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