|
這段時間一直在學習uboot,從閱讀源代碼到開始動手移植。這塊an2410跟smdk2410幾乎
一樣,所以移植起來參照include/configs/下的smdk2410.h,不會太復雜。移植成功后
再回頭看看原來的調試過程,才發現犯的錯誤都挺離譜的。今天重新解壓了一份
開凈的u-boot源代碼移植到板子上,并將整個過程記錄下來,以供備忘,也給正在
an2410上移植uboot的朋友做個參考。
下面僅記錄移植步驟及改動的地方,關于代碼細節可參考網上的相關文章。下面兩篇是我閱讀代碼的一點記錄
http://blog.chinaunix.net/u3/93566/showart_2097734.html
http://blog.chinaunix.net/u3/93566/showart_2097507.html
目標板: an2410-ssb (阿南的板子)
移植重點: 從nand flash啟動 k9f1208
這塊板子上沒有nor flash
others: 網卡芯片 cs8900a
sdram 64M 2塊ks562632
uboot版本 : u-boot-1.3.4
移植步驟:
1. 在board下建立an2410文件夾,這里直接將board/smdk2410 復制為 board/an2410
2. 在頂層的Makefile里添加如下兩行(可先搜索smdk2410,然后再其上添加)
an2410_config: unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t an2410 NULL s3c24x0
同時搜索CROSS_COMPILE,并修改其下面arm對應相的交叉編譯路徑
3. 將include/configs/smkd2410.h 復制為 include/configs/an2410.h
4. 修改cpu/arm920t/start.S,這個文件是uboot代碼的匯編部分,其中修改的有以下幾
個部分
(1)
====上面是設置時鐘分頻比====
/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
這里加上下面三句,主要目的是調試的時候用,在調試的時候,是把uboot直接加載到
sdram上去,所以就不需要設置sdram,這里的3句會檢測是否是調試狀態,若是則跳過
adr r0, _start /* 加載此時的啟始地址到r0 */
ldr r1, _TEXT_BASE /* 加載默認的連接地址到r1 */
cmp r0, r1 /* 若r0與r1相等,則說明此時是在ram上,否則,是從
* nand上啟動,需要重新設定sdram
*/
blne cpu_init_crit
#endif
(2) 緊接著上面,這里要先設置芯片的時鐘。在uboot里,原來設置cpu時鐘是在
start_armboot里,即board_init里。這里提前設置時鐘,cpu也會跑快些
由于設置時鐘用的C函數,所以把堆棧的設置提前了
/*
* Setup the stack,下面調用C函數之前,先設置棧指針
*/
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
#ifndef CFG_SKIP_LOWLEVEL_INIT
bl clock_init /* 現在就設置時鐘頻率 */
#endif
(3) 設置nand ,由于下面馬上就要從nand上copy代碼了,所以這里先設置nand,代碼參考
vivi中的head.S,這里加了一個預定義CFG_BOOT_FROM_NAND,所以在an2410.h中需要定義
它
#if CFG_BOOT_FROM_NAND
#define NAND_CTL_BASE 0x4e000000
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFSTAT 0x10
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ configure nand flash
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ reset command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
1:
add r3, r3, #0x1
cmp r3, #0xa
blt 1b
2:
ldr r2, [r1, #oNFSTAT]
tst r2, #0x1 @ wait ready
beq 2b
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
#endif
(3) 復制代碼,nand_read_ll同樣也是取自于vivi
其中需要有修改的地方,見patch
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
/* beq stack_setup */ /* 之前已經設置了棧指針 */
beq clear_bss
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
#if CFG_BOOT_FROM_NAND
bl nand_read_ll /* 將u-boot從nand復制到ram */
#else
add r2, r0, r2 /* r2 <- source end address */
5. 修改 board/an2410/lowlevel_init.S
#define B3_BWSCON (DW16 + UBLB) /* CS8900A*/
#define REFCNT 0x4f4 /* period=7.8125us, HCLK=100Mhz
(2048 +1-7.8125*100) */
6. 添加board/an2410/nand_boot.c , 其中有兩個函數 nand_read_ll, 這個是取自
vivi,用來復制代碼;另一個是clock_init, 用來初始化cpu時鐘
代碼見patch
7. 修改 board/an2410/Makefile ,去掉flash.o ,添加nand_boot.o
#COBJS := smdk2410.o flash.o
COBJS := smdk2410.o nand_boot.o
8. 由于clock_init已經設置了時鐘,所以在board/an2410/smdk2410.c中的
board_init函數里去掉時鐘初始化相關部分
9. 修改an2410.h,其中有多處要修改的
增加下面幾行
#define CONFIG_JFFS2_CMDLINE 1
#define CONFIG_JFFS2_NAND 1
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT ""
/* 下面增加幾個命令 */
#define CONFIG_CMD_JFFS2
#define CONFIG_CMD_NAND
#define CONFIG_CMD_REGINFO
#define CONFIG_CMD_PING
#define CONFIG_BOOTDELAY 3
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.68.0.10
#define CONFIG_SERVERIP 192.168.0.100
參數taglist
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_CMDLINE_TAG 1
#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007fc0 kernel; bootm 0x30007fc0"
去掉flash
#define CFG_NO_FLASH 1
//#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#if 0
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
環境變量都保存在nand里
//#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_IS_IN_NAND 1
#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
#define CFG_ENV_OFFSET 0x40000
#define CFG_NAND_BASE 0
#define CFG_MAX_NAND_DEVICE 1
#define CFG_MAX_NAND_CHIP 1
#define CFG_BOOT_FROM_NAND 1
主要的修改就是上面的了,uboot的可移植非常好,所以只要幾步就可以移植到特定的開
方板上。啟動信息如下(沒有開debug, 沒有內核)
U-Boot 1.3.4 (Dec 21 2009 - 00:08:13)
DRAM: 64 MB
NAND: 64 MiB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
NAND read: device 0 offset 0x60000, size 0x200000
Reading data from 0x25fe00 -- 100% complete.
2097152 bytes read: OK
Wrong Image Format for bootm command
ERROR: can't get kernel image!
an2410 >
uboot.tar
(160 KB)
2009-12-21 00:47 上傳
點擊文件名下載附件
下載積分: 積分 -1
patch.tar
(50 KB)
2009-12-21 00:47 上傳
點擊文件名下載附件
下載積分: 積分 -1
|
|