U-BOOT移植心得

來源:互聯網
上載者:User

最近跑完裸機之後,便開始跑系統,但想著裸機與系統之間隔著個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地址 初始化各類外設:IIC、LCD、鍵盤、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是一個儲存在ARM的r8寄存器中的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 );

  }

  解析一下:

  前面幾點都是關於LCD和LOGO顯示的不多說(因為自己移植是沒弄到LCD的移植)

  說一下main_loop()函數中Ln481 :分支選擇 下載 OR 載入 模式

  首先,run_command 這個是執行命令函數,一看名字就知道,也是在/common/main.c中定義的

  說說最重要的“menu”和“boot_zImage”吧

  1、 If從NORFLASH進行啟動,則為下載模式,則執行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

  2、setup linux parameters

  3、get machine type

  4、GO -> call-linux

  對比後的一些感悟:

  雖說自己也跟著移植過U-BOOT,也能建立自己的板級支援包,能實現基本的串口控制台,NAND OR NOR FLASH,DM9000網路,JFFS2檔案系統等準系統,但比起天嵌這個,能下載 和 載入 模式,還是有很多不足

  所以說,自己移植只是感覺其中的方法,領悟之後還是在天嵌的基礎上再加進一步移植吧,感覺沒必要從頭到尾都自己搞一遍,方法懂了,架構熟悉了就好

  //===================================================================

  移植過程的一個簡單舉例:

  因為移植很多都是基於smdk2410來改的,首先要對2410和2440的區別有一定瞭解,再者就是自己在裸機上是編寫過改外設的驅動的,這樣移植起來就比較舒服,不會說什麼都跟著做,感覺很虛,學不到東西。

  就舉讓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的,而2440的NAND配置參數和它不同,需要改部分地方

  3、 添加初始化函數到第二階段board_init_r處,一般來說基本外設都已添加了,看你是否定義宏來讓其編譯這函數

  移植一些規律總結:

  其實多移植幾次就會發現,UBOOT的移植修改還是遵循著一定的規律。即是先在配置標頭檔中開啟相關宏定義支援,在到板級初始化(一般是第二階段初始化過程)代碼中添加需要支援功能的初始化函數。

  如果初始化函數對應的板版本不相容或不存在,就要自己編寫了。

  //===================================================================

  最後,說說U-BOOT的編譯吧

  說到編譯,建議去看《從庖丁解牛說uboot如何編譯》,說得很好。

  而說到編譯的執行過程,建議看看

  http://hi.baidu.com/serial_story/blog/item/871fc30311670783d53f7c74.html

  《詳細分析make uboot 最後的編譯連結的具體執行過程

  最後談談編譯不通過的問題,如果是內部自己程式出錯,可以通過提示資訊查出

  如果是出現ERROR一百多個,或者什麼arm-linux-ld的問題,那應該是編譯器版本不相容問題,建議換換新的版本或更舊的版本再試試。

  好,到這裡算是可以繼續下一步系統的移植和驅動的編寫了,而最近503的肥仔說想了個有關投影儀與網路攝影機的項目想做,剛好我對影像處理這方面比較感興趣,而且覺得他創意很好

  可能去做了哦,GO

  頭很暈,歇幾天啦~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.