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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM