最近工作稳定下来,开始折腾我那可怜的开发板,首先我想为它移植一个uboot,顺便记录下,以便以后查阅。

下载最新的uboot,u-boot-2011.09-rc1.tar.gz,解压后,CD到其目录下。

移植环境:

主机:ubuntu10.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。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