linux I2C设备驱动

linux内核的总线-设备-驱动模型,当总线上的设备与总线上的驱动匹配时,就会调用驱动的probe函数,完成一系列的操作

I2C也是内核的一种总线

一、I2C设备的4种构建方法

1、静态注册设备

(1)定义一个 i2c_board_info 结构体,有名字,和设备地址

static struct i2c_board_info  my_i2c_dev_info = {
	I2C_BOARD_INFO("my_i2c_dev", 0x2d),
};

(2)注册设备

i2c_register_board_info(int busnum, struct i2c_board_info const * info, unsigned n)

* busnum:哪一条总线,也就是选择哪一个i2c控制器
* info:i2c设备信息
* n:info中有几个设备

i2c_register_board_info做了什么?

i2c_register_board_info(int busnum,	struct i2c_board_info const *info, unsigned len)
{
    devinfo->busnum = busnum; /* 选择i2c总线 */
    devinfo->board_info = *info; /* 绑定设备信息 */
    list_add_tail(&devinfo->list, &__i2c_board_list); /* 将设备信息添加进链表中 */
}

在哪里使用了 __i2c_board_list 这个链表?

i2c_scan_static_board_info(struct i2c_adapter *adapter)
    list_for_each_entry(devinfo, &__i2c_board_list, list) /* 遍历i2c设备链表 */
        i2c_new_device(adapter,	&devinfo->board_info); /* 创建一个i2c_client设备 */
            struct i2c_client	*client;
            

在哪里调用了 i2c_scan_static_board_info 这个函数?

int i2c_register_adapter(struct i2c_adapter *adap)
{
    i2c_scan_static_board_info(adap);
}

adapter是i2c设备器,也就是i2c主机控制器,在启动内核时已经被注册了

调用关系如下

内核启动
    int i2c_register_adapter(struct i2c_adapter *adap)
        i2c_scan_static_board_info(adap)
            list_for_each_entry(devinfo, &__i2c_board_list, list)

所以使用这个方法添加i2c设备,每次都要重新编译内核,无法动态注册i2c设备,不适合我们动态加载insmod

2、直接i2c_new_device,i2c_new_probe_device

i2c_new_device:

struct i2c_client *
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)

* adap:指定i2c设备器,以后访问设备的时候,使用过哪一个设备器(i2c主机控制器)去访问
* info:指定i2c设备信息

i2c_new_device注册i2c设备的代码 

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/slab.h>

s
Linux I2C设备驱动Linux内核中的一个子系统,用于处理I2C总线上的设备驱动程序。I2C是一种串行通信协议,通常用于连接各种外设,例如传感器、LCD屏幕、EEPROM、温度传感器等。 Linux I2C设备驱动程序通常包括以下几个部分: 1. i2c_driver结构体:定义I2C设备驱动的属性和操作函数。这个结构体包含了设备的名称、ID等信息,以及设备的初始化函数、读写函数等。通过注册这个结构体,将I2C设备驱动程序和I2C总线绑定在一起。 2. i2c_client结构体:定义I2C设备的属性和操作函数。这个结构体包含了设备的地址、名称等信息,以及设备的读写函数等。通过这个结构体,可以访问I2C设备,读写寄存器等。 3. probe函数:用于初始化I2C设备。当I2C总线扫描到一个新的设备时,会调用该函数,完成设备的初始化工作。 4. remove函数:用于卸载I2C设备。当I2C总线上的设备被移除时,会调用该函数,完成设备的清理工作。 5. ioctl函数:用于实现设备的特殊操作。例如,设置I2C设备的工作模式、读取设备的状态等。 通过实现这些函数,可以编写一个完整的Linux I2C设备驱动程序。在驱动程序中,可以使用Linux内核提供的函数,例如i2c_transfer函数、i2c_smbus_read_byte函数等,来实现I2C设备的读写操作。同时,也可以使用Linux的调试工具来调试驱动程序,例如dmesg命令、insmod命令等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值