首页 > 编程知识 正文

i2c时钟延展,Linux i2c 怎么用

时间:2023-05-06 16:40:17 阅读:148013 作者:613

您可以看到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。

相关文章:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。