USB 與 IR GPIO 問題請教

45 views
Skip to first unread message

王世芳

unread,
Apr 8, 2017, 4:52:10 AM4/8/17
to IT_Project
HELLO 目前遇到一些狀況 想請問老師們
目前使用embedded linux 3.10.14
在MT7621上有雙CPU CPU0 CPU1
USB 的interrupt 在CPU0
使用lirc gpio來傳送ir 訊號 控制 CAM MENU
使用uvc + mjstreamer 來live view

發現有個狀況
如果 lirc 運行在 CPU0
當發送irsend 指令,會造成 uvc 掉frame0問題
因為 lirc 的 driver 有 spin_lock_irqsave 造成的

所以用taskset 跟nice 把lirc 設定在cpu1 執行
但發現irsend的時候會不靈敏,雖然不會掉frame了
irsend 的時候 led 有亮,但有時候就沒反應

在lirc設定在cpu1的情況下
如果把mjstreamer 的resolution減少 或是 照素面的地方
irsend就正常了
感覺是USB的流量 跟GPIO會打架

目前正在嘗試
1.想辦法把UVC的流量減少
2.是否在linux有可以調整USB與GPIO priority 的地方
3.programing guide 有 RBUS Matrix and QoS Arbiter register 似乎可以設DMA priority

請問有比較可行的解決方法嗎?

joseph chen

unread,
Apr 9, 2017, 8:27:22 PM4/9/17
to IT_Project
 

  Irsend 在mark 階段使用GPIO output產生pulse, 若改成PWM output 產生pulse 應該就能改善
 


王世芳於 2017年4月8日星期六 UTC+8下午4時52分10秒寫道:

王世芳

unread,
Apr 10, 2017, 5:36:35 AM4/10/17
to IT_Project


感謝 Joseph老師

  雖然MT7621沒有PWM可以使用,不過發現解決方法

taskset 2 nice -n 10 mjpegstreamer........................................省略
taskset 2 nice -n -20 lircd ......................................................省略

很奇怪
# cat /proc/interrupts
           CPU0       CPU1
 22:        343          0  MIPS GIC  xhci-hcd:usb1

主要的謎團是,driver spin_lock_irq_save 在 SMP 多核心的狀態下是怎麼運作的?
如何知道spin_lock_irq是用哪一個核心跑的?

因為uvc driver 有 spin_lock_irq_save
lirc_rpi driver 也有 spin_lock_irq_save

如果mjpg streamer 跟 lirc 都設定 在 CPU0 lirc_rpi driver lock 就會造成 uvc driver 掉 frame

mjstreamer 在CPU0 lirc 在CPU1 會造成irsend 不靈敏,應該是GPIO 模擬的訊號跑掉了

問題是都設定在 CPU1 怎麼正常了....

因為USB的interrupt都在CPU0 所以 loading比較重?還是uvc的driver是用usb interrupt?

linux....真是博大精深....

Reply all
Reply to author
Forward
0 new messages