小菜鸟请教一个I2C设备驱动的问题

四极管 2012-05-15 09:04:44
使用设备驱动模型,
static struct i2c_gpio_platform_data i2c_xxx_platdata = {
.sda_pin = GPIO_xxx_SDA, // gpio number
.scl_pin = GPIO_xxx_SCL,
.udelay = 5,
.sda_is_open_drain = 0,
.scl_is_open_drain = 0,
.scl_is_output_only = 0
};

static struct i2c_board_info i2c_devs5[] __initdata = {
{
I2C_BOARD_INFO("xxx", 0x10),
},
};


static struct platform_device linux_device_i2c5 = {
.name = "i2c-gpio",
.id = 5, // adepter number
.dev.platform_data = &i2c_xxx_platdata,

}
static struct platform_device *smdkc110_devices[] __initdata = {
中包含:
&linux_device_i2c5,

模拟的定义都设定好了,

I2C设备驱动程序
xxx_ts_probe也进入了。。但是在我读写的时候总是提示i2c_transfer这个函数出错。。
错误信息为:
msg xxx_i2c_rxdata i2c read error:-6
开始怀疑硬件是否出错。但是我使用I2CGET和I2CSET工具是可以读出数据的。。是我的设备还没有挂载上?
但是程序确实是执行了初始化xxx_ts_probe,在读数据和写数据的时候出错的。。。小菜鸟一个,希望大牛们能指点一二。感激不尽
...全文
1017 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
?beta 2014-07-08
  • 打赏
  • 举报
回复
楼主能贴出来怎么解决的吗,共同学习
慕白bmy 2013-04-28
  • 打赏
  • 举报
回复
引用 17 楼 yangxingbo0311 的回复:
注意一下速度。。。。模块的速度很慢的。。慢到您无法想象
什么速度。?告诉我哪里? 速度就是频率啊。 频率要为多少啊? 谢谢。 我现在调ft5406
四极管 2012-06-06
  • 打赏
  • 举报
回复
注意一下速度。。。。模块的速度很慢的。。慢到您无法想象
jiarui0213 2012-06-05
  • 打赏
  • 举报
回复
你好楼主 请问你是怎么解决的 最近一直被这个问题困扰着?
四极管 2012-05-21
  • 打赏
  • 举报
回复
已解决
四极管 2012-05-18
  • 打赏
  • 举报
回复
波形没出来。。。只有读写有数据的时候才出来。。。用I2CGET是可以的。。有波形也有数据。。我猜测是初始化读取速度过快。。。器件没反应过来,而我用I2CGET是一次一次的手动输入。所以可以。再试
四极管 2012-05-17
  • 打赏
  • 举报
回复
我用的是设备模型I2C-GPIO的。贴上源码:

#define SCH900_NAME "SCH900"
static struct i2c_client *this_client;

static int sch900_i2c_rxdata(char *rxdata, int length,int addr)
{
int ret;

struct i2c_msg msgs[] = {
{
.addr = this_client->addr,
.flags = 0,
.len = 1,
.buf = rxdata,
},
{
.addr = this_client->addr,
.flags = I2C_M_RD,
.len = length,
.buf = rxdata,
},
};
rxdata[0] = addr;
ret = i2c_transfer(this_client->adapter, msgs, 2);

if (ret < 0)
pr_err("msg %s i2c read error: %d\n", __func__, ret);

return ret;
}

static int sch900_i2c_txdata(char *txdata, int length)
{
int ret;

struct i2c_msg msg[] = {
{
.addr = this_client->addr,
.flags = 0,
.len = length,
.buf = txdata,
},
};

ret = i2c_transfer(this_client->adapter, msg, 1);
if (ret < 0)
pr_err("%s i2c write error: %d\n", __func__, ret);

return ret;
}

static int
sch900_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int err = 0;
char buf[2]={0};
printk("==sch900_ts_probe=\n");
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
err = -ENODEV;
goto exit_check_functionality_failed;
}

printk("==sch900 i2c_set_clientdata=\n");
this_client = client;

msleep(200);
msleep(200);
sch900_i2c_txdata(0x70,1);
msleep(200);
sch900_i2c_txdata(0xc0,2);

