U-boot-2009.08移植TE2440II开发板--在SDRAM中运行
发布时间:2011-3-23 13:42
发布者:techshare
因为串口的波特率问题纠结了我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中,哈哈。 ![]() 李万鹏 |
网友评论