linux2.6.12自带的i2c驱动的应用
来源:互联网 发布:c语言用for九九乘法表 编辑:程序博客网 时间:2024/05/23 14:17
这两天,想在qt上实现i2c的读写,参看文章
http://www.52rd.com/Blog/Detail_RD.Blog_farsight2009_22372.html
对于linux下,自带的i2c有了一定认识,之前自己写过一个i2c的驱动,但是读写有问题,特别是2440的状态寄存器和控制寄存器配置不成功,只有包含了系统的2410的驱动,才能配置,无语。所以想使用其自带的驱动。
按照他的说明,更改好程序以后,执行时,不论读写都报错,我的i2c芯片是2432的e2prom,是16位的地址。其器件地址0xa0,
报错:Remote IO error。
跟踪内核,发现是在i2c_transfer(client->adapter, rdwr_pa, rdwr_arg.nmsgs);的时候错的。于是找到函数adap->algo->master_xfer(adap,msgs,num);
其原型如下:
/* ----------------------------------------------------
* the functional interface to the i2c busses.
* ----------------------------------------------------
*/
int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
{
int ret;
if (adap->algo->master_xfer) {
#ifdef DEBUG
for (ret = 0; ret < num; ret++) {
dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
"len=%d/n", ret, msgs[ret].flags & I2C_M_RD ?
'R' : 'W', msgs[ret].addr, msgs[ret].len);
}
#endif
down(&adap->bus_lock);
ret = adap->algo->master_xfer(adap,msgs,num);
up(&adap->bus_lock);
return ret;
} else {
dev_dbg(&adap->dev, "I2C level transfers not supported/n");
return -ENOSYS;
}
}
其中adap->algo->master_xfer(adap,msgs,num);的介绍在网上找到一段:
我们需要为特定的I2C适配器实现其通信方法,主要实现i2c_algorithm的master_xfer()函数和functionality()函数。
functionality ()函数非常简单,用于返回algorithm所支持的通信协议,如I2C_FUNC_I2C、I2C_FUNC_10BIT_ADDR、 I2C_FUNC_SMBUS_READ_BYTE、I2C_FUNC_SMBUS_WRITE_BYTE等。
master_xfer()函数在I2C适配器上完成传递给它的i2c_msg数组中的每个I2C消息,代码清单15.11给出了xxx设备的master_xfer()函数模板。
代码清单15.11 I2C总线驱动master_xfer函数模板
1 static int i2c_adapter_xxx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
2 int num)
3 {
4 ...
5 for (i = 0; i < num; i++)
6 {
7 i2c_adapter_xxx_start(); /*产生开始位*/
8 /*是读消息*/
9 if (msgs[i]->flags &I2C_M_RD)
10 {
11 i2c_adapter_xxx_setaddr((msg->addr << 1) | 1); /*发送从设备读地址*/
12 i2c_adapter_xxx_wait_ack(); /*获得从设备的ack*/
13 i2c_adapter_xxx_readbytes(msgs[i]->buf, msgs[i]->len); /*读取msgs[i]
14 ->len长的数据到msgs[i]->buf*/
15 }
16 else
17 /*是写消息*/
18 {
19 i2c_adapter_xxx_setaddr(msg->addr << 1); /*发送从设备写地址*/
20 i2c_adapter_xxx_wait_ack(); /*获得从设备的ack*/
21 i2c_adapter_xxx_writebytes(msgs[i]->buf, msgs[i]->len); /*读取msgs[i]
22 ->len长的数据到msgs[i]->buf*/
23 }
24 }
25 i2c_adapter_xxx_stop(); /*产生停止位*/
26 }
上 述代码实际上给出了一个master_xfer()函数处理I2C消息数组的流程,对于数组中的每个消息,判断消息类型,若为读消息,则赋从设备地址为 (msg->addr << 1) | 1,否则为msg->addr << 1。对每个消息产生1个开始位,紧接着传送从设备地址,然后开始数据的发送或接收,对最后的消息还需产生1个停止位。图15.3描述了整个 master_xfer()完成的时序。
注意红色部分,我在程序中,addr赋值是0xa0,这里他发送的时候,对地址做了操作,于是将0xa0》1填入,即可。
- linux2.6.12自带的i2c驱动的应用
- PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- RaspberryPi3 驱动 I2C接口的 JY901模块(9轴IMU,自带卡尔曼滤波)
- 使用Linux自带的i2c-dev操作EEPROM
- i2c驱动的编写
- linux驱动的i2c驱动
- 带I2C接口的数字温度传感器TMP101及其应用
- vs2005和自带sqlserver2005的应用
- android各种自带应用的调用
- 调试系统自带的应用
- android自带的媒体数据库应用
- 如何卸载win10的自带应用
- 打开手机自带的应用市场
- 卸载Win10自带的应用
- Win10恢复自带应用的方法
- Linux2.6.37 I2C驱动框架(四)
- 基于I2C子系统的I2C驱动编写
- JavaScript名词解释
- 误解XML
- 常用bash脚本
- 7.29
- c++ 深复制,浅复制
- linux2.6.12自带的i2c驱动的应用
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- 鼠标经过显示图片
- linux内核的 等待队列 使用方法,wait_queue_head_t,进程休眠
- 网站的安全与稳定
- js 文件压缩-jsmin简介
- 菜单
- 关于配置文件中不允许有子节点错误的总结
- MyEclipse+WebSphere 通过 JNDI 连接 Sybase 简介