| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- #include <stdio.h>
- #include <string.h>
- #include "amt630hv160_lib.h"
- #include "update.h"
- #include "sfud.h"
- #include "fs/ff.h"
- #include "fs/diskio.h"
- #include "mailbox_message.h"
- /*
- 打开CHECK_CPU_SUPPORT宏定义会影响动画、UI首帧时间,
- cpuapp程序为(x)KB, 耗时约(0.37 * x)ms.
- */
- //#define CHECK_CPU_SUPPORT
- #define APPLDR_CHECKSUM_OFFSET 20
- u8 cpu_running = 0;
- u8 cpu_access_status = 0;
- static void SelCpuPadConfig(void)
- {
- u32 padctl[16];
- u32 drvctl[16];
- u32 pullctl[15];
- int i;
- //select all pad config to cpu
- for (i = 0; i < 15; i++) {
- padctl[i] = 0xffffffff;
- drvctl[i] = 0xffffffff;
- pullctl[i] = 0xffffffff;
- }
- padctl[15] = 0xff; //sel pwm to cpu
- drvctl[15] = 0xffffffff;
- //select jtag pad config to mcu
- padctl[7] &= ~0x3ff;
- #ifdef _MCU_UART0
- padctl[2] &= ~(0xf << 12);
- #endif
- #ifdef _I2C0
- padctl[7] &= ~(0xf << 12);
- #endif
- #ifdef _I2C1
- padctl[2] &= ~(0x3UL << 30);
- padctl[3] &= ~(0x3 << 0);
- #endif
- #ifdef _ADC
- #ifdef _ADC0
- #ifdef _ADC0_0
- padctl[11] &= ~(0x3 << 0);
- pullctl[14] &= ~(0x1 << 0);
- #endif
- #ifdef _ADC0_1
- padctl[11] &= ~(0x3 << 2);
- pullctl[14] &= ~(0x1 << 1);
- #endif
- #ifdef _ADC0_2
- padctl[11] &= ~(0x3 << 4);
- pullctl[14] &= ~(0x1 << 2);
- #endif
- #ifdef _ADC0_3
- padctl[11] &= ~(0x3 << 6);
- pullctl[14] &= ~(0x1 << 3);
- #endif
- #ifdef _ADC0_4
- padctl[11] &= ~(0x3 << 8);
- pullctl[14] &= ~(0x1 << 4);
- #endif
- #ifdef _ADC0_5
- padctl[11] &= ~(0x3 << 10);
- pullctl[14] &= ~(0x1 << 5);
- #endif
- #ifdef _ADC0_6
- padctl[11] &= ~(0x3 << 12);
- pullctl[14] &= ~(0x1 << 6);
- #endif
- #ifdef _ADC0_7
- padctl[11] &= ~(0x3 << 14);
- pullctl[14] &= ~(0x1 << 7);
- #endif
- #endif /*_ADC0 */
- #ifdef _ADC1
- #ifdef _ADC1_0
- padctl[11] &= ~(0x3 << 16);
- pullctl[14] &= ~(0x1 << 8);
- #endif
- #ifdef _ADC1_1
- padctl[11] &= ~(0x3 << 18);
- pullctl[14] &= ~(0x1 << 9);
- #endif
- #ifdef _ADC1_2
- padctl[11] &= ~(0x3 << 20);
- pullctl[14] &= ~(0x1 << 10);
- #endif
- #ifdef _ADC1_3
- padctl[11] &= ~(0x3 << 22);
- pullctl[14] &= ~(0x1 << 11);
- #endif
- #ifdef _ADC1_4
- padctl[11] &= ~(0x3 << 24);
- pullctl[14] &= ~(0x1 << 12);
- #endif
- #ifdef _ADC1_5
- padctl[11] &= ~(0x3 << 26);
- pullctl[14] &= ~(0x1 << 13);
- #endif
- #ifdef _ADC1_6
- padctl[11] &= ~(0x3 << 28);
- pullctl[14] &= ~(0x1 << 14);
- #endif
- #ifdef _ADC1_7
- padctl[11] &= ~(0x3UL << 30);
- pullctl[14] &= ~(0x1 << 15);
- #endif
- #endif /*_ADC1 */
- #ifdef _ADC2
- #ifdef _ADC2_0
- padctl[12] &= ~(0x3 << 0);
- pullctl[14] &= ~(0x1 << 16);
- #endif
- #ifdef _ADC2_1
- padctl[12] &= ~(0x3 << 2);
- pullctl[14] &= ~(0x1 << 17);
- #endif
- #ifdef _ADC2_2
- padctl[12] &= ~(0x3 << 4);
- pullctl[14] &= ~(0x1 << 18);
- #endif
- #ifdef _ADC2_3
- padctl[12] &= ~(0x3 << 6);
- pullctl[14] &= ~(0x1 << 19);
- #endif
- #ifdef _ADC2_4
- padctl[12] &= ~(0x3 << 8);
- pullctl[14] &= ~(0x1 << 20);
- #endif
- #ifdef _ADC2_5
- padctl[12] &= ~(0x3 << 10);
- pullctl[14] &= ~(0x1 << 21);
- #endif
- #ifdef _ADC2_6
- padctl[12] &= ~(0x3 << 12);
- pullctl[14] &= ~(0x1 << 22);
- #endif
- #ifdef _ADC2_7
- padctl[12] &= ~(0x3 << 14);
- pullctl[14] &= ~(0x1 << 23);
- #endif
- #endif /*_ADC2 */
- #endif /*_ADC */
- #ifdef _CANFD0
- padctl[5] &= ~(0xfUL << 28);
- padctl[6] &= ~(0x3 << 0);
- padctl[13] &= ~(0x1 << 14);
- #endif
- #ifdef _CANFD1
- padctl[6] &= ~(0x3f << 2);
- padctl[13] &= ~(0x1 << 15);
- #endif
- #ifdef _SPI0
- padctl[4] &= ~(0x3UL << 30);
- padctl[5] &= ~(0xff << 0);
- #endif
- #ifdef _SDMMC0
- padctl[3] &= ~(0x3fff << 2);
- #endif
- #ifdef _SDMMC1
- padctl[2] &= ~(0x3fff << 16);
- #endif
- #ifdef _MCU_PWM
- #ifdef _MCU_PWM0
- padctl[6] &= ~(0x3 << 8);
- padctl[15] &= ~(1 << 0);
- #endif
- #ifdef _MCU_PWM1
- padctl[6] &= ~(0x3 << 10);
- padctl[15] &= ~(1 << 1);
- #endif
- #ifdef _MCU_PWM2
- padctl[6] &= ~(0x3 << 12);
- padctl[15] &= ~(1 << 2);
- #endif
- #ifdef _MCU_PWM3
- padctl[6] &= ~(0x3 << 14);
- padctl[15] &= ~(1 << 3);
- #endif
- #ifdef _MCU_PWM4
- padctl[6] &= ~(0x3 << 16);
- padctl[15] &= ~(1 << 4);
- #endif
- #ifdef _MCU_PWM5
- padctl[6] &= ~(0x3 << 18);
- padctl[15] &= ~(1 << 5);
- #endif
- #ifdef _MCU_PWM6
- padctl[6] &= ~(0x3 << 20);
- padctl[15] &= ~(1 << 6);
- #endif
- #ifdef _MCU_PWM7
- padctl[6] &= ~(0x3 << 22);
- padctl[15] &= ~(1 << 7);
- #endif
- #endif
- #ifdef _PWMCAP0
- padctl[6] &= ~(0x3 << 24);
- #endif
- #ifdef _PWMCAP1
- padctl[6] &= ~(0x3 << 26);
- #endif
- #ifdef _PWMCAP2
- padctl[6] &= ~(0x3 << 28);
- #endif
- #ifdef _PWMCAP3
- padctl[6] &= ~(0x3 << 30);
- #endif
- for (i = 0; i < 15; i++) {
- MCU_SYSCTRL->SEL_PADCTL[i] = padctl[i];
- MCU_SYSCTRL->SEL_DRVCTL[i] = drvctl[i];
- MCU_SYSCTRL->SEL_PULLCTL[i] = pullctl[i];
- }
- MCU_SYSCTRL->SEL_PADCTL[15] = padctl[15];
- MCU_SYSCTRL->SEL_DRVCTL[15] = drvctl[15];
- }
- static void LoadCpuLoader(void)
- {
- SysInfo *sysinfo = GetSysInfo();
- #if CPU_DEVICE_TYPE_SELECT != EMMC_FLASH
- sfud_flash *sflash = sfud_get_device(0);
- sfud_read(sflash, sysinfo->loader_offset, sysinfo->loader_size, (void*)CPU_IRAM_BASE);
- sfud_read(sflash, sysinfo->app_offset, sysinfo->app_size, (void*)DDR_BASE);
- #else
- u32 size = (sysinfo->loader_size + 0x3) & (~0x3);
- EmmcReadData(sysinfo->loader_offset, size, (void*)CPU_IRAM_BASE);
- size = (sysinfo->app_size + 0x3) & (~0x3);
- EmmcReadData(sysinfo->app_offset, size, (void*)DDR_BASE);
- #endif
- }
- #ifdef CHECK_CPU_SUPPORT
- static int CheckCpuProgram(void)
- {
- SysInfo *sysinfo = GetSysInfo();
- u32 checksum;
- checksum = *(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET);
- *(uint32_t*)(CPU_IRAM_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
- if (checksum != xcrc32((void *)CPU_IRAM_BASE, sysinfo->loader_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
- printf("%s,cpuldr checksum error.\n", __func__);
- return -1;
- }
- checksum = *(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET);
- *(uint32_t*)(DDR_BASE + APPLDR_CHECKSUM_OFFSET) = 0;
- if (checksum != xcrc32((void *)DDR_BASE, sysinfo->app_size, 0xFFFFFFFF, HARD_CALC_CRC)) {
- printf("%s,cpuapp checksum error.\n", __func__);
- return -1;
- }
- return 0;
- }
- #endif
- void StartCpu(void)
- {
- /* DDR Init*/
- if (DDR_Init()) {
- printf("ddr init cannot start CPU");
- return;
- }
- SaveChipInfoForCpu();
- LoadCpuLoader();
- #ifdef CHECK_CPU_SUPPORT
- if (CheckCpuProgram())
- return;
- #endif
- SelCpuPadConfig();
- //*(volatile uint32_t *)0x20000000 = 0xeafffffe; // a7 while(1) debug cpu
- printf("Start cpu...\n");
- MCU_SYSCTRL->V7_CTL_CFG = 0x3f;
- cpu_running = 1;
- }
|