内核源码 linux/Document/i2c/instantialing-device文档,讲了iic设备的构建方法
a. 设备的4种构建方法
a.1 定义一个i2c_board_info, 里面有:名字, 设备地址
然后i2c_register_board_info(busnum, ...) (把它们放入__i2c_board_list链表)
list_add_tail(&devinfo->list, &__i2c_board_list);
链表何时使用:
i2c_register_adapter > i2c_scan_static_board_info > i2c_new_device
使用限制:必须在 i2c_register_adapter 之前 i2c_register_board_info
所以:不适合我们动态加载insmod
i2c_new_device 直接在init函数中调用次函数 //对应i2c_unregister_dev
: 认为设备肯定存在,不论你的id_table中的addr是否存在它都会调用probe
i2c_new_probed_device//先检测设备地址是否有对应设备,如果有对应设备才i2c_new_device
probe(adap, addr_list[i]) /* 根据地址链表,确定设备是否真实存在 */找到设备驱动模型另一边的项后调用probe
info->addr = addr_list[i];
i2c_new_device(adap, info);
i2c_new_device //在设备驱动模型中与i2c_add_driver对应,以上有i2c_add_driver的解释
a.3 从用户空间创建设备
创建设备
echo at24c08 0x50 > /sys/class/i2c-adapter/i2c-0/new_device //在内核里边搜索new_device 会发现在i2c_core.c中 DEVICE_ATTR(new_device,** ,func)
在func中会调用i2c_new_device被调用
导致i2c_new_device被调用
删除设备
echo 0x50 > /sys/class/i2c-adapter/i2c-0/delete_device
导致i2c_unregister_device
a.4 前面的3种方法都要事先确定适配器(I2C总线,I2C控制器)
如果我事先并不知道这个I2C设备在哪个适配器上,怎么办?去class表示的所有的适配器上查找
有上一些I2C设备的地址是一样,怎么继续分配它是哪一款?用detect函数
static struct i2c_driver at24cxx_driver = {
.class = I2C_CLASS_HWMON, /* 表示去哪些适配器上找设备 */
.driver = {
.name = "100ask",
.owner = THIS_MODULE,
},