首页 > 代码库 > Am335x u-boot 启动过程中的系统频率配置
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控制器时出错。
Am335x u-boot 启动过程中的系统频率配置