久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

U-BOOT移植心得

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年03月17日   【字體:

 

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

相關文章

主站蜘蛛池模板: 国产成人精品亚洲日本在线观看 | 欧美啪啪 | 操视频网站 | 欧洲尺码日本国产精品 | 久久久久免费精品国产 | 91就要激情| 国产成人精品免高潮在线观看 | 久色 | av中文网 | 色婷婷亚洲国产女人的天堂 | 国产精品一区二区三区久久久 | 久久国产成人精品国产成人亚洲 | 欧美一区二区免费在线 | 日韩中文字幕 | 青草青草久热精品视频在线观看 | 国产精品一区二区久久精品爱微奶 | 精品欧美乱码久久久久久 | 97久久精品 | 在线观看av中文字幕 | 国产成人免费网站 | 亚洲一区二区av | 色噜噜亚洲男人的天堂 | aaaaaa大片免费看最大的 | 天天综合干 | 欧美日韩国产综合在线 | 成人午夜精品 | 午夜精品久久久久久久 | 国产精品久久久久久久久免费高清 | 91精品久久久久久久久中文字幕 | 一级看片免费视频囗交动图 | 亚洲精品乱码久久久久久按摩观 | 91视视频在线观看入口直接观看 | 午夜在线观看视频 | 国产99视频精品免费播放照片 | 91久久久久| 国产亚洲一区在线 | 国产一区中文 | 狠狠操狠狠搞 | 九九热这里只有精品在线观看 | 羞羞视频网站在线观看 | 毛片在线免费 |