用linux 调用内核中的统一I2C驱动 i2c总是 busy,求大神支招,谢谢! 程序很短

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用linux 调用内核中的统一I2C驱动 i2c总是 busy,求大神支招,谢谢! 程序很短相关的知识,希望对你有一定的参考价值。

我用2440的板子;。用linux 调用内核中的统一I2C驱动接口写了个应用程序来理解I2C的给工作流程,。结果i2c总是 busy.
在板子上运行时的提示信息:
s3c2440-i2c s3c2440-i2c: cannot get bus (error -110)

在内核中对应的代码是:
kernel/drivers/i2c/busses/i2c-s3c2410.c:
ret = s3c24xx_i2c_set_master(i2c);
if (ret != 0)
dev_err(i2c->dev, "cannot get bus (error %d)\n", ret);
ret = -EAGAIN;
goto out;

/**程序不长,就全贴出来啦*/

#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<linux/i2c-dev.h>
#include<sys/ioctl.h>
#include<stdio.h>

#define I2C_SLAVE 0X0703
int main (int argc,char **argv)


int fd;
int adapter_nr = 0;
char filename[20];
char buf[10];
char rbuf[10];
unsigned char addr_data = 0x00;
//1,打开设备文件
snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
fd = open(filename, O_RDWR);
if (file < 0)
printf("open device file fail!\n");
return -1;

//2,设置从机地址
int addr = 0x50; /* The I2C address */
ioctl(fd, I2C_SLAVE, addr);

//3,发送片内地址和数据
buf[0] = addr_data;
buf[1] = 0x92; //要写入数据

write(fd, buf, 2); /*读写命令在发送片内地址前会自动先发送设置好的从机地址*/

//4,读数据
//4.1 写片内地址
write(fd,&addr_data,1);
//4.2 读数据
read(fd,&rbuf,1);
printf("rbuf[0] = 0x%x\n",rbuf[0]);

最近我也遇到这个问题了,纠结了一天,在网友的支持下解决了,这个天嵌的版本中,i2c和他的摄像头驱动(OV9650驱动)相冲突,你在编译内核之前,将摄像头的驱动全部去掉,这样子重新编译之后,i2c就可以正常测试使用了。 参考技术A to_i2c_client(dev) 这个函数返回值是一个指针,这个指针是个struct i2c_client 类型的指针,这个指针指向块内存,内存中存放着 to_i2c_client(dev)这个函数产生的数据。。追问

不好意思,每太明白,可以说的具体一些吗?谢谢/

基于飞凌FETA40i-C核心板在光时域反射仪中的应用原理

在光缆工程完工后,都需要进行线路的最后测试,来记录光缆的长度、径距损耗及接头损耗、各接头位置信息等。

光时域反射仪(英文简称:OTDR)是测试中必不可少的工具,通过对测量曲线的分析,了解光纤的均匀性、缺陷、断裂、接头耦合等若干性能的仪器。它是根据光的后向散射与菲涅耳反向原理制作,利用光在光纤中传播时产生的后向散射光来获取衰减的信息,主要可用于测量光纤衰减、接头损耗、光纤故障点定位以及了解光纤沿长度的损耗分布情况等,已经成为光缆施工、维护及检测中必不可少的工具。

外形如图:

了解完功能和原理后,接下来继续看......

一、 光时域反射仪的应用领域

测试光纤光缆的长度,均匀性

传输损耗,光纤的传输衰减

接头损耗等光纤物理特性,并能对光纤线路中的事件点,故障点准确定位

二、目前现状

传统的光时域反射仪大多数以单片机的方案来做,显示单一,存储空间小,随着该行业的发展,对产品的要求也多了起来,高主频,高性能,多操作系统,彩屏显示,画质清晰...

下面以全志A40i为例,展开Linux在光时域分析仪中的应用

常见接口要求如下:

软件:linux/Android /wince

显示:一路(3.5、4.3、5.6、10.1)寸不等,主要用来显示测试波形

USB :至少3路  ,可接U盘,打印机及通过SyncActive软件与PC机通信

网口: 一路(百兆即可)

串口 :主要用来接GPS,485等

传输:WiFi、蓝牙、4G

IO:可接按键

锂电池的管理:电池充放电的管理(一边充电一边供电)、开关机管理(长按开机 长按关机 短按休眠 短按唤醒)、省电管理(支持定时息屏  待机等)

FETA40I-C在此方案中的优势

四核cortex-A7,主频最高1.2Ghz,集成Mali400MP GPU

支持一路千兆网口,一路百兆网口

工业级芯片,户外运行更稳定

外部扩展丰富,UART*8、SD*4、USB*3、SPI*4等

默认支持LINUX3.10+QT5.9和Android7.1 操作系统

锂电池管理--核心板PMIC支持电池供电和对电池的充放电管理

飞凌其他平台可实现方案

A  Linux:FET6410,FET6UL,FET335X,FETA40i

B  Android:FETA40i,FET3399,FETMX8mm,FET4418/6818

C  wince:FET335x

联系我们: 

服    务   热   线 :400-699-6866

飞凌嵌入式官网:https://www.forlinx.com/

官    方   商   城:https://forlinx.taobao.com/  

以上是关于用linux 调用内核中的统一I2C驱动 i2c总是 busy,求大神支招,谢谢! 程序很短的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动开发I2C

Linux驱动开发I2C

Linux驱动开发I2C

linux 深入理解I2C内核驱动

Linux I2C驱动--用户态驱动简单示例

linux内核I2C子系统详解——看这一篇就够了