天天看點

linux i2c v4l2驅動核心的知識 platform,LinuxI2C裝置驅動編寫摘要.docx

LinuxI2C裝置驅動編寫摘要

Linux I2C裝置驅動編寫(一)在Linux驅動中I2C系統中主要包含以下幾個成員:I2C adapter 即I2C擴充卡I2C driver 某個I2C裝置的裝置驅動,可以以driver了解。I2C client 某個I2C裝置的裝置聲明,可以以device了解。I2C adapter是CPU內建或外接的I2C擴充卡,用來控制各種I2C從裝置,其驅動需要完成對擴充卡的完整描述,最主要的工作是需要完成i2c_algorithm結構體。這個結構體包含了此I2C控制器的資料傳輸具體實作,以及對外上報此裝置所支援的功能類型。i2c_algorithm結構體如下:struct i2c_algorithm { int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data); u32 (*functionality) (struct i2c_adapter *);};如果一個I2C擴充卡不支援I2C通道,那麼就将master_xfer成員設為NULL。如果擴充卡支援SMBUS協定,那麼需要去實作smbus_xfer,如果smbus_xfer指針被設為NULL,那麼當使用SMBUS協定的時候将會通過I2C通道進行仿真。master_xfer指向的函數的傳回值應該是已經成功處理的消息數,或者傳回負數表示出錯了。functionality指針很簡單,告訴詢問着這個I2C主要器都支援什麼功能。在核心的drivers/i2c/i2c-stub.c中實作了一個i2c adapter的例子,其中實作的是更為複雜的SMBUS。SMBus 與 I2C的差別通常情況下,I2C和SMBus是相容的,但是還是有些微妙的差別的。時脈速度對比:?I2CSMBus最小無10kHz最大100kHZ(标準)400kHz(快速模式)2MHz(高速模式)100kHz逾時無35ms在電氣特性上他們也有所不同,SMBus要求的電壓範圍更低。I2C driver具體的I2C裝置驅動,如相機、傳感器、觸摸屏、背光控制器常見硬體裝置大多都有或都是通過I2C協定與主機進行資料傳輸、控制。結構體如下:struct i2c_driver { unsigned int class; int (*attach_adapter)(struct i2c_adapter *) __deprecated; //舊的與裝置進行綁定的接口函數 int (*detach_adapter)(struct i2c_adapter *) __deprecated; //舊的與裝置進行解綁的接口函數 int (*probe)(struct i2c_client *, const struct i2c_device_id *); //現行通用的與對應裝置進行綁定的接口函數 int (*remove)(struct i2c_client *); //現行通用與對應裝置進行解綁的接口函數 void (*shutdown)(struct i2c_client *); //關閉裝置 int (*suspend)(struct i2c_client *, pm_message_t mesg); //挂起裝置,與電源管理有關,為省電 int (*resume)(struct i2c_client *); //從挂起狀态恢複 /* Alert callback, for example for the SMBus alert protocol. *