新聞中心
另外一種驅(qū)動(dòng)
應(yīng)用層除了使用上述的使用i2c_driver接口來訪問i2c設(shè)備,Linux內(nèi)核還提供了一種簡單粗暴的方式——直接通過虛擬i2c設(shè)備驅(qū)動(dòng)的方式,即上一篇中的i2c-dev提供的方式,這種方式使用的i2c_client是隨著open的操作臨時(shí)創(chuàng)建的虛擬的client,即不是掛接在i2c_bus_type中的鏈表中的,對(duì)于用戶程序來說,這種方式的驅(qū)動(dòng)只是提供了相應(yīng)的操作方法并創(chuàng)建設(shè)備文件,可以看作是一種**”i2c_driver成員函數(shù)+字符設(shè)備驅(qū)動(dòng)”的虛擬驅(qū)動(dòng),需要讓用戶空間程序通過芯片手冊(cè)配置時(shí)序來訪問總線上的設(shè)備,看起來就像是在用戶空間直接操作i2c控制器,但其實(shí)它更多的用法是當(dāng)我們的i2c_driver工作不正常的時(shí)候,我們可以通過這種方式來排查具體是設(shè)備驅(qū)動(dòng)工作的問題or主機(jī)驅(qū)動(dòng)工作的問題。 如若需要使用這個(gè)功能,需要對(duì)內(nèi)核進(jìn)行下述配置,重新編譯加載之后我們就可以在內(nèi)核中看到設(shè)備號(hào)為89**的設(shè)備文件,這個(gè)就是主機(jī)驅(qū)動(dòng)提供給應(yīng)用層的訪問接口

>device drivers--->
I2C support --->
I2C device interface
以mpu6050為例,下面是一個(gè)簡單的應(yīng)用層直接通過主機(jī)驅(qū)動(dòng)訪問的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;
}
文章標(biāo)題:Linuxi2c子系統(tǒng)(二):使用i2c-dev.c訪問設(shè)備方案
網(wǎng)址分享:http://www.dlmjj.cn/article/cocihhe.html


咨詢
建站咨詢
