📄 bootmenu.c
字号:
strcat(buf, ".gz"); if (ipv4_tftp(g_bootconfig.server, buf, addr, &len) == 0) { uart_printf(recv_msg, len, len, addr); if (gzipped) { uart_printf(unzip_msg, origaddr); len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip); } g_download_info[target].download = 1; g_download_info[target].len = len; } }#endif#ifdef CONFIG_ENABLE_USERPREF#ifdef CONFIG_ENABLE_VSYNCPARAM#ifdef CONFIG_ENABLE_FLASH else if ((strcmp(argv[1], "flash") == 0) && (target == DOWNLOAD_VSYNCPARAM)) { if (doload_vsyncparam(g_download_info[target].addr, 1) != 0) g_download_info[target].download = 1; else uart_puts("Invalid vsync image\n"); goto download_out; }#endif#endif#endif else { uart_puts("Unknown media\n"); goto download_out; } if (g_download_info[target].len > 0) uart_printf("Checksum: 0x%x\n", checksum = binfile_crc_check((void *)g_download_info[target].addr, g_download_info[target].len)); else goto download_out; if ((target == DOWNLOAD_INSTFILE) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_installablefile(g_download_info[target].addr, g_download_info[target].len, 0, 0) == 0)) uart_puts("Invalid installable file.\n"); g_download_info[target].download = 0; /* Free it up for further download */ g_download_info[target].len = 0; } #ifdef CONFIG_ENABLE_IRQHANDLER if ((target == DOWNLOAD_IRQHANDLER) && (g_download_info[target].len > 0)) {#ifdef CONFIG_ENABLE_VSYNCPARAM if (g_download_info[DOWNLOAD_VSYNCPARAM].download == 0) { uart_puts("No VSYNC parameters loaded: blank structure.\n"); /* clear 32KB */ memset((void *) g_download_info[DOWNLOAD_VSYNCPARAM].addr, 0, MAX_USERPREF_SIZE/2); g_download_info[DOWNLOAD_VSYNCPARAM].download = 1; }#endif if ((checksum != 0) || (doload_irqhandler(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid IRQ handler.\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } }#endif#ifdef CONFIG_ENABLE_UCODES /* Assume ucode file only use top reserved area in DRAM0 */ if ((target == DOWNLOAD_UCODE) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_ucode(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid ucode image\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endif#ifdef CONFIG_ENABLE_BITMAPS if ((target == DOWNLOAD_BITMAP) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_bitmap(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid bitmap\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endif#ifdef CONFIG_ENABLE_DVI if ((target == DOWNLOAD_DVI) && (g_download_info[target].len > 0)) { if ((checksum != 0) || (doload_dvi(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) { uart_puts("Invalid dvi\n"); g_download_info[target].download = 0; g_download_info[target].len = 0; } } #endifdownload_out: return 0;}#ifdef CONFIG_ARCH_TANGO15#ifdef CONFIG_ENABLE_FULLFUNCTIONvoid mac_subwrite(int argc, char *argv[]){ unsigned char buffer[256]; unsigned int addr=I2C_EEPROM_WRITE_ADDR, saddr=0, len=8; int i; if(argc>2) saddr = atoi(argv[2]); if(argc>3) len = atoi(argv[3]); for(i=0;i<len;i++) { if (argc > (i+4)) buffer[i] = htoi(argv[i+4]); else break; } for(i=0;i<len;i++) uart_printf("%02x ",buffer[i]); uart_printf("\naddr=0x%x, subaddr=0x%x, len=0x%x\n",addr, saddr, len); hwi2c_write(addr, saddr, &buffer[0], len, 20); em86xx_msleep(100); // always read the remaining 256-(saddr+len) bytes if (hwi2c_read_no_subaddr(addr, &buffer[saddr+len], 256-(saddr+len), 200) != 0) uart_printf("mac subwrite error: hwi2c_read_no_subaddr\n");}void mac_dump(int argc, char *argv[]){ unsigned char buffer[256]; unsigned int addr=I2C_EEPROM_READ_ADDR, len=256; int i; memset(buffer, 0xff, sizeof(buffer)); if (hwi2c_read_no_subaddr(addr, &buffer[0], len, 200) != 0) { /* ERROR */ uart_printf("mac dump error\n"); } else { /* We have the first 8 bytes in buffer */ uart_printf("0x00: "); for(i=0;i<len;i++) { uart_printf("%02x ",buffer[i]); if((i&0xf) == 0xf) uart_printf("\n0x%02x: ",i+1); } uart_printf("\n"); }}#endif //#ifdef CONFIG_ENABLE_FULLFUNCTION#ifdef CONFIG_ENABLE_NETWORK_TANGO15#define SIGN 0x5astatic unsigned int mac_offset=0;int mac_read(char *bufr){ unsigned char buf[256]; unsigned char sum=0; unsigned int offset; int i;#ifdef BOOTLOADER offset = mac_offset;#else offset = 0;#endif hwi2c_read_no_subaddr(I2C_EEPROM_READ_ADDR, buf, 256, 20); for(i=0;i<8;i++) sum += buf[offset+i]; if( (sum ==0) && (buf[offset+6] == SIGN) ) { memcpy(bufr,&buf[offset],8); return 0; } 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; unsigned char buffer[256]; 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(I2C_EEPROM_WRITE_ADDR, 0, &bufw[0], 8, 20); em86xx_msleep(100); // always read the remaining 248 bytes if (hwi2c_read_no_subaddr(addr, &buffer[8], 248, 200) != 0) uart_printf("mac write error: hwi2c_read_no_subaddr\n");// 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 //TANGO15#endif /* CONFIG_ENABLE_NETWORK_TANGO15 */#ifdef CONFIG_BOOTMENU_BISTstatic int do_bist(const struct bist_entry *entry){ register unsigned int i; unsigned int mask = 0, pass = 0; unsigned int save_regs[32]; unsigned int org_status, busy; unsigned int addr = entry->addr; unsigned int bist_mask = entry->mask; int timeout; /* Save original status before BIST starts */ org_status = __raw_readl(addr + G2L_RESET_CONTROL); if (addr == REG_BASE_dram_controller_0) { for (i = 0; i < DRAM_REGS; i++) save_regs[i] = __raw_readl(REG_BASE_dram_controller_0 + DRAM_dunit_cfg + (i<<2)); } else if (addr == REG_BASE_host_interface) { for (i = 0; i < PBI_REGS; i++) save_regs[i] = __raw_readl(REG_BASE_host_interface + PB_timing0 + (i<<2)); } else if (addr == REG_BASE_display_block) { save_regs[0] = __raw_readl(REG_BASE_system_block + SYS_avclk_mux); save_regs[1] = __raw_readl(REG_BASE_system_block + SYS_clkgen1_pll); save_regs[2] = __raw_readl(REG_BASE_system_block + SYS_clkgen1_div); __raw_writel(3, REG_BASE_display_block + G2L_RESET_CONTROL); __raw_writel(2, REG_BASE_display_block + G2L_RESET_CONTROL); __raw_writel(0x800000, REG_BASE_display_block + VO_reset_datapath); __raw_writel(0x800000, REG_BASE_display_block + VO_run); __raw_writel(1, REG_BASE_display_block + 0x3d00); __raw_writel(0x01010020, REG_BASE_system_block + SYS_clkgen1_pll); /* 306MHz */ __raw_writel(0x202, REG_BASE_system_block + SYS_clkgen1_div); /* PLL1_1 = PLL1_2 = 153MHz */ __raw_writel(0xbbba, REG_BASE_system_block + SYS_avclk_mux); em86xx_msleep(30); // wait until PLL gets stable }#if (DEFAULT_DRAM1_SIZE != 0) else if (addr == REG_BASE_dram_controller_1) { for (i = 0; i < DRAM_REGS; i++) save_regs[i] = __raw_readl(REG_BASE_dram_controller_1 + DRAM_dunit_cfg + (i<<2)); }#endif uart_printf("BIST(0x%lx, %s): ", addr, entry->name); if ((addr == REG_BASE_cpu_block) || (addr == REG_BASE_system_block) || (addr == REG_BASE_dram_controller_0)) { uart_printf(" => Skipped (used by bootmenu)\n"); return 0; } __raw_writel(1, addr + G2L_RESET_CONTROL); mask = __raw_readl(addr + G2L_BIST_MASK) & ~bist_mask; /* Start BIST */ __raw_writel(0x80000000, addr + G2L_BIST_BUSY); /* Max. wait for 1 second */ for (timeout = 0; timeout < BIST_TIMEOUT; timeout++, em86xx_msleep(1)) { busy = __raw_readl(addr + G2L_BIST_BUSY); if (((busy & 0x7fffffff) & (~bist_mask)) == 0) break; } pass = __raw_readl(addr + G2L_BIST_PASS) & ~bist_mask; __raw_writel(0, addr + G2L_BIST_BUSY); em86xx_msleep(10); if (timeout >= BIST_TIMEOUT) uart_printf("BUSY=0x%lx, MASK=0x%lx, PASS=0x%lx", (busy & 0x7fffffff) & (~bist_mask), mask, pass); else uart_printf("MASK=0x%lx, PASS=0x%lx", mask, pass); if (addr == REG_BASE_dram_controller_0) { for (i = 0; i < DRAM_REGS; i++) __raw_writel(save_regs[i], REG_BASE_dram_controller_0 + DRAM_dunit_cfg + (i<<2)); } else if (addr == REG_BASE_host_interface) { for (i = 0; i < PBI_REGS; i++) __raw_writel(save_regs[i], REG_BASE_host_interface + PB_timing0 + (i<<2)); } else if (addr == REG_BASE_display_block) { __raw_writel(save_regs[2], REG_BASE_system_block + SYS_clkgen1_div); __raw_writel(save_regs[1], REG_BASE_system_block + SYS_clkgen1_pll); __raw_writel(save_regs[0], REG_BASE_system_block + SYS_avclk_mux); em86xx_msleep(30); // wait until PLL gets stable }#if (DEFAULT_DRAM1_SIZE != 0) else if (addr == REG_BASE_dram_controller_1) { for (i = 0; i < DRAM_REGS; i++) __raw_writel(save_regs[i], REG_BASE_dram_controller_1 + DRAM_dunit_cfg + (i<<2)); }#endif __raw_writel(org_status, addr + G2L_RESET_CONTROL); em86xx_msleep(10); uart_printf(" => %s\n", (timeout >= BIST_TIMEOUT) ? "Timeout\07" : ((mask == pass) ? "Passed" : "Failed\07")); return(((timeout < BIST_TIMEOUT) && (mask == pass)) ? 0 : 1); /* 0=OK, 1=Failed */}int bootmenu_bist(int argc, char *argv[]){ int i; if (argc != 1) return 0; for (i = 0; bist_table[i].addr != 0; i++) do_bist(&bist_table[i]); return 0;}#endifint 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(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -