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控制器時出錯。