• UBoot200903移植笔记(第二阶段:时钟!)


    根据U-Boot-2009-03移植笔记(第二阶段移植准备)最后的总结,需要针对S3C2440来移植时钟初始化的代码。

    在lib_arm/board.c中,个init_sequence数组,定义了所有的初始化函数指针。

    时钟的驱动,在函数board_init中,位于board/xinna2440/xinna2440.c,我们这里只支持S3C2440,删除文件头部的时钟参数宏定义,直接改为

     1 #define FCLK_SPEED 1
     2 
     3 #define M_MDIV    0x7f
     4 #define M_PDIV    0x2
     5 #define M_SDIV    0x1
     6 
     7 #define USB_CLOCK 1
     8 
     9 #define U_M_MDIV    0x38
    10 #define U_M_PDIV    0x2
    11 #define U_M_SDIV    0x2
    12 #define S3C2440_CLKDIV    0x5 
    S3C2440时钟参数定义

    在board_init函数的clk_power->LOCKTIME = 0xFFFFFF;语句前,增加汇编代码:

        /* to reduce PLL lock time, adjust the LOCKTIME register */
        clk_power->CLKDIVN = S3C2440_CLKDIV;
        __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n" 
                 "orr    r1, r1, #0xc0000000\n" 
                 "mcr    p15, 0, r1, c1, c0, 0\n"
                 :::"r1"
               );

    然后修改cpu/arm920t/s3c24x0/speed.c。

     1 DECLARE_GLOBAL_DATA_PTR;  /*添加代码*/
     2 static ulong get_PLLCLK(int pllreg)
     3 {
     4     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
     5     ulong r, m, p, s;
     6 
     7     if (pllreg == MPLL)
     8     r = clk_power->MPLLCON;
     9     else if (pllreg == UPLL)
    10     r = clk_power->UPLLCON;
    11     else
    12     hang();
    13 
    14     m = ((r & 0xFF000) >> 12) + 8;
    15     p = ((r & 0x003F0) >> 4) + 2;
    16     s = r & 0x3;
    17 
    18     if(pllreg == MPLL)   /*修改get_PLLCLK返回值*/
    19         return  ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s)); 
    20     else if(pllreg == UPLL)
    21         return ((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));   /* S3C2440 */
    22 }
    23 
    24 /* return FCLK frequency */
    25 ulong get_FCLK(void)
    26 {
    27     return(get_PLLCLK(MPLL));
    28 }
    29 
    30 /* return HCLK frequency */
    31 ulong get_HCLK(void)
    32 {
    33     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    34     return get_FCLK() / 4; /*修改get_HCLK返回值*/
    35 }
    36 
    37 /* return PCLK frequency */
    38 ulong get_PCLK(void)
    39 {
    40     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    41 
    42     return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
    43 }
    44 
    45 /* return UCLK frequency */
    46 ulong get_UCLK(void)
    47 {
    48     return(get_PLLCLK(UPLL));
    49 }

    保存,编译,打开minicom,烧写,运行,发现了熟悉的画面。

     

    串口输出正常无乱码,说明时钟驱动移植成功!

    80岁也要写程序
  • 相关阅读:
    BAT 批处理 for循环 迟环境变量 [MD]
    adb 环境配置 常用命令 [MD]
    XML 解析 DOM SAX PULL 序列化 总结 [MD]
    instanceof 和 isInstance 强转 类型 class [MD]
    Charles 简介 总结 HTTP 抓包 代理 [MD]
    Permission 运行时权限 总结 翻译 [MD]
    反编译 AndroidKiller 逆向 字节码 实践案例 [MD]
    Gradle 翻译 Analyzer APK文件分析 [MD]
    Java 中 boolean 类型占用多少个字节 [MD]
    Shell 命令行工具 Cmder Babun Zsh [MD]
  • 原文地址:https://www.cnblogs.com/smartcoder/p/3105887.html
Copyright © 2020-2023  润新知