static void board_i2c_init(void) { //set I2C pinmux with PCB board layout /*@AML9726-MX-MAINBOARD_V1.0.pdf*/ /*@AL5631Q+3G_AUDIO_V1.pdf*/ board_i2c_set_pinmux(); //Amlogic I2C controller initialized //note: it must be call before any I2C operation aml_i2c_init(); //must call aml_i2c_init(); before any I2C operation /*M6 board*/ //udelay(10000); udelay(10000); #ifdef TEST_UBOOT_BOOT_SPEND_TIME unsigned int before_pmu_init = get_utimer(0); #endif #ifdef CONFIG_PLATFORM_HAS_PMU board_pmu_init(); #endif #ifdef TEST_UBOOT_BOOT_SPEND_TIME unsigned int after_pmu_init = get_utimer(0); printf("\nPMU init time %d\n", after_pmu_init-before_pmu_init); #endif }
unsigned main(unsigned __TEXT_BASE,unsigned __TEXT_SIZE) { //Adjust 1us timer base timer_init(); serial_init(UART_CONTROL_SET(CONFIG_BAUDRATE,CONFIG_CRYSTAL_MHZ*1000000)); serial_put_dword(get_utimer(0)); AML_WATCH_DOG_DISABLE();//disable Watchdog debug_rom(__FILE__,__LINE__); return 0; }
static int do_gettime (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int time = get_utimer(0); printf("***from powerup: %d us.\n", time); return time; }
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { ulong iflag; ulong load_end = 0; int ret = 0; boot_os_fn *boot_fn; AML_LOG_INIT("cmd_bootm"); AML_LOG_TE("cmd_bootm"); #ifdef TEST_UBOOT_BOOT_SPEND_TIME bootm_start_time = get_utimer(0); #endif #ifdef CONFIG_NEEDS_MANUAL_RELOC static int relocated = 0; /* relocate boot function table */ if (!relocated) { int i; for (i = 0; i < ARRAY_SIZE(boot_os); i++) if (boot_os[i] != NULL) boot_os[i] += gd->reloc_off; relocated = 1; } #endif AML_LOG_TE("cmd_bootm"); #ifdef CONFIG_RESET_TO_SYSTEM struct aml_pmu_driver *pmu_driver = NULL; pmu_driver = aml_pmu_get_driver(); if (pmu_driver && pmu_driver->pmu_reset_flag_operation) { pmu_driver->pmu_reset_flag_operation(RESET_FLAG_SET); } #endif AML_LOG_TE("cmd_bootm"); #ifdef CONFIG_M6_SECU_BOOT #ifdef CONFIG_MESON_TRUSTZONE extern int meson_trustzone_boot_check(unsigned char *addr); ret = meson_trustzone_boot_check((unsigned char*)load_addr); #else extern int aml_decrypt_kernel_image(void* kernel_image_address); ret = aml_decrypt_kernel_image((void*)load_addr); #endif if(ret != 0) { printf("Error! Illegal kernel image, please check!\n"); return ret; } #endif //CONFIG_M6_SECU_BOOT AML_LOG_TE("cmd_bootm"); #ifdef CONFIG_AML_SECU_BOOT_V2 #ifdef CONFIG_MESON_TRUSTZONE extern int meson_trustzone_boot_check(unsigned char *addr); if(!g_nIMGReadFlag) ret = meson_trustzone_boot_check(aml_get_kernel_crypto_addr(argc < 2 ? NULL : argv[1])); #else extern int aml_sec_boot_check(unsigned char *pSRC); if(!g_nIMGReadFlag) ret = aml_sec_boot_check(aml_get_kernel_crypto_addr(argc < 2 ? NULL : argv[1])); #endif if(0 != ret) return ret; #endif //CONFIG_AML_SECU_BOOT_V2 AML_LOG_TE("cmd_bootm"); #ifdef CONFIG_AML_GATE_INIT extern void gate_init(void); gate_init(); #endif /* determine if we have a sub command */ if (argc > 1) { char *endp; simple_strtoul(argv[1], &endp, 16); /* endp pointing to NULL means that argv[1] was just a * valid number, pass it along to the normal bootm processing * * If endp is ':' or '#' assume a FIT identifier so pass * along for normal processing. * * Right now we assume the first arg should never be '-' */ if ((*endp != 0) && (*endp != ':') && (*endp != '#')) return do_bootm_subcommand(cmdtp, flag, argc, argv); } AML_LOG_TE("cmd_bootm"); if (bootm_start(cmdtp, flag, argc, argv)) return 1; AML_LOG_TE("cmd_bootm"); /* * We have reached the point of no return: we are going to * overwrite all exception vector code, so we cannot easily * recover from any failures any more... */ iflag = disable_interrupts(); #if defined(CONFIG_CMD_USB) /* * turn off USB to prevent the host controller from writing to the * SDRAM while Linux is booting. This could happen (at least for OHCI * controller), because the HCCA (Host Controller Communication Area) * lies within the SDRAM and the host controller writes continously to * this area (as busmaster!). The HccaFrameNumber is for example * updated every 1 ms within the HCCA structure in SDRAM! For more * details see the OpenHCI specification. */ usb_stop(); #endif AML_LOG_TE("cmd_bootm"); ret = bootm_load_os(images.os, &load_end, 1); AML_LOG_TE("cmd_bootm"); if (ret < 0) { if (ret == BOOTM_ERR_RESET) do_reset (cmdtp, flag, argc, argv); if (ret == BOOTM_ERR_OVERLAP) { if (images.legacy_hdr_valid) { if (image_get_type (&images.legacy_hdr_os_copy) == IH_TYPE_MULTI) puts ("WARNING: legacy format multi component " "image overwritten\n"); } else { puts ("ERROR: new format image overwritten - " "must RESET the board to recover\n"); show_boot_progress (-113); do_reset (cmdtp, flag, argc, argv); } } if (ret == BOOTM_ERR_UNIMPLEMENTED) { if (iflag) enable_interrupts(); show_boot_progress (-7); return 1; } } AML_LOG_TE("cmd_bootm"); lmb_reserve(&images.lmb, images.os.load, (load_end - images.os.load)); AML_LOG_TE("cmd_bootm"); if (images.os.type == IH_TYPE_STANDALONE) { if (iflag) enable_interrupts(); /* This may return when 'autostart' is 'no' */ bootm_start_standalone(iflag, argc, argv); return 0; } show_boot_progress (8); #if defined(CONFIG_SILENT_CONSOLE) && \ (defined(CONFIG_SILENT_CONSOLE_LINUX_QUIET) || defined(CONFIG_DEPRECATED_SILENT_LINUX_CONSOLE)) if (images.os.os == IH_OS_LINUX) fixup_silent_linux(); #endif AML_LOG_TE("cmd_bootm"); #ifdef CONFIG_AUTO_SET_BOOTARGS_MEM mem_size_arg_process(); #endif boot_fn = boot_os[images.os.os]; if (boot_fn == NULL) { if (iflag) enable_interrupts(); printf ("ERROR: booting os '%s' (%d) is not supported\n", genimg_get_os_name(images.os.os), images.os.os); show_boot_progress (-8); return 1; } AML_LOG_TE("cmd_bootm"); arch_preboot_os(); #ifdef TEST_UBOOT_BOOT_SPEND_TIME { int boot_kernel_start; boot_kernel_start = get_utimer(0); printf("bootm start to prepare boot kernel time:%dus\n",boot_kernel_start-bootm_start_time); printf("from main_loop start to kernel decompress finished time:%dus\n",boot_kernel_start-main_loop_start); } #endif ulong temp_img_addr; AML_LOG_TE("cmd_bootm"); /* use fprintf to always show this print even if console is silenced with GD_FLG_SILENT */ fprintf(stderr, "uboot time: %d us.\n", get_utimer(0)); boot_fn(0, argc, argv, &images); show_boot_progress (-9); #ifdef DEBUG puts ("\n## Control returned to monitor - resetting...\n"); #endif do_reset (cmdtp, flag, argc, argv); return 1; }
//burn the amlogic keys like USB_Burning_Tool static int sdc_burn_aml_keys(HIMAGE hImg, const int keyOverWrite) { int rc = 0; const char* *keysName = NULL; unsigned keysNum = 0; const char** pCurKeysName = NULL; unsigned index = 0; rc = run_command("aml_key_burn probe vfat sdc", 0); if(rc){ DWN_ERR("Fail in probe for aml_key_burn\n"); return __LINE__; } { unsigned random32 = 0; unsigned seed = 0; char cmd[96]; random32 = seed = get_utimer(0) + 12345;//make it random /*random32 = random_u32(seed);*/ DWN_MSG("random value is 0x%x\n", random32); sprintf(cmd, "aml_key_burn init 0x%x", random32); rc = run_command(cmd, 0); if(rc){ DWN_ERR("Fail in cmd[%s]\n", cmd); return __LINE__; } } rc = sdc_burn_get_user_key_names(hImg, &keysName, &keysNum); if(ITEM_NOT_EXIST != rc && rc){ DWN_ERR("Fail to parse keys.conf, rc =%d\n", rc); return __LINE__; } DWN_MSG("keys.conf:\n"); for(index = 0; index < keysNum; ++index)printf("\tkey[%d]\t%s\n", index, keysName[index]); rc = optimus_sdc_keysprovider_init(); if(rc){ DWN_ERR("Fail in optimus_sdc_keysprovider_init\n"); return __LINE__; } pCurKeysName = keysName; for(index = 0; index < keysNum; ++index) { const char* const keyName = *pCurKeysName++; if(!keyName)continue; DWN_MSG("\n"); DWN_MSG("Now to burn key <---- [%s] ----> %d \n", keyName, index); rc = sdc_check_key_need_to_burn(keyName, keyOverWrite); if(rc < 0){ DWN_ERR("Fail when when check stauts for key(%s)\n", keyName); return __LINE__; } if(!rc)continue;//not need to burn this key //0, init the key license parser const void* pHdle = NULL; rc = optimus_sdc_keysprovider_open(keyName, &pHdle); if(rc){ DWN_ERR("Fail in init license for key[%s]\n", keyName); return __LINE__; } //1,using cmd_keysprovider to read a key to memory u8* keyValue = (u8*)OPTIMUS_DOWNLOAD_TRANSFER_BUF_ADDR; unsigned keySz = OPTIMUS_DOWNLOAD_SLOT_SZ;//buffer size rc = optimus_sdc_keysprovider_get_keyval(pHdle, keyValue, &keySz); if(rc){ DWN_ERR("Fail to get value for key[%s]\n", keyName); return __LINE__; } //3, burn the key rc = optimus_keysburn_onekey(keyName, (u8*)keyValue, keySz); if(rc){ DWN_ERR("Fail in burn the key[%s] at addr=%p, sz=%d\n", keyName, keyValue, keySz); return __LINE__; } //3,report burn result to cmd_keysprovider rc = optimus_sdc_keysprovider_update_license(pHdle); if(rc){ DWN_ERR("Fail in update license for key[%s]\n", keyName); return __LINE__; } } rc = optimus_sdc_keysprovider_exit(); if(rc){ DWN_ERR("Fail in optimus_sdc_keysprovider_exit\n"); return __LINE__; } rc = run_command("aml_key_burn uninit", 0); if(rc){ DWN_ERR("Fail in uninit for aml_key_burn\n"); return __LINE__; } return 0; }