因為串口的波特率問題糾結了我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中,哈哈。 李萬鵬 |