uboot

 
 uboot at ARM s3c2410
 

http://www.eetop.com.cn/cgi-bin/topic.cgi?forum=18&topic=1329

uboot 在 ARM s3c2410 上移植過程

總述
u-boot是德國DENX小組的開發用於多種嵌入式CPU的bootloader程序,在LINUX下可以通過CVS來得到當前正在開發的u-boot軟件。當前版本號:u-boot 1.0.2,見include/version.h中的定義。
#cvs –dserver:[email protected]:/cvsroot/u-boot login
#cvs –z3 –d server:[email protected]:/cvsroot/u-boot checkout –P u-boot
本文講述S3C2410中u-boot的移植過程:S3C2410的硬件配置是:
l CPU:S3C2410
l NOR: 16M,INTEL EP28F128J3A
l SDRAM:64M, MICRON 48LC16M16A2-75 B
l DM9000AVICOM (10/100M) 網卡
l USB HOST一個
配置自已的主板
l 閱讀Makefile文件,在Makefile文件中添加兩行:
s3c2410_config: unconfig
@./mkconfig $(@:_config=) arm arm920t s3c2410
其中ARM是CPU的種類, arm920t是ARM CPU對應的代碼目錄,s3c2410是自已主板對應的目錄。
l 在board目錄中建立s3c2410目錄,複製smdk2410目錄中的內容(cp smdk2410/* s3c2410)。
l 在include/configs/目錄下複製smdk2410.h(cp smdk2410.h s3c2410.h)
l 修改ARM編譯器的目錄名及前綴
本人ARM編譯器的目錄是在:/opt/host/armv4l/bin/armv4l-unknown-linux-
把CROSS-COMPILE = arm-linux- 改爲實際目錄:如
CROSS-COMPILE = /opt/host/armv4l/bin/arm4l-unknown-linux-
l 完成之後,可以測試一下你的配置:
#make s3c2410_config
#make
編譯應該在processor.h中出錯
l 修改processor.h中:
union debug_insn
{
u32 arm;
u16 thumb;
}
修改成:
union debug_insn
{
u32 arm_mode;
u16 thumb_mode;
}

l 編譯成功,編譯好的程序同smdk2410一樣。
l 注:如果第一次修改後編譯沒有在processor.h中出錯,而在examples目錄出錯,認真檢查以上修改(修改的內容不正確),並在 examples目錄中運行touch命令(不運行touch還會出錯,可能uboot Makefile沒有寫好,沒查原因),再編譯。
生成最基本的u-boot, 沒有功能,只能起動
l 修改程序連接地址:
在board/s3c2410中有一個config.mk文件,用於設置程序連接的起始地址,因爲會在u-boot中增加功能,所以留下6M的空間,修改33F80000爲33A00000。
l 爲了以後能用uboot的GO命令執行修改過的用loadb或tftp下載的u-boot:在board/s3c2410的memsetup.S中標記符”0:”上加入五句:
l mov r3, pc
l ldr r4, =0x3FFF0000
l and r3, r3, r4 //以上三句得到實際起動的內存地址
l aad r0, r0, r3 //用GO命令調試uboot時,啓動地址在RAM
l add r2, r2, r3 //把初始化內存信息的地址,加上實際起動地址
u 0標記符0, 原來存在的標記符)
l 用SJF軟件通過jtag口下載編譯的u-boot, 啓動!讀取環境塊時CRC出錯,然後進入SMDK#。
l 把MIZI vivi中的PrintHexWord, PrintWord拷過來,這樣可以在調試彙編時可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr r0, [r2, r0] 應改爲ldrb r0, [r2, r0],這樣可以在四字節對齊的系統中使用。
INTEL nor flash操作功能
l INTEL 的28F128,在board目錄中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目錄代換原來的flash.c。
l cmi中的flash.c在寫入時要交換字節,所以刪除它的write_short()和wirte_buff()函數,把ep7312主板目錄中 flash.c的wirte_word()和wirite_buff()函數複製過來。把flash.c中的FLASH_BASE0_PRELIM改爲 CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改爲0x20000,(E28F128J3A flash中塊的大小是128K)。
l 把s3c2410.h中的flash內容由原來的:
1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
2. #define CFG_FLASH_BASE PHYS_FLASH_1
3. #define CONFIG_AMD_LV400 1
4. #if 0
5. #define CONFIG_AMD_LV800 1
6. #endif

7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
8. #ifdef CONFIG_AMD_LV800
9. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */
10. #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
12. #endif
13. #ifdef CONFIG_AMD_LV400
14. #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
15. #define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */
16. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000)
改爲:
1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
2. #define PHYS_FLASH_SIZE 0x01000000 /* 16 MB */
3. ##define CFG_FLASH_PROTECTION
4. define CFG_FLASH_BASE PHYS_FLASH_1
5. #define CFG_MONITOR_BASE PHYS_FLASH_1
6. #define CFG_MAX_FLASH_BANKS 1/* max number of memory banks */
7. #define CFG_MAX_FLASH_SECT 128/* max number of sectors on one chip */
8. #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */
9. #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */
10. #define CFG_ENV_IS_IN_FLASH 1
11. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000)
12. #define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
l 把cmd_mem.c中的cmd_get_data_size函數的default_size全改爲1, 默認以字節顯示,更直觀,並且不會出現地址對齊錯(data abort)。而在do_mem_mw()及mod_mem()中加入:
if(addr2info(addr) != NULL)
{
printf(“can’t wirte or modify in flash! Use cp instead./n”);
return 0;
}
以使mw和mm命令不能修改flash中的數據,而只開放cp修改flash中的數據。
l 改board/s3c2410/flash.c中的flash_erase(),把start = get_timer(0)移到for(), 以去掉flash_erase timeout 錯誤。
設置FLASH和SDRAM時序
根據28F128J3A-150,這是一150ns的flash, 所以把flash時序設爲最慢。把s3c2410設成202.8MHZ, 並且工作在異步模式, 修改memsetup.S。

