作者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