linux驅動開發擴充套件 i2c子系統核心部分分析

2021-10-10 20:19:03 字數 1654 閱讀 2963

drivers/i2c/i2c-core.c

postcore_initcall(i2c_init);

module_exit(i2c_exit);

static int __init i2c_init(void)

#endif

retval = i2c_add_driver(&dummy_driver);//為i2c匯流排新增乙個空驅動

if (retval)

goto class_err;

return 0;

class_err:

#ifdef config_i2c_compat

class_compat_unregister(i2c_adapter_compat_class);

bus_err:

#endif

bus_unregister(&i2c_bus_type);

return retval;

}static void __exit i2c_exit(void)

struct bus_type i2c_bus_type = ;
static struct i2c_driver dummy_driver = ;
i2c_device_match

/* match on an id table if there is one */

if (driver->id_table)

return i2c_match_id(driver->id_table, client) != null;

static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,

const struct i2c_client *client)

return null;

}

匹配i2c_client的name和i2c_driver中的id_table的name

i2c_device_probe

client->driver = driver;
將driver資料結構繫結到device中

status = driver->probe(client, i2c_match_id(driver->id_table, client));
呼叫driver中的probe函式

核心層開放給其他部分的註冊介面

(1)i2c_add_adapter/i2c_add_numbered_adapter        註冊adapter的

(2)i2c_add_driver                                註冊driver的

(3)i2c_new_device                                註冊client的 

Linux驅動 I2C匯流排

這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...

Linux驅動之I2C裝置驅動

核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...

i2c裝置驅動

1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...