Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources

This commit is contained in:
2026-07-06 11:30:13 +08:00
commit e76462eeb7
3451 changed files with 1415300 additions and 0 deletions

401
sdk/chip/txw82x/system0.c Normal file
View File

@@ -0,0 +1,401 @@
#include "basic_include.h"
#include "csi_config.h"
#include "soc.h"
#include "csi_core.h"
#include "csi_kernel.h"
#include "sys_config.h"
#include "dev/dma/hg_m2m_dma.h"
#include "lib/ota/al_typedef.h"
#ifdef CONFIG_SLEEP
#include "lib/common/dsleepdata.h"
#endif
#include "cpu1_mem.h"
#include "dev/xspi/hg_xspi_psram.h"
#include "dev/xspi/hg_xspi_flash.h"
#include "dev/adc/hgadc_v1.h"
#include "hal/adc.h"
extern int main(void);
extern int32 dev_init(void);
extern void device_init(void);
extern int psram_auto_init(int extern_pt, uint32_t clk);
extern void psram_info(int isready);
void pmu_watchdog_init(void);
extern uint32_t g_intstackbase;
extern uint32_t g_top_irqstack;
extern uint32_t __heap_start;
extern uint32_t __heap_end;
extern uint32_t __psram_heap_start;
extern uint32_t __psram_heap_end;
extern unsigned int __al_user_sram_start;
extern struct os_workqueue main_wkq;
extern uint8_t assert_holdup;
extern uint32 psram_rsv_addr;
uint32 srampool_start = 0;
uint32 srampool_end = 0;
uint32 psrampool_start = 0;
uint32 psrampool_end = 0;
uint32 __sp_save[3];
#ifndef SYS_FACTORY_PARAM_SIZE
#define SYS_FACTORY_PARAM_SIZE 20
#endif
//生成func_code=1的参数
#define FUNCCODE1_HEAD(fun_num,size) (((size) << 8) | ((fun_num)))
#define FUN_NUM (1) //func_code=1的参数
#define FUN_NUM_1_SIZE (2+16) //2是保留的2byte,16分别是iocfg、eqcfg、ispcfg, psramcfg
#ifdef PIN_FROM_PARAM
const uint16_t __used iocfg_psram[IOCFG_SIZE / 2] = {IOCFG_SIZE};
#else
#endif
#define PARAM_HEAD(size,head) (SYS_FACTORY_PARAM_SIZE|head<<16)
__initconst const uint16_t __used isp_param[4096 / 2] = {4096, 0};
__initconst const uint16_t __used eq_param[1024 / 2] = {1024};
__initconst const uint16_t __used psram_param[4096 / 2] = {4096, 0};
const uint32_t __used sys_factory_param[SYS_FACTORY_PARAM_SIZE / 2] __at_section("SYS_PARAM") =
{
PARAM_HEAD(SYS_FACTORY_PARAM_SIZE,0x2B1A),
FUNCCODE1_HEAD(FUN_NUM,FUN_NUM_1_SIZE),
(uint32_t)IOCFG_PARAM_ADDR,
(uint32_t)eq_param,
(uint32_t)isp_param,
(uint32_t)psram_param
};
/** recommend usage :
* 1、CSI (CPU separate) cache use for IBUS : SRAM(0x040000000) FLASH(0x10000000) PSRAM(0x08000000)
* 32kB*2 DBUS : SRAM(0x200000000) FLASH(0x30000000) PSRAM(0x28000000)
*
* 2、CLD (AHB share) cache only for DBUS : PSRAM(0x28000000) can share for CPU0 & CPU1
* 32KB
*/
__SYS_INIT void cache_open(void)
{
sysctrl_cpu0_ibus_burst_set(CPU_BURST_SIZE_16B);
sysctrl_cpu0_l2_dcache_en(1);
sysctrl_cpu1_l2_dcache_en(0);
cld_cache_disable();
csi_cache_reset_profile();
csi_cache_set_range(0, 0, CACHE_CRCR_8M, 0x0);
csi_cache_set_range(1, 0, CACHE_CRCR_8M, 0x0);
csi_cache_set_range(2, 0, CACHE_CRCR_8M, 0x0);
csi_cache_set_range(3, 0, CACHE_CRCR_8M, 0x0);
if (!IS_SRAM_ADDR((uint32_t) & (__Vectors))) {
csi_cache_set_range(0, ((uint32_t) & (__Vectors)) & 0xFFF00000, CACHE_CRCR_8M, 0x1);
}
csi_cache_enable_profile();
csi_icache_enable();
}
__SYS_INIT void cache_open_psram(void)
{
sysctrl_cpu0_dbus_burst_set(CPU_BURST_SIZE_0B);
sysctrl_cpu0_l2_dcache_en(1);
if (!cld_cache_is_enable()) {
sysctrl_force_cld_allocate_en();
cld_cache_invalidate_all();
cld_cache_enable();
cld_cache_enable_profile();
}
#if defined(PSRAM_HEAP)
if (!SYSCTRL_GET_CPU0_L2_DCACHE_EN) {
sysctrl_cpu0_dbus_burst_set(CPU_BURST_SIZE_16B);
csi_cache_set_range(3, PSRAM_BASE, CACHE_CRCR_16M, 0x1);
csi_dcache_enable();
}
#endif
}
__SYS_INIT void system_clock_init(void)
{
if (!sysctrl_cmu_sysclk_set(DEFAULT_SYS_CLK, 1)) {
while (1);
}
}
__SYS_INIT void system_set_ace_peris(void)
{
uint32_t ie = disable_irq();
#ifndef SINGLE_CORE
sysctrl_ace_peris_access_cpu0(ACE_USB20|ACE_USB11|ACE_GMAC|ACE_DISPLAY_TOP|ACE_VIDEO_INTF_TOP|ACE_VIDEO_SUBSYS_TOP|ACE_OSPI_CTRL|ACE_QSPI_CTRL|ACE_H264_CODEC_TOP|ACE_IMAGE_ISP_TOP|ACE_VIDEO_GPU_TOP);
sysctrl_ace_peris_access_cpu1(ACE_BASEBAND1|ACE_BASEBAND|ACE_RFDIGITAL|ACE_RFDIGCAL_TOP);
sysctrl_ace_peris_access_cpu_all(ACE_MIX_TOP|ACE_GPIO_TOP|ACE_EFUSE_CTRL|ACE_SYS_SEC_TOP|ACE_PMU);
#else
sysctrl_ace_peris_access_cpu0(0xFFFFFFFF);
sysctrl_ace_peris_access_cpu_all(ACE_BASEBAND1|ACE_BASEBAND|ACE_RFDIGITAL|ACE_RFDIGCAL_TOP);
#endif
enable_irq(ie);
}
#ifndef SINGLE_CORE
__SYS_INIT void sys_start_cpu1(uint32_t run_addr)
{
os_printf(KERN_NOTICE"kick start cpu1 at %p!\n", run_addr);
CoreSetting->soft_int_pending = 0;
CoreSetting->print_level = 0;
CoreSetting->disable_print = 0;
CoreSetting->dcache_maint_en = CONFI_CORE_DCACHE_MAINT_EN;
CoreSetting->dbg_uart_dev = CONFI_CORE_UARTDEV;
CoreSetting->m2m_dma_dev = (HG_M2M_DMA_NUM > 2) ? 0 : 1; // modify HG_M2M_DMA_NUM CORE0 2 or 3 core1 use DMA2
CoreSetting->adc_dev = 0;
CoreSetting->wdt1_to = 4;
CoreSetting->wdt1_irq_hdl = 0;
CoreSetting->cpu_clk = CONFIG_CORE_CPU_CLK;
CoreSetting->rxbuf_addr = (uint32_t)(CONFIG_CORE_RXBUF_ADDR);
CoreSetting->rxbuf_size = CONFIG_CORE_RXBUF_SIZE;
CoreSetting->heap_addr = (uint32_t)(CONFIG_CORE_HEAP_START);
CoreSetting->heap_size = CONFIG_CORE_HEAP_SIZE;
CoreSetting->skbpool_addr = (uint32_t)(CONFIG_CORE_SKB_POOL_ADDR);
CoreSetting->skbpool_size = CONFIG_CORE_SKB_POOL_SIZE;
CoreSetting->skbpool_flag = 0;
CoreSetting->soft_int_pending = 0;
CoreSetting->vif_maxcnt = 2;
CoreSetting->bss_maxcnt = 16;
CoreSetting->sta_maxcnt = 2;
CoreSetting->bss_lifetime = 30;
CoreSetting->heap_flag = 0;//SYSHEAP_FLAGS_MEM_LEAK_TRACE | SYSHEAP_FLAGS_MEM_OVERFLOW_CHECK;
#ifdef LMAC_BGN_PCF
CoreSetting->afh_en = 1;
#else
CoreSetting->afh_en = 0;
#endif
CoreSetting->afh_chan_mask = 0x00;
#if defined(PSRAM_HEAP)
CoreSetting->psram_rsv_addr_core0 = (uint32_t)os_malloc_psram(32);
#else
CoreSetting->psram_rsv_addr_core0 = 0;
#endif
sysctrl_cpu1_softrst_en();
__NOP();
__NOP();
__NOP();
__NOP();
sysctrl_cpu1_softrst_system_en();
sysctrl_cpu1_softrst_self_dis();
sysctrl_set_cpu1_pc_rst_addr(run_addr >> 10);
sysctrl_cpu1_clk_en();
sysctrl_set_cpu1_jtag_map(CPU1_JTAG_DISABLE);
sysctrl_cpu1_softrst_dis();
while(!CoreSetting->cpu1_ready);
os_printf(KERN_INFO"CPU1 ready!\r\n");
}
#endif
void cld_cache_irq_handler(void *data)
{
os_printf("%s %d\r\n",__func__, __LINE__);
os_printf("CTRL=%08x\r\n", DCACHE_CTRL->CTRL);
os_printf("MAINT_STATUS=%08x\r\n", DCACHE_CTRL->MAINT_STATUS);
os_printf("SECIRQSTAT=%08x\r\n", DCACHE_CTRL->SECIRQSTAT);
os_printf("NSECIRQSTAT=%08x\r\n", DCACHE_CTRL->NSECIRQSTAT);
__disable_irq();
while(1);
}
int ll_xip_clock_init(int clk_mhz);
__SYS_INIT void SystemInit(void)
{
IC_SIM_START();
srampool_start = (uint32)&__heap_start;
srampool_end = (uint32)&__heap_end;
#if defined(PSRAM_HEAP)
psrampool_start = (uint32)&__psram_heap_start;
psrampool_end = (uint32)&__psram_heap_end;
#endif
sysctrl_qspi_lock();
system_set_ace_peris();
cache_open();
*((uint32_t *)(&g_intstackbase)) = 0xDEADBEEF;
__set_VBR((uint32_t) & (__Vectors));
SYSCTRL_REG_OPT_INIT();
sys_reset_pending_clr();
PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(PMU_WDT_LOCK_SIGN)|BIT(PMU_WDT1_LOCK_SIGN)|BIT(PMU_LPWDT_LOCK_SIGN)|BIT(PMU_BOOT_DIRECT_RUN));
sysctrl_efuse_pwron_init();
if (sysctrl_get_softreset_pending()) {
sysctrl_clr_softreset_pending();
pmu_set_direct_run_pengding2();
} else {
pmu_clr_direct_run_pengding2();
}
firmware_info_t info_in_fls = (firmware_info_t)&__al_user_sram_start;
fls_user_data_t user_data = (fls_user_data_t)info_in_fls->user.user_data;
if (info_in_fls->user.user_data) {
if (user_data->fw_magic == (0xC791B319)) {
} else {
ll_xip_clock_init(0);
}
} else {
ll_xip_clock_init(0);
}
sysctrl_cmu_init();
#ifndef FPGA_SUPPORT
system_clock_init();
#endif
if (DEFAULT_SYS_CLK > (192*1000000) ) {
void ll_clock_set_apb0_div(uint8 apb0_div);
ll_clock_set_apb0_div(2);
}
//pmu_vdd_core_set(5);
pmu_vdd_dis();
#if defined(CONFIG_SEPARATE_IRQ_SP)
/* 801 not supported */
__set_Int_SP((uint32_t)&g_top_irqstack);
__set_CHR(__get_CHR() | CHR_ISE_Msk);
#endif
VIC->TSPR = 0xFF;
/* Clear active and pending IRQ */
csi_vic_disable_all_irq();
csi_vic_clear_all_pending_irq();
csi_vic_clear_all_active();
/* All peripheral interrupt priority is set to lowest */
for (uint32 i = 0; i < IRQ_NUM; i++) {
csi_vic_set_prio(i, 7);
}
csi_coret_config(system_clock_get() / CONFIG_SYSTICK_HZ, CORET_IRQn); //1ms
csi_vic_enable_irq(CORET_IRQn);
request_irq(LVD_IRQn, lvd_irq_handler, 0);
irq_enable(LVD_IRQn);
cld_cache_irq_enable();
request_irq(EXT_DCACHE_IRQn, cld_cache_irq_handler, 0);
irq_enable(EXT_DCACHE_IRQn);
pmu_clr_deadcode_pending();
}
__init static void malloc_init(void)
{
uint32 flags = 0;
#ifdef MEM_TRACE
flags |= SYSHEAP_FLAGS_MEM_LEAK_TRACE | SYSHEAP_FLAGS_MEM_OVERFLOW_CHECK;
#endif
sram_heap.name = "sram";
sram_heap.ops = &mmpool1_ops;
sysheap_init(&sram_heap, (void *)SYS_HEAP_START, SYS_HEAP_SIZE, flags);
}
__init static void malloc_psram_init(void)
{
#ifdef PSRAM_HEAP
uint32 flags = SYSHEAP_FLAGS_MEM_ALIGN_32;
#ifdef MEM_TRACE
flags |= SYSHEAP_FLAGS_MEM_LEAK_TRACE | SYSHEAP_FLAGS_MEM_OVERFLOW_CHECK;
#endif
psram_heap.name = "psram";
psram_heap.ops = &mmpool1_ops;
sysheap_init(&psram_heap, (void *)SYS_PSRAM_HEAP_START, SYS_PSRAM_HEAP_SIZE, flags);
#endif
}
__init static int system_psram_init(void)
{
extern void add_psram_cfg();
add_psram_cfg();
// 240M 320M, 274M, 160M...
// 你可以选择你喜欢的频率, 但内部只有几个挡位可以选择, 匹配最接近的配置
int psram_heap_size = psram_auto_init(0, 320 * 1000000);
cache_open_psram();
#ifdef PSRAM_HEAP
if(psram_heap_size){
psrampool_end = PSRAM_BASE + psram_heap_size*1024*1024;
malloc_psram_init();
psram_rsv_addr = (uint32)os_malloc_psram(32);
}
if(!psram_heap_size){
os_printf("psram not ready\n");
}
return psram_heap_size;
#endif
}
__init void pre_main(void)
{
CoreSetting->cpu1_ready = 0;
assert_holdup = ASSERT_HOLDUP;
save_boot_loader_addr();
malloc_init();
int psram_size = system_psram_init();
#ifdef CSKY_OS
csi_kernel_init();
#endif
#ifdef OHOS
LOS_KernelInit();
#endif
dev_init();
device_init();
psram_info(psram_size);
sysctrl_efuse_validity_handle();
#ifndef SINGLE_CORE
adc_open((struct adc_device *)dev_get(HG_ADC0_DEVID));
irq_enable(CPU_DBG_ON_IRQn);
csi_vic_set_prio(CPU_DBG_ON_IRQn, 1);
sys_start_cpu1(0x10001000);
#endif
#ifdef CONFIG_SLEEP
sys_sleepcb_init();
sys_sleepdata_init();
#endif
pmu_watchdog_init();
VERSION_SHOW();
module_version_show();
sys_reset_show();
os_workqueue_init(&main_wkq, "MAIN", OS_TASK_PRIORITY_NORMAL, NULL, 2048);
mainwkq_monitor_init();
os_run_func((os_run_func_t)main, 0, 0, 0);
#ifdef CSKY_OS
csi_kernel_start();
#endif
#ifdef OHOS
LOS_Start();
#endif
}