您可以看到clk_p.rate已更改为pclk。 默认值为0。
调用函数s3c2410_baseclk_add ()登录外围设备时钟的步骤和
注册总线时钟的过程也同样使用外围设备时钟,定义如下:
structclkinit_clocks_off[]={{
……
,{.name='i2c ',
. id=-1,
. parent=clk_p,
. enable=s3c2410_clkcon_enable,
. ctrlbit=S3C2410_CLKCON_IIC,
、{
……
}
}
注册系统时钟链。 这里需要注意的是,i2c时钟的parent时钟是clk_p,以后再用这个。
接下来,分析i2c部分中的时钟初始化设置
在i2c中设置时钟相关性的部分通过函数s3c 24xx _ I2C _ probe-s3c 24xx _ I2C _ init-s3c 24xx _ I2C _ clock rate来实现
static ints 3c 24 xx _ I2C _ clock rate (structs 3c 24 xx _ I2C * I2C,unsignedint*got ) )
{
structs 3c 2410 _ platform _ I2C * pdata=I2C-dev-platform _ data;
unsigned long clkin=clk _ get _ rate (I2C-clk );
unsignedintdivs,div1;
unsignedlongtarget_frequency;
u32iiccon;
输入免费;
i2c-clkrate=clkin;
clkin/=1000; /*clkinnowinKHz*/
dev_dbg(I2c-dev,' pdatadesiredfrequency%lun ',pdata-frequency );
printk('clkin=%dn ',clkin );
target _ frequency=pdata-frequency? pdata-frequency:100000;
target_frequency/=1000; /*TargetfrequencynowinKHz*/
freq=s3c 24xx _ I2C _ calc divisor (clkin,target_frequency,div1,divs );
……
}
请注意此处的clk_get_rate函数
无符号long clk _ get _ rate (struct clk * clk )
{
if(is_err(clk ) )
返回0;
if (时钟速率!=0)
返回时钟-速率;
if(clk-ops )!=NULLclk-ops-get_rate!=NULL )
返回(clk-ops-get _ rate ) ) clk;
备用(clk-parent )!=NULL )
returnclk_get_rate(clk-parent;
返回时钟-速率;
}
在i2c-clk中,rate、ops均未初始化,因此转移到clk-parent执行。 这里的parent是clk_p时钟。
另一方面,以前的clk_p时钟在以前的初始化中被设定为接近pclk,默认情况下pclk、即外围设备的时钟频率为50M。
所以这里clkin的数值是50000000。
相关文章: