2009.08移植TE2440II开发板(3)

因为串口的波特率问题纠结了我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

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwfwfz.html