标签:class 链表 适配 方法 info too 构造 amp 3.4
IIC驱动含有 IIC总线驱动 和 IIC设备驱动
IIC总线驱动中,核心是构造i2c_adapter结构体
在IIC设备驱动中,核心是构造i2c_driver结构体
怎么写I2C设备驱动程序?
1. 分配一个i2c_driver结构体
2. 设置
attach_adapter // 它直接调用 i2c_probe(adap, 设备地址, 发现这个设备后要调用的函数);
detach_client // 卸载这个驱动后,如果之前发现能够支持的设备,则调用它来清理
3. 注册:i2c_add_driver
二者的联系靠i2c_client结构体
.address //设备地址
.adapter //适配器
.driver //设备驱动
linux3.4.2内核下的IIC驱动
\linux-3.4.2\linux-3.4.2\Documentation\i2c\instantiating-devices
提供了四种方法
1.3 bus-drv-dev模型及写程序
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
a.2 直接i2c_new_device, i2c_new_probed_device
a.2.1 i2c_new_device : 认为设备肯定存在
a.2.2 i2c_new_probed_device :对于"已经识别出来的设备"(probed_device),才会创建("new")
i2c_new_probed_device
probe(adap, addr_list[i]) /* 确定设备是否真实存在 */
info->addr = addr_list[i];
i2c_new_device(adap, info);
a.3 从用户空间创建设备
创建设备
echo at24c08 0x50 > /sys/class/i2c-adapter/i2c-0/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函数
一般使用前三种方法
在msg传输时,使用smbus进行传输.....................smbus是i2c_transfer的一小部分,内核推荐使用\linux-3.4.2\linux-3.4.2\Documentation\i2c\smbus-protocol
使用内核中的驱动程序
\linux-3.4.2\linux-3.4.2\Documentation\i2c\dev-interface
主要是应用程序中如何对其进行使用
在网上下载i2c_tools,其中有一个i2c_dev.h,其中封装的read、write函数都是使用ioctl,比单纯的R/W更适合IIC驱动
2019 5 19 IIC驱动程序
标签:class 链表 适配 方法 info too 构造 amp 3.4
原文地址:https://www.cnblogs.com/calm-monkey/p/10890051.html