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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM