新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Bootloader在AT91RM9200系統中的實現

        Bootloader在AT91RM9200系統中的實現

        作者: 時間:2012-05-21 來源:網絡 收藏

        1.3 本嵌入式板的存儲空間情況

        筆者開發的ARM板的與相關的關鍵存儲空間分布情況如下:

        32M字節SDRAM: 0x2000_0000 – 0x21FF_FFFF

        2M 字節 Flash: 0x1000_0000 – 0x101F_FFFF

        2 用GNU工具開發

        GNU提供了免費的編譯工具,可從網上下載。針對ARM平臺的交叉編譯工具有匯編器arm-linux-as, C編譯器arm-linux-gcc,連接器arm-linux-ld,以及二進制轉換工具arm-linux-objcopy。 GNU的編譯器功能非常強大,共有上百個操作選項,滿足開發者的各種需要。它的特點是開發成本低,無需昂貴的仿真器,不但可以開發操作系統下運行的程序,也可以開發裸機應用程序[3]。GNU工具都運行在Linux下,開發者需要1臺運行Linux的PC作為宿主機,開發后下載到板子上。,vivi等都利用了這些工具。為開發者的開發提供了很好的范例。一般地,基于GNU工具的程序開發流程如下:(1)編寫C、C++或者匯編源程序;(2)用相關編譯器生成目標文件;(3)編寫連接腳本;(4)用連接器生成最終文件(elf格式);(5)用二進制轉換工具生成可下載的二進制代碼。

        編寫適用于本系統的Bootloader以完成最基本的引導操作系統的功能為目的。作為引導程序的基本功能應該包括:(1)對硬件的初始化,如設置異常向量,設置CPU的速度、時鐘頻率和中斷控制寄存器,初始化內存控制器,初始化堆棧等;(2)支持文件的下載,串口的Kermit協議下載或者支持tftp 協議的網口下載,后者實現相對復雜,但是速度快,可以根據情況選擇;(3)對Flash的操作;(4)最好支持下載和自舉兩種工作模式;(5)解壓內核,配置參數等。其中功能(1)直接涉及硬件,實現時應該使用GNU匯編。不同于ADS環境下的ARM匯編程序編寫,這種匯編語言有其特點,支持預處理,可以使用#include>和C語言風格的注釋,文件的擴展名是大寫的S(編譯器以此區分是否預處理匯編程序),開發者可以參考GNU提供的資料,以及的源代碼。

        3 的移植

        3.1 源代碼分析

        U-BOOT(Universe Bootloader),是Sourceforge網站的開放源代碼項目,支持PowerPC、ARM、MIPS和x86等多種體系結構,代碼便于移植[4]。本人開發中采用了U-Boot1.1.2的源代碼,GCC編譯器版本是2.95.3。開發者首先要了解代碼的結構和功能。在此基礎上分析代碼的運行順序和相互調用關系。

        圖2 U-boot的執行順序

        U-Boot的運行過程如圖2所示,程序從cpu/at91rm9200/start.S開始,start.S中用.globl _start定義了入口,之后設置了處理器的狀態,初始化了中斷和內存時序并且確定是否需要對整個U-Boot代碼重定位,跳轉到 star_armboot()運行,這個函數在/lib_asm/board.c中定義,完成了一些初始化工作,之后便循環調用commmon /main.c中的main_loop()函數。開發時可以按這個次序閱讀代碼。在代碼的board目錄下,可以找到與自己的芯片相同的開發板對應目錄,此處選擇的是目錄at91rm9200dk,移植時修改工作也多在此處。

        3.2 移植要點

        進行移植主要關注并進行修改的代碼文件有和相應的修改要點如下:

        (1) include/commom.h。代碼中用很多的條件編譯包含了一些頭文件,并且聲明了一系列的基本函數,這個頭文件被很多文件包含。了解這個文件的內容對理解、修改代碼很有幫助。

        (2) include/configs/at91rm9200dk.h。這個文件中是針對本電路板的詳細設置信息,關鍵的設置有時鐘設置,終端選擇(GDBU、 USART0、USART1),SDRAM的起始地址PHYS_SDRAM和大小PHYS_SDRAM_SIZE,Flash存儲器的起始地址 PHYS_FLASH_1和大小PHYS_FLASH_SIZE,以及Flash中U-Boot的環境變量的存儲地址CFG_ENV_ADDR和大小 CFG_ENV_SIZE,以及U-Boot的起始地址CFG_U_BOOT_BASE和大小CFG_U_BOOT_SIZE。其他的參數可以根據開發者的需要進行修改。以上的參數要根據實際情況修改。

        根據開發經驗,容易忽略的是FLASH中環境變量的存儲地址CFG_ENV_ADDR和大小CFG_ENV_SIZE的設置。U-boot中的 saveenv命令執行時會將setenv命令設置的環境變量存儲在Flash,要求起始地址是Flash的一個段(section)的邊界,項目中根據 AM29LV160DB芯片的手冊以及電路原理圖上Flash的地址線的連接對本文件做以下修改:

        #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0xe000)

        #define CFG_ENV_SIZE 0x2000 /* 0x8000 */

        修改為:

        #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x8000)

        #define CFG_ENV_SIZE 0x8000 /*0x8000 */

        Flash存儲器的地址分配情況可以參見圖1。

        (3) board/at91rm9200dk/config.mk。這里面將TEXT_BASE設置為0x21f00000,與本文第1部分中提到的Boot程序的DST參數設置一致。

        (4) board/at91rm9200dk/flash.c。由于Flash芯片選用的與源代碼所針對的Flash芯片不同,首先要在include /flash.h中加入下面的宏:#define AMD_ID_LV160DB 0x22492249,這是AM29LV160DB芯片的設備ID號,為了在flash_identification()函數中正確地識別。另外在本文件中還要加入定義

        OrgDef OrgAMDLV160DB[] ={

        { 1, 16*1024 },

        /* 1 * 16 kBytes sectors */

        { 2, 8*1024 },

        /* 2 * 8 kBytes sectors */

        { 1, 32*1024 },

        /* 1 * 32 kBytes sectors */

        { 31, 64*1024 },

        /* 31 * 64 kBytes sectors */

        };



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 麻阳| 开阳县| 南郑县| 象州县| 德清县| 华坪县| 鲁甸县| 札达县| 河北区| 和田市| 桐柏县| 北安市| 泽普县| 平昌县| 灵璧县| 明星| 锦屏县| 和龙市| 乐业县| 桦南县| 古蔺县| 会宁县| 宝应县| 禹州市| 汨罗市| 西充县| 普洱| 镇坪县| 洛南县| 略阳县| 错那县| 边坝县| 城固县| 三台县| 新邵县| 娄烦县| 壤塘县| 松溪县| 同德县| 萍乡市| 思茅市|