int modify_system_uart(void) { script_gpio_set_t fetch_cfg_gpio[2]; int uart_port_id = 0; char uartname[16] ; char uart_data[8] ; int sdc0_used = 0; if(script_parser_fetch("force_uart_para","force_uart_rx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find force_uart_rx \n"); return -1; } if(script_parser_fetch("force_uart_para","force_uart_tx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find force_uart_tx \n"); return -1; } if(script_parser_fetch("force_uart_para","force_uart_port",(int *)(&uart_port_id),sizeof(int)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } memset(uartname,0,16); memset(uart_data,0,8); #if defined (CONFIG_ARCH_SUN7I) ||defined(CONFIG_ARCH_SUN8IW1P1) strcat(uartname,"uart_para"); #else strcat(uartname,"uart"); #endif sprintf(uart_data,"%d",uart_port_id); strcat(uartname,uart_data); printf("the uartname is %s \n",uartname); if(script_parser_patch(uartname,"uart_port",(int *)(&uart_port_id),sizeof(int)/4)) { printf("debug_mode_error : can't find uart_debug_port \n"); return -1; } if(script_parser_patch(uartname,"uart_rx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_rx\n"); return -1; } if(script_parser_patch(uartname,"uart_tx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_rx\n"); return -1; } //disable card0 init in linux if(script_parser_patch("mmc0_para","sdc_used",(int *)(&sdc0_used),sizeof(int)/4)) { printf("debug_mode_error :can not patch sdc_used \n"); return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int power_oz_probe(void) { int ret; u32 oz_power_hd; user_gpio_set_t oz_gpio_cfg[1]; memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg)); ret = script_parser_fetch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int)); if(ret) { printf("get a15_pwr_en cfg failed\n"); return -1; } oz_gpio_cfg[0].data = 1; //配置使能gpio ret = script_parser_patch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int)); if(ret) { printf("patch a15_pwr_en config failed\n"); return -2; } oz_power_hd = gpio_request_simple("external_power", "a15_pwr_en"); if(oz_power_hd) { printf("set gpio failed\n"); return -3; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称:power_oz_patch_gpio * * 参数列表: * * 返回值 : * * 说明 :change the gpio data status in sys_config.fex with the vol input * * ************************************************************************************************************ */ static int power_oz_patch_gpio(int set_vol) { int ret; int i; u8 index; char sub_name[16]; user_gpio_set_t oz_gpio_cfg[3]; memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg)); ret = script_parser_fetch("external_power", "a15_vset1", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int)); if(ret) { printf("get oz power cfg failed\n"); return -1; } ret = script_parser_fetch("external_power", "a15_vset2", (int*)&oz_gpio_cfg[1], sizeof(oz_gpio_cfg[1])/sizeof(int)); if(ret) { printf("get oz power cfg failed\n"); return -1; } ret = script_parser_fetch("external_power", "a15_vset3", (int*)&oz_gpio_cfg[2], sizeof(oz_gpio_cfg[2])/sizeof(int)); if(ret) { printf("get oz power cfg failed\n"); return -1; } //get the gpio status with the set_vol index = power_oz_probe_gpio(set_vol); //配置gpio data for(i = 0; i < 3; i++) { oz_gpio_cfg[i].data = gpio_value[index][i]; memset(sub_name, 0, 16); sprintf(sub_name, "%s%d", "a15_vset", i+1); ret = script_parser_patch("external_power", sub_name, (void *)&oz_gpio_cfg[i], sizeof(oz_gpio_cfg[i])/sizeof(int)); if(ret) { printf("patch gpio config failed\n"); return -2; } } return 0; }
int sunxi_flash_handle_init(void) { int workmode; int storage_type; int card_no; // long long flash_size; // uboot_spare_head.boot_data.storage_type = 0; // if(uboot_spare_head.boot_data.storage_type) // uboot_spare_head.boot_data.work_mode = WORK_MODE_CARD_PRODUCT;//WORK_MODE_CARD_PRODUCT; workmode = uboot_spare_head.boot_data.work_mode; #if 1 printf("workmode = %d\n", workmode); debug("storage type = %d\n", uboot_spare_head.boot_data.storage_type); #endif if(workmode == WORK_MODE_BOOT || workmode == WORK_MODE_SPRITE_RECOVERY) { int nand_used, sdc0_used, sdc2_used, sdc_detmode=3; storage_type = uboot_spare_head.boot_data.storage_type; debug("storage type = %d\n", storage_type); if((storage_type == 1) || (storage_type == 2)) { if(2 == storage_type) { nand_used = 0; sdc2_used = 1; script_parser_patch("nand0_para", "nand0_used", &nand_used, 1); script_parser_patch("nand1_para", "nand1_used", &nand_used, 1); script_parser_patch("mmc2_para", "sdc_used", &sdc2_used, 1); script_parser_patch("mmc2_para", "sdc_detmode", &sdc_detmode, 1); } else { //nand_used = 0; sdc0_used = 1; //sdc2_used = 0; //script_parser_patch("nand0_para", "nand0_used", &nand_used, 1); //script_parser_patch("nand1_para", "nand1_used", &nand_used, 1); script_parser_patch("mmc0_para", "sdc_used", &sdc0_used, 1); script_parser_patch("mmc0_para", "sdc_detmode", &sdc_detmode, 1); //script_parser_patch("mmc2_para", "sdc_used", &sdc2_used, 1); } card_no = (storage_type == 1)?0:2; printf("MMC: %d\n", card_no); board_mmc_set_num(card_no); debug("set card number\n"); board_mmc_pre_init(card_no); debug("begin to find mmc\n"); mmc_boot = find_mmc_device(card_no); if(!mmc_boot){ printf("fail to find one useful mmc card\n"); return -1; } debug("try to init mmc\n"); if (mmc_init(mmc_boot)) { puts("MMC init failed\n"); return -1; } debug("mmc %d init ok\n", card_no); sunxi_flash_read_pt = sunxi_flash_mmc_read; sunxi_flash_write_pt = sunxi_flash_mmc_write; sunxi_flash_size_pt = sunxi_flash_mmc_size; sunxi_flash_exit_pt = sunxi_flash_mmc_exit; sunxi_flash_phyread_pt = sunxi_flash_mmc_phyread; sunxi_flash_phywrite_pt = sunxi_flash_mmc_phywrite; sunxi_sprite_phyread_pt = sunxi_flash_mmc_phyread; sunxi_sprite_phywrite_pt = sunxi_flash_mmc_phywrite; } else { nand_used = 1; sdc2_used = 0; script_parser_patch("nand0_para", "nand0_used", &nand_used, 1); script_parser_patch("nand1_para", "nand1_used", &nand_used, 1); script_parser_patch("mmc2_para", "sdc_used", &sdc2_used, 1); tick_printf("NAND: "); if (workmode == WORK_MODE_BOOT) { if(nand_uboot_init(1)) { tick_printf("nand init fail\n"); return -1; } } else if (workmode == WORK_MODE_SPRITE_RECOVERY) { if(nand_uboot_init(2)) { tick_printf("nand init fail\n"); return -1; } } //flash_size = nand_uboot_get_flash_size(); //flash_size <<= 9; //print_size(flash_size, "\n"); sunxi_flash_read_pt = sunxi_flash_nand_read; sunxi_flash_write_pt = sunxi_flash_nand_write; sunxi_flash_size_pt = sunxi_flash_nand_size; sunxi_flash_exit_pt = sunxi_flash_nand_exit; sunxi_flash_flush_pt = sunxi_flash_nand_flush; } sunxi_sprite_read_pt = sunxi_flash_read_pt; sunxi_sprite_write_pt = sunxi_flash_write_pt; sunxi_flash_init_uboot(0); script_parser_patch("target", "storage_type", &storage_type, 1); tick_printf("sunxi flash init ok\n"); #if defined(CONFIG_ARCH_SUN8IW1P1) if((storage_type == 0) || (storage_type == 2)) //如果是A31非卡0启动,则需要跳转检测卡0 { sunxi_card_probe_mmc0_boot(); } #endif if((storage_type == 0) ||(storage_type == 2)) { int sprite_next_work = 0; script_parser_fetch("card_boot","next_work",&sprite_next_work,1); if(sprite_next_work == SUNXI_UPDATA_NEXT_ACTION_SPRITE_TEST) sunxi_card_fill_boot0_magic(); } } else if((workmode & WORK_MODE_PRODUCT) || (workmode == 0x30)) /* 量产模式 */ { if(!nand_uboot_probe()) { printf("nand found\n"); sunxi_sprite_init_pt = sunxi_flash_nand_init; sunxi_sprite_exit_pt = sunxi_flash_nand_exit; sunxi_sprite_read_pt = sunxi_flash_nand_read; sunxi_sprite_write_pt = sunxi_flash_nand_write; sunxi_sprite_erase_pt = sunxi_flash_nand_erase; sunxi_sprite_size_pt = sunxi_flash_nand_size; sunxi_sprite_flush_pt = sunxi_flash_nand_flush; sunxi_sprite_force_erase_pt = sunxi_flash_nand_force_erase; debug("sunxi sprite has installed nand function\n"); uboot_spare_head.boot_data.storage_type = 0; if(workmode == 0x30) { if(sunxi_sprite_init(1)) { tick_printf("nand init fail\n"); return -1; } } } #ifdef CONFIG_SUNXI_SPINOR else if(!try_spi_nor(0)) //burn nor { printf("try nor successed \n"); sunxi_sprite_init_pt = sunxi_flash_spinor_init; sunxi_sprite_exit_pt = sunxi_flash_spinor_exit; sunxi_sprite_read_pt = sunxi_flash_spinor_read; sunxi_sprite_write_pt = sunxi_sprite_spinor_write; sunxi_sprite_erase_pt = sunxi_flash_spinor_erase; sunxi_sprite_size_pt = sunxi_flash_spinor_size; sunxi_sprite_flush_pt = sunxi_flash_spinor_flush; sunxi_sprite_datafinish_pt = sunxi_flash_spinor_datafinish; printf("sunxi sprite has installed spi function\n"); uboot_spare_head.boot_data.storage_type = 3; } #endif else /* burn sdcard 2 */ { printf("try nand fail\n"); board_mmc_pre_init(2); mmc_sprite = find_mmc_device(2); if(!mmc_sprite){ printf("fail to find one useful mmc card\n"); return -1; } if (mmc_init(mmc_sprite)) { puts("MMC init failed\n"); return -1; } sunxi_sprite_init_pt = sunxi_sprite_mmc_init; sunxi_sprite_exit_pt = sunxi_sprite_mmc_exit; sunxi_sprite_read_pt = sunxi_sprite_mmc_read; sunxi_sprite_write_pt = sunxi_sprite_mmc_write; sunxi_sprite_erase_pt = sunxi_sprite_mmc_erase; sunxi_sprite_size_pt = sunxi_sprite_mmc_size; sunxi_sprite_phyread_pt = sunxi_sprite_mmc_phyread; sunxi_sprite_phywrite_pt = sunxi_sprite_mmc_phywrite; sunxi_sprite_force_erase_pt = sunxi_sprite_mmc_force_erase; debug("sunxi sprite has installed sdcard2 function\n"); uboot_spare_head.boot_data.storage_type = 2; } if((workmode == WORK_MODE_CARD_PRODUCT) || (workmode == 0x30)) //sdcard burn mode { board_mmc_pre_init(0); mmc_boot = find_mmc_device(0); if(!mmc_boot) { printf("fail to find one useful mmc card\n"); return -1; } if (mmc_init(mmc_boot)) { puts("MMC sprite init failed\n"); return -1; } else { puts("mmc init ok\n"); } sunxi_flash_init_pt = sunxi_flash_mmc_init; sunxi_flash_read_pt = sunxi_flash_mmc_read; sunxi_flash_write_pt = sunxi_flash_mmc_write; sunxi_flash_size_pt = sunxi_flash_mmc_size; sunxi_flash_phyread_pt = sunxi_flash_mmc_phyread; sunxi_flash_phywrite_pt = sunxi_flash_mmc_phywrite; sunxi_flash_exit_pt = sunxi_flash_mmc_exit; } sunxi_flash_init_uboot(0); } else if(workmode & WORK_MODE_UPDATE) /* 升级模式 */ { } else /* undefined mode */ { } return 0; }
/* ************************************************************************************************************ * * function * * name : modify_uboot_uart * * parmeters : * * return : * * note : [email protected] * * ************************************************************************************************************ */ int modify_uboot_uart(void) { script_gpio_set_t fetch_cfg_gpio[2]; u32 reg = 0; int uart_port_id = 0; //disable uart0 if(script_parser_fetch("uart_para","uart_debug_rx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find card0_rx \n"); return -1; } fetch_cfg_gpio[0].mul_sel = 0; if(script_parser_patch("uart_para","uart_debug_rx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_rx\n"); return -1; } //config uart_tx if(script_parser_fetch("uart_para","uart_debug_tx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } fetch_cfg_gpio[1].mul_sel = 0; if(script_parser_patch("uart_para","uart_debug_tx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_tx\n"); return -1; } //disable uart0 gpio_request_simple("uart_para",NULL); //port_id if(script_parser_fetch("force_uart_para","force_uart_port",(int *)(&uart_port_id),sizeof(int)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } if(script_parser_patch("uart_para","uart_debug_port",(int *)(&uart_port_id),sizeof(int)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } if(script_parser_fetch("force_uart_para","force_uart_tx",(int *)(&fetch_cfg_gpio[0]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } if(script_parser_patch("uart_para","uart_debug_tx",(void*)&fetch_cfg_gpio[0],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_tx\n"); return -1; } if(script_parser_fetch("force_uart_para","force_uart_rx",(int *)(&fetch_cfg_gpio[1]),sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error: can't find card0_tx \n"); return -1; } if(script_parser_patch("uart_para","uart_debug_rx",(void*)&fetch_cfg_gpio[1],sizeof(script_gpio_set_t)/4)) { printf("debug_mode_error : can't patch uart_debug_tx\n"); return -1; } printf("uart_port_id = %d\n",uart_port_id); uboot_spare_head.boot_data.uart_port = uart_port_id; //reset #ifdef UART_RST_CTRL reg = readl(UART_RST_CTRL); reg &= ~(1 << (16 + uart_port_id)); reg |= (1 << (16 + uart_port_id)); writel(reg,UART_RST_CTRL); #endif //gate reg = readl(UART_GATE_CTRL); reg &= ~(1 << (16 + uart_port_id)); reg |= (1 << (16 + uart_port_id)); writel(reg,UART_GATE_CTRL); //enable card0 gpio_request_simple("uart_para",NULL); serial_init(); return 0; }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int dram_init(void) { uint *addr; //gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); //memcpy((void *)BOOT_STANDBY_DRAM_PARA_ADDR, uboot_spare_head.boot_data.dram_para, 32 * 4); //add by jerry addr = (uint *)uboot_spare_head.boot_data.dram_para; #if defined CONFIG_FPGA gd->ram_size = 512 * 1024 *1024 ; #else if(addr[4]) { gd->ram_size = (addr[4] & 0xffff) * 1024 * 1024; } else { gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); } #endif puts("dram_para_set start\n"); script_parser_patch("dram_para", "dram_clk", &addr[0], 1); script_parser_patch("dram_para", "dram_type", &addr[1], 1); script_parser_patch("dram_para", "dram_zq", &addr[2], 1); script_parser_patch("dram_para", "dram_odt_en", &addr[3], 1); script_parser_patch("dram_para", "dram_para1", &addr[4], 1); script_parser_patch("dram_para", "dram_para2", &addr[5], 1); script_parser_patch("dram_para", "dram_mr0", &addr[6], 1); script_parser_patch("dram_para", "dram_mr1", &addr[7], 1); script_parser_patch("dram_para", "dram_mr2", &addr[8], 1); script_parser_patch("dram_para", "dram_mr3", &addr[9], 1); script_parser_patch("dram_para", "dram_tpr0", &addr[10], 1); script_parser_patch("dram_para", "dram_tpr1", &addr[11], 1); script_parser_patch("dram_para", "dram_tpr2", &addr[12], 1); script_parser_patch("dram_para", "dram_tpr3", &addr[13], 1); script_parser_patch("dram_para", "dram_tpr4", &addr[14], 1); script_parser_patch("dram_para", "dram_tpr5", &addr[15], 1); script_parser_patch("dram_para", "dram_tpr6", &addr[16], 1); script_parser_patch("dram_para", "dram_tpr7", &addr[17], 1); script_parser_patch("dram_para", "dram_tpr8", &addr[18], 1); script_parser_patch("dram_para", "dram_tpr9", &addr[19], 1); script_parser_patch("dram_para", "dram_tpr10", &addr[20], 1); script_parser_patch("dram_para", "dram_tpr11", &addr[21], 1); script_parser_patch("dram_para", "dram_tpr12", &addr[22], 1); script_parser_patch("dram_para", "dram_tpr13", &addr[23], 1); puts("dram_para_set end\n"); return 0; }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int dram_init(void) { uint *addr; //gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); memcpy((void *)BOOT_STANDBY_DRAM_PARA_ADDR, uboot_spare_head.boot_data.dram_para, 32 * 4); //add by jerry addr = (uint *)uboot_spare_head.boot_data.dram_para; if(addr[10]) { gd->ram_size = (addr[10] & 0xffff) * 1024 * 1024; } else { gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); } puts("dram_para_set start\n"); script_parser_patch("dram_para", "dram_baseaddr", &addr[0], 1); script_parser_patch("dram_para", "dram_clk", &addr[1], 1); script_parser_patch("dram_para", "dram_type", &addr[2], 1); script_parser_patch("dram_para", "dram_rank_num", &addr[3], 1); script_parser_patch("dram_para", "dram_chip_density", &addr[4], 1); script_parser_patch("dram_para", "dram_io_width", &addr[5], 1); script_parser_patch("dram_para", "dram_bus_width", &addr[6], 1); script_parser_patch("dram_para", "dram_cas", &addr[7], 1); script_parser_patch("dram_para", "dram_zq", &addr[8], 1); script_parser_patch("dram_para", "dram_odt_en", &addr[9], 1); script_parser_patch("dram_para", "dram_size", &addr[10], 1); script_parser_patch("dram_para", "dram_tpr0", &addr[11], 1); script_parser_patch("dram_para", "dram_tpr1", &addr[12], 1); script_parser_patch("dram_para", "dram_tpr2", &addr[13], 1); script_parser_patch("dram_para", "dram_tpr3", &addr[14], 1); script_parser_patch("dram_para", "dram_tpr4", &addr[15], 1); script_parser_patch("dram_para", "dram_tpr5", &addr[16], 1); script_parser_patch("dram_para", "dram_emr1", &addr[17], 1); script_parser_patch("dram_para", "dram_emr2", &addr[18], 1); script_parser_patch("dram_para", "dram_emr3", &addr[19], 1); puts("dram_para_set end\n"); return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * int set_vol: not using * int onoff: not using * 返回值 : * * 说明 :根据sys_config.fex 配置进行设置电压, 先设置电压,在使能或者关闭 * * ************************************************************************************************************ */ int power_oz_set_dcdc(int set_vol, int onoff) { int ret; u32 oz_power_hd; user_gpio_set_t oz_gpio_cfg[1]; //配置输出电压 if(set_vol > 0) { ret = power_oz_patch_gpio(set_vol); if(ret) { printf("oz power patch config failed\n"); return -1; } oz_power_hd = gpio_request_simple("external_power", "a15_vset1"); if(oz_power_hd) { printf("set gpio failed\n"); return -3; } oz_power_hd = gpio_request_simple("external_power", "a15_vset2"); if(oz_power_hd) { printf("set gpio failed\n"); return -3; } oz_power_hd = gpio_request_simple("external_power", "a15_vset3"); if(oz_power_hd) { printf("set gpio failed\n"); return -3; } } if(onoff < 0) { return 0; } memset(oz_gpio_cfg, 0, sizeof(oz_gpio_cfg)); ret = script_parser_fetch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int)); if(ret) { printf("get a15_pwr_en cfg failed\n"); return -1; } if(onoff == 0) { oz_gpio_cfg[0].data = 0; } else { oz_gpio_cfg[0].data = 1; } //配置使能gpio ret = script_parser_patch("external_power", "a15_pwr_en", (int*)&oz_gpio_cfg[0], sizeof(oz_gpio_cfg[0])/sizeof(int)); if(ret) { printf("patch a15_pwr_en config failed\n"); return -2; } oz_power_hd = gpio_request_simple("external_power", "a15_pwr_en"); if(oz_power_hd) { printf("set gpio failed\n"); return -3; } return 0; }
void board_init_r(gd_t *id, ulong dest_addr) { char *s; bd_t *bd; ulong malloc_start; #if !defined(CONFIG_SYS_NO_FLASH) ulong flash_size; #endif gd = id; bd = gd->bd; gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ monitor_flash_len = _end_ofs; /* Enable caches */ enable_caches(); // debug("monitor flash len: %08lX\n", monitor_flash_len); #ifdef CONFIG_ALLWINNER #ifdef DEBUG // printf("sunxi script init\n"); #endif sw_gpio_init(); if(script_parser_fetch("target", "storage_type", &storage_type, sizeof(int))) storage_type = 0; if((storage_type <= 0) || (storage_type > 2)) { int used; used = 1; script_parser_patch("nand_para", "nand_used", &used, 1); used = 0; script_parser_patch("mmc2_para", "sdc_used", &used, 1); storage_type = 0; } else if(1 == storage_type) { mmc_card_no = 0; } else { int used; used = 0; script_parser_patch("nand_para", "nand_used", &used, 1); used = 1; script_parser_patch("mmc2_para", "sdc_used", &used, 1); mmc_card_no = 2; } #ifdef DEBUG { int used; printf("test storage_type=%d, mmc_card_no=%d\n", storage_type, mmc_card_no); if(!script_parser_fetch("nand_para", "nand_used", &used, sizeof(int))) { printf("nand_para nand_used = %d\n", used); } if(!script_parser_fetch("mmc2_para", "sdc_used", &used, sizeof(int))) { printf("mmc2_para sdc_used = %d\n", used); } printf("test over\n"); } #endif if(script_parser_fetch("uart_para", "uart_debug_port", &uart_console, sizeof(int))) uart_console = 0; #endif board_init(); /* Setup chipselects */ #ifdef CONFIG_SERIAL_MULTI serial_initialize(); #endif debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); #ifdef CONFIG_LOGBUFFER logbuff_init_ptrs(); #endif #ifdef CONFIG_POST post_output_backlog(); #endif /* The Malloc area is immediately below the monitor copy in DRAM */ malloc_start = dest_addr - TOTAL_MALLOC_LEN; mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN); #if !defined(CONFIG_SYS_NO_FLASH) puts("Flash: "); flash_size = flash_init(); if (flash_size > 0) { # ifdef CONFIG_SYS_FLASH_CHECKSUM print_size(flash_size, ""); /* * Compute and print flash CRC if flashchecksum is set to 'y' * * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX */ s = getenv("flashchecksum"); if (s && (*s == 'y')) { printf(" CRC: %08X", crc32(0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size)); } putc('\n'); # else /* !CONFIG_SYS_FLASH_CHECKSUM */ print_size(flash_size, "\n"); # endif /* CONFIG_SYS_FLASH_CHECKSUM */ } else { puts(failed); hang(); } #endif #ifdef CONFIG_ALLWINNER if(!storage_type){ puts("NAND: "); nand_init(); /* go init the NAND */ } else{ puts("MMC: "); mmc_initialize(bd); } sunxi_flash_handle_init(); sunxi_partition_init(); #else #if defined(CONFIG_CMD_NAND) if(!storage_type){ puts("NAND: "); nand_init(); /* go init the NAND */ } #endif/*CONFIG_CMD_NAND*/ #if defined(CONFIG_GENERIC_MMC) if(storage_type){ puts("MMC: "); mmc_initialize(bd); } #endif/*CONFIG_GENERIC_MMC*/ #endif/*CONFIG_ALLWINNER*/ #if defined(CONFIG_CMD_ONENAND) onenand_init(); #endif #ifdef CONFIG_HAS_DATAFLASH AT91F_DataflashInit(); dataflash_print_info(); #endif /* initialize environment */ env_relocate(); #if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI) arm_pci_init(); #endif /* IP Address */ gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); stdio_init(); /* get the devices list going. */ jumptable_init(); #if defined(CONFIG_API) /* Initialize API */ api_init(); #endif console_init_r(); /* fully init console as a device */ #if defined(CONFIG_ARCH_MISC_INIT) /* miscellaneous arch dependent initialisations */ arch_misc_init(); #endif #if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r(); #endif /* set up exceptions */ interrupt_init(); /* enable exceptions */ enable_interrupts(); /* Perform network card initialisation if necessary */ #if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96) /* XXX: this needs to be moved to board init */ if (getenv("ethaddr")) { uchar enetaddr[6]; eth_getenv_enetaddr("ethaddr", enetaddr); smc_set_mac_addr(enetaddr); } #endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */ /* Initialize from environment */ s = getenv("loadaddr"); if (s != NULL) load_addr = simple_strtoul(s, NULL, 16); #if defined(CONFIG_CMD_NET) s = getenv("bootfile"); if (s != NULL) copy_filename(BootFile, s, sizeof(BootFile)); #endif #ifdef BOARD_LATE_INIT board_late_init(); #endif #ifdef CONFIG_BITBANGMII bb_miiphy_init(); #endif #if defined(CONFIG_CMD_NET) #if defined(CONFIG_NET_MULTI) puts("Net: "); #endif eth_initialize(gd->bd); #if defined(CONFIG_RESET_PHY_R) debug("Reset Ethernet PHY\n"); reset_phy(); #endif #endif #ifdef CONFIG_POST post_run(NULL, POST_RAM | post_bootmode_get(0)); #endif #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) /* * Export available size of memory for Linux, * taking into account the protected RAM at top of memory */ { ulong pram; uchar memsz[32]; #ifdef CONFIG_PRAM char *s; s = getenv("pram"); if (s != NULL) pram = simple_strtoul(s, NULL, 10); else pram = CONFIG_PRAM; #else pram = 0; #endif #ifdef CONFIG_LOGBUFFER #ifndef CONFIG_ALT_LB_ADDR /* Also take the logbuffer into account (pram is in kB) */ pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024; #endif #endif sprintf((char *)memsz, "%ldk", (gd->ram_size / 1024) - pram); setenv("mem", (char *)memsz); } #endif /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) { main_loop(); } /* NOTREACHED - no way out of command loop except booting */ }