s3c2410xa0有三个时钟FLCKxa0、HCLKxa0和PCLKxa0(这3个时针都是核心时针)
s3c2410xa0芯片有这么一段话:
FCLKxa0isxa0usedxa0byxa0ARM920Txa0,内核时钟,主频。
HCLKxa0isxa0usedxa0forxa0AHBxa0bus,xa0whichxa0isxa0usedxa0byxa0thexa0ARM920T,xa0thexa0memoryxa0controller,xa0thexa0interruptxa0controller,xa0thexa0LCDxa0controller,xa0thexa0DMAxa0andxa0USBxa0hostxa0block.xa0也就是为AHB总线上的外设提供时钟信号,包括USB时钟。xa0AHB总线用于连接高速外设。
PCLKxa0isxa0usedxa0forxa0APBxa0bus,xa0whichxa0isxa0usedxa0byxa0thexa0peripheralsxa0suchxa0asxa0WDT,xa0IIS,xa0I2C,xa0PWMxa0timer,xa0MMCxa0interface,ADC,xa0UART,xa0GPIO,xa0RTCxa0andxa0SPI.xa0也就是为APB总线上的外设提供时钟信号,即IO接口时钟,串口的时钟设置就是从PCLK来的。APB总线用于连接低速外设。
Thexa0S3C2410Xxa0supportsxa0selectionxa0ofxa0Dividingxa0Ratioxa0betweenxa0FCLK,xa0HLCKxa0andxa0PCLK.xa0Thisxa0ratioxa0isxa0determinedxa0byxa0HDIVNxa0andxa0PDIVNxa0ofxa0CLKDIVNxa0controlxa0register.
s3c2410可通过设置CLKDIVN控制寄存器的HDIVN位(第1位)和PDIVN位(第0位)来改变FCLK,xa0HLCKxa0和xa0PCLK的比率。
xa0xa0
那么如何获取FCLK,xa0HLCKxa0和xa0PCLK的时针频率呢?
可先通过clk_get获取一个clk结构体
de>/*xa0clk_get获取一个名为id的时针
*xa0输入参数dev:xa0可以为NULL
*xa0输入参数id:xa0时针名称,如fclk、hclk、pclk等
*xa0返回值:xa0返回该时钟的clk结构体
*/de>
de>structxa0clkxa0*clk_get(structxa0devicexa0*dev,xa0constxa0charxa0*id)
structxa0clkxa0{
structxa0list_headxa0list;
structxa0modulexa0*owner;
structxa0clkxa0*parent;
constxa0charxa0*name;xa0/*xa0该时针名称xa0*/
intxa0id;
intxa0usage;
unsignedxa0longxa0rate;xa0/*xa0时钟频率xa0*/
unsignedxa0longxa0ctrlbit;
intxa0(*enable)(structxa0clkxa0*,xa0intxa0enable);
intxa0(*set_rate)(structxa0clkxa0*c,xa0unsignedxa0longxa0rate);
unsignedxa0longxa0(*get_rate)(structxa0clkxa0*c);
unsignedxa0longxa0(*round_rate)(structxa0clkxa0*c,xa0unsignedxa0longxa0rate);
intxa0(*set_parent)(structxa0clkxa0*c,xa0structxa0clkxa0*parent);
};
de>
再将clk_get返回的clk结构体传递给clk_get_rate,获取该时钟的频率
de>unsignedxa0longxa0clk_get_rate(structxa0clkxa0*clk)de>
一个例子:
de>printk(KERN_DEBUG"fclkxa0=xa0%d,xa0pclkxa0=xa0%d,xa0hclkxa0=xa0%d,xa0uclkxa0=xa0%d\n",
clk_get_rate(clk_get(NULL,xa0"fclk")),
clk_get_rate(clk_get(NULL,xa0"hclk")),
clk_get_rate(clk_get(NULL,xa0"pclk")),
clk_get_rate(clk_get(NULL,xa0"uclk")));de>
这里出现了另一个时针uclk,专门给usb供给时针信号。uclk是外部时针源,由s3c2410芯片的gph8/uclk管脚引入,给uart提供外部时针信号,以获取更精确地时针频率。
关于AMBA片上总线
AMBA(Advancedxa0Microcontrollerxa0Busxa0Architecture)是由ARM公司提出的片上总线规范。AMBAxa02.0规范包括四个部分:AHB(AMBA高性能总线)、ASB(AMBA系统总线)、APB(AMBA外设总线)和Testxa0Methodology。
thexa0Advancedxa0High-performancexa0Bus(AHB)应用于连接高性能、高时钟频率的系统模块(如CPU、DMA和DSP等)它构成了高性能的系统骨干总线(xa0back-bonexa0busxa0)。AHBxa0bus上的外设有LCDxa0controller(CONT代表controller,控制器)、USBxa0Hostxa0CONT、ExtMaster、Nandxa0CONT和nandxa0flashxa0bootxa0loader、busxa0CONT、interruptxa0CONT、powerxa0management、memoryxa0CONT(sram/nor/sdram等)。
thexa0Advancedxa0Systemxa0Bus(ASB)是第一代AMBA系统总线,同AHB相比,它数据宽度要小一些,它支持的典型数据宽度为8位、16位、32位。
thexa0Advancedxa0Peripheralxa0Bus(APB)是本地二级总线(localxa0secondaryxa0busxa0),通过桥和AHB/ASB相连。它主要是为了满足不需要高性能流水线接口或不需要高带宽接口的设备的互连。APBxa0bus上的外设有UART、USBxa0device、SDI/MMC、Watchxa0Dogxa0Timer、busxa0CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。