實現網卡功能
本人的網卡是DM9000,在uboot中沒有相應的驅動,所以自已寫了一個網卡驅動。
1. 把驅動拷到drivers/dm9000.c
2. 在drivers/Makefile中加入dm9000.o
3. 在lib_arm/board.c中修改CS8900=>DM9000
4. 在include/configs/s3c2410中加入以下幾句
#define CONFIG_DRIVER_DM9000 1 /* we have a CS8900 on-board */
#define DM9000_BASE 0x08000000
#define DM9000_BUS16 1 /* the Linux driver does accesses as shorts */
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.120
#define CONFIG_SERVERIP 192.168.2.122

實現USB功能
1. 在include/configs/s3c2410中的CONFIG_COMMANDS中加入:
l CFG_CMD_USB |/
l CFG_CMD_FAT |/
2. 並在文件中加入以下設置:
l #define CONFIG_USB_OHCI
l #define CONFIG_USB_STORAGE
l #define CONFIG_USB_KEYBOARD
l #define CONFIG_DOS_PARTITION
l #define CFG_DEVICE_DEREGISTER
l #define CONFIG_SUPPORT_VFAT
l #define LITTLEENDIAN
3. 這時usb start 和 usb info等功能正常,而其它一些功能不正常。
4. 功能fatls 不正常,修改fs/fat/fat.c
l 沒有把VFAT的UNICODE字符轉換過來,加入UNICODE字符轉換函數。Uni2ansi(), 增加slot2str()的cp936版, 增加一個toshort()。
l 加入#define cp936
l 在fat_getenv()中有一個對齊錯誤,修改fat.h使fatbuff字對齊。
l 在do_fat_read()中加入兩句,以消除列根目錄錯誤。
l 在board/cmd_fat.c中加入兩句,以消除沒有usb storage設備時的錯誤:
if(!dev_desc)
printf(“Not init storage usb device:/n usb start/n usb info/n usb scan/n”);
5. 修改fs/fat/fat.c
get_cluster()函數中加入 if(size / FS_BLOCK_SIZE > 0), 以防讀文件時不能成功讀出。
引導LINUX
現在我們可以引導LINUX了。
l 要引導bzip2的linux核,把CFG_MALLOC_SIZE改爲大於4M
l 把編譯好的LINUX內存,通過uboot/tools/mkimage轉換成uboot格式
1. mkimage -A arm -O linux -T kernel -C bzip2 -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux1.bz2 c
2. mkimage -A arm -O linux -T kernel -C gzip -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux.gz b
3. mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n 'init ramdisk' -d ramdisk.image.gz ramdisk
l 在include/configs/s3c2410.h中加入:
1. #define CONFIG_BOOTARGS "initrd=0x30800000,0x200000 root=/dev/ram init=/linuxrc console=ttyS0,115200"
2. #define CONFIG_BOOTFILE "vmlinux_for_uboot.gz"
3. #define CONFIG_BOOTCOMMAND "bootm 0x80000 0x1a0000"
0x80000爲內核在flash中的位置。
0x1a0000爲ramdisk.image.gz在flash中的內容。
4. #define CFG_LOAD_ADDR 0x30800000 /* default load address */
l 在lib_arm/armlinux.c的do_bootm_linux中加入:
1. memcpy ((char *)CFG_LOAD_ADDR, (char *)data, len);
2. data = CFG_LOAD_ADDR;
把ramdisk複製到0x30800000位置的RAM中
3. 定義以下配置,把信息傳入LINUX核心的TAG區
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
#define CONFIG_CMDLINE_TAG

