1

這可能是一個愚蠢的問題,是否需要在超時後重新枚舉USB大容量存儲類?

我在運行嵌入式Linux的ARM-CortexM4平臺(STM32F4系列)上調試USB存儲設備。 ARM作爲USB主機工作,並嘗試與USB全速(12Mb/s)的拇指驅動器進行通信。

現在這裏是問題。通過BULK傳輸成功枚舉和多個SCSI命令後,容量和所有內容都可以正確讀取。然而,約15秒後,當我再次嘗試發送這些SCSI命令(同等條件下),USB主機控制器僅返回「交易錯誤」,它看起來像設備沒有響應批量傳輸了(不確認序號)和主機控制器超時。問題是,USB大容量存儲類或SCSI系統是否有超時機制,在超時後系統必須重新枚舉或重新探測,否則它將不再響應?

我理解這可能會在我的計劃是因爲一個愚蠢的錯誤,或由於對特定的硬件一定的侷限性。但是,當我在PC上的Linux上使用usbmon模塊來捕獲同一個驅動器上的傳輸時,我可以看到操作系統每5個實際發送一個序列探測命令(Read-max-Lun,接着是測試單元就緒)秒,這可能是爲什麼拇指驅動器沒有在我的電腦上失敗的原因。

謝謝!我期待着任何答覆。

回答

0

我認爲你是在正確的軌道與測試單元就緒命令上..我在寫一個嵌入式設備的大容量存儲設備驅動程序的中間,當OS X測試,最初的SCSI查詢後,當沒有其他活動發生時,我的設備每秒接收一次「測試單元就緒」命令。由於你的帖子已經很老了,所以如果你已經解決了你的問題,我建議你發佈你自己的解決方案。

否則嘗試從主機側面加入定期測試單元準備命令時,有沒有其他活動。您可以設置並激活每當USB處於活動狀態的計時器。如果定時器啓動,您可以發送一個測試單元就緒命令。沖洗重複。

+0

我很感謝您的回覆。不幸的是,這個問題還沒有解決一段時間,我已經放棄了現在。我曾嘗試切換回由STMicro提供的USB主機固件,但它似乎在工作,但我試圖將所有內容都複製到我的Linux設備驅動程序中,並在幾秒鐘後像以前那樣掛起設備。 – caoyuan9642 2015-03-29 23:49:01

+0

由於我正在調試主機並且您正在設計一個設備,因此我的問題可能與您的問題有所不同。我不知道誰應該定期發送測試單元。很明顯,它不會自動發送到Linux內核驅動程序本身的任何位置,所以我懷疑它是由一些用戶空間守護程序(如udev)發送的?我對用戶空間程序不是很熟悉,這只是一個猜測。希望這方面的專家能幫助我。謝謝! – caoyuan9642 2015-03-29 23:51:46