最近整理資料,發現這篇三年前的研習報告,在此發表當作記錄。對此課程有興趣的朋友,可以洽詢傳識資訊。
研習動機
研發 USB-CDC 介面過程中,曾遭遇 USB 熱插拔後,應用程式 COM port 無法釋放問題,經多方追查,發現問題在於 Microsoft USBCDC.SYS 驅動程式上,為了深入了解 Windows Driver 及解決問題,引發學習動機。
課程綱要
從 WDM (Windows Driver Model) 基本架構及運作流程介紹起,再導入 WDF (Windows Driver Foundation) 設計,並藉由 Cypress FX2 board 練習 Driver 修改及除錯,逐步熟悉其技巧,對驅動程式設計有完整概念。
WDM 是從 Win98 時代沿用至今的驅動程式模組,因應新作業系統 Vista 微軟推廣 WDF 設計,一來可大幅降低程式碼,二來提昇系統穩定度與效能,不過所有的功能函數、系統宣告與變數的命名方式全面變革。
WDF 分兩大類
KMDF (Kernel-Mode Driver Foundation) 與 UMDF (User-Mode Driver Foundation),兩者程式碼差異極大。前者採 C 寫碼,後者用 C++ 更物件導向。UMDF 適合簡單、無中斷、對時序要求不高的驅動程式,所以設計前須確定採用何種方式。
以一個 USB 轉 RS-232 驅動程式為例,用 WDM 設計約需 40000行程式碼,用 WDF 設計則須20000行。採用 WDF 設計的好處為程式更結構化,因為視窗系統對驅動程式未定義到的部分,都有內定處理方式,程式設計師只要針對需要的部分追加功能,尤其是 UMDF,不會因驅動程式異常而造成當機。
開發 Windows Driver 至少須安裝 WDK (Build 6000) 及 DbgView。WDK 須向微軟官方網站註冊免費下載,共2.4GB,電腦主機至少 Win 2000、RAM 1GB,於 DOS 環境下建立程式,程式設計時不可使用 ANSI 標準 Library。另外對 64-bit 作業系統,程式碼須調整,有諸多限制。
研習心得
公司主要營利項目為儀表之研發與製造,在軟韌體領域,重點放在儀表上韌體設計,其次為電腦應用程式。驅動程式主要搭配作業系統運作,上與應用程式連結,向下則控制電腦硬體,擔任應用程式與電腦硬體間溝通的角色。
一般而言,自行設計之應用程式搭配作業系統或 Chip Set 原廠提供的驅動程式,可達成 99.9% 以上使用需求。若要涉入開發驅動程式,撇開開發人力問題,首先必須面對作業系統相容性問題。完成的驅動程式須經微軟認證,取得 .cat 檔,安裝過程才不會產生警告畫面,認證費用須美金 3000元。
有一種情形是必須自行設計驅動程式 - 不變更現有的應用程式,卻須有新功能展現。例如,透過網路撥放音樂,實現這項功能的方法有二:
一、設計新播放應用程式,開啟本機音樂檔,將資料轉送至網路,播放之主機接收資料後從喇叭播音。
二、變更本機喇叭驅動程式,使用本機原有的音樂撥放程式,當播音時,本機的喇叭驅動程式攔截到資料,就轉送至網路,由播音之主機播出。
先前 usbcdc.sys 無法處理熱插拔,主因在驅動程式未對 Surprise Removal 處理。
關於 USB-CDC,微軟並未提供原始碼,但是可以參考 WDK 提供的 Serial - USB driver sample code 修改,驅動程式運作的流程如下:
應用程式透過 IO Manager 呼叫 COM port,IO Manager 會將需求指向自行設計的 Virtual COM driver,這個 driver 會將資料轉交給 USB driver,對 USB 實體控制。
研習本課程後,雖然無法立即對現有專案產生助益,但是對日後研發問題的解析排除或新商品的設計仍有深遠的幫助,可減少資料蒐集與問題解析所發費的時間, 並且也了解相關資源,加速解決問題的速度。
新ubuntu2404,新尹倉1120
-
Ubuntu24.04
每次ubuntu系統出新版本,我的更新都是滯後的。最新的ubuntu2404.iso已經超過6G,估計是因為加入了大量中文字體致使體積大增。我十多年來一直當作系統盤的4個G的U盤再也裝不下了,最終我決定把一個32G的U盤當系統安裝盤。
昨晚研究了multibootUSB好久,最終引導不...
1 天前
沒有留言:
張貼留言