err = sch900_i2c_rxdata(buf, 2, 0XC0);
if (err < 0) {
printk("%s read_data i2c_rxdata failed: %d\n", __func__, err);
return err;
}
printk("SCH9003 probe id:%d,%d\n",buf[0],buf[1]);


//sch900_i2c_rxdata(buf,2,0x80);
//printk("==sch900_i2c_rxdata: %d\n",buf);

return 0;

exit_check_functionality_failed:
return err;
}

static int __devexit sch900_ts_remove(struct i2c_client *client)
{
printk("==sch900_ts_remove=\n");
i2c_set_clientdata(client, NULL);
return 0;
}

static const struct i2c_device_id sch900_ts_id[] = {
{ SCH900_NAME, 0},{ }
};
MODULE_DEVICE_TABLE(i2c, sch900_ts_id);

static struct i2c_driver sch900_ts_driver = {
.probe = sch900_ts_probe,
.remove = __devexit_p(sch900_ts_remove),
.id_table = sch900_ts_id,
.driver = {
.name = SCH900_NAME,
.owner = THIS_MODULE,
},
};

static int __init sch900_ts_init(void)
{
return i2c_add_driver(&sch900_ts_driver);
}

static void __exit sch900_ts_exit(void)
{
i2c_del_driver(&sch900_ts_driver);
}

module_init(sch900_ts_init);
module_exit(sch900_ts_exit);




错误提示:
sch900_i2c_txdata i2c write error:-6
sch900_i2c_txdata i2c write error:-6
msg sch900_i2c_rxdata i2c read error:-6
sch900_ts_probe read_data i2c_rxdata faile:-6

跟踪调试ret = adap->algo->master_xfer(adap, msgs, num);
就是返回值出错。。再进去就是I2C协议了。。不应该有错的呀。。。

  • 打赏
  • 举报
回复
通信方法分两种:
1是在编译内核时添上对I2C的支持,这样在/dev下自然就有i2c-0等设备节点,直接open它操作就可以了。
这个的前提是硬件接的I2C..

2自己写代码,这个就不受I2C接口的限制了。自己写又分两种,不知道LZ这个设备模型是自己写的,还是哪来的。 我是直接自己写代码控制GPIO模拟I2C,代码量很小滴..

我博客里有GPIO模拟MDC/MDIO的代码例子,也有关于模拟I2C的文章哈,可以参考下。

至于设备模型这个..感觉挺复杂的,一直没仔细看过..
falloutmx 2012-05-17
  • 打赏
  • 举报
回复
量波形,看波形出来没
四极管 2012-05-17
  • 打赏
  • 举报
回复
另。。我的硬件平台是S5PV210。操作系统平台Android2.3.7
四极管 2012-05-17
  • 打赏
  • 举报
回复
为什么帖子热不起来呢?分数不够?
四极管 2012-05-15
  • 打赏
  • 举报
回复
用I2CDETECT 测试出来的从机地址应该是没有错的。。
ying_seven 2012-05-15
  • 打赏
  • 举报
回复
如果打印出来的是err_no应该是没有这个设备 或者地址的意思
你看看从机地址是不是写错了?
四极管 2012-05-15
  • 打赏
  • 举报
回复
同样的 我把测试用在触摸屏驱动上。。当拔掉触摸屏的时候也是这样子的错误 难道我的设备没有检测到?那用I2CGET测试出来的又是什么东西呢?
四极管 2012-05-15
  • 打赏
  • 举报
回复
是的。。。那个错误号没有什么规定的意义吧 我大概查了一下。。
ying_seven 2012-05-15
  • 打赏
  • 举报
回复
使用gpio模拟的I2C么?
错误信息是在client driver里面打印出来的,你查查那个错误号有没有什么意义啊
四极管 2012-05-15
  • 打赏
  • 举报
回复
也就是ret = i2c_transfer(this_client->adapter, msgs, 2);传递信息的时候返回值是小于0的。。
不知该如何查起。。。
四极管 2012-05-15
  • 打赏
  • 举报
回复
是我说的不够清楚么?还是咋的

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