2010-06-10 82 views
2

我有一個USB連接的嵌入式設備。當用戶將設備插入其PC(Windows,OSX)時,操作系統如何發現要安裝的驅動程序?我如何獲得我的驅動程序被選中?他們是否可以駐留在某個中央服務器上(由OS供應商運行)?當你插入一個新的USB設備時會發生什麼?

回答

6

這是針對Windows:

當USB設備插入到系統中,USB總線驅動程序通知。 總線驅動程序向設備發送標準USB請求(USB_DEVICE_DESCRIPTOR)。通過此設備報告其名稱和類型。 (形式bDeviceClass/bDeviceSubClass/bDeviceProtocol)。

使用此信息,Windows會在系統中創建一個設備條目。這是硬件ID。系統現在試圖找到可以處理設備的通用驅動程序(HID/UVC)或專門註冊以支持此硬件ID的驅動程序。

要將驅動程序註冊爲特定設備的處理程序,必須將該驅動程序安裝到系統中,或者必須向Microsoft提供一個可在其服務器上提供的驅動程序。

+0

你給微軟一個副本的方式是什麼(如他們的稱謂)? – Will 2010-06-10 09:37:23

+1

WHQL。不,這不是第一步。 – Christopher 2010-06-10 09:42:07

+0

瞭解:)。 – Will 2010-06-10 09:56:58

7

對於OS X:

那麼我想象的第一部分是類似於Windows。但是,驅動程序(或者說驅動程序堆棧)是通過名爲driver matching的進程選擇的。每個驅動程序都捆綁了一個特殊的XML字典文件,該文件描述了該驅動程序所用的設備。

字典中的一個鍵是IOProviderClass鍵,它告訴操作系統粗略地說明了驅動程序適用於哪些設備。已加載的驅動程序可以提供「nubs」,這是其他驅動程序可以連接的接口。哪些驅動程序嘗試附加到結點由IOProviderClass鍵確定。

因此,例如,當您將USB驅動器插入Mac時,已加載的USB控制器驅動程序會檢測到此情況併爲設備提供一個結點。通過驅動程序匹配來選擇低級USB驅動程序 - 根據從設備獲得的值來檢查字典中的鍵/值,例如,供應商ID,設備類型等,併爲得到正確的IO提供者類別的每個驅動器導出分數。最高得分的那個被附在結節上。

這個新驅動程序本身可能會爲其他驅動程序提供nubs附加。例如,連接USB磁盤驅動器將導致USB堆棧爲SCSI塊設備驅動程序創建一個結點以連接到該結點。通常情況下,這會導致蘋果的標準SCSI塊設備驅動程序被加載,這反過來會爲BSD驅動程序(每個分區一個)提供nubs,從而在dev文件系統中創建BSD設備節點。

如果您希望將您的驅動程序選定爲高於其他驅動程序,您只需爲驅動程序所用的設備添加鍵值對,從而使驅動程序獲得非常高的分數。通常只需將密鑰放入您的供應商ID /型號就足夠了。不過,我認爲你可以重寫匹配方法(設備驅動程序是用一組受限制的C++編寫的)來給你的驅動程序一個非常高的分數。

這是一個高層次的觀點。不過,這是我做了這麼多年的,因此請確保您閱讀了當前的Apple文檔

+1

對不起,我不能接受*兩個*答案 – Will 2010-06-18 08:45:01

+0

@會:沒問題。無論如何,我都很喜歡回憶起我的設備驅動日。 – JeremyP 2010-06-18 10:36:36

相關問題