i2c设备:
一. Touch驱动的注册:
1. i2c_add_driver(struct i2c_driver xx_i2c_driver):
这个函数仅是调用 i2c_register_driver(struct module *owner, struct i2c_driver *driver);
2. i2c_register_driver(struct module *owner, s`truct i2c_driver *driver):
主要有两个功能:
a. 初始化 xx_i2c_driver 中的 'struct device_driver’ 结构体(xx_i2c_device),最主要的是初始化 ‘struct device_driver’ 结构体中的 ‘bus’参数,赋值为‘i2c_bus_type(一个在i2c中已初始化的结构体)’。i2c_bus_type 结构体中包含的函数值得研究。
b. 调用 driver_register(struct device_driver *drv) 函数;
c. 创建 struct i2c_client:
bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver) ---> __process_new_driver() ---> i2c_do_add_adapter() ---> i2c_detect() ---> i2c_detect_address() ---> i2c_new_device()
3. driver_register(struct device_driver *drv)函数:
先通过 xx_i2c_device的成员变量name在 i2c_device_list上检测是否该驱动已经被注册,如果没有注册则调用 bus_add_driver(struct device_driver *drv)函数 进行注册。
4. bus_add_driver(struct device_driver *drv)函数:
这个函数主要是将 xx_i2c_driver 和 xx_i2c_device 挂在到 i2c 总线队列上。
到了底层,基本上都是大量的链表,结构体和指针~
PS:整个注册过程中,xx_i2c_device的成员变量 name 起了非常大的作用。