金 璐
(東軟醫療系統股份有限公司,遼寧 沈陽 110011)
目前在超聲系統設備上鍵盤設計中,往往采用鍵盤專用芯片作為主控芯片,這種方式的優點是設計簡單,不用進行軟件編程[1]。但在臨床醫生日常使用過程中,往往會出現按鍵失靈、硬件設備不識別等故障[2],在山區或者鄉鎮也會出現無法正常使用的現象。當出現這種情況,售后服務人員也無法判斷問題點,進而導致后期維修成本的增加。所以,設計一款可編程、可維護的超聲臺車控制面板是必要的。
超聲臺車的控制面板由小鍵盤、軌跡球、鍵位控制面板等模塊構成。鍵位控制面板模塊由2 塊STM32嵌入式芯片完成按鍵掃描、滑塊掃描、旋鈕掃描及鍵值發送等功能。同時,控制面板在軟件編程中嵌入FreeRTOS 開源操作系統來確保按鍵的實時性和可靠性[3]。在控制面板驅動中,采用了按鍵過濾功能,進一步保證了主機Host 所接收的信號是按鍵所在的實時位置,避免由于數據阻塞造成Host 端響應延遲的問題。
控制面板的工作流程:例如當醫生期望調節TGC時會滑動滑塊,這時滑塊的鍵值信息會發送至Host 主機端,驅動端截獲當前的鍵值數據解析后,會發送Windows 可識別的ISY message 信號,在Host 端的上位機輪詢到這個message 信號就可以做出相對應的滑塊動作,并將信息傳遞給圖像Image 單元,以圖像的方式反饋給醫生。
控制面板的組件主要包括鍵位控制面板、小鍵盤、軌跡球等外設。鍵位控制面板選用的單片機型號為STM32F103,工作溫度為-40 ℃~85 ℃基本滿足日常使用情況[4]。具體配置情況:時鐘配置見圖1,系統時鐘是72M,USB 的時鐘是48M。

圖1 鍵位控制面板時鐘配置
基礎配置見圖2,嵌入FreeRTOS 操作系統,具體優點如下:(1) FreeRTOS 是免費的,要做產品的話,免費的FreeRTOS 操作系統就是個不錯的選擇。(2) 簡單、小巧、易用,通常情況下內核占用4 k~9 k 字節的空間。(3) 相比于while 輪詢的好處在于不會因為功能的添加造成功能間的時延且后期功能添加,代碼移植方便簡單。

圖2 鍵位控制面板基礎配置
由于本設計中采用了FreeRTOS 操作系統,所以采用了任務輪詢的方式進行鍵位檢測,即不同類型的鍵值在不同的任務中進行邏輯處理。
2.3.1 Button 任務
Button 按鍵部分主要采用的是7*7 矩陣掃描檢測,見圖3。

圖3 Button 按鍵7*7 矩陣掃描原理圖
2.3.2 Encode 任務
Encode 按鍵采用的編碼器型號為EC21A154040 1,輸出波形的相序,見圖4。

圖4 輸出波形相序圖
2.3.3 TGC 任務
ADC 采集方式為單通道采集,采集不同Channel數據,進行了多次采集,并軟件濾波。
由于采集的數據是32 位,而TGC 滿量程是0~255,所以需要移位處理。
2.3.4 小鍵盤功能
鍵盤設備類是HID 類,同樣是一款STM32F103嵌入式單片機,在時鐘配置上與鍵位控制面板的配置基本一致。基礎配置上與鍵位控制面板略有區別,只有一個USB Device 的設備類,這樣對于Host 主機識別來講,會將小鍵盤當做HID 類設備,無需驅動即可使用。
2.3.5 輔助功能
鍵位控制面板輔助功能包括軌跡球、光傳感等。
軌跡球是一個Hub 類的USB 外設,可以直接連接到Host 端的Hub 上就可以在Host 主機端的設備管理器中看到。
光傳感器采用的芯片為APDS-9960 RGB 紅外手勢傳感,主要用于LED 燈息亮設計,該傳感器的靠近感應功能支持大概10 cm 范圍,超出10 cm 范圍后感應數值都為0。
根據WDK 可以創建一個Sample 代碼,其中各個模塊的工程如下:
2.4.1 驅動入口
USB 驅動的函數入口為DriverEntry,也是微軟唯一指定的驅動函數入口點。
2.4.2 設備添加函數
當設備連接Host 主機后,驅動端會進行PNP 的電源枚舉,如果電源狀態為E0 時,會調用設備添加函數OsrFxEvtDeviceAdd 進行設備添加操作,在pnpPowerCallbacks 函數里注冊一系列的回調函數,其中就包括設備添加函數。
2.4.3 隊列函數
隊列函數包括手動隊列和串行隊列,這里添加了一個手動隊列WdfIoQueueDispatchManual,目的是為了響應STM32 發送過來的中斷信號,進而解析鍵值信息。
2.4.4 創建wdf 設備
當調用函數WdfDeviceCreate 時就創建了wdf 設備,在此之前所有的配置參數都會綁定到這個wdf 設備上。
2.4.5 USB 中斷傳輸
USB 中斷傳輸不是真正意義上的中斷,而是采用Host 輪詢的方式來模擬中斷,其實是一個偽中斷[5]。既然是輪詢操作,就會涉及到一個輪詢頻率的問題,即多少時間需要輪詢一次。這個時間值被定義在中斷端口的端口描述符中,由硬件定義,并由總線驅動參照執行。
2.4.6 連續讀操作
Continuous Reader 這個概念是wdf 框架較wdm框架的區別之一,這種設計方式簡化了開發人員的開發難度。
對應的函數為WDF_USB_CONTINUOUS_READER_CONFIG,具體實現方式如下,這個函數有兩個參數需要注意:
TransferLength:表示每次從中斷端口讀取數據的最大長度,設置為最大包的長度是比較安全的。
NumPendingReads:多個 IRP 形成隊列,排隊等侯總線驅動從USB 設備中斷端口讀取有效數據。


2.4.7 鍵值數據處理
當連續讀回調函數被執行的時候,從Buffer 內存句柄中獲取內存緩沖指針,部分數據處理方式如下:

2.4.8 鍵值解析部分
鍵值解析主要包括按鍵選定、按鍵釋放和長時按鍵,部分實現代碼如下:


為了驗證設計的正確性,Host 端編寫簡單的測試Demo 程序。具體功能如下:
(1) 根據GUID 創建一個驅動句柄。
(2) 創建一個線程,其功能是檢測鍵值輸入信息,并提取有效數據段,發送ISY message 至Host 主機。
(3) 以DeviceIoControl 函數向驅動發送一些控制指令,比如點燈,獲取設備信息等功能。
經Demo 測試后,確認可以正常獲取鍵值信息且Host 主機正確做出響應。現已在超聲產品NeuEcho10和NeuEcho15 投產使用,見圖5,目前并沒有出現按鍵失靈、硬件設備不識別等故障,整體來看效果不錯。

圖5 NeuEcho15 展示圖