設(shè)備驅(qū)動(dòng)
I2C 設(shè)備驅(qū)動(dòng)重點(diǎn)關(guān)注兩個(gè)數(shù)據(jù)結(jié)構(gòu):i2c_client 和 i2c_driver。i2c_client 就是描述設(shè)備信息的,i2c_driver 描述驅(qū)動(dòng)內(nèi)容。
一個(gè)設(shè)備對(duì)應(yīng)一個(gè) i2c_client,每檢測(cè)到一個(gè) I2C 設(shè)備就會(huì)給這個(gè) I2C 設(shè)備分配一個(gè) i2c_client。
i2c_driver 中包含 probe 函數(shù)和 device_driver 結(jié)構(gòu)體。如果使用設(shè)備樹(shù)的話(huà),需要設(shè)置 device_driver 的 of_match_table 成員變量,也就是驅(qū)動(dòng)的兼容(compatible)屬性。
當(dāng) I2C 設(shè)備和驅(qū)動(dòng)匹配以后,probe 函數(shù)就會(huì)執(zhí)行。
因此,對(duì)于 Linux 來(lái)講,不區(qū)分 I2C 控制器和 I2C 從機(jī)設(shè)備,用的都是同一套東西,即【總線(xiàn)、設(shè)備、驅(qū)動(dòng)】框架,都有 probe 函數(shù)。
設(shè)備樹(shù)
注意,I2C 設(shè)備在設(shè)備樹(shù)中必須掛到對(duì)應(yīng)的總線(xiàn)下,如圖是在 &i2c0 下。
驅(qū)動(dòng)
當(dāng)驅(qū)動(dòng)和設(shè)備匹配時(shí),probe 函數(shù)開(kāi)始執(zhí)行,重要的地方博主都寫(xiě)了注釋
static int goodix_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *dev_id)
{
struct goodix_ts_device *ts_device = NULL;
struct goodix_ts_board_data *ts_bdata = NULL;
int r = 0;
//檢查 I2C 控制器支持是否支持標(biāo)準(zhǔn) I2C 協(xié)議
r = i2c_check_functionality(client- >adapter,I2C_FUNC_I2C);
/* 板級(jí)信息分配內(nèi)存 */
ts_bdata = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_board_data), GFP_KERNEL);
ts_device = devm_kzalloc(&client- >dev,sizeof(struct goodix_ts_device), GFP_KERNEL);
//填充結(jié)構(gòu)體元素
/* use pinctrl in core.c */
ts_bdata- >pinctrl_dev = client- >adapter- >dev.parent;
ts_device- >name = "GT9886 TouchDevcie";
ts_device- >dev = &client- >dev;
ts_device- >board_data = ts_bdata;
ts_device- >hw_ops = &hw_i2c_ops;
touch_filter_bdata = ts_bdata;
/* ts core device */
goodix_pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
//填充結(jié)構(gòu)體元素
goodix_pdev- >name = GOODIX_CORE_DRIVER_NAME;
goodix_pdev- >id = 0;
goodix_pdev- >num_resources = 0;
goodix_pdev- >dev.platform_data = ts_device;
goodix_pdev- >dev.release = goodix_pdev_release;
r = platform_device_register(goodix_pdev);
/* register platform driver*/
r = goodix_ts_core_init();
......
}
I2C 從機(jī)設(shè)備驅(qū)動(dòng)中的 probe 函數(shù)和器件強(qiáng)相關(guān),各家撰寫(xiě)方式不一樣。
在 I2C 設(shè)備驅(qū)動(dòng)中,除了 init、exit、probe、remove 函數(shù)外,還要實(shí)現(xiàn) read、write 函數(shù)才行。
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1790瀏覽量
84911 -
I2C
+關(guān)注
關(guān)注
28文章
1452瀏覽量
122261 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
568瀏覽量
40030
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論