iic-调试笔记

本文详细介绍了Linux内核中I2C设备的四种构建方法,包括静态注册、i2c_new_device、i2c_new_probed_device以及从用户空间创建设备。讲解了如何通过i2c_register_board_info、i2c_new_device和i2c_new_probed_device等函数进行设备注册,并探讨了如何处理未知适配器和设备地址冲突的情况。同时提到了内核的i2c_tool库以及i2c_driver与i2c_client结构体在设备驱动中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核源码  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",

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值