U-Boot启动过程分解 2
2.?????? 初始化函数功能: ?????? for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { ????????????? if ((*init_fnc_ptr)() != 0) { ???????????????????? hang (); ????????????? } ?????? } ?????? 此处判断init_fnc_t的结构是否清零,否则打印 “### ERROR ### Please RESET the board ###n” ? 附:init_fnc_t的结构定义: init_fnc_t *init_sequence[] = { ???? cpu_init,???????? /* basic cpu dependent setup */ ???? board_init,???????????? /* basic board dependent setup */ ???? interrupt_init,???????? /* set up exceptions */ ???? env_init,???????? /* initialize environment */ ???? init_baudrate,???????? /* initialze baudrate settings */ ???? serial_init,????????????? /* serial communications setup */ ???? console_init_f,????????????? /* stage 1 init of console */ ???? display_banner,???????????? /* say that we are here */ #if defined(CONFIG_DISPLAY_CPUINFO) ???? print_cpuinfo,??????? /* display cpu info (and speed) */ #endif #if defined(CONFIG_DISPLAY_BOARDINFO) ???? checkboard,?????????? /* display board info */ #endif ???? dram_init,????????????? /* configure available RAM banks */ ???? display_dram_config, ???? NULL, }; gd_t的结构定义: typedef???? struct????? global_data { bd_t??????? *bd; unsigned long? flags; unsigned long? baudrate; unsigned long? have_console; /* serial_init() was called */ unsigned long? reloc_off;?????? /* Relocation Offset */ unsigned long? env_addr;?????? /* Address? of Environment struct */ unsigned long? env_valid;?????? /* Checksum of Environment valid? */ unsigned long? fb_base;? /* base address of frame buffer */ #ifdef CONFIG_VFD unsigned char vfd_type; /* display type */ #endif #if 0 unsigned long? cpu_clk;? /* CPU clock in Hz!????????????? */ unsigned long? bus_clk; unsigned long? ram_size; /* RAM size */ unsigned long? reset_status;?? /* reset status register at boot */ #endif void??????? **jt;??????? /* jump table */ } gd_t; 3.?????? 若定义CFG_NO_FLASH,对FLASH初始化: 初始化FLASH,并打印flash:size 此处未涉及,不再追究; 4.?????? 若定义CONFIG_VFD则对其进行初始化: 设置初始化地址,此处未涉及,不再追究; 5.?????? 若定义CONFIG_LCD对其地址初始化: 此处定义LCD页为4096,并将_bss_end 后一页空间设为其地址,并将其清零,再将地址赋值到gd->fb_base; 6.?????? 对内存地址初始化: 此处调用void mem_malloc_init(ulong dest_addr);对内存的起始、结束和断点地址设置; #ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */ mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE); #else mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); #endif ? 附: static void mem_malloc_init (ulong dest_addr) { mem_malloc_start = dest_addr; mem_malloc_end = dest_addr + CFG_MALLOC_LEN; mem_malloc_brk = mem_malloc_start; ? /* memset ((void *) mem_malloc_start, ?????????????? mem_malloc_end - mem_malloc_start); */ } 7.?????? 初始化SDCard和nand flash: 本文档只针对S3c6410+256M nand flash注释,程序在此处分别判断CONFIG_SMDK6410/CONFIG_SMDK6430、CONFIG_SMDK6400/CONFIG_SMDK2450/CONFIG_SMDK2416两类不同cpu进行不同初始化,不相关其余部分忽略; ???? /* SD/MMC detecting is on as default */ ???? puts("SD/MMC:? "); ???? movi_set_capacity();??????????? /*设置容量,未作任何处理*/ ???? movi_set_ofs(MOVI_TOTAL_BLKCNT);??? /*填充ofsinfo结构*/ ???? movi_init();???? /*设置gpio、使能位,初始化(设置设备时钟、读写速度、中断使能、检测设备类型等)*/ ? ???? if (INF_REG3_REG == 1) { ??????????? puts("OneNAND: "); ??????????? onenand_init(); ??????????? setenv("bootcmd","onenand read c0008000 40000 3c0000;bootm c0008000"); ???? } else { ??????????? puts("NAND:??? "); ??????????? nand_init();???? /*填充oob_config结构,并打印flash容量*/ ??????????? /*打印指令*/ ??????????? if (INF_REG3_REG == 0 || INF_REG3_REG == 7) ?????????????????? setenv("bootcmd","movi read kernel c0008000;movi read rootfs c0800000;bootm c0008000"); ??????????? else ?????????????????? setenv("bootcmd","nand read c0008000 40000 3c0000;bootm c0008000");???? ???? } ?????? 该部分内容,首先初始化SD/MMC,然后对nand flash进行初始化, 8.?????? 若定义数据flash CONFIG_HAS_DATAFLASH,对其进行初始化: 该设备暂不涉及,暂不追究; 9.?????? env_relocate ();未知功能: 10.?? 设置MAC地址与网卡: 对网络知识欠缺,此部分内容跳过; 11.?? 设备初始化: devices_init ();?????? /* get the devices list going. */ I2C、lcd、video、keyboard、logbuff、system、serial devices、usbtty、netconsole 12.?? 不解功能(line431-442): #ifdef CONFIG_CMC_PU2 ??? load_sernum_ethaddr (); #endif /* CONFIG_CMC_PU2 */ ? ??? jumptable_init (); ? ??? console_init_r ();??? /* fully init console as a device */ ? #if defined(CONFIG_MISC_INIT_R) ??? /* miscellaneous platform dependent initialisations */ ??? misc_init_r (); #endif 13.?? 使能中断: enable_interrupts (); 该函数调用汇编指令: mrs %0,cpsr bic %0,%0,#0x80 msr cpsr_c,%0 14.?? 网络部分设置内容(line448-466):忽略 15.?? boot命令相关,不解(line468-476) 16.?? void main_loop(void) 命令循环主函数,根据相应命令,执行对应操作; Note:friendlyARM公司在启动过程中加入了Menu函数和对应数字动作处理功能; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Swift中的if语句中使用多个let-as
- objective-c – OBJC_ASSOCIATION_ASSIGN是指原子
- 如何在React Native的选项卡中的NavigatorIOS中添
- c# – 这个安全警告意味着什么(.Net Process类)?
- 最近进坑了DCS-3950双层交换机链路聚合配置整理
- FlashBack Recorder 5.7.0.3607汇编超精简绿色破
- 正则表达式爬取网页内容的简单使用
- [cocos2d-x][apk打包][Fatal signal 11][andr
- oracle ORA-00031:session marked for kill(标记
- Flutter进阶—构建布局实例