良许Linux教程网 干货合集 Linux i2c子系统(二) :使用i2c-dev.c访问设备方案

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为例,下面是一个简单的应用层直接通过主机驱动访问的demo

#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;
}

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部