日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序

發布時間:2023/12/4 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內核版本:linux-3.4.2

源程序:? ? linux-3.4.2\drivers\i2c\busses\I2c-s3c2410.c

這次要解決的問題是:如何配置soc的I2C模塊,輸出想要的時序波形?

關于Linux里I2C驅動的架構,在轉載的文章講得相當透徹(《linux下I2C驅動架構全面分析》http://www.linuxidc.com/Linux/2014-05/101648.htm )。I2C驅動的框架如下圖,主要包括:

總線驅動層: 驅動Soc內部的I2c模塊,也稱之為適配器(adapter)驅動。覆蓋圖中硬件驅動層。

設備驅動層:實現i2c設備的device驅動(如Eeprom的驅動),使用I2C驅動的接口,編寫字符設備(多數是字符設備)。覆蓋圖中的driver驅動層。

核心層:是連接“總線驅動層”和“設備驅動層”的接口。如總線驅動層向核心層注冊一個使用總線的驅動,設備驅動調用這個總線驅動,控制對應的函數。由于

Linux能夠支持多種I2C總線和多種I2C設備,因此采用了總線平臺驅動。采用了分層和分離的思想,使一個I2C設備可以使用任意一條I2C總線。

圖1. Linux的I2C驅動框架圖

簡要地回顧完I2C驅動的架構,回到主題——怎樣產生I2C時序?

在總線驅動層里實現了產生I2C時序,注冊一個master_xfer()方法,使用soc的內部I2C模塊收發數據。我找了一個i2c總線的實例

進行說明:linux-3.4.2\drivers\i2c\busses\I2c-s3c2410.c

static int __init i2c_adap_s3c_init(void)

{

return platform_driver_register(&s3c24xx_i2c_driver);//注冊一個平臺驅動 platform_driver

}

static struct platform_driver s3c24xx_i2c_driver = {

.probe? = s3c24xx_i2c_probe,? //設置probe函數,初始化soc內的i2c模塊,設置收發函數

.remove? = s3c24xx_i2c_remove,

.id_table?= s3c24xx_driver_ids,? //當一個設備的id與.id_table中的一項匹配時(相等),調用probe函數

.driver? = {

.owner?= THIS_MODULE,

.name?= "s3c-i2c",

.pm?= S3C24XX_DEV_PM_OPS,

.of_match_table = s3c24xx_i2c_match,

},

};

static int s3c24xx_i2c_probe(struct platform_device *pdev)

{

i2c->adap.algo? ? = &s3c24xx_i2c_algorithm;? //設置具體的收發算法

ret = i2c_add_numbered_adapter(&i2c->adap);? //把適配器的驅動注冊進內核,以后這個適配器由core層進行管理

}

/* i2c bus registration info */

static const struct i2c_algorithm s3c24xx_i2c_algorithm = {

.master_xfer? = s3c24xx_i2c_xfer, //設置master_xfer函數,由這個函數產生I2C時序

.functionality? = s3c24xx_i2c_func,

};

當程序來到了master_xfer這一步,接下來就是硬件相關的部分了(和soc內部的i2c模塊相關的部分)。master_xfer會根據函數的參數,找到

對應的適配器,發送數據。看看master_xfer的參數:

static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg *msgs, int num)

adap:指定需要用到的適配器(Linux驅動能夠同時管理多個適配器)

msgs:需要發送的消息

num: 消息的長度

至此,已經用程序解了“怎樣產生I2C時序”:在master_xfer函數里設置好如何發送一個I2C時序。當需要發送I2C時序時,調用core層的接口,指定使用哪一條總線、發送什么數據,即可產生想要的I2C時序。

總結

以上是生活随笔為你收集整理的linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。