FL2440的u-boot-2010.09移植(二)

让串口能正常输出打印信息,添加jz2440中S3C2440片上系统的支持。

一、汇编文件修改,这部分主要集中修改修改cpu/arm920t/start.S文件。

1、打开/cpu/arm920t/start.S,删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。

- start_code:  
/*  
* set the cpu to SVC32 mode  
*/  
mrsr0,cpsr  
bicr0,r0,#0x1f  
orrr0,r0,#0xd3  
msrcpsr,r0  
  
 /*bl coloured_LED_init  
bl red_LED_on*/     //这是LED灯初始化将其屏蔽掉,因为我们jz2440上的LED资源与SMDK2410开发板的不一致

2.找到下面的语句,定位到该位置,修改相应部位,即增加红色部分

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)  

mov  r1, #0xffffffff  
ldr    r0, =INTMSK  
strr1, [r0]  
# if defined(CONFIG_S3C2440)  
ldrr1, =0x7fff   //这里是屏蔽中断,S3C440用到了15位,所以把值设置成0x7fff  
ldrr0, =INTSUBMSK  
strr1, [r0]  
# endif      
  
# if defined(CONFIG_S3C2440)  
#  define MPLLCON        0x4C000004   
#  define UPLLCON        0x4C000008  
 ldrr0, =CLKDIVN  
movr1, #5                // FCLK:HCLK:PCLK = 1:4:8   
strr1, [r0]  
  
       ldr   r0, =MPLLCON     //写MPLL使pll生效,405MHz,(127<<12)+(2<<4)+(1)  
       ldr   r1, =0x7F021  
       str    r1, [r0]  
                              
       ldr   r0, =UPLLCON    //USB时钟48MHz       (56<<12)+(2<<4)+(2)  
       ldr   r1, =0x038022  
       str    r1, [r0]  
  
 # else

       /* FCLK:HCLK:PCLK = 1:2:4 */  
/* default FCLK is 120 MHz ! */  
ldr   r0, =CLKDIVN  
        mov    r1, #3       
str   r1, [r0]  
     # endif  
  
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */  
  
  
/*  
* we do sys-critical inits only at reboot,  
* not when booting from ram!  
*/  
#ifndef CONFIG_SKIP_LOWLEVEL_INIT  
blcpu_init_crit  
#endif

3 打开 board/samsung/ok2440v3/ok2440v3.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   //因为FL2440的晶振为12M,在芯片手册可以查到这些值,使得CPU频率为405M,USB时钟频率为48M.  
#define U_M_SDIV 0x2

4 打开cpu/arm920t/s3c24x0/speed.c;修改(根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数):

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 defined(CONFIG_S3C2440)  
if (pllreg == MPLL)  
{  
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));  
         }  
# endif  
  
    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));  
}  
/* return HCLK frequency */  
ulong get_HCLK(void)  
{  
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();  
# if defined(CONFIG_S3C2440)  
return(get_FCLK()/4);  
# endif  
    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());

}

这样,时钟就设置好了,保存,重新生成u-boot.bin,下载到开发板运行,就可以看到串口打印信息了

如果我们在include/configs/fl2440.h文件中添加

#define  CONFIG_SKIP_LOWLEVEL_INIT     1 //用来支持uboot在内存中直接运行

然后再编译出u-boot.bin,这时的镜像文件就可以通过J-Link下载到内存0x33f80000处运行。

在board/asmsung/fl2440/fl2440.c添加如下两个宏定义用来自动补齐命令

#define CONFIG_CMDLINE_EDITING   1    

#define CONFIG_AUTO_COMPLETE     1 /*tab COMPLETE*/ 
文章导航