九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
UBOOT 學(xué)習(xí)心得(UBOOT流程分析)
網(wǎng)上找到的UBOOT研究文章,結(jié)合自己這幾天看的。目前是明白了UBOOT主干程序流程了。開始分析細(xì)節(jié)部分了。下面是別人寫的UBOOT分析。
參考了fzb和趙春江兩位大牛的,研究了2010.06版本的2011.06版本兩個(gè)經(jīng)典版本,也對(duì)比了TQ(我買的板是天嵌的)自己寫的U-BOOT,學(xué)到了不少,也發(fā)現(xiàn)了很多東西,以下便記錄以下自己的心得吧,以便以后可以自己參考下。
U-BOOT的兩個(gè)階段啟動(dòng)過程:(2010.06經(jīng)典版來說)
第一階段start.S的路徑位于arch\arm\cpu\arm920t\這段匯編代碼一般被稱作第一階段初始化代碼。主要作用是初始化運(yùn)行環(huán)境;初始化內(nèi)存;重新放置UBOOT代碼到內(nèi)存中;跳入到內(nèi)存中執(zhí)行第二段初始化代碼
1、    關(guān)閉開門狗,屏蔽所有中斷
2、    設(shè)置分頻比
3、    bl     cpu_init_crit()    關(guān)MMU,初始化內(nèi)存
bl     lowlevel_init()      配置內(nèi)存,修改內(nèi)存刷新率參數(shù)等
4、    relocate          判斷當(dāng)前代碼是在NORFLASH還是RAM
copy_loop循環(huán)            將FLASH代碼復(fù)制至RAM中
 5、   stack_setup   棧設(shè)置
clear_bss _bss_start到_bss_end之間的數(shù)據(jù)清0
 6、   ldr     pc , start_armboot     跳轉(zhuǎn)到第二階段
//=====================================================================
第二階段board.c的路徑位于arch/arm/lib/board.c,這段代碼為U-BOOT的第二階段初始化代碼。主要作用是初始化兩個(gè)重要數(shù)據(jù)結(jié)構(gòu),對(duì)SDRAM的內(nèi)存分配設(shè)置,對(duì)各種需要用到的外設(shè)進(jìn)行初始化,最后循環(huán)跳入main_loop()函數(shù)
二階段start_armboot分為board_init_f 和 board_init_r兩部分
先執(zhí)行的board_init_f部分:
1、為gd數(shù)據(jù)結(jié)構(gòu)分配地址,并清零
2、執(zhí)行init_fnc_ptr函數(shù)指針數(shù)組中的各個(gè)初始化函數(shù),如下
board_early_init_f    , timer_init       , env_init       init_baudrate serial_init     
console_init_f       display_banner           dram_init
3、A、 分配SDRAM高64KB為TLB,用于U-BOOT
B、分配SDRAM下一單元為U-BOOT代碼段,數(shù)據(jù)段,BSS段
(這里插一句,原來BSS段是用來存放未初始化的全局變量與靜態(tài)變量)
      C、接著開辟malloc空間,存bd , gd , 3個(gè)字大小的異常堆空間
