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; }
相关推荐
zhjn0 2020-11-24
farwang 2020-11-25
星愿心愿 2020-11-24
tianhuak 2020-11-24
昭君出塞 2020-11-23
bluecarrot 2020-11-23
linuxwcj 2020-10-21
以梦为马不负韶华 2020-10-20
彼岸随笔 2020-10-20
yutou0 2020-10-17
applecarelte 2020-10-16
ourtimes 2020-10-16
waterhorse 2020-09-19
MRFENGG 2020-11-11
rainandtear 2020-10-30
kyssfanhui 2020-10-20
liuhangtiant 2020-10-20