常用U-BOOT命令介紹

1. ?得到所有命令列表
2. help: help usb, 列出USB功能的使用說明
3. ping:注:只能開發板PING別的機器
4. setenv: 設置互環境變量:
5. setenv serverip 192.168.0.1
6. setenv ipaddr 192.168.0.56
7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’
8. saveenv: 保存環境變量
9. 在設置好環境變量以後, 保存變量值
10. tftp: tftp 32000000 vmlinux, 把server(IP=環境變量中設置的serverip)中/tftpdroot/ 下的vmlinux通過TFTP讀入到物理內存32000000處。
11. kgo: 起動沒有壓縮的linux內核,kgo 32000000
12. bootm:起動UBOOT TOOLS製作的壓縮LINUX內核, bootm 3200000
13. protect: 對FLASH進行寫保護或取消寫保護, protect on 1:0-3(就是對第一塊FLASH的0-3扇區進行保護),protect off 1:0-3取消寫保護
14. erase: 刪除FLASH的扇區, erase 1:0-2(就是對每一塊FLASH的0-2扇區進行刪除)
15. cp: 在內存中複製內容, cp 32000000 0 40000(把內存中0x32000000開始的0x40000字節複製到0x0處)
16. mw: 對RAM中的內容寫操作, mw 32000000 ff 10000(把內存0x32000000開始的0x10000字節設爲0xFF)
17. md: 修改RAM中的內容, md 32000000(內存的起始地址)
18. usb:
l usb start: 起動usb 功能
l usb info: 列出設備
l usb scan: 掃描usb storage(u 盤)設備
19. fatls:列出DOS FAT文件系統, 如:fatls usb 0列出第一塊U盤中的文件
20. fatload: 讀入FAT中的一個文件,如:fatload usb 0:0 32000000 aa.txt
21. 把USB中的aa.txt 讀到物理內存0x32000000處!
22. flinfo: 列出flash的信息
23. loadb: 準備用KERMIT協議接收來自kermit或超級終端傳送的文件。
24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系統)中的NFS文件系統中的aa.txt 讀入內存0x32000000處。

 
 U-BOOT
 


引 言:
   本文以U-BOOT爲例,介紹瞭如何在ARM9開發板上移植BootLoader的過程。LH7A400學習板是旋極公司推出的一款高性能嵌入式開發 板,其採用的處理器LH7A400是Sharp公司生產的一款基於ARM922T內核的32位RISC芯片。該芯片集成了高性能的32位RISC處理器核 ARM922T(運算速度200MHz,總線速度100MHz) ,能使處理速度達到每秒220百萬條指令(MIPS),能耗爲1.33mW/MIPS,可以在低電壓狀態下工作(核心1.8V,輸入/輸出3.3 V),片內帶有鎖相迴路(PLL)和低能耗核心。此外該芯片還包括: 16KB 高速緩存 (Cache), 存儲器管理單元(MMU), 80KB 靜態存儲器(SRAM), 彩色液晶顯示控制器(LCD), 直接存儲控制器(10通道 DMA), 異步串行口控制器(UART), 同步串行口控制器(SSP), PCMCIA控制器, AC97聲音控制器, 智能卡控制器, 多媒體卡控制器, 電池控制器, USB控制器和時鐘/供電管理器。值得一提的是,LH7A400是一款寬溫芯片,其工作溫度範圍爲-40℃~+85℃(降低時鐘頻率),可廣泛應用於無線 手持設備、智能電話、PDA、家庭娛樂控制器、PocketPC及各種工控設備。
