概述
在前兩篇文章中,我們針對 LPC 的鍵鼠項目開發時,對于 LPC USB 代碼流程的講解,讓大家對于代碼的架構以及流程有所了解。在本篇中以及后續的文檔中不定期將對于之前沒有說明的部分進行補充說明,大家可以當做番外篇或者 DLC 來看。
DLC內容
1. 在使用原廠的 SDK demo 時,大家應該能夠發現一個情況:在編譯下載鍵鼠的例程到開發板之后,只要設備通過 USB 線接上電腦上電后,就會不停地畫框(鼠標例程)或者上下翻頁(鍵盤例程)。例程中是通過在三個地方中添加函數來實現的,由于鍵鼠兩個例程都是相同的位置,我這邊就以鼠標例程來進行說明。其中我們可以在例程中找到主要實現鼠標畫框的函數為USB_DeviceHidMouseAction,如下圖所示:
主要調用的三個地方分別為:kUSB_DeviceHidEventSendResponse、kUSB_DeviceEventSetConfiguration以及kUSB_DeviceEventSetInterface 這三個地方進行調用。
其中kUSB_DeviceHidEventSendResponse 這個事件是在設備發送完 USB 數據之后底層回報的事件,用以通知數據發送完成或者取消的結果,而例程中在這里添加發送函數的作用是循環發送鼠標數據。流程如下圖所示:
而剩下的兩個事件就是在設備上電工作時進行 USB 配置完成后開始傳輸的時間,處理流程如下:
其中可以看出當底層協議棧接收到主機端設置配置或者接口請求之后,會通過這兩個事件通知到應用程序中,可以準備發送 USB 數據了。如果在開發代碼時,可以將 USB_DeviceHidMouseAction 函數干掉,或者修改成符合自己需要的發送函數,并且將這三個事件中調用該函數的代碼干掉,其中在 kUSB_DeviceEventSetInterface以及kUSB_DeviceEventSetConfiguration 函數中添加相關的標志位,用于提示可以準備發送數據了,而 kUSB_DeviceHidEventSendResponse 事件中可以根據通知結果添加自己對應的后續操作。
2. 在開發項目的過程中,還有一個常用的功能需要添加的,就是當主機休眠時,設備需要執行 Suspend 以及后續的 Resume 的喚醒功能。對此,SDK 中有一個相關的例程
dev_suspend_resume_hid_mouse 可以參考,首先需要在 .h 中將 USB 的 Lowpower 功能打開,如下圖所示:
這樣的話才能確保到相應的 Suspend 以及 Resume 的事件能夠在 SDK 中運行,具體可以例程搜索 USB_DEVICE_CONFIG_LOW_POWER_MODE。其中代碼中會在 USB 中斷 USB_DeviceLpcIp3511IsrFunction 中查詢 USB device 的狀態寄存器 DEVCMDSTAT 中關于 DSUS_C bit,如下圖所示:
如果 DSUS_C 位被置 1 就說明設備將處于這三個狀態中:需要進入 Suspend 狀態;設備斷開連接;設備接收到 Resume 信號。那么如何區別這些狀態咧?就需要繼續查看寄存器中 DSUS bit,如下圖所示:
當DSUS bit 置1,則表明設備已經超過 3ms 沒有發送 SOF 信號來維持活躍狀態,需要執行 Suspend 操作,而DSUS bit沒有置 1 而 DSUS_C bit 置 1,則表明設備接收到了 Resume 信號,需要執行 Resume 操作。在通過 SDK 中標準和類驅動中,最后傳輸到應用程序中是USB_DeviceCallback 函數中 kUSB_DeviceEventSuspend 以及 kUSB_DeviceEventResume,SDK 是在這兩個事件中通過設置對應的標志位,然后通過一個任務不斷查看這些標志位來進行對應的操作。
總結
在本篇中主要是描述了鍵鼠例程中發送函數的流程和對應事件,以及如何修改添加自己的發送函數;還有就是關于 USB 主機關機休眠時,設備執行 Suspend & Resume 操作時的流程。后續會隨著對于 USB 的深入了解再繼續推出補充說明。
-
usb
+關注
關注
60文章
7964瀏覽量
265278 -
代碼
+關注
關注
30文章
4808瀏覽量
68815
發布評論請先 登錄
相關推薦
評論