最近工作穩定下來,開始折騰我那可憐的開發板,首先我想為它移植一個uboot,順便記錄下,以便以後查閱。
下載最新的uboot,u-boot-2011.09-rc1.tar.gz,解壓後,CD到其目錄下。
U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm
移植環境:
主機:Ubuntu 10.4 vbox虛擬機
編譯器:arm-linux-gcc 4.3.2
參考平台:SMDK2410
1.創建板子文件夾和配置文件:
cp board/samsung/smdk2410 board/samsung/fl2440 –rf
mv board/samsung/fl2440/smdk2410.c board/samsung/fl2440/fl2440.c
vi board/samsung/fl2440/Makefile
修改COBJS :=fl2440.o
cp include/configs/smdk2410.h include/configs/fl2440.h
vi include/configs/fl2440.h
增加#define CONFIG_SKIP_LOWLEVEL_INIT 1 //首先將在SDRAM中測試,所以跳過CPU初始化過程
vi Makefile
930行增加:
fl2440_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm 920t fl2440 samsung s3c24x0
161行修改:
CROSS_COMPILE ?= arm-linux-
保存後,可以進行測試:
make clean
make fl2440_config
make
然後會生成二進制文件u-boot.bin, 這個時候把程序放到開發板上是運行不了的,因為通過DNW下載的程序,它會從指定位置運行,而u-boot默認代碼地址為0。修改DNW配置,設置下載地 址為0x32000000(FL2440的DRAM空間是0x30000000~0x34000000,共64M),然後修改fl2440.h:
vi include/configs/fl2440.h
#define CONFIG_SYS_TEXT_BASE 0x32000000
然後重新生成uboot.bin,在DNW主菜單中選擇0,就可以通過USB將uboot.bin下載到開發板運行了,當然運行會出錯的。
2.修改配置
網上大部分的博客都是使用S3C2410的配置,我不想用這個,因為uboot已支持S3C2440。
修改include/configs/fl2440.h
去掉這兩行:
#defineCONFIG_S3C2410 /*specifically a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 /* on aSAMSUNG SMDK2410 Board */增加:
#define CONFIG_S3C2440
將NAND配置先注釋起來,不然會有很多錯誤:/*#define CONFIG_CMD_NAND*/
更改內存范圍,將:#defineCONFIG_SYS_MEMTEST_END 0x33F00000
修改為:
#defineCONFIG_SYS_MEMTEST_END 0x34000000
3.修改時鐘
vi arch/arm/cpu/arm920t/start.S
在163行處增加:
# if defined(CONFIG_S3C2440)
ldr r1,=0x7fff
ldr r0,=INTSUBMSK
str r1, [r0]
# endif這裡是屏蔽中斷,S3C440用到了15位,所以把值設置成0x7fff
將下面這段去掉:
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
增加這樣一段:# if defined(CONFIG_S3C2440)
ldr r0,=CLKDIVN
mov r1, #5
str r1, [r0]
#endif
這裡主要是設置FCLK,HCLK,PCLK等時鐘的,關於這一部分有篇博客寫得很好:FCLK,HCLK和PCLK的關系
保存,修改fl2440.c:
vi board/samsung/fl2440/fl2440.c
將這段去掉:
#define FCLK_SPEED 1
#ifFCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elifFCLK_SPEED==1 /* Fout = 202.8MHz */
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
#endif
#define USB_CLOCK 1
#if USB_CLOCK==0
#define U_M_MDIV 0xA1
#define U_M_PDIV 0x3
#define U_M_SDIV 0x1
#elif USB_CLOCK==1
#define U_M_MDIV 0x48
#define U_M_PDIV 0x3
#define U_M_SDIV 0x2
#endif
增加這段:
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
因為FL2440的晶振為12M,在芯片手冊可以查到這些值,使得CPU頻率為405M,USB時鐘頻率為48M在board_init函數中,修改:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
為:
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
這樣,時鐘就設置好了,保存,重新生成u-boot.bin,下載到開發板運行,就可以看到串口打印信息了:
U-Boot 2011.09-rc1 (Oct 03 2011 - 20:32:32)
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###
下一步的話,考慮讓UBOOT支持NAND FLASH。