4、將relorate的地址值賦給gd結(jié)構(gòu)體相應(yīng)變量(2011.06版本的,用于返回start.S)
后執(zhí)行的board_init_r部分:
1、對(duì)gd , bd 數(shù)據(jù)結(jié)構(gòu)賦值初始化
2、各種外設(shè)初始化:
初始化NORFLASH,     NANDFLASH,            初始化ONENAND FLASH
初始化環(huán)境變量     初始化PCI    設(shè)置IP地址 初始化各類外設(shè):IICLCD、鍵盤、USB        初始化控制臺(tái)              建立IRQ中斷堆棧    初始化以太網(wǎng)
初始化跳轉(zhuǎn)表(定義了U-Boot中基本的常用函數(shù)庫)。。這不算外設(shè)
3、一個(gè)死循環(huán)執(zhí)行   main_loop()函數(shù)
-------------------------------------------------
兩個(gè)版本的U-BOOT啟動(dòng)對(duì)比:
-------------------------------------------------
其實(shí)在總體上都差不多,只不過相對(duì)于經(jīng)典版(2010.06版),新版之后都變惡心了
主要有這樣的區(qū)別:
1、原版本第一階段的第5步棧設(shè)置被放到第4步relorate前(這個(gè)沒什么)
2、原版第二階段的board_init_f被放到第一階段第4步relorate前,就是說執(zhí)行完
stack_setup棧設(shè)置后變進(jìn)入了第二階段的部分初始化,然后通過4、將relorate的地址值賦給gd結(jié)構(gòu)體相應(yīng)變量(2011.06版本的,用于返回start.S)又返回來第一階段。。。感覺新版改后很亂,很沒條理(開源的每年改,就是煩呀,哈哈)
//=================================================
以下列出兩個(gè)階段可能要用到的函數(shù)的路徑,方便以后找:(按2011.06版本)
一階段:
lowlevel_init函數(shù),它是在board/samsung/smdk2410目錄下的lowlevel_init.s文件中定義
二階段:
gd是一個(gè)保存在ARMr8寄存器中的gd_t結(jié)構(gòu)體的指針,它是在/include/asm目錄下的global_data.h文件內(nèi)被定義的
bd結(jié)構(gòu)體的數(shù)據(jù)原型為bd_t數(shù)據(jù)結(jié)構(gòu),它表示的是板級(jí)信息結(jié)構(gòu)體,它是在/include/asm目錄下的u-boot.h文件中定義的。
init_fnc_ptr函數(shù)指針數(shù)組中的各個(gè)初始化函數(shù):
board_early_init_f函數(shù)在board/samsung/smdk2410目錄下的smdk2410.c文件內(nèi)timer_init函數(shù)在arch/arm/cpu/arm920t/s3c24x0目錄下的timer.c文件內(nèi)
env_init函數(shù)在common目錄下的env_flash.c文件內(nèi)
init_baudrate函數(shù)在arch/arm/lib目錄下的board.c文件內(nèi)
serial_init函數(shù)在drivers/serial目錄下的serial_s3c24x0.c文件內(nèi),在include/configs/smdk2410.h中定義了CONFIG_S3C24X0_SERIAL
console_init_f函數(shù)在common目錄下的console.c文件內(nèi)
display_banner函數(shù)在arch/arm/lib目錄下的board.c文件內(nèi)
dram_init函數(shù)在board/samsung/smdk2410目錄下的smdk2410.c文件內(nèi)
各種外設(shè)的初始化
flash_init函數(shù)是在drivers/mtd目錄下的cfi_flash.c文件內(nèi)(因?yàn)?/span>include/configs/smdk2410.h中定義了CONFIG_FLASH_CFI_DRIVER
nand_init函數(shù)是在divers/mtd/nand目錄下的nand.c文件內(nèi)定義的
env_relocate函數(shù)是在common目錄下的env_common.c文件中定義的
stdio_init ()common目錄下的stdio.c文件中定義的
jumptable_init ()common目錄下的exports.c文件中定義的
console_init_r ()是在common目錄下的console.c文件中定義的
interrupt_init () enable_interrupts ()都是在arch/arm/lib目錄下的interrupts.c文件中定義
eth_initialize()函數(shù)是在net目錄下的eth.c文件的第209行至第298行定義的
main_loop()common目錄下的main.c文件內(nèi)定義的
--------------------------------------------------
天嵌與自己移植的U-BOOT的差別分析和領(lǐng)悟
先列出天嵌公司里研發(fā)人員寫的  我們自己移植(小移植)的最大不同:
對(duì)比了一下,發(fā)現(xiàn)最大的不同在于common/main.c文件中,即在兩階段啟動(dòng)過程基本一樣
不同點(diǎn):(行數(shù)按天嵌版本的)
abortboot()函數(shù)(在main_loop()中被調(diào)用)
 Ln239: printf ( “ Press Space key to Download Mode ! ” ) ;
 Ln303 :在檢測是否 a key press 時(shí),加入了顯示LOGO程序:embedsky_tq_logo();
main_loop()函數(shù)
 Ln 381: LCD初始化程序
 Ln481 :分支選擇 下載 OR 加載模式
if ( BootFrmNORFLASH() )
  run_command (“menu”,0 );
else
 {Printf (“ Booting Linux \n ”);run_command (“boot_zImage”,0 );}
解析一下:
前面幾點(diǎn)都是關(guān)于LCDLOGO顯示的不多說(因?yàn)樽约阂浦彩菦]弄到LCD的移植)
說一下main_loop()函數(shù)Ln481 :分支選擇 下載 OR 加載模式
首先,run_command 這個(gè)是執(zhí)行命令函數(shù),一看名字就知道,也是在/common/main.c中定義的
說說最重要的menuboot_zImage
1、    IfNORFLASH進(jìn)行啟動(dòng),則為下載模式,則執(zhí)行menu()這個(gè)函數(shù),在/common/cmd_menu.c中定義
       打開cmd_menu.c文件會(huì)發(fā)現(xiàn),里面都是一些串口選項(xiàng)列表,我們打開2440電源發(fā)現(xiàn)的下載列表都是從 main_menu_usage()函數(shù)中打印出來的,而選擇的項(xiàng)又通過menu_shell()通過控制臺(tái)執(zhí)行各種我們的選項(xiàng),每個(gè)選項(xiàng)的如何執(zhí)行過程都列得很清楚,感覺就像跑裸機(jī)時(shí),自己按照fzb的串口控制臺(tái)弄出來一樣
   2、    Else NANDFLASH進(jìn)行啟動(dòng)    則為加載模式,進(jìn)行LINUX系統(tǒng)的配置和啟動(dòng)。
       lib_arm /boot_zImage.c 文件:里的boot_zImage( )函數(shù)
       函數(shù)執(zhí)行的內(nèi)容大概如下:
       1、 copy   kernel image
       2、setup linux   parameters
       3、get   machine   type
       4、GO   -> call-linux
對(duì)比后的一些感悟:
雖說自己也跟著移植過U-BOOT,也能建立自己的板級(jí)支持包,能實(shí)現(xiàn)基本的串口控制臺(tái),NAND OR NOR FLASH,DM9000網(wǎng)絡(luò),JFFS2文件系統(tǒng)等基本功能,但比起天嵌這個(gè),能下載    加載模式,還是有很多不足
所以說,自己移植只是感覺其中的方法,領(lǐng)悟之后還是在天嵌的基礎(chǔ)上再加進(jìn)一步移植吧,感覺沒必要從頭到尾都自己搞一遍,方法懂了,框架熟悉了就好。
//===================================================================
移植過程的一個(gè)簡單舉例:
因?yàn)橐浦埠芏喽际腔?/span>smdk2410來改的,首先要對(duì)24102440的區(qū)別有一定了解,再者就是自己在裸機(jī)上是編寫過改外設(shè)的驅(qū)動(dòng)的,這樣移植起來就比較舒服,不會(huì)說什么都跟著做,感覺很虛,學(xué)不到東西。
舉個(gè)例子讓U-BOOT支持NANDFLASH的讀寫
 1、 先是在總的宏定義頭文件中加上你外設(shè)所需的宏定義
總的宏定義路徑為 /include /configs / XX.h/ (最后這個(gè).h文件一般是以板的名稱命名)
    添加宏定義,如:#define   CONFIG_NAND_BASE   0      
                            。。。 等等
    那怎么知道添加什么宏定義呢?一般來說看對(duì)外設(shè)初始化函數(shù),和U-BOOT二階段啟動(dòng)函數(shù)要用到哪些就定義哪些。。。
 2、 改相應(yīng)的初始化函數(shù):board_nand_init函數(shù)和s3c2440_hwcontrol函數(shù)
因?yàn)?/span>U-BOOT里初始化函數(shù)基本基于2410的,而2440NAND配置參數(shù)和它不同,需要改部分地方
3、 添加初始化函數(shù)到第二階段board_init_r處,一般來說基本外設(shè)都已添加了,看你是否定義宏來讓其編譯這函數(shù)
移植一些規(guī)律總結(jié):
其實(shí)多移植幾次就會(huì)發(fā)現(xiàn),UBOOT的移植修改還是遵循著一定的規(guī)律。即是先在配置頭文件中打開相關(guān)宏定義支持,在到板級(jí)初始化(一般是第二階段初始化過程)代碼中添加需要支持功能的初始化函數(shù)。
如果初始化函數(shù)對(duì)應(yīng)的板版本不兼容或不存在,就要自己編寫了。
----------------------------------------------------
最后,說說U-BOOT的編譯
說到編譯,建議去看《從庖丁解牛說uboot如何編譯》,說得很好。
而說到編譯的執(zhí)行過程,建議看看
詳細(xì)分析make uboot 最后的編譯鏈接的具體執(zhí)行過程
最后談?wù)劸幾g不通過的問題,如果是內(nèi)部自己程序出錯(cuò),可以通過提示信息查出
如果是出現(xiàn)ERROR一百多個(gè),或者什么arm-linux-ld的問題,那應(yīng)該是編譯器版本不兼容問題,建議換換新的版本或更舊的版本再試試。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
展訊平臺(tái)uboot啟動(dòng)流程
u-boot移植(友善smart210開發(fā)板)(轉(zhuǎn)載)
uboot移植文檔
U-Boot在FS2410上的移植(轉(zhuǎn)載)
小靜的ARM學(xué)習(xí)日志04
【轉(zhuǎn)載】OK6410 uboot移植5
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服