對USB驅動程式的的理解

2021-04-08 21:46:31 字數 3506 閱讀 4594

1、每個裝置對應乙個pdo,每個pdo又對應多個fdo,在驅動程式中直接操作的不是硬體而是相應的pdo和fdo。在user和kernel通訊方面,系統將每乙個使用者請求打包成irp結構,將其傳送至驅動程式,並通過識別irp中的pdo來區別是傳送給哪個裝置的。另外,在驅動程式載入方面,wdm不通過驅動程式名稱識別,而是通過乙個128位的全域性唯一的識別符號guid來實現驅動程式的識別,即每乙個韌體都有乙個guid,你通過guid來區分是哪個韌體。 (通過irp中的pdo來識別驅動裝置,通過guid識別驅動程式)

3、usbd是usb系統軟體中最關鍵的一層,它負責控制全部usb協議的操作和中斷處理控制。主要功能有:裝置設定、資源管理、資料傳輸(管道層次)以及公共資料定義等。管道機制和命令機制。管道機制:管道是裝置和主機之間的邏輯連線,分為標準管道和邏輯管道,標準管道用語完成一些客戶通過命令介面所傳遞的請求,如設定裝置的位址等,但usbd不允許客戶直接訪問裝置的標準管道。客戶管道則有客戶進行管理,並提供相應的資料緩衝區。命令機制允許客戶以讀寫的方式對裝置的資料及其控制部分進行訪問,客戶所要做的,僅僅是向usbd提供裝置的位址及相關的資料緩衝區的指標。命令機制所提供的功能主要是usb匯流排管理相關的內容,如裝置設定管理、裝置資料訪問、匯流排裝置管理以及電流分配等。

4、usb裝置驅動程式設計

2000ddk+vc6.0(只能用c,不能用c++)

三個關鍵的例程:driverentry、adddevice、readwrite

(1)driverentry,完成某些全域性初始化操作,它是核心模式驅動程式主入口點。

extern "c"

ntstatus driverentry( in pdriver_object driverobject,

in punicode_string registrypath )

通過pdriver_object這一重要的資料結構,i/o管理器使用它來定義每乙個裝置驅動程式,driverentry主要工作是各種函式指標填入驅動程式物件的各個域中,這些指標為作業系統指明了驅動程式容器中各種子例程,重要包括下面指標成員:

1、driverunload

2、driverextension->adddevice指向驅動程式的adddevice函式

3、driverstartio指向驅動程式處理序列i/o請求的函式。如果驅動程式採用標準的irp排隊的方式,應該設定該成員,使得指向驅動程式的startio例程。

4、majorfunction是乙個指標陣列,指向存在於驅動程式中的多種irp處理函式。

driverobject->driverunload = driverunload;

driverobject->driverextension->adddevice =adddevice;

driverobject->majorfunction[irp_mj_create]= dispatchcreate;

~~~~~~~~~~~~~~

(2)adddevice

乙個驅動程式可以被多個裝置使用。wdm驅動程式有乙個特殊的adddevice函式,pnp管理器為每個例項呼叫該函式。原形如下:

ntstatus

adddevice( in pdriver_object driverobject,

in pdevice_object physicaldeviceobject);

adddevice函式的基本職責是建立乙個裝置物件並把它連線到以pdo為底的裝置棧中。

具體步驟如下:

1) 用iocreatedevice建立裝置物件,並建立乙個私有的裝置擴充套件物件。

pdevice_object fdo;

ntstatus status = iocreatedevice(driverobject,

sizeof(device_extension),

null,

file_device_unknown,

file_device_secure_open,

false,

&fdo);

2) 初始化裝置擴充套件和裝置物件的flag成員。

pdevice_extension pdc = (pdevice_extension)fdo->deviceextension;

fdo->deviceextension;

fdo->flag2|=do_buffered_io;

3) 呼叫ioattachdevicetodevicestace函式把新裝置物件放到堆疊上。

pdx->lowerdeviceobject=ioattachdevicetodevicestack(fdo,pfo);

裝置物件(device_object或*pdevice_object)也是ddk定義的乙個重要結構。它可以在其裝置名稱(devicename)域中(第三個引數)為裝置物件進行命名。 裝置物件另乙個關鍵的域為擴充套件裝置物件(deviceextension)大小,i/o管理器為裝置物件分配一塊記憶體,該指標指向乙個使用者定義的資料結構,用於儲存每個裝置例項的資訊

typedef struct _device_extension

device_extension,*pdevice_extension;

adddevice為裝置物件註冊乙個介面,以便應用程式能通過註冊介面來訪問該裝置。乙個裝置介面被乙個128位的guid唯一標識。

status = ioregisterdeviceinfe***ce(pdo,&guid_inte***ce_usb,null,&pdx->ifname);得到guid後,當響應pnp請求irp_mn_start_device時,驅動程式呼叫下面函式使其可用,iosetdeviceinte***cestate(&pdx->ifname,true);

在響應這個呼叫過程中,i/o管理器將建立乙個指向裝置的pdo符號連線物件。因為介面名最終指向pdo,所以pdo的安全描述符將最終控制裝置的訪問許可權。(3)readwrite實現裝置驅動程式功能的各個派遣函式,並實現匯流排列舉和管理函式,用於裝置初始化以及錯誤恢復。是整個驅動最重要部分,以讀資料請求為例子,即主機要求裝置向其傳輸資料。

1)建立並提交乙個urb,usb驅動從不直接和硬體對話,通過建立urb並把urb提交到匯流排驅動程式就可以完成硬體操作,usbd.sys是接受urb的實體,向usbd的呼叫被轉化為帶有主功能**為irp_mj_***的irp。然後usbd再排程匯流排時間,發出urb中指定的操作。

建立乙個urb是usb驅動最基本的工作,首先應該為urb分配記憶體,然後呼叫初始化例程把urb結構中的各個域填入請求要求的內容。最後通過建立並傳送乙個內部i/o控制(ioctl)請求到usbd驅動程式來傳送這個urb包,從而完成usb請求。

2)建立並傳送ioctl請求

建立完urb後,我們建立並傳送乙個ioctl(內部i/o控制)請求到usbd,然後等待裝置回應,相應的函式為sendawaiturb

3) 返回裝置完成狀態

2、usb主機驅動符合wdm驅動體系結構也使用irp(i/o請求包)的機制。但實際的usb驅動程式使用urb(usb請求塊)結構向其硬體裝置傳送請求。usb驅動程式高度依賴其匯流排驅動程式(usbd.sys),而不直接使用硬體抽象層(hal)函式與硬體通訊。

USB裝置驅動程式

一.usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...

USB驅動程式分析

1.對於每個pc來說,都有乙個或者多個稱為主機 host 控制器的裝置,該主機控制器和乙個根集線器 hub 作為乙個整體。2.每個host控制器其實就是乙個pci裝置,掛載在pci匯流排上。驅動開發人員應該給host控制器提供驅動程式,用usb hcd結構體表示。3.usb host控制器都會自帶乙...

USB驅動程式的載入 二

應用程式 usb client driver 層一 usbd.dll 層二 ohci.dll 層三 wince的usb驅動分為三層,如上圖所示.從上到下,姑且將其稱為層一,層二,層三。層一通過gc usbfuncs來呼叫層二所提供的功能,而層二通過gc hcdfuncs來呼叫層三實現的功能,而應用程...