UBOOT在普光ARM-9200嵌入式開發板程序
UBOOT在普光ARM-9200嵌入式開發板程序
總述 u-boot是德國DENX小組的開發用於多種嵌入式CPU的bootloader程序,在LINUX下可以通過CVS來得到當前正在開發的u-boot軟體。當前版本號:u-boot 1.0.2,見include/version.h中的定義。 #cvs –d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login #cvs –z3 –d :pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot checkout –P u-boot 本文講述S3C2410中u-boot的移植程序:S3C2410的硬體組態是: lCPU:S3C2410 lNOR: 16M,INTEL EP28F128J3A lSDRAM:64M, MICRON 48LC16M16A2-75 B lDM9000:DAVICOM (10/100M) 網路卡 lUSB 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:」上加入五句: lmov r3, pc lldr r4, =0x3FFF0000 land r3, r3, r4 //以上三句得到實際起動的記憶體位址 laad r0, r0, r3 //用GO指令偵錯uboot時,啟動位址在RAM ladd r2, r2, r3 //把啟始化記憶體訊息的位址,加上實際起動位址 u0:(標記符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操作功能 lINTEL 的28F128,在board目錄中找到CMI主機板有此FLASH,把cmi中flash.c拷到s3c2410目錄代換原來的flash.c。 lcmi中的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_10x00000000 /* Flash Bank #1 */ 2.#define CFG_FLASH_BASEPHYS_FLASH_1 3.#define CONFIG_AMD_LV4001 4.#if 0 5.#define CONFIG_AMD_LV8001 6.#endif 7.#define CFG_MAX_FLASH_BANKS1/* max number of memory banks */ 8.#ifdef CONFIG_AMD_LV800 9.#define PHYS_FLASH_SIZE0x00100000 /* 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_SIZE0x00080000 /* 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_10x00000000 /* Flash Bank #1 */ 2.#define PHYS_FLASH_SIZE0x01000000 /* 16 MB */ 3.##define CFG_FLASH_PROTECTION 4.define CFG_FLASH_BASEPHYS_FLASH_1 5.#define CFG_MONITOR_BASE PHYS_FLASH_1 6.#define CFG_MAX_FLASH_BANKS1/* 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.#defineCFG_ENV_IS_IN_FLASH1 11.#define CFG_ENV_ADDR(PHYS_FLASH_1 + 0x60000) 12.#define CFG_ENV_SIZE0x20000/* 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_DM90001/* we have a CS8900 on-board */ #define DM9000_BASE0x08000000 #define DM9000_BUS161 /* the Linux driver does accesses as shorts */ #define CONFIG_ETHADDR08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR192.168.2.120 #define CONFIG_SERVERIP192.168.2.122 實現USB功能 1.在include/configs/s3c2410中的CONFIG_COMMANDS中加入: lCFG_CMD_USB |\ lCFG_CMD_FAT |\ 2.並在文件中加入以下設定: l#define CONFIG_USB_OHCI l#define CONFIG_USB_STORAGE l#define CONFIG_USB_KEYBOARD l#define CONFIG_DOS_PARTITION l#defineCFG_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.#defineCFG_LOAD_ADDR0x30800000/* 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: lusb start: 起動usb 功能 lusb info: 列出設備 lusb scan: 掃瞄usb storage(u 盤)設備 19.fatls:列出DOS FAT文件系統, 如:fatls usb 0列出第一塊USB碟中的文件 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處。 |
所有時間均為台北時間。現在的時間是 11:11 AM。 |
Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.
『服務條款』
* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *