s3c2410時(shí)鐘信號(hào):FCLK、HCLK和PCLK;clk_get_rate()
s3c2410 有三個(gè)時(shí)鐘FLCK 、HCLK 和PCLK (這3個(gè)時(shí)針都是核心時(shí)針)
s3c2410 芯片有這么一段話:
FCLK is used by ARM920T ,內(nèi)核時(shí)鐘,主頻。
HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是為AHB總線上的外設(shè)提供時(shí)鐘信號(hào),包括USB時(shí)鐘。 AHB總線用于連接高速外設(shè)。
PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI. 也就是為APB總線上的外設(shè)提供時(shí)鐘信號(hào),即IO接口時(shí)鐘,串口的時(shí)鐘設(shè)置就是從PCLK來(lái)的。APB總線用于連接低速外設(shè)。
The S3C2410X supports selection of Dividing Ratio between FCLK, HLCK and PCLK. This ratio is determined by HDIVN and PDIVN of CLKDIVN control register.
s3c2410可通過(guò)設(shè)置CLKDIVN控制寄存器的HDIVN位(第1位)和PDIVN位(第0位)來(lái)改變FCLK, HLCK 和 PCLK的比率。
那么如何獲取FCLK, HLCK 和 PCLK的時(shí)針頻率呢?
可先通過(guò)clk_get獲取一個(gè)clk結(jié)構(gòu)體
/* clk_get獲取一個(gè)名為id的時(shí)針
* 輸入?yún)?shù)dev:可以為NULL
* 輸入?yún)?shù)id:時(shí)針名稱,如fclk、hclk、pclk等
* 返回值:返回該時(shí)鐘的clk結(jié)構(gòu)體
*/
struct clk *clk_get(struct device *dev, const char *id)
struct clk {
struct list_head list;
struct module *owner;
struct clk *parent;
const char *name; /* 該時(shí)針名稱 */
int id;
int usage;
unsigned long rate; /* 時(shí)鐘頻率 */
unsigned long ctrlbit;
int (*enable)(struct clk *, int enable);
int (*set_rate)(struct clk *c, unsigned long rate);
unsigned long (*get_rate)(struct clk *c);
unsigned long (*round_rate)(struct clk *c, unsigned long rate);
int (*set_parent)(struct clk *c, struct clk *parent);
};
再將clk_get返回的clk結(jié)構(gòu)體傳遞給clk_get_rate,獲取該時(shí)鐘的頻率
unsigned long clk_get_rate(struct clk *clk)
一個(gè)例子:
printk(KERN_DEBUG"fclk = %d, pclk = %d, hclk = %d, uclk = %dn",
clk_get_rate(clk_get(NULL, "fclk")),
clk_get_rate(clk_get(NULL, "hclk")),
clk_get_rate(clk_get(NULL, "pclk")),
clk_get_rate(clk_get(NULL, "uclk")));
這里出現(xiàn)了另一個(gè)時(shí)針uclk,專門(mén)給usb供給時(shí)針信號(hào)。uclk是外部時(shí)針源,由s3c2410芯片的gph8/uclk管腳引入,給uart提供外部時(shí)針信號(hào),以獲取更精確地時(shí)針頻率。
關(guān)于AMBA片上總線
AMBA(Advanced Microcontroller Bus Architecture)是由ARM公司提出的片上總線規(guī)范。AMBA 2.0規(guī)范包括四個(gè)部分:AHB(AMBA高性能總線)、ASB(AMBA系統(tǒng)總線)、APB(AMBA外設(shè)總線)和Test Methodology。
the Advanced High-performance Bus(AHB)應(yīng)用于連接高性能、高時(shí)鐘頻率的系統(tǒng)模塊(如CPU、DMA和DSP等)它構(gòu)成了高性能的系統(tǒng)骨干總線( back-bone bus )。AHB bus上的外設(shè)有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。
the Advanced System Bus(ASB)是第一代AMBA系統(tǒng)總線,同AHB相比,它數(shù)據(jù)寬度要小一些,它支持的典型數(shù)據(jù)寬度為8位、16位、32位。
the Advanced Peripheral Bus(APB)是本地二級(jí)總線(local secondary bus ),通過(guò)橋和AHB/ASB相連。它主要是為了滿足不需要高性能流水線接口或不需要高帶寬接口的設(shè)備的互連。APB bus上的外設(shè)有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。