S5PV210-uboot解析(三)-start_armboot解析
生活随笔
收集整理的這篇文章主要介紹了
S5PV210-uboot解析(三)-start_armboot解析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
start_armboot解析
start_armboot函數(shù)在lib_arm/board.c文件里,除了函數(shù)本身,還有一些用到了的定義和宏。S5PV210-uboot解析-start.S解析(二)-gd_t和init_sequence函數(shù).note
typedef?int?(init_fnc_t)?(void); 這里定義的是一個函數(shù)類型,不是函數(shù)指針。
下面是正式代碼,我將沒有用到的地方都去掉了:
void?start_armboot?(void) { ????init_fnc_t?**init_fnc_ptr;
這里定義的是函數(shù)類型的二重指針,也可以看成是函數(shù)類型的指針數(shù)組。
????char?*s; ????int?mmc_exist?=?0; ? ????/*?Pointer?is?writable?since?we?allocated?a?register?for?it?*/ #ifdef?CONFIG_MEMORY_UPPER_CODE?/*?by?scsuh?*/ ????ulong?gd_base; ? ????gd_base?=?CFG_UBOOT_BASE?+?CFG_UBOOT_SIZE?-?CFG_MALLOC_LEN?-?CFG_STACK_SIZE?-?sizeof(gd_t);
gd_base的地址就是 0x33e0_0000 + 2*1024*1024 - (0x4000 + 896*1024) - (512*1024) - (36 + 46 ) 就是 基地址 + 2MB -(16KB + 896KB) - (512KB) - (82B) 也就是uboot的基地址+2MB-1424KB,相當于uboot基地址后面623KB多點的位置。 這之間的內(nèi)存排布就是
????gd?=?(gd_t*)gd_base; #else ????gd?=?(gd_t*)(_armboot_start?-?CFG_MALLOC_LEN?-?sizeof(gd_t)); #endif ? ????/*?compiler?optimization?barrier?needed?for?GCC?>=?3.4?*/ ????__asm__?__volatile__("":?:?:"memory");
這句話是調(diào)用匯編的指令,為了防止高版本的GCC的優(yōu)化造成錯誤。__asm__?表示后面的代碼為內(nèi)嵌匯編,__volatile__防止編譯器優(yōu)化代碼,括號內(nèi)的是匯編指令。內(nèi)嵌匯編語法如下: __asm__(匯編語句模板: 輸出部分: 輸入部分: 破壞描述部分) ? ????memset?((void*)gd,?0,?sizeof?(gd_t)); ????gd->bd?=?(bd_t*)((char*)gd?-?sizeof(bd_t)); ????memset?(gd->bd,?0,?sizeof?(bd_t));
memset初始化指針。 ? ????monitor_flash_len?=?_bss_start?-?_armboot_start; ? ????for?(init_fnc_ptr?=?init_sequence;?*init_fnc_ptr;?++init_fnc_ptr)?{ ????????if?((*init_fnc_ptr)()?!=?0)?{ ????????????hang?(); ????????} ????} ? 這個for循環(huán)用到了之前定義的函數(shù)類型的二重指針(相當于指針數(shù)組),遍歷init_sequence數(shù)組內(nèi)的元素,即運行每一個函數(shù)進行相關(guān)的初始化操作,這里面的函數(shù)都是初始化相關(guān)的。這里操作的時候先賦值init_fnc_ptr?=?init_sequence 循環(huán)的時候操作init_fnc_ptr?而不對init_sequence 進行操作。如果某一個函數(shù)初始化失敗了,沒有返回0,那么就進入hang函數(shù)掛起。hang函數(shù)內(nèi)部就是一個死循環(huán)。如果uboot進入到hang函數(shù)了,只能重啟。
#ifndef?CFG_NO_FLASH ????/*?configure?available?FLASH?banks?*/ ????size?=?flash_init?(); ????display_flash_config?(size); #endif?/*?CFG_NO_FLASH?*/
這里是屬于代碼移植的遺留問題,在210板子中是沒有norFlash的,但是這里還是保留了這段代碼,而進行實際測試發(fā)現(xiàn)如果定義CFG_NO_FLASH的話會產(chǎn)生很多錯誤,所以沒有定義CFG_NO_FLASH。這段代碼只是在串口輸出了Flash: 8 MB,沒有其他的作用。 ? #ifdef?CONFIG_VFD #?? ifndef?PAGE_SIZE #?? ??define?PAGE_SIZE?4096 #?? endif ????/* ?????*?reserve?memory?for?VFD?display?(always?full?pages) ?????*/ ????/*?bss_end?is?defined?in?the?board-specific?linker?script?*/ ????addr?=?(_bss_end?+?(PAGE_SIZE?-?1))?&?~(PAGE_SIZE?-?1); ????size?=?vfd_setmem?(addr); ????gd->fb_base?=?addr; #endif?/*?CONFIG_VFD?*/ ? #ifdef?CONFIG_LCD ????/*?board?init?may?have?inited?fb_base?*/ ????if?(!gd->fb_base)?{ #?????? ifndef?PAGE_SIZE #?????? ??define?PAGE_SIZE?4096 #?????? endif ????????/* ?????????*?reserve?memory?for?LCD?display?(always?full?pages) ?????????*/ ????????/*?bss_end?is?defined?in?the?board-specific?linker?script?*/ ????????addr?=?(_bss_end?+?(PAGE_SIZE?-?1))?&?~(PAGE_SIZE?-?1); ????????size?=?lcd_setmem?(addr); ????????gd->fb_base?=?addr; ????} #endif?/*?CONFIG_LCD?*/
CONFIG_VFD和CONFIG_LCD都是和顯示相關(guān)的,是uboot中自帶的LCD顯示的軟件架構(gòu),但這里這兩個宏都沒有被定義,因為在后面我們使用了自己的LCD顯示函數(shù)。 ? ????/*?armboot_start?is?defined?in?the?board-specific?linker?script?*/ #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
//******************************// //?Board?Specific //?#if?defined(CONFIG_SMDKXXXX) //******************************// ? 接下來的一些代碼都是和指定的板子相關(guān)的,通過定義宏來選擇。
#if?defined(CONFIG_X210) ? ????#if?defined(CONFIG_GENERIC_MMC) ????????puts?("SD/MMC:??"); ????????mmc_exist?=?mmc_initialize(gd->bd); ????????if?(mmc_exist?!=?0) ????????{ ????????????puts?("0?MB\n");
初始化MMC,其實是初始化SoC內(nèi)部的MMC控制器。調(diào)用mmc_initialize函數(shù)。
__attribute__ 可以設(shè)置函數(shù)屬性(Function Attribute )、變量屬性(Variable Attribute )和類型屬性(Type Attribute )。
weak 和 alias 分別是兩個屬性。weak 使得 board_mmc_init 這個符號在目標文件中作為 weak symbol 而不是 global symbol。
而 alias 則使 board_mmc_init 是 __def_mmc_init 的一個別名,__def_mmc_init 和 board_mmc_init 必須在同一個編譯單元中定義,否則會編譯出錯。
給函數(shù)加上weak屬性時,即使函數(shù)沒定義,函數(shù)被調(diào)用也可以編譯成功。
當有兩個函數(shù)同名時,則使用強符號(也叫全局符號,即沒有加weak的函數(shù))來代替弱符號(加weak的函數(shù))。
#ifdef?CONFIG_CHECK_X210CV3 ????????????check_flash_flag=0;//check?inand?error! #endif ????????} #ifdef?CONFIG_CHECK_X210CV3 ????????else ????????{ ????????????check_flash_flag=1;//check?inand?ok!? ????????} #endif ????#endif ? ????#if?defined(CONFIG_MTD_ONENAND) ????????puts("OneNAND:?"); ????????onenand_init(); ????????/*setenv("bootcmd",?"onenand?read?c0008000?80000?380000;bootm?c0008000");*/ ????#else ????????//puts("OneNAND:?(FSR?layer?enabled)\n"); ????#endif ? ????#if?defined(CONFIG_CMD_NAND) ????????puts("NAND:????"); ????????nand_init(); ????#endif ? #endif?/*?CONFIG_X210?*/
/*?initialize?environment?*/ env_relocate?();
重定位環(huán)境變量,因為環(huán)境變量最開始都燒錄在SD卡中,這里將SD卡中的環(huán)境變量讀取到DDR中。
/*?IP?Address?*/
????gd->bd->bi_ip_addr?=?getenv_IPaddr?("ipaddr");
?
????/*?MAC?Address?*/
????{
????????int?i;
????????ulong?reg;
????????char?*s,?*e;
????????char?tmp[64];
?
????????i?=?getenv_r?("ethaddr",?tmp,?sizeof?(tmp));
????????s?=?(i?>?0)???tmp?:?NULL;
?
????????for?(reg?=?0;?reg?<?6;?++reg)?{
????????????gd->bd->bi_enetaddr[reg]?=?s???simple_strtoul?(s,?&e,?16)?:?0;
????????????if?(s)
????????????????s?=?(*e)???e?+?1?:?e;
????????}
?
????}
從環(huán)境變量中獲取IP地址和MAC地址,getenv_IPaddr?是調(diào)用getenv 函數(shù)來獲取環(huán)境變量中的字符串格式的IP地址,中間還用string_to_ip 來將字符串格式的IP地址轉(zhuǎn)換成字符串格式的點分十進制格式。
devices_init?();?? /*?get?the?devices?list?going.?*/
設(shè)備初始化函數(shù),放在這里面初始化的設(shè)備都是驅(qū)動設(shè)備,作用就是集中執(zhí)行各種硬件驅(qū)動的初始化函數(shù)。
jumptable_init ();
跳轉(zhuǎn)表。應(yīng)該是要實現(xiàn)函數(shù)指針到具體函數(shù)的映射,但是查找發(fā)現(xiàn)跳轉(zhuǎn)表只是被賦值沒有被引用,因此在uboot中沒有使用。
#if?!defined(CONFIG_SMDK6442) ????console_init_r?(); /*?fully?init?console?as?a?device?*/ #endif
/*?enable?exceptions?*/ enable_interrupts?();
中斷使能,實際是空函數(shù)。沒有定義相關(guān)的宏,#else分支是空函數(shù)。
????/*?Initialize?from?environment?*/ ????if?((s?=?getenv?("loadaddr"))?!=?NULL)?{ ????????load_addr?=?simple_strtoul?(s,?NULL,?16); ????} #if?defined(CONFIG_CMD_NET) ????if?((s?=?getenv?("bootfile"))?!=?NULL)?{ ????????copy_filename?(BootFile,?s,?sizeof?(BootFile)); ????} #endif
這兩個環(huán)境變量是和內(nèi)核啟動有關(guān)的,啟動linux內(nèi)核時會參考這兩個變量。 ? #ifdef?BOARD_LATE_INIT ????board_late_init?(); #endif
開發(fā)板晚期初始化的函數(shù),在x210中,這個函數(shù)是空的。
****************lxg?added**************/ #ifdef?CONFIG_MPAD ????extern?int?x210_preboot_init(void); ????x210_preboot_init(); #endif
x210啟動起來之前的一些初始化,主要是LCD相關(guān)。還有屏幕上的logo顯示。 /****************end**********************/ ? ????/*?check?menukey?to?update?from?sd?*/ ????extern?void?update_all(void); ????if(check_menu_update_from_sd()==0)//update?mode ????{ ????????puts?("[LEFT?DOWN]?update?mode\n"); ????????run_command("fdisk?-c?0",0); ????????update_all(); ????} ????else ????????puts?("[LEFT?UP]?boot?mode\n");
這里設(shè)置了一個自動更新的功能,開機按下LEFT按鍵會進入 update mode,之后uboot會從SD卡中讀取鏡像燒錄到iNand中。不按LEFT會進入boot mode,即正常啟動。 ? ????/*?main_loop()?can?return?to?retry?autoboot,?if?so?just?run?it?again.?*/ ????for?(;;)?{ ????????main_loop?(); ????} ? uboot啟動的最后階段,main_loop是一個死循環(huán),如果開機倒計時不打斷會自動引導(dǎo)內(nèi)核加載系統(tǒng),如果打斷會進入uboot的命令行。
????/*?NOTREACHED?-?no?way?out?of?command?loop?except?booting?*/ }
到這里uboot啟動的第二階段也分析完了。在start_armboot函數(shù)中,主要就是對開發(fā)板的硬件做了初始化,還有軟件的一些數(shù)據(jù)結(jié)構(gòu)做了初始化。 主要的函數(shù)及功能: init_sequence cpu_init 空的 board_init 網(wǎng)卡、機器碼、內(nèi)存?zhèn)鲄⒌刂? dm9000_pre_init 網(wǎng)卡 gd->bd->bi_arch_number 機器碼 gd->bd->bi_boot_params 內(nèi)存?zhèn)鲄⒌刂? interrupt_init 定時器 env_init init_baudrate gd數(shù)據(jù)結(jié)構(gòu)中波特率 serial_init 空的 console_init_f 空的 display_banner 打印啟動信息 print_cpuinfo 打印CPU時鐘設(shè)置信息 checkboard 檢驗開發(fā)板名字 dram_init gd數(shù)據(jù)結(jié)構(gòu)中DDR信息 display_dram_config 打印DDR配置信息表 mem_malloc_init 初始化uboot自己維護的堆管理器的內(nèi)存 mmc_initialize inand/SD卡的SoC控制器和卡的初始化 env_relocate 環(huán)境變量重定位 gd->bd->bi_ip_addr gd數(shù)據(jù)結(jié)構(gòu)賦值 gd->bd->bi_enetaddr gd數(shù)據(jù)結(jié)構(gòu)賦值 devices_init 空的 jumptable_init 不用關(guān)注的 console_init_r 真正的控制臺初始化 enable_interrupts 空的 loadaddr、bootfile 環(huán)境變量讀出初始化全局變量 board_late_init 空的 eth_initialize 空的 x210_preboot_init LCD初始化和顯示logo check_menu_update_from_sd 檢查自動更新 main_loop 主循環(huán)
start_armboot函數(shù)在lib_arm/board.c文件里,除了函數(shù)本身,還有一些用到了的定義和宏。S5PV210-uboot解析-start.S解析(二)-gd_t和init_sequence函數(shù).note
typedef?int?(init_fnc_t)?(void); 這里定義的是一個函數(shù)類型,不是函數(shù)指針。
下面是正式代碼,我將沒有用到的地方都去掉了:
void?start_armboot?(void) { ????init_fnc_t?**init_fnc_ptr;
這里定義的是函數(shù)類型的二重指針,也可以看成是函數(shù)類型的指針數(shù)組。
????char?*s; ????int?mmc_exist?=?0; ? ????/*?Pointer?is?writable?since?we?allocated?a?register?for?it?*/ #ifdef?CONFIG_MEMORY_UPPER_CODE?/*?by?scsuh?*/ ????ulong?gd_base; ? ????gd_base?=?CFG_UBOOT_BASE?+?CFG_UBOOT_SIZE?-?CFG_MALLOC_LEN?-?CFG_STACK_SIZE?-?sizeof(gd_t);
gd_base的地址就是 0x33e0_0000 + 2*1024*1024 - (0x4000 + 896*1024) - (512*1024) - (36 + 46 ) 就是 基地址 + 2MB -(16KB + 896KB) - (512KB) - (82B) 也就是uboot的基地址+2MB-1424KB,相當于uboot基地址后面623KB多點的位置。 這之間的內(nèi)存排布就是
????gd?=?(gd_t*)gd_base; #else ????gd?=?(gd_t*)(_armboot_start?-?CFG_MALLOC_LEN?-?sizeof(gd_t)); #endif ? ????/*?compiler?optimization?barrier?needed?for?GCC?>=?3.4?*/ ????__asm__?__volatile__("":?:?:"memory");
這句話是調(diào)用匯編的指令,為了防止高版本的GCC的優(yōu)化造成錯誤。__asm__?表示后面的代碼為內(nèi)嵌匯編,__volatile__防止編譯器優(yōu)化代碼,括號內(nèi)的是匯編指令。內(nèi)嵌匯編語法如下: __asm__(匯編語句模板: 輸出部分: 輸入部分: 破壞描述部分) ? ????memset?((void*)gd,?0,?sizeof?(gd_t)); ????gd->bd?=?(bd_t*)((char*)gd?-?sizeof(bd_t)); ????memset?(gd->bd,?0,?sizeof?(bd_t));
memset初始化指針。 ? ????monitor_flash_len?=?_bss_start?-?_armboot_start; ? ????for?(init_fnc_ptr?=?init_sequence;?*init_fnc_ptr;?++init_fnc_ptr)?{ ????????if?((*init_fnc_ptr)()?!=?0)?{ ????????????hang?(); ????????} ????} ? 這個for循環(huán)用到了之前定義的函數(shù)類型的二重指針(相當于指針數(shù)組),遍歷init_sequence數(shù)組內(nèi)的元素,即運行每一個函數(shù)進行相關(guān)的初始化操作,這里面的函數(shù)都是初始化相關(guān)的。這里操作的時候先賦值init_fnc_ptr?=?init_sequence 循環(huán)的時候操作init_fnc_ptr?而不對init_sequence 進行操作。如果某一個函數(shù)初始化失敗了,沒有返回0,那么就進入hang函數(shù)掛起。hang函數(shù)內(nèi)部就是一個死循環(huán)。如果uboot進入到hang函數(shù)了,只能重啟。
#ifndef?CFG_NO_FLASH ????/*?configure?available?FLASH?banks?*/ ????size?=?flash_init?(); ????display_flash_config?(size); #endif?/*?CFG_NO_FLASH?*/
這里是屬于代碼移植的遺留問題,在210板子中是沒有norFlash的,但是這里還是保留了這段代碼,而進行實際測試發(fā)現(xiàn)如果定義CFG_NO_FLASH的話會產(chǎn)生很多錯誤,所以沒有定義CFG_NO_FLASH。這段代碼只是在串口輸出了Flash: 8 MB,沒有其他的作用。 ? #ifdef?CONFIG_VFD #?? ifndef?PAGE_SIZE #?? ??define?PAGE_SIZE?4096 #?? endif ????/* ?????*?reserve?memory?for?VFD?display?(always?full?pages) ?????*/ ????/*?bss_end?is?defined?in?the?board-specific?linker?script?*/ ????addr?=?(_bss_end?+?(PAGE_SIZE?-?1))?&?~(PAGE_SIZE?-?1); ????size?=?vfd_setmem?(addr); ????gd->fb_base?=?addr; #endif?/*?CONFIG_VFD?*/ ? #ifdef?CONFIG_LCD ????/*?board?init?may?have?inited?fb_base?*/ ????if?(!gd->fb_base)?{ #?????? ifndef?PAGE_SIZE #?????? ??define?PAGE_SIZE?4096 #?????? endif ????????/* ?????????*?reserve?memory?for?LCD?display?(always?full?pages) ?????????*/ ????????/*?bss_end?is?defined?in?the?board-specific?linker?script?*/ ????????addr?=?(_bss_end?+?(PAGE_SIZE?-?1))?&?~(PAGE_SIZE?-?1); ????????size?=?lcd_setmem?(addr); ????????gd->fb_base?=?addr; ????} #endif?/*?CONFIG_LCD?*/
CONFIG_VFD和CONFIG_LCD都是和顯示相關(guān)的,是uboot中自帶的LCD顯示的軟件架構(gòu),但這里這兩個宏都沒有被定義,因為在后面我們使用了自己的LCD顯示函數(shù)。 ? ????/*?armboot_start?is?defined?in?the?board-specific?linker?script?*/ #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
//******************************// //?Board?Specific //?#if?defined(CONFIG_SMDKXXXX) //******************************// ? 接下來的一些代碼都是和指定的板子相關(guān)的,通過定義宏來選擇。
#if?defined(CONFIG_X210) ? ????#if?defined(CONFIG_GENERIC_MMC) ????????puts?("SD/MMC:??"); ????????mmc_exist?=?mmc_initialize(gd->bd); ????????if?(mmc_exist?!=?0) ????????{ ????????????puts?("0?MB\n");
初始化MMC,其實是初始化SoC內(nèi)部的MMC控制器。調(diào)用mmc_initialize函數(shù)。
#ifdef?CONFIG_CHECK_X210CV3 ????????????check_flash_flag=0;//check?inand?error! #endif ????????} #ifdef?CONFIG_CHECK_X210CV3 ????????else ????????{ ????????????check_flash_flag=1;//check?inand?ok!? ????????} #endif ????#endif ? ????#if?defined(CONFIG_MTD_ONENAND) ????????puts("OneNAND:?"); ????????onenand_init(); ????????/*setenv("bootcmd",?"onenand?read?c0008000?80000?380000;bootm?c0008000");*/ ????#else ????????//puts("OneNAND:?(FSR?layer?enabled)\n"); ????#endif ? ????#if?defined(CONFIG_CMD_NAND) ????????puts("NAND:????"); ????????nand_init(); ????#endif ? #endif?/*?CONFIG_X210?*/
/*?initialize?environment?*/ env_relocate?();
重定位環(huán)境變量,因為環(huán)境變量最開始都燒錄在SD卡中,這里將SD卡中的環(huán)境變量讀取到DDR中。
從環(huán)境變量中獲取IP地址和MAC地址,getenv_IPaddr?是調(diào)用getenv 函數(shù)來獲取環(huán)境變量中的字符串格式的IP地址,中間還用string_to_ip 來將字符串格式的IP地址轉(zhuǎn)換成字符串格式的點分十進制格式。
devices_init?();?? /*?get?the?devices?list?going.?*/
設(shè)備初始化函數(shù),放在這里面初始化的設(shè)備都是驅(qū)動設(shè)備,作用就是集中執(zhí)行各種硬件驅(qū)動的初始化函數(shù)。
jumptable_init ();
跳轉(zhuǎn)表。應(yīng)該是要實現(xiàn)函數(shù)指針到具體函數(shù)的映射,但是查找發(fā)現(xiàn)跳轉(zhuǎn)表只是被賦值沒有被引用,因此在uboot中沒有使用。
#if?!defined(CONFIG_SMDK6442) ????console_init_r?(); /*?fully?init?console?as?a?device?*/ #endif
/*?enable?exceptions?*/ enable_interrupts?();
中斷使能,實際是空函數(shù)。沒有定義相關(guān)的宏,#else分支是空函數(shù)。
????/*?Initialize?from?environment?*/ ????if?((s?=?getenv?("loadaddr"))?!=?NULL)?{ ????????load_addr?=?simple_strtoul?(s,?NULL,?16); ????} #if?defined(CONFIG_CMD_NET) ????if?((s?=?getenv?("bootfile"))?!=?NULL)?{ ????????copy_filename?(BootFile,?s,?sizeof?(BootFile)); ????} #endif
這兩個環(huán)境變量是和內(nèi)核啟動有關(guān)的,啟動linux內(nèi)核時會參考這兩個變量。 ? #ifdef?BOARD_LATE_INIT ????board_late_init?(); #endif
開發(fā)板晚期初始化的函數(shù),在x210中,這個函數(shù)是空的。
****************lxg?added**************/ #ifdef?CONFIG_MPAD ????extern?int?x210_preboot_init(void); ????x210_preboot_init(); #endif
x210啟動起來之前的一些初始化,主要是LCD相關(guān)。還有屏幕上的logo顯示。 /****************end**********************/ ? ????/*?check?menukey?to?update?from?sd?*/ ????extern?void?update_all(void); ????if(check_menu_update_from_sd()==0)//update?mode ????{ ????????puts?("[LEFT?DOWN]?update?mode\n"); ????????run_command("fdisk?-c?0",0); ????????update_all(); ????} ????else ????????puts?("[LEFT?UP]?boot?mode\n");
這里設(shè)置了一個自動更新的功能,開機按下LEFT按鍵會進入 update mode,之后uboot會從SD卡中讀取鏡像燒錄到iNand中。不按LEFT會進入boot mode,即正常啟動。 ? ????/*?main_loop()?can?return?to?retry?autoboot,?if?so?just?run?it?again.?*/ ????for?(;;)?{ ????????main_loop?(); ????} ? uboot啟動的最后階段,main_loop是一個死循環(huán),如果開機倒計時不打斷會自動引導(dǎo)內(nèi)核加載系統(tǒng),如果打斷會進入uboot的命令行。
????/*?NOTREACHED?-?no?way?out?of?command?loop?except?booting?*/ }
到這里uboot啟動的第二階段也分析完了。在start_armboot函數(shù)中,主要就是對開發(fā)板的硬件做了初始化,還有軟件的一些數(shù)據(jù)結(jié)構(gòu)做了初始化。 主要的函數(shù)及功能: init_sequence cpu_init 空的 board_init 網(wǎng)卡、機器碼、內(nèi)存?zhèn)鲄⒌刂? dm9000_pre_init 網(wǎng)卡 gd->bd->bi_arch_number 機器碼 gd->bd->bi_boot_params 內(nèi)存?zhèn)鲄⒌刂? interrupt_init 定時器 env_init init_baudrate gd數(shù)據(jù)結(jié)構(gòu)中波特率 serial_init 空的 console_init_f 空的 display_banner 打印啟動信息 print_cpuinfo 打印CPU時鐘設(shè)置信息 checkboard 檢驗開發(fā)板名字 dram_init gd數(shù)據(jù)結(jié)構(gòu)中DDR信息 display_dram_config 打印DDR配置信息表 mem_malloc_init 初始化uboot自己維護的堆管理器的內(nèi)存 mmc_initialize inand/SD卡的SoC控制器和卡的初始化 env_relocate 環(huán)境變量重定位 gd->bd->bi_ip_addr gd數(shù)據(jù)結(jié)構(gòu)賦值 gd->bd->bi_enetaddr gd數(shù)據(jù)結(jié)構(gòu)賦值 devices_init 空的 jumptable_init 不用關(guān)注的 console_init_r 真正的控制臺初始化 enable_interrupts 空的 loadaddr、bootfile 環(huán)境變量讀出初始化全局變量 board_late_init 空的 eth_initialize 空的 x210_preboot_init LCD初始化和顯示logo check_menu_update_from_sd 檢查自動更新 main_loop 主循環(huán)
總結(jié)
以上是生活随笔為你收集整理的S5PV210-uboot解析(三)-start_armboot解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gdevops峰会北京站归来
- 下一篇: 仿抖音短视频系统源码,获取系统图片