zoukankan      html  css  js  c++  java
  • 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
    ",data.accel.x,data.accel.y,data.accel.z);
    		ioctl(fd,GET_GYRO,&data);
    		printf("gyro:x %d, y:%d, z:%d
    ",data.gyro.x,data.gyro.y,data.gyro.z);
    		ioctl(fd,GET_TEMP,&data);
    		printf("temp: %d
    ",data.temp);
    		sleep(1);
    	}
    	return 0;
    }
    
  • 相关阅读:
    理解Java虚拟机——Java内存模型管理
    Java 使用fastjson 将 json字符串写到文件中去
    java 如何调用 linux or mac 命令行
    MacOS 编译 openjdk8 并导入 Clion 调试
    linux ls 命令超级详解
    小 Q 与树 (点分治)
    mysql 索引策略
    java中serialVersionUID作用
    通过源码分析Spring Security用户认证流程
    使用PowerMockRunner和Mockito编写单元测试用例详解
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/6500556.html
Copyright © 2011-2022 走看看