作者WPC001 (突然觉得自己是孤独的...)
看板LinuxDev
标题[问题] 两个不同的I2C Chip 抢占Bus 资源
时间Wed Sep 15 00:20:19 2010
假设有两个行程都不断存取两个i2c driver
但真实的i2c bus就只有一个, 也就是第一个driver在存取i2c slave devices时
第二个driver一定是无法存取的 (应该是有spin lock)
但我的疑问是来自於, 这两个driver似乎常常打架, 协调的很差
i2c_smbus_read_byte_data时常传回<0的错误值
虽然我可以藉由判别传回值, 来确保资料正确
但实测的结果是, 读取速率慢非常非常多(时常在打架)
原本两个driver在读取时, delay各为20ms (也就是每秒约有50笔资料输出)
现在变成每秒2~3笔资料输出 (非常容易碰撞), 想请问有甚麽好的解法
(两个driver都是自己写的)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.54.146
1F:推 shaopin:不要两个process, 合为一个process去读ㄋ? 09/15 10:39
2F:推 sceneryview:spin lock没写好 ?! 09/15 23:31
3F:→ elpam:感觉应该是hw 的题吧~~有罗辑分析仪会好点 09/16 10:36
4F:→ elpam:想办法确认一下register address没有冲到先~ 09/16 10:36
5F:→ WPC001:i2c确定没冲到...但process部分没办法,一定会有多个proc抢 09/16 23:04
6F:→ WPC001:底层driver试着加入dbg info, 发现read_byte经常回传<0的值 09/16 23:05
7F:推 saxontai:driver有针对Arbitration作处理?所有传输中该回应该处理 09/17 01:13
8F:→ saxontai:的ACK都有做?以上皆是的话拿示波器勾勾看是怎麽回事吧。 09/17 01:14
9F:→ WPC001:i2c io的部分, 应该是直接套用samsung s3c的driver 09/18 06:24
10F:→ WPC001:追了一下source, 里头应该有spin lock 09/18 06:25
11F:→ WPC001:然後大概是透过gpio去实作i2c, ack应该也都正常 09/18 06:25
12F:推 TroyLee:用gpio实做? s3c 本身应该有硬体 i2c 吧 09/18 11:19
13F:→ chris234:是用软体透过GPIO产生波形吗? 还是i2c跟GPIO mux在一起? 09/19 11:50
14F:→ WPC001:samsung的那两根pin, 是gpio, 但被driver组态成i2c了... 09/25 21:59
15F:推 milochen:请问你是依据 I2C Bus Protocol 写这两只driver吗 ? 09/26 23:27
16F:→ WPC001:I2C的protocol是由s3c本身的driver完成的 09/27 21:24
17F:→ WPC001:这两个driver, 仅是与其他i2c chip drv一样,注册i2c device 09/27 21:25
18F:推 milochen:我觉得 elpam 大的建议很好,可以试试,先确认问题在那边 10/02 19:41
19F:→ WPC001:目前改用另外一个thread然後配合caching pattern解决了 10/06 00:15