ARM Linux時鐘初始化

2021-07-17 03:14:28 字數 3026 閱讀 2465

arm-linux時鐘初始化是從machine_start中的map_io函式開始的,map_io函式中會呼叫s3c24xx_init_clocks(12000000);來進行,我們來看一下初始化過程

static struct cpu_table *cpu;

void__init s3c24xx_init_clocks(intxtal)

示例如下:

structcpu_table ;

static structcpu_table cpu_ids __initdata = ,

, , ,

//……

}; void__init s3c244x_init_clocks(intxtal)

s3c24xx_register_baseclocks函式會向系統註冊基本時鐘,s3c2440a時鐘鏈路:由外晶振osc(或外部時鐘)提供時鐘輸入,然後分成兩路,一路由mpll鎖相環倍頻出時鐘fck(核時鐘),然後經分頻出兩路時鐘hclk(ahb匯流排外設時鐘)和pclk(apb匯流排外設時鐘),另一路由upll鎖相環倍頻出時鐘uclk,為usb外設提供時鐘,以下基本時鐘中,xtal為外部晶振時鐘,clk_mpll為經過mpll鎖相環倍頻出時鐘,clk_upll為由upll鎖相環倍頻出時鐘uclk,clk_f為核心時鐘,即主頻,clk_h為hclk(ahb匯流排外設時鐘)clk_p為pclk(apb匯流排外設時鐘)

int__init s3c24xx_register_baseclocks(unsigned longxtal)

struct clk ;

clock.c檔案定義乙個list_head的鍊錶,s3c24xx_register_clock

函式會將clk結

構體的變數加入到這個鍊錶中,函式定義如下

static list_head(clocks);

ints3c24xx_register_clock(structclk 

*clk)

各主時鐘的定義如下:

struct clk clk_xtal = ;

struct clk clk_ext = ;

struct clk clk_epll = ;

struct clk clk_mpll = ;

struct clk clk_upll = ;

struct clk clk_f = ;

struct clk clk_h = ;

struct clk clk_p = ;

struct clk clk_usb_bus = ;

struct clk s3c24xx_uclk = ;

時鐘註冊進系統後便可以通過,核心的

api來操作時鐘了,

struct clk *clk_get(struct device *dev, const char *id)

函式來獲取乙個名為id的

clk結構體指標,然後可以通過

clk_get_rate

來獲取該時鐘的頻率,

:printk(kern_debug 」fclk=%d \n」,clk_get_rate(clk_get(null,」fclk」)));

s3c244x_setup_clocks(void)

會設定系統的基本時鐘

void__init_

or_cpufreq s3c244x_setup_clocks(void)

hclk 

= fclk 

/ hdiv

; pclk 

= hclk 

/ ((clkdiv 

& s3c2440_clkdivn_pdivn) ? 2 

: 1);

/* print brief summary of clocks, etc */

printk("s3c244x

: core 

%ld.%03ld mhz

, memory 

%ld.%03ld mhz

,peripheral 

%ld.%03ld mhz\n",

print_mhz(fclk), print_mhz(hclk), print_mhz(pclk));

s3c24xx_setup_clocks(fclk

, hclk

, pclk);

} s3c24xx_setup_clocks(fclk

, hclk

, pclk);

void__init_

or_cpufreq s3c24xx_setup_clocks(unsigned longfclk

,unsigned longhclk

,unsigned longpclk)

linux clk時鐘初始化

例項記錄的是am335x 時鐘初始化框架,具體細節還沒來得及深究,僅供自己記錄學習用。arch arm mach omap2 board generic.c dt machine start am33xx dt,generic am33xx flattened device tree reserve...

時鐘初始化flash設定

時鐘初始化的時候,有這兩句 enable prefetch buffer flash prefetchbuffercmd flash prefetchbuffer enable flash 2 wait state flash setlatency flash latency 2 這是因為cpu比f...

SystemInit時鐘系統初始化函式

void systeminit void static void setsysclock void 下面主要講解該函式 static void setsysclockto72 void while hsestatus 0 startupcounter hse startup timeout if r...