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
    */
    mrs r0,cpsr
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,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
    str r1, [r0]
    # if defined(CONFIG_S3C2440)
    ldr r1, =0x7fff   //这里是屏蔽中断,S3C440用到了15位,所以把值设置成0x7fff
    ldr r0, =INTSUBMSK
    str r1, [r0]
    # endif    

    # if defined(CONFIG_S3C2440)
    #  define MPLLCON        0x4C000004 
    #  define UPLLCON        0x4C000008
     ldr r0, =CLKDIVN
    mov r1, #5                // FCLK:HCLK:PCLK = 1:4:8 
    str r1, [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
bl cpu_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*/ 


目录
相关文章
|
11月前
|
存储 UED
「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏
本篇将带你实现一个简单的数字猜谜游戏。用户输入一个数字,应用会判断是否接近目标数字,并提供提示“高一点”或“低一点”,直到用户猜中目标数字。这个小游戏结合状态管理和用户交互,是一个入门级的互动应用示例。
251 7
「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏
|
10月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
187 20
|
10月前
|
传感器 自动驾驶 算法
《C++:自动驾驶车辆环境感知与决策控制的核心引擎》
在自动驾驶领域,C++凭借其卓越的性能和高效的资源管理,成为实现环境感知和决策控制的关键技术。C++能够高效处理激光雷达、摄像头、毫米波雷达等传感器数据,快速生成精准的环境模型。在决策控制方面,C++支持高效的路径规划、速度控制和紧急应对策略,确保车辆在复杂环境中安全、高效地行驶。C++的实时性和可靠性使其成为自动驾驶技术的重要支柱,推动未来交通的创新与变革。
191 20
|
10月前
|
弹性计算 运维 开发者
ECS实例健康状态和诊断报告评测
作为一名开发工程师,我负责云资源的运维和管理。阿里云的ECS实例健康状态和诊断功能非常实用,能有效提升工作效率。通过这些工具,可以快速查看ECS实例的状态和诊断报告,及时发现并解决问题,确保业务系统的稳定运行。这不仅简化了操作流程,还降低了使用门槛,使运维更加高效便捷。
139 0
|
缓存 Kubernetes Java
阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战
SAE 事件中心通过智能诊断显示通知与用户连接起来,SAE WEB 百毫秒弹性实例给事件中心带来了新的实时性、海量数据和高吞吐的挑战,本篇将带您了解 SAE 整体事件中心的架构和挑战。
395 11
|
前端开发 Java 开发者
|
存储 Java 应用服务中间件
Java统计用户在线人数,这样做才优雅
统计用户在线人数 在统计用户在人数的时候,我们用到了监听器,监听器大致分为以下三种: 1. ServletRequestListener:用于监听请求的监听接口 2. HttpSessionListener:用于监听会话的监听接口 3. ServletContextListener:用于监听应用的回话接口
355 1
|
IDE 安全 前端开发
eclipse汉化教程
eclipse汉化详细教程
692 0
|
移动开发 API 图形学
全能型开源引擎LayaAir周边生态LayaNative完全开源
全能型开源引擎LayaAir周边生态LayaNative完全开源
全能型开源引擎LayaAir周边生态LayaNative完全开源

热门文章

最新文章