i2c_add_driver函数用法
I2C的設備驅動是通過i2c_add_driver(&my_driver)向i2c-core注冊的,my_driver中的核心是detach和attach函數,在attach中通過probe探測到總線上的設備并把設備和
驅動建立連接以完成設備的初始化。如何探測總線上的設備、Linux中i2c設備地址如何標識并引用?
I2C中, 典型的attach如下所示:
static int my_attach(struct i2c_adapter *adapter)
{
????returni2c_probe(adapter, &addr_data, my_probe);
}
static int my_probe(struct i2c_adapter *adapter, int address, intkind)
{
????..........
}
addr_data是在 include/linux/i2c.h中定義的或自己在自己驅動程序中定義的一個i2c_client_address_data結構:
static struct i2c_client_address_data addr_data ={????????????\
????.normal_i2c????=normal_i2c,????????????????????\
????.probe????????=probe,????????????????????\
????.ignore????????=ignore,????????????????????\
????.forces????????=forces,????????????????????\
}
若自己不定義,則用i2c.h中的默認定義。
struct i2c_client_address_data {
????unsignedshort *normal_i2c;
????unsignedshort *probe;
????unsignedshort *ignore;
????unsignedshort **forces;
};
根據作者自行定義設備地址與否,有兩種情形:
a.采用默認定義,一般是不會work,畢竟大多數i2c-core中是不可能提前知道所接設備地址的,這樣通過i2c_probe()探測肯定不可能找到,也不可能建立兩者之間的聯系;
況且,i2c_probe()屬于i2c-core中的函數,i2c-core中管理著所有注冊過的設備和驅動列表,i2c_probe()中也不能隨意傳入地址,否則容易導致系統混亂或有潛在的風險,
所以i2c-core也不允許這么做!
b. 作者自行定義地址結構
典型例子如下:
若自行定義,則參考如下:
static unsigned short normal_i2c[] ={I2C_KS0127_ADDON>>1,
???????????????????????I2C_KS0127_ONBOARD>>1,I2C_CLIENT_END};/// 實際設備的地址List
static unsigned short probe[2]=????{I2C_CLIENT_END,I2C_CLIENT_END};
static unsigned short ignore[2]=?????{I2C_CLIENT_END,I2C_CLIENT_END};
static struct i2c_client_address_data addr_data = {
????normal_i2c,
????probe,
????ignore,
};
或者根本就不定義完整的i2c_client_address_data結構,只根據需要定義normal_i2c[],probe[],ignore[],forces[][],然后調用
i2c_probe(adapter,&addr_data, &my_probe) 即可。
在my_probe()中把實際的地址賦于i2c_client,調用i2c_set_clientdata()設置i2c_client->dev->drv_data,并調用i2c_attach_client(client)向系統注冊設備。
最后,i2c_probe()中探測時的地址優先級:
forces[][], probe[], normal_i2c[](其中忽略ignore[]中的項)。
I2c設備在實際使用中比較廣泛,sensor,rtc,audio, codec,etc.因設備復雜性不同,Linux中有些驅動中對地址的定義不在同一文件,這時多數情況都在arch中對設備作為
platform_device進行初始化并注冊的代碼中。
總結
以上是生活随笔為你收集整理的i2c_add_driver函数用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做个核酸 假牙都掉了出来:不只一个大白被
- 下一篇: iPhone用户注意 《暗黑:不朽》手游