設備驅動
I2C 設備驅動重點關注兩個數據結構:i2c_client 和 i2c_driver。i2c_client 就是描述設備信息的,i2c_driver 描述驅動內容。
一個設備對應一個 i2c_client,每檢測到一個 I2C 設備就會給這個 I2C 設備分配一個 i2c_client。
i2c_driver 中包含 probe 函數和 device_driver 結構體。如果使用設備樹的話,需要設置 device_driver 的 of_match_table 成員變量,也就是驅動的兼容(compatible)屬性。
當 I2C 設備和驅動匹配以后,probe 函數就會執行。
因此,對于 Linux 來講,不區分 I2C 控制器和 I2C 從機設備,用的都是同一套東西,即【總線、設備、驅動】框架,都有 probe 函數。
設備樹
注意,I2C 設備在設備樹中必須掛到對應的總線下,如圖是在 &i2c0 下。
驅動
當驅動和設備匹配時,probe 函數開始執行,重要的地方博主都寫了注釋
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 控制器支持是否支持標準 I2C 協議
r = i2c_check_functionality(client- >adapter,I2C_FUNC_I2C);
/* 板級信息分配內存 */
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);
//填充結構體元素
/* 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);
//填充結構體元素
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 從機設備驅動中的 probe 函數和器件強相關,各家撰寫方式不一樣。
在 I2C 設備驅動中,除了 init、exit、probe、remove 函數外,還要實現 read、write 函數才行。
-
驅動
+關注
關注
12文章
1827瀏覽量
85185 -
I2C
+關注
關注
28文章
1482瀏覽量
123335 -
數據結構
+關注
關注
3文章
573瀏覽量
40094
發布評論請先 登錄
相關推薦
評論