ARM+LINUX移植攻略(三)U-boot-2009.08移植TE2440II开发板--在SDRAM中运行

来源:互联网 发布:软件就业形势 编辑:程序博客网 时间:2024/06/05 06:41

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 
http://blog.csdn.net/woshixingaaa/archive/2011/02/09/6175141.aspx

因为串口的波特率问题纠结了我2天,嘿嘿。 
1.首先创建自己板子的目录 
cd u-boot-2009.08 
mkdir board/samsung/TE2440II 
cp board/samsung/smdk2410/* board/samsung/TE2440II/ 
mv board/samsung/TE2440II/smdk2410.c board/samsung/TE2440II/TE2440II.c 
2.添加配置文件 
cp include/configs/smdk2410.h include/configs/TE2440II.h 
在include/configs/smdk2410.h include/configs/TE2440II.h中添加 
#define CONFIG_SKIP_LOWLEVEL_INIT         1    
因为是先在SDRAM中运行,所以要跳过底层的初始化。暂时没有添加CONFIG_2440,用原来的CONFIG_2410,以提高移植速度。 
注意暂时不要添加#define CONFIG_SKIP_RELOCATE_UBOOT    1 
否则就要更改你的下载地址为0x33f80000,让他去搬运代码吧 
3.修改board/samsung/TE2440II/ 目录下的Makefile,把COBJS := 修改为 
COBJS    := TE2440II.o flash.o 
4.修改顶层Makefile 
TE2440II_config : unconfig                                                   
           @$(MKCONFIG) $(@:_config=) arm arm920t TE2440II samsung s3c24x0 
注意有个Tab键 
5. 修改顶层Makefile文件,在CROSS_COMPILE ?=后面添加自己的交叉编译工具。 
CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-linux- 
6.完成这几步后编译一下 
    make TE2440II_config 
    make 
下到SDRAM中,终端应该没有任何信息,需要设置波特率。 
1.    修改TE2440II.c文件 
#elif FCLK_SPEED==1        /* Fout = 405MHz */ 
#define M_MDIV    0x7f 
#define M_PDIV    0x2 
#define M_SDIV    0x1 
#endif

2.    修改cpu/arm920t/start.S 
外部晶振为12MHz,通过MPLLCON设置MPLL为405M 
#if defined(CONFIG_S3C2410) 
#define MPLLCON 0x4C000004 
#define UPLLCON 0x4c000008 
#define LOCKTIME 0x4C000000 
#define CAMDIVN  0x4C000018 
    ldr r0,=LOCKTIME 
    ldr r1,=0xffffffff 
    str r1,[r0] 
//清除摄像头分频寄存器的值    
ldr r0,=CAMDIVN                 
    mov r1,#0 
    str r1,[r0] 
    ldr r0, =CLKDIVN 
    mov r1, #5 
    str r1,[r0]

    //手册说HDIVN不为0,加这个 
    mrc  p15, 0, r1, c1, c0, 0         //read ctrl register        
    orr   r1, r1, #0xc0000000          //Asynchronous 
    mcr  p15, 0, r1, c1, c0, 0         //write ctrl register

        ldr r0, =UPLLCON                   //同时修改UPLLCON和MPLLCON需要先修   
    ldr r1, =0x00038022                  //改UPLLCON,且之间要间隔至少7个nop 
    str r1,[r0]                           //手册有些 
       nop                            
       nop 
       nop 
       nop 
       nop 
       nop 
       nop 
       nop 
     ldr r0, =MPLLCON 
    ldr r1, =0x0007f021 
    str r1,[r0] 
#endif    
3.    修改cpu/arm920t/s3c24x0/speed.c 
由于S3C2440和S3C2410的MPLL计算公式改变了,所以要改一下。 
get_PLLCLK改成这样 
static ulong get_PLLCLK(int pllreg) 

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER(); 
    ulong r, m, p, s;

    if (pllreg == MPLL) 
    r = clk_power->MPLLCON; 
    else if (pllreg == UPLL) 
    r = clk_power->UPLLCON; 
    else 
    hang();

    m = ((r & 0xFF000) >> 12) + 8; 
    p = ((r & 0x003F0) >> 4) + 2; 
    s = r & 0x3; 
if (pllreg == MPLL) //MPLL的算法和UPLL是不同的。这里m=2*m 
    { 
        m <<= 1; 
    }

    p = ((r & 0x003F0) >> 4) + 2; 
    s = r & 0x3;

    return ((CONFIG_SYS_CLK_FREQ * m) / (p << s)); 

get_HCLK改成这样 
/* return HCLK frequency */ 
ulong get_HCLK(void) 

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER(); 
    return get_FCLK()/4; 
    //return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK()); 

get_PCLK改成这样 
/* return PCLK frequency */ 
ulong get_PCLK(void) 

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER(); 
    return get_HCLK()/2; 
    //return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK()); 

4.    我出问题的地方是串口,显示的基本跟正常的一样,但是显示为乱码,是串口波特率的问题。在drivers/serial/serial_s3c24x0.c中,修改 
uart->UBRDIV = 27; 
我直接设定了,不用鸟u-boot再鸟算了,他自己怎么也算不对,我帮他。 
5.    make TE2440II_config 
       make 
下载到SDRAM中,哈哈。

3