簡(jiǎn)介
I2C驅(qū)動(dòng)由I2C核心,I2C總線驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng)組成.I2C核心是I2C總線驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng)的中間樞紐,以通用的,與平臺(tái)無(wú)關(guān)的接口實(shí)現(xiàn)了I2C中設(shè)備與適配器的溝通.I2C總線驅(qū)動(dòng)填充i2c_adapter和i2c_algorithm結(jié)構(gòu)體,I2C設(shè)備驅(qū)動(dòng)填充i2c_driver結(jié)構(gòu)體并實(shí)現(xiàn)本身所對(duì)應(yīng)的設(shè)備類(lèi)型驅(qū)動(dòng)
I2C體系結(jié)構(gòu)
1.I2C核心
提供I2C總線驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè),注銷(xiāo)方法,I2C通信上次與具體適配器無(wú)關(guān)的代碼以及探測(cè)設(shè)備,檢測(cè)設(shè)備地址的上層代碼等
2.I2C總線驅(qū)動(dòng)
是對(duì)I2C硬件體系結(jié)構(gòu)中適配器端的實(shí)現(xiàn),主要包含I2C適配器數(shù)據(jù)結(jié)構(gòu)i2c_adapter,I2C適配器的Algorithm數(shù)據(jù)結(jié)構(gòu)i2c_algorithm和控制I2C適配器產(chǎn)生通信信號(hào)的函數(shù),可以控制I2C適配器以主控方式產(chǎn)生開(kāi)始位,停止位,等等
3.I2C設(shè)備驅(qū)動(dòng)
是對(duì)I2C硬件體系結(jié)構(gòu)中設(shè)備端的實(shí)現(xiàn),設(shè)備一般掛接在受CPU控制的I2C適配器上,主要數(shù)據(jù)結(jié)構(gòu)i2c_driver和i2c_client
代碼目錄
1.i2c-core.c
實(shí)現(xiàn)I2C核心的功能以及proc/bus/i2c*接口
2.i2c-dev.c
實(shí)現(xiàn)I2C適配器設(shè)備文件的功能,每一個(gè)I2C適配器都被分配一個(gè)設(shè)備,i2c-dev.c只提供了通用接口
3.busses文件夾
包含I2C主機(jī)控制器的驅(qū)動(dòng)
4.algos文件夾
實(shí)現(xiàn)I2C總線適配器的通信方法
重要數(shù)據(jù)結(jié)構(gòu):i2c_adapter,i2c_algorithm,i2c_driver和i2c_client
1.i2c_adapter與i2c_algorithm
i2c_adapter對(duì)應(yīng)于物理上的一個(gè)適配器,而i2c_algorithm對(duì)應(yīng)一套通信方法,一個(gè)I2C適配器需要i2c_algorithm提供的通信函數(shù)來(lái)控制適配器產(chǎn)生特定的訪問(wèn)周期,i2c_adapter包含i2c_algorithm
2.i2c_driver和i2c_client
i2c_driver對(duì)應(yīng)于一套驅(qū)動(dòng)方法,如probe,remove等,i2c_client對(duì)應(yīng)于真實(shí)的物理設(shè)備,每個(gè)設(shè)備都需要一個(gè)i2c_client描述,i2c_driver與i2c_client是一對(duì)多,i2c_device_id的id_table是該驅(qū)動(dòng)所支持的I2C設(shè)備的ID表
3.i2c_adapter與i2c_client
i2c_client依附于i2c_adapter,一個(gè)適配器可以連接多個(gè)i2c設(shè)備
Linux I2C核心
主要函數(shù):
增加/刪除i2c_adapter
int i2c_add_adapter(struct i2c_adapter *adap)
void i2c_del_adapter(struct i2c_adapter *adap)
增加/刪除i2c_driver
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
void i2c_del_driver(struct i2c_driver *driver)
I2C傳輸,發(fā)送和接收
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,int num)
int i2c_master_send(struct i2c_client *client, const char *buf, int count)
int i2c_master_recv(struct i2c_client *client, char *buf, int count)
linux I2C適配器驅(qū)動(dòng)
涉及函數(shù):
xxx_i2c_probe(..)
xxx_i2c_remove(...)
數(shù)據(jù)結(jié)構(gòu)of_device_id,platform_driver
linux i2c設(shè)備驅(qū)動(dòng)
數(shù)據(jù)結(jié)構(gòu)i2c_driver
函數(shù):
__init xxx_init(void)
__exit xxx_exit(void)