Linux i2c子系统(二) _经过i2c-dev.c访问设备的方法

另一种驱动

应用层除了使用上述的使用i2c_driver接口来访问i2c设备,Linux内核还提供了一种简单粗暴的方式——直接经过虚拟i2c设备驱动的方式,即上一篇中的i2c-dev提供的方式,这种方式使用的i2c_client是随着open的操做临时建立的虚拟的client,即不是挂接在i2c_bus_type中的链表中的,对于用户程序来讲,这种方式的驱动只是提供了相应的操做方法并建立设备文件,能够看做是一种"i2c_driver成员函数+字符设备驱动"的虚拟驱动,须要让用户空间程序经过芯片手册配置时序来访问总线上的设备,看起来就像是在用户空间直接操做i2c控制器,但其实它更多的用法是当咱们的i2c_driver工做不正常的时候,咱们能够经过这种方式来排查具体是设备驱动工做的问题or主机驱动工做的问题。
如若须要使用这个功能,须要对内核进行下述配置,从新编译加载以后咱们就能够在内核中看到设备号为89的设备文件,这个就是主机驱动提供给应用层的访问接口函数

>device drivers--->
    I2C support --->
        I2C device interface

以mpu6050为例,下面是一个简单的应用层直接经过主机驱动访问的democode

#define MPU6050_MAGIC 'K'

union mpu6050_data
{
    struct {
        short x;
        short y;
        short z;
    }accel;
    struct {
        short x;
        short y;
        short z;
    }gyro;
    unsigned short temp;
};

#define GET_ACCEL _IOR(MPU6050_MAGIC, 0, union mpu6050_data)
#define GET_GYRO  _IOR(MPU6050_MAGIC, 1, union mpu6050_data) 
#define GET_TEMP  _IOR(MPU6050_MAGIC, 2, union mpu6050_data)

int main(int argc, char * const argv[])
{
    int fd = open(argv[1],O_RDWR);
    union mpu6050_data data = {{0}};
    while(1){
        ioctl(fd,GET_ACCEL,&data);
        printf("acc:x %d, y:%d, z:%d\n",data.accel.x,data.accel.y,data.accel.z);
        ioctl(fd,GET_GYRO,&data);
        printf("gyro:x %d, y:%d, z:%d\n",data.gyro.x,data.gyro.y,data.gyro.z);
        ioctl(fd,GET_TEMP,&data);
        printf("temp: %d\n",data.temp);
        sleep(1);
    }
    return 0;
}
相关文章
相关标签/搜索