📄 bootmenu.c
字号:
} else return -1;}int bootmenu_mac(int argc, char *argv[]){ unsigned char bufw[8]={0x11,0x33,0x66,0x99,0xaa,0xbb,0xcc,0xdd}; unsigned char sum=0; unsigned int addr=0xa5; int i; if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS uart_puts(s_help_mac_brief); uart_puts(s_help_mac);#else uart_puts(no_help_msg);#endif return 0; } if (strcmp(argv[1], "read") == 0) { if (mac_read(bufw) == -1) uart_printf("mac read error: sum=%02x\n",bufw[7]); for(i=0;i<6;i++) uart_printf("%02x ",bufw[i]); uart_printf("\n"); } else if (strcmp(argv[1], "write") == 0 ) { for(i=0;i<6;i++) { if (argc > (i+2)) bufw[i] = htoi(argv[i+2]); uart_printf("%02x ",bufw[i]); sum+=bufw[i]; } bufw[6] = SIGN; sum+=bufw[6]; bufw[7] = (unsigned char)(-sum); sum += bufw[7]; uart_printf("%02x %02x sum=0x%02x\n",bufw[6],bufw[7],sum); for(i=0;i<8;i++) hwi2c_write(addr, i, &bufw[i], 1, 200);// hwi2c_write(addr, 0, &bufw[0], 8, 200); mac_offset = 0x100 - 8; } #ifdef CONFIG_ENABLE_FULLFUNCTION else if(strcmp(argv[1], "dump") == 0 ) { mac_dump(argc, argv); } else if(strcmp(argv[1], "subwrite") == 0 ) { mac_subwrite(argc, argv); }#endif return 0; }#endif //TANGO15int bootmenu_dump(int argc, char *argv[]){ static unsigned int addr = 0; int i; unsigned int num = 0x100, unit = 1; for (i = 1; (i < argc) && (argv[i][0] == '-'); ++i) { switch (argv[i][1]) { case 'l' : unit = 4; break; case 'w' : unit = 2; break; case 'b' : unit = 1; break; } } if (argc > i) addr = atoi(argv[i++]); if (argc > i) num = atoi(argv[i++]); dump_memory(NULL, addr, num, unit); addr += num; return 0;}#ifdef CONFIG_ENABLE_FLASHint bootmenu_flash(int argc, char *argv[]){ int flash_inited = 0; if (argc > 1 && strcmp(argv[1], "probe") == 0) { unsigned int addr = LOADER_FLASHBASE; if (argc > 2) addr = atoi(argv[2]); flash_probe(addr, 1, 1); goto flash_out; } else if (!flash_found()) { flash_inited = 1; flash_probe(LOADER_FLASHBASE, 0, 0); if (!flash_found()) { if (argc == 1 || strcmp(argv[1], "test") != 0) goto flash_out; } } if (argc == 1) { if (!flash_inited) {#ifndef CONFIG_DISABLE_HELP_MSGS uart_puts(s_help_flash_brief); uart_puts(s_help_flash);#else uart_puts(no_help_msg);#endif } goto flash_out; } if (strcmp(argv[1], "list") == 0) { flash_list(NULL); } else if (strcmp(argv[1], "boot") == 0 || strcmp(argv[1], "romfs") == 0 #ifdef ENABLE_ENCRYPTED_OPT_ROM || strcmp(argv[1], "romfscrypt1") == 0 || strcmp(argv[1], "romfscrypt2") == 0 || strcmp(argv[1], "romfscrypt3") == 0 || strcmp(argv[1], "romfscrypt4") == 0#endif #ifdef ENABLE_SIGNED_OPT_ROM || strcmp(argv[1], "romfssign1") == 0 || strcmp(argv[1], "romfssign2") == 0 || strcmp(argv[1], "romfssign3") == 0 || strcmp(argv[1], "romfssign4") == 0#endif #ifdef CONFIG_ENABLE_2NDBOOT || strcmp(argv[1], "2ndboot") == 0#endif#ifdef CONFIG_ENABLE_USERPREF || strcmp(argv[1], "userpref") == 0#endif ) { int target = 0; unsigned int flashaddr = 0; unsigned int ramaddr = 0; unsigned int start, end, blocksize; if (argv[1][0] == 'b') { target = DOWNLOAD_BOOT; flashaddr = LOADER_FLASHBASE; } else if (argv[1][0] == 'r') { target = DOWNLOAD_ROMFS; flashaddr = LOADER_FLASH_ROMFSADDR;#ifdef ENABLE_ENCRYPTED_OPT_ROM if( strcmp(argv[1], "romfscrypt1") == 0 ){ flashaddr= ENCRYPTED_OPT_ROM1_ADDR; }else if( strcmp(argv[1], "romfscrypt2") == 0 ){ flashaddr = ENCRYPTED_OPT_ROM2_ADDR; }else if( strcmp(argv[1], "romfscrypt3") == 0 ){ flashaddr = ENCRYPTED_OPT_ROM3_ADDR; }else if( strcmp(argv[1], "romfscrypt4") == 0 ){ flashaddr = ENCRYPTED_OPT_ROM4_ADDR; }#endif /* ENABLE_ENCRYPTED_OPT_ROM */#ifdef ENABLE_SIGNED_OPT_ROM if( strcmp(argv[1], "romfssign1") == 0 ){ flashaddr= SIGNED_OPT_ROM1_ADDR; }else if( strcmp(argv[1], "romfssign2") == 0 ){ flashaddr = SIGNED_OPT_ROM2_ADDR; }else if( strcmp(argv[1], "romfssign3") == 0 ){ flashaddr = SIGNED_OPT_ROM3_ADDR; }else if( strcmp(argv[1], "romfssign4") == 0 ){ flashaddr = SIGNED_OPT_ROM4_ADDR; }#endif /* ENABLE_SIGNED_OPT_ROM */ }#ifdef CONFIG_ENABLE_2NDBOOT else if (argv[1][0] == '2') { target = DOWNLOAD_2NDBOOT; flashaddr = LOADER_FLASH_STAGE2ADDR; }#endif#ifdef CONFIG_ENABLE_USERPREF else if (argv[1][0] == 'u') { target = DOWNLOAD_USERPREF; /* Use last 64KB */ flashaddr = LOADER_FLASHBASE + flash_getsize() - MAX_USERPREF_SIZE; }#endif ramaddr = g_download_info[target].addr; if (!g_download_info[target].download) uart_printf(dl_ram_msg, "binary image"); else { if (g_download_info[target].len > flash_getsize()) { uart_puts("The image is too big (parallel flash).\n"); goto flash_out; } if (target == DOWNLOAD_BOOT) { // check signature loaderconfig_t *pconfig = (loaderconfig_t *) ramaddr; if (pconfig->signature != LOADER_CONFIGSIGN) { uart_puts("Invalid boot loader image (parallel flash)\n"); goto flash_out; } } else if (target == DOWNLOAD_ROMFS) { if (g_download_info[target].len > (MAX_ROMFS_SIZE << 10)) { uart_puts("ROMFS image is too big.\n"); goto flash_out; }#ifdef ENABLE_ENCRYPTED_OPT_ROM /* Additional checks for optional encrypted romfs */#define CHECK_ENCRYPTED_OPT_ROM(addr, size); \ if ((flashaddr == (addr)) && (g_download_info[target].len > (size))) { \ uart_puts("ROMFS image is too big.\n"); \ goto flash_out; \ } CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_ROM0_ADDR, ENCRYPTED_ROM0_SIZE); CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM1_ADDR, ENCRYPTED_OPT_ROM1_SIZE); CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM2_ADDR, ENCRYPTED_OPT_ROM2_SIZE); CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM3_ADDR, ENCRYPTED_OPT_ROM3_SIZE); CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM4_ADDR, ENCRYPTED_OPT_ROM4_SIZE);#endif /* ENABLE_ENCRYPTED_OPT_ROM */#ifdef ENABLE_SIGNED_OPT_ROM /* Additional checks for optional signed romfs */#define CHECK_SIGNED_OPT_ROM(addr, size); \ if ((flashaddr == (addr)) && (g_download_info[target].len > (size))) { \ uart_puts("ROMFS image is too big.\n"); \ goto flash_out; \ } CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM1_ADDR, SIGNED_OPT_ROM1_SIZE); CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM2_ADDR, SIGNED_OPT_ROM2_SIZE); CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM3_ADDR, SIGNED_OPT_ROM3_SIZE); CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM4_ADDR, SIGNED_OPT_ROM4_SIZE);#endif /* ENABLE_SIGNED_OPT_ROM */ }#ifdef CONFIG_ENABLE_2NDBOOT else if (target == DOWNLOAD_2NDBOOT) { unsigned long *ptr = (unsigned long *)(ramaddr + CFG_2NDBOOT); if (*ptr != LOADER_CONFIGSIGN) { /* It still might be an encrypted image */ ptr = (unsigned long *)(ramaddr + g_download_info[target].len - 8); if (*ptr != LOADER_CONFIGSIGN){ uart_puts("Invalid 2ndboot loader image\n"); goto flash_out; } } }#endif#ifdef CONFIG_ENABLE_USERPREF else if (target == DOWNLOAD_USERPREF) { if (g_download_info[target].len > MAX_USERPREF_SIZE) { uart_puts("userpref image is too big.\n"); goto flash_out; } }#endif uart_printf("Writing data on RAM 0x%08x to flash 0x%08x\n", ramaddr, flashaddr); flash_calcblock(flashaddr, &start, &blocksize); flash_calcblock(flashaddr + g_download_info[target].len - 1, &end, &blocksize); end += blocksize - 1; uart_printf(" 0x%08x - 0x%08x will be erased\n", start, end); uart_printf(" 0x%08x - 0x%08x will be written\n", flashaddr, flashaddr + g_download_info[target].len - 1); #ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "ERASING", FIP_LEFT); #endif uart_puts("Erasing : "); flash_erase_region(flashaddr, g_download_info[target].len); //flash_erase_region(0x46000000+0x380000, 0x80000); //goto flash_out; #ifdef SET_SERVER_IP_FOR_DOWNLOAD fip_write_text(0, fiptext = "WRITING", FIP_LEFT); #endif uart_puts("\nWriting : "); flash_write_data(flashaddr, (unsigned char *) ramaddr, g_download_info[target].len); uart_printf("\nVerifying (flash 0x%08x, RAM 0x%08x, size %d) : ", flashaddr, ramaddr, g_download_info[target].len); #ifdef SET_SERVER_IP_FOR_DOWNLOAD { int err_cmp; err_cmp=memcmp((const void *)flashaddr, (const void *)ramaddr, g_download_info[target].len); if(err_cmp==0){ fip_write_text(0, fiptext = "WRITE OK", FIP_CENTER); uart_puts("OK."); } else{ fip_write_text(0, fiptext = "WRITE ERR", FIP_CENTER); uart_puts("Failed."); } } #else uart_puts((memcmp((const void *)flashaddr, (const void *)ramaddr, g_download_info[target].len) == 0) ? "OK." : "Failed."); #endif uart_puts("\n"); } } #ifdef CONFIG_ENABLE_FULLFUNCTION else if (strcmp(argv[1], "erase") == 0) { char str[128]; unsigned int addr, start, end, len = 0, blocksize; if (argc == 2) { uart_puts("Specify address and length to erase\n"); goto flash_out; } addr = atoi(argv[2]); if (argc > 3) len = atoi(argv[3]); flash_calcblock(addr, &start, &blocksize); if (len == 0) end = start + blocksize - 1; else { flash_calcblock(addr + len - 1, &end, &blocksize); end += blocksize - 1; } uart_printf("This will erase 0x%08x - 0x%08x. Are you sure? (y/N) ", start, end); uart_gets(str, sizeof str, 0); if (str[0] == 'Y' || str[0] == 'y') { uart_puts("Erasing : "); if (len == 0) flash_erase_oneblock(start); else flash_erase_region(start, len); uart_puts("\n"); } } else if (strcmp(argv[1], "eraseall") == 0) { char str[128]; uart_puts("This will erase entire flash. Are you sure? (y/N) "); uart_gets(str, sizeof str, 0); if (str[0] == 'Y' || str[0] == 'y') { uart_puts("Erasing : "); flash_erase_all(); uart_puts("\n"); } } else if (strcmp(argv[1], "writeb") == 0) { unsigned int addr, data; if (argc < 4) { uart_puts(flashw_msg); goto flash_out; } addr = atoi(argv[2]); data = atoi(argv[3]); uart_printf("%08x : %02x => ", addr, *(volatile unsigned char *) addr); if (flash_write_onebyte(addr, data) != 0) uart_puts("(FAULT) "); uart_printf("%02x\n", *(volatile unsigned char *) addr); } else if (strcmp(argv[1], "writew") == 0) { unsigned int addr, data; if (argc < 4) { uart_puts(flashw_msg); goto flash_out; } addr = atoi(argv[2]) & ~0x01; data = atoi(argv[3]); uart_printf("%08x : %04x => ", addr, *(volatile unsigned short *) addr); if (flash_write_oneword(addr, data) != 0) uart_puts("(FAULT) "); uart_printf("%04x\n", *(volatile unsigned short *) addr); } else if (strcmp(argv[1], "write") == 0) { unsigned int to, from, len; if (argc < 5) { uart_puts(flashw_msg); goto flash_out; } to = atoi(argv[2]); from = atoi(argv[3]); len = atoi(argv[4]); uart_puts("Writing : "); if (flash_write_data(to, (unsigned char *) from, len) != 0) uart_puts("Erase first before writing"); uart_puts("\n"); } else if (strcmp(argv[1], "test") == 0) { flash_test(argc - 2, argv + 2); } #endif else uart_puts("Invalid command\n"); flash_out: return 0;}#endif#ifdef CONFIG_ENABLE_IDEint bootmenu_ide_checkdrive(char *str, int flag, int exist){ int drive; if (str == NULL) uart_puts("Specify drive (0/1)\n"); else { d
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -