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控制器时出错。

posted @ 2017-05-10 19:49  竹主  阅读(2396)  评论(0编辑  收藏  举报