zoukankan      html  css  js  c++  java
  • Am335x u-boot 启动过程中的系统频率配置

    Am335x的时钟结构分为:ADPLLS和ADPLLLJ

    1、ADPLLS用来配置Core_CLK,Dispaly_clk,ARM系统CLK(mpu_clk),DDR PLLs_clk

    2、ADPLLLJ用来为am335x的外设配置时钟

    Core_clk的配置:

    通过寄存器CM_CLKSEL_DPLL_CORE配置参数M,N来设置CLKDCOLDO的输出,在通过配置寄存器CM_DIV_M4_DPLL_CORE,CM_DIV_M5_DPLL_CORE,CM_DIV_M6_DPLL_CORE来配置CORE_CLKOUTM4,CORE_CLKOUTM5,CORE_CLKOUTM6的输出。

    例如:master_osc的输出为24MhZ,要得到CLKDCOLDO=10MHZ,由下表知:CLKDCOLDO=2*[M/(N+1)]*CLKINP(master_osc), 得出M=50,N=23

    根据图8-10可的出CORE_CLKOUTM4=100/M4, 

            CORE_CLKOUTM5=100/M5

            CORE_CLKOUTM6=100/M6

      进而可相继得出图8-10右边的各个时钟。

    在u-boot中的代码体现为:

    在文件../arch/arm/cpu/armv7/am335x.c中会执行prcm_init函数

    --->prcm_init

      ----->setup_dplls

        ---->get_dpll_core_params

          ---->../arch/arm/cpu/armv7/am335x/clock_am33xx.c中定义dpll的参数并将其初始化也就是

            ---->const struct dpll_params dpll_core = {50, OSC-1, -1, -1, 1, 1, 1};//{m,n,m2,m3,m4,m5,m6}

              ---->do_setup_dpll

                ---->寄存器CM_CLKSEL_DPLL_CORE设置m n值

                ---->给寄存器CM_DIV_M2_DPLL_CORE CM_DIV_M3_DPLL_CORE CM_DIV_M4_DPLL_CORE CM_DIV_M5_DPLL_CORE               CM_DIV_M6_DPLL_CORE设置m2,m3,m4,m5,m6的值。

    通过prmc_init函数基本可以将am335x的时钟给设置完毕。

    prmc_init中还有一个比较重要的函数enable_basic_clocks:这个函数从字面意思理解为使能基本的时钟,其实是相当于使能am335x各部分功能的模块还能。比如要用到MMC0,那么mmc0clkctrl久必须要加进去要不MMC0是不能被访问的。

    之前调试LCD时就犯了这个错误,没有将CM_PER_LCDC_CLKCTRL此寄存器的MODULEMODE位设置为2,以致于访问LCD控制器时出错。

  • 相关阅读:
    通过另外一个应用程序给多个文本框赋值, 模拟单击事件
    AngularJS
    九章算法
    实现继承
    二分查找
    NET Core依赖注入解读&使用Autofac替代实现
    NET SignalR 与 LayIM2.0
    WebVR
    依赖注入
    如何实现配置与源文件的同步
  • 原文地址:https://www.cnblogs.com/BigOBlue/p/6837790.html
Copyright © 2011-2022 走看看