該學習板還包括如下硬件:由2 片16位Flash (32MB)和2片16位的SDRAM(64M)構成32位寬的高速存儲器結構;10/100M自適應網絡芯片DM9000; Sharp 3.5’TFT LCD彩屏;觸摸屏;USB Host/Device;CF卡插槽;全功能JTAG接口等。

1 U-BOOT簡介
   U-BOOT是由德國的工程師Wolfgang Denk從8XXROM代碼發展而來的,它支持很多處理器,比如PowerPC、ARM、MIPS和 x86。目前,U-BOOT源代碼在sourceforge網站的社區服務器中,Internet上有一羣自由開發人員對其進行維護和開發,它的項目主頁 是::URL::http://sourceforge.net/projects/U-BOOT。U-BOOT的最新版本源代碼可以在 Sourceforge的CVS服務器中匿名獲得。
#cvs -dserver:[email protected]:/cvsroot/U-BOOT login
#cvs -z6 -dserver:[email protected]:/cvsroot/U-BOOT / co -P modulename

1.1 U-BOOT源代碼目錄結構
◆ board:和一些已有開發板有關的文件,比如Makefile和u-boot.lds等都和具體開發板的硬件和地址分配有關。
◆ common:與體系結構無關的文件,實現各種命令的C文件。
◆ cpu: CPU相關文件,其中的子目錄都是以U-BOOT所支持的CPU爲名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定 的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設置指令Cache和數據Cache等; interrupt.c設置系統的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;start.S是U-BOOT 啓動時執行的第一個文件,它主要是設置系統堆棧和工作方式,爲進入C程序奠定基礎。
◆ disk:disk驅動的分區處理代碼。
◆ doc:文檔。
◆ drivers:通用設備驅動程序,比如各種網卡、支持CFI的Flash、串口和USB總線等。
◆ fs:支持文件系統的文件,U-BOOT現在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:頭文件,還有對各種硬件平臺支持的彙編文件,系統的配置文件和對文件系統支持的文件。
◆ net:與網絡有關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文件系統的實現。
◆ lib_arm:與ARM體系結構相關的代碼。
◆ tools:創建S-Record格式文件 和U-BOOT images的工具。

1.2 U-BOOT的特點
  U-BOOT支持SCC/FEC以太網、OOTP/TFTP引導、IP和MAC的預置功能,這一點和其它BootLoader(如BLOB和RedBoot等)類似。但U-BOOT還具有一些特有的功能。

◆ 在線讀寫Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在線讀寫。
◆ 支持串行口kermit和S-record下載代碼,U-BOOT本身的工具可以把ELF32格式的可執行文件轉換成爲 S-record格式,直接從串口下載並執行。
◆ 識別二進制、ELF32、uImage格式的Image,對Linux引導有特別的支持。U-BOOT對Linux 內核進一步封裝爲uImage。封裝如下:
#{CROSS_COMPILE}-objcopy -O binary -R.note -R.comment -S vmlinux / linux.bin
#gzip -9 linux.bin
#tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e/
0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uImage
即 在Linux內核鏡像vmLinux前添加了一個特殊的頭,這個頭在include/image.h中定義,包括目標操作系統的種類(比如Linux, VxWorks等)、目標CPU的體系機構(比如ARM、PowerPC等)、映像文件壓縮類型(比如gzip、bzip2等)、加載地址、入口地址、映 像名稱和映像的生成時間。當系統引導時,U-BOOT會對這個文件頭進行CRC校驗,如果正確,纔會跳到內核執行。如下所示:
WT-ARM9# bootm 0xc1000000
## Checking Image at 0xc100000 ...
Image Name: Linux-2.4.20
Created: 2004-07-02 22:10:11 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 550196 Bytes = 537 kB = 0 MB
Load Address: 0xc0008000
Entry Point: 0xc0008000
Verifying Checksum ... OK
Uncompressing Kernel Image ……… OK
◆ 單任務軟件運行環境。U-BOOT可以動態加載和運行獨立的應用程序,這些獨立的應用程序可以利用U-BOOT控制檯的I/O函數、內存申請和中斷服務等。這些應用程序還可以在沒有操作系統的情況下運行,是測試硬件系統很好的工具。
◆ 監控(minitor)命令集:讀寫I/O,內存,寄存器、內存、外設測試功能等
◆ 腳本語言支持(類似BASH腳本)。利用U-BOOT中的autoscr命令,可以在U-BOOT中運行“腳本”。首先在文本文件中輸入需要執行的命令,然後用tools/mkimage封裝,然後下載到開發板上,用autoscr執行就可以了。
① 編輯如下的腳本example.script。
echo
echo Network Configuration:
echo ----------------------
echo Target:
printenv ipaddr hostname
echo
echo Server:
printenv serverip rootpath
echo
② 用tools/mkimage對腳本進行封裝。
# mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr example script" -d example.script /tftpboot/example.img
Image Name: autoscr example script
Created: Wes Sep 8 01:15:02 2004
Image Type: ARM Linux Script (uncompressed)
Data Size: 157 Bytes = 0.15 kB = 0.00 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 149 Bytes = 0 kB = 0 MB
③ 在U-BOOT中加載並執行這個腳本。
WT-ARM9# tftp 100000 /tftpboot/example.img
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.99
Filename '/tftpboot/TQM860L/example.img'.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
WT-ARM9# autoscr 100000
## Executing script at 00100000
Network Configuration:
----------------------
Target:
ipaddr=10.0.0.99
hostname=arm
Server:
serverip=10.0.0.2
rootpath=/nfsroot
WT-ARM9#
◆ 支持WatchDog、LCD logo和狀態指示功能等。如果系統支持splash screen,U-BOOT啓動時,會把這個圖像顯示到LCD上,給用戶更友好的感覺。
◆ 支持MTD和文件系統。U-BOOT作爲一種強大的BootLoader,它不僅支持MTD,而且可以在MTD基礎上實現多種文件系統,比如cramfs、fat和jffs2等。
◆ 支持中斷。由於傳統的BootLoader都分爲stage1和stage2,所以在stage2中添加中斷處理服務十分困難,比如BLOB;而U-BOOT是把兩個部分放到了一起,所以添加中斷服務程序就很方便。
◆ 詳細的開發文檔。由於大多數BootLoader都是開源項目,所以文檔都不是很充分。U-BOOT的維護人員意識到了這個問題,充分記錄了開發文檔,所以它的移植要比BLOB等缺少文檔的BootLoader方便。

2 對U-BOOT-1.1.0的修改
   爲了使U-BOOT-1.1.0支持新的開發板,一種簡便的做法是在U-BOOT已經支持的開發板中選擇一種接近的進行修改。由於U-BOOT- 1.10不支持ARM-922T內核,所以選擇基於ARM-920T內核的smdk2400爲模板。相關的源代碼在board/smdk2400/下。

2.1 支持ARM-922T內核的代碼修改
修改以下代碼,使U-BOOT支持arm-922t內核。
① 在include/目錄下新建文件arm922t.h,內容如下:
#ifndef __ARM922T_H__
#define __ARM922T_H__
#endif
② 在include/目錄下新建文件wt-arm9.h,該文件描述了ARM922T中Timer、UART等寄存器的結構及若干宏定義。具體內容要參考相關處理器手冊。
③ 在cpu/目錄下新建目錄arm922t,將目錄arm920t下的內容複製後,參考手冊分別修改cpu.c、interrupts.c和serial.c,其它文件不修改。

2.2 開發板的支持
  建立自己開發板的目錄和相關文件。
① 在include/configs目錄中添加頭文件lh7a400.h。這個文件是lh7a400開發板的配置文件,它包括開發板的CPU、系統時鐘、 RAM、Flash系統及其它相關的配置信息。其格式可參考include/configs/smdk2400.h。
② 在board/目錄下新建wt-arm9目錄,創建如下文件:flash.c、lhmemsetup.c、wt- arm9.c、Makefile和u-boot.lds。
◆ flash.c。U-BOOT 讀、寫和刪除Flash設備的源代碼文件。由於不同開發板中Flash存儲器的種類各不相同,所以,修改flash.c時需參考相應的Flash芯片手冊。它包括如下幾個函數:
unsigned long flash_init (void ,Flash初始化;
void flash_print_info (flash_info_t *info),打印Flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),Flash擦除;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),Flash寫入;
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),從內存複製數據。
◆ lhmemsetup.c。初始化時鐘、SMC控制器和SDRAM控制器。
◆ wt-arm9.c。設置各種總線時鐘,打開數據Cache和指令Cache,並設置相關內存參數。
◆ Makefile。直接拷貝board/smdk2400/Makefile,作如下修改:
OBJS := wt-arm9.o flash.o lhmemsetup.o
◆ u-boot.lds。設置U-BOOT中各個目標文件的連接地址,直接拷貝 board/smdk2400/u-boot.lds,作如下修改:
.text
{
cpu/arm922t/start.o (.text)
*(.text)
}

2.3 添加網口設備控制程序
  在drivers/目錄中添加網口設備控制程序dm9000.c 和dm9000.h,其中dm9000.c 主要包括以下函數:
int eth_init (bd_t *bd),初始化網絡設備;
void eth_halt (void),關閉網絡設備;
int eth_send (volatile void *packet,int len),發送數據包;
int eth_rx (void) 接收數據包。
用中斷方式處理數據包的收發,因此還定義了另外兩個函數:
void InitInterrupt (void) ,中斷初始化;
void dm9000_irq (void) ,中斷處理。
以上兩個函數在cpu/arm922t/interrupts.c中被調用,最後在drivers/Makefile中加入dm9000.o。

2.4 修改Makefile
  在u-boot-1.1.0/Makefile中加入
lh7a400_config : unconfig
@./mkconfig $(@:_config=) arm arm922t wt-arm9
其中“arm”是CPU的種類, arm922t 是ARM CPU對應的代碼目錄,wt-arm9是自己開發板對應的目錄。
交叉編譯器安裝在/opt/arm/3.3/bin/目錄下,所以把CROSS_COMPILE設置成相應的路徑:
export CROSS_COMPILE = /opt/arm/3.3/bin/arm-elf-

2.5 生成目標文件
   先運行make clean,
[zeng@localhost u-boot-1.1.0]$make clean
然後運行make lh7a400_config,
[zeng@localhost u-boot-1.1.0]$ make lh7a400_config
Configuring for lh7a400 board...
再運行make,
[zeng@localhost u-boot-1.1.0]$make
之後會生成三個文件:
u-boot——ELF格式的文件,可以被大多數Debug程序識別;
u-boot.bin——二進制bin文件,純粹的U-BOOT二進制執行代碼,不保存ELF格式和調試信息。這個文件一般用於燒錄到用戶開發板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發板中。

2.6 測 試
  通過JTAG口將u-boot.bin燒寫到Flash的零地址,復位後執行u-boot。若運行正常,會從串口返回如下信息:
U-Boot 1.1.0 (Aug 21 2004 ?18:44:37)
U-BooT code: C3F80000 -> C3FA51A0 BSS: -> C3FA96EC
IRQ Stack: c3f1ff7c
FIQ Stack: c3f1ef7c
RAM Configuration:
Bank #0: c0000000 8 MB
Bank #1: c1000000 8 MB
……
Flash: 32 MB
In: serial
Out: serial
Err: serial
WT-ARM9 #
  輸入help得到所有命令列表,help command 列出該命令的功能。緊接着測試Flash和網卡,如果都正常工作的話,表明移植U-BOOT的工作基本完成,可以接着調試內核和文件系統。

結 語

   BootLoader是操作系統和硬件的樞紐,它爲操作系統內核的啓動提供了必要的條件和參數。在移植過程中,開發人員除了要掌握 BootLoader的結構和工作流程外,還要對相關硬件有一定的瞭解。目前,筆者移植的U-BOOT已經能夠穩定地運行在開發板上,而且可以通過 Flash和網絡加載內核和文件系統,爲後續開發,特別是驅動程序的開發奠定了良好的基礎。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章