嵌入式系統中USB驅動程式設計

2021-04-13 04:18:49 字數 2439 閱讀 4989

摘 要:本文介紹了windows2000作業系統下,符合wdm模式的usb驅動程式的體系結構及處理流程,並以乙個批量資料傳輸的例項詳細介紹了如何編寫usb驅動程式。

引言

usb是2023年康柏、微軟、ibm, dec等公司為了解決傳統匯流排的不足,而推出的一種序列匯流排標準。該匯流排已經逐漸成為現代資料傳輸的發展趨勢,被廣泛地應用於pc機及嵌入式系統上。

目前,雖然windows2000提供有多種通用的usb驅動程式,但並不滿足本嵌入式系統的設計需求,因此本系統採用w i n d o w s ddk(device driver kit)開發工具,自行開發了基於wdm模型的usb裝置功能驅動程式。

usb驅動程式

1.usb驅動程式體系結構

執行在核心態的usb驅動程式是基於win32驅動程式模型wdm(windows driver model)的,它採用分層驅動程式模型,由usb匯流排驅動程式和usb功能驅動程式兩部分組成,匯流排驅動程式由作業系統提供,使用者只需編寫相應的功能驅動程式即可。

2.處理流程

因為i/o管理器把每乙個裝置對使用者程式都抽象成檔案,所以使用者程式通過呼叫檔案操作api函式就可以實現與驅動程式中某個裝置的通訊。

使用者程式傳送的請求由i/o管理器轉換為具有不同主功能**的irp(i/o請求包)傳送給功能驅動程式。功能驅動程式接收該irp,在**例程中根據 irp中包含的具體操作**,構造相應的urb(usb請求塊,在ddk中有urb結構的定義),把它放到乙個新的irp中,並把這個新的irp傳遞給 usb匯流排驅動程式。usb匯流排驅動程式根據irp中所包含的urb執行相應操作,再將操作結果通過irp返還給功能驅動程式。功能驅動程式接收此 irp,將操作結果通過irp返還i/o管理器。最後,i/o管理器將此irp中的操作結果返回給應用程式。至此,應用程式對usb裝置的一次i/o操作完成,其處理流程如圖1所示。

3.應用例項

在本嵌人式系統中,硬體選用了philips公司生產的usb2.0高速介面器件isp1581,實現主機與嵌人式系統間的usb資料傳輸。

為了適應各種usb外設的需要,usb提供了四種不同的傳輸型別。這裡,為滿足嵌入式系統與主機間大量、可靠的資料交換要求,資料傳輸選用批量傳輸方式。

usb功能驅動程式的構成及實現

本功能驅動程式主要由四個模組組成:初始化模組、i/o模組、即插即用管理模組和電源管理模組。另外,還有乙個.inf檔案用於驅動程式的安裝。

★ 初始化模組

在初始化模組中,包括有每乙個裝置驅動程式都有的乙個初始化入口點:driverentry例程,每次裝置驅動程式啟動時該例程被系統自動呼叫,其最重要的功能是設定驅動程式對應於i/o請求的主功能**(majorfunction)的**例程。driverentry例程如下所示:

driverentry(in pdriver_object driverobject, …)

//驅動程式人口

初始化模組中還包括有create和close兩個例程,這是win32程式獲得和釋放裝置控制代碼的唯一途徑;adddevice例程在系統新增乙個裝置時被pnp管理器呼叫,其主要工作是建立並初始化裝置物件;driverunload例程在系統解除安裝硬體時使用,由i/o管理器呼叫,釋放所有資源。

★ i/o模組

i/o模組由讀寫例程read、write和裝置控制例程iocontrol構成。

· 讀寫例程

讀寫兩個例程用於實現批量資料傳輸。通過設定urb->urbbulkorinterrupttransfer. transferflags標誌位可以決定資料流向,因此將它們放在同乙個例程中。讀寫例程主要處理流程如下:

(1)呼叫iogetcurrentirpstacklocation(),獲得指向自身i/o堆疊單元的指標;

(2)使用構造巨集usbbuildinterruptorbulktransferrequest(),構造乙個urb_bulk_or_interrupt_transferurb型別的urb結構;

(3)呼叫iogetnextlrp stacklocation()獲得下一層驅動程式的i/o堆疊單元位置,並傳遞構造好的urb;

(4)呼叫iosetcompletionroutine(),將乙個i/o完成例程與irp關聯;

(5)呼叫iocalldriver() ,將請求傳遞給下層驅動程式處理。

· iocontrol例程

使用者程式使用deviceiocontrol函式傳遞乙個稱為i/o控制**(ioctl)的32位長度的引數,i/o管理器將ioctl放在irp 的  parameters.deviceiocontrol.iocontrolcode域中,在功能驅動程式中由iocontrol例程使用該引數確定應執行的功能。

ioctl值由ctl_code巨集生成,ctl_code巨集有四個巨集引數。在本驅動程式中定義了兩個ioctl,分別用於復位管道和向usb韌體傳送一次批量傳輸位元組數。iocontrol例程對這兩個ioctl的處理流程與上面的讀寫例程類似,這裡就不再贅述。 

CAN 匯流排嵌入式驅動程式設計

摘要 介紹了uclinux 作業系統的核心結構以及裝置驅動程式設計的基本原理,並對can 匯流排的嵌入式系統進行了硬體設計及軟體驅動程式設計,提出can 匯流排技術應用於嵌入式系統的一種方案。1 引言 早期應用於八位微控制器軟體設計的嵌入式系統主要為前後臺系統 或超迴圈系統 程式大約在幾千行以內,由...

嵌入式系統usb開發學習概述

如未特別說明,現階段學習的usb主要是指usb從機 裝置.簡單閱讀過一些介紹usb應用基礎和協議棧的文件之後,發現協議棧的內容主要是約定要怎樣怎樣,資料報格式啊,通訊機制啊.但是,真正落實到mcu上的程式設計時,首要要搞清楚的是,哪些工作是由硬體完成的,那些工作是由軟體完成的.需要軟體完成的部分,可...

嵌入式linux IIC驅動

linux驅動和裝置隔離,驅動分層,iic驅動框架分為兩部分 1.1 iic匯流排驅動 platform是虛擬匯流排,針對沒有匯流排的裝置實現,匯流排 裝置 驅動框架,iic不用虛擬,可直接用匯流排bus。iic匯流排驅動有兩個重要資料結構 i2c adapter,i2c algorithm。i2c...