USB裝置驅動程式導讀 8

2021-04-14 13:47:09 字數 1377 閱讀 1737

帶著上次留下的疑問,我們繼續來學習作業系統如何通過usbdisk讀寫usb裝置的。我們先看usb/class/storage/disk/scsi2/usbdisk6.def檔案。在這個檔案中可以看到,該dll一共匯出了14個函式,其中兩個是上次內容當中被裝置驅動程式呼叫的usbdiskattach和usbdiskdetach,餘下的是一組以dsk開頭的流驅動介面,易見,usbdisk是以流驅動的形式向作業系統提供服務的。

為了清晰起見,以下大量的程式我們並不學習,而只關心裝置讀寫,因此我們來看disk.c這個程式檔案。找到dsk_read和dsk_write兩個函式,令我們大失所望,因為這兩個函式都是形如

unreferenced_parameter(pdevice);

unreferenced_parameter(pbuffer);

unreferenced_parameter(bufferlength);

debugmsg(zone_err,(text("dsk_read/n")));

setlasterror(error_invalid_function);

return 0;

這樣的實現,也就是說使用者無法通過常規的readfile和writefile函式使用這個裝置,那怎麼辦?是否意味著這個disk無法讀寫呢?當然不是,我們應該馬上想到dsk_iocontrol()這個函式,當遇到某些裝置無法用常規的檔案操作函式操作時,我們有deviceiocontrol()使用者函式可以使用,而這個函式就會呼叫到驅動程式中的dsk_iocontrol函式。

在這個函式中,我們找到了對ioctl_disk_read等命令的處理程式,其中最關鍵的一句就是scsirwsg(pdevice, psgreq, pdevice->lun, bread),即呼叫了乙個scsirwsg的函式。

在scsi2.c這個程式中,我們找到了這個函式,其中sg指的是一種讀寫緩衝區的資料結構,實際上就是帶有緩衝區及長度的乙個結構體,是ce下磁碟裝置通用的讀寫資料結構,可以在diskio.h中找到它的定義。在這個函式中我們發現它再次呼叫了scsireadwrite()這個函式進行讀寫操作,找到這個函式,裡面有我們最重要的一行呼叫,即呼叫了usbsdatatransfer()函式,還記得這個函式在哪見過嗎?沒錯,就是在usb裝置的驅動程式當中。

通過這一過程我們發現,那些scsi的函式都只是在準備一些緩衝區、資料結構等,並沒有對硬體進行操作,真正要操作硬體裝置的還是由驅動程式來完成的,可見,裝置驅動程式是有著很強層次結構的,下層是專門針對物理裝置的,上層是針對作業系統的抽象裝置的,下層是u盤等物理實體,上層是資料夾,二者通過一定的通訊或呼叫機制完成了裝置在作業系統下的正常工作。

回到usbmsc.c程式中來,找到usbsdatatransfer函式,這個函式很簡單,根據傳輸協議呼叫cbit_datatransfer()或bot_datatransfer() 即可。

USB裝置驅動程式導讀 8

帶著上次留下的疑問,我們繼續來學習作業系統如何通過usbdisk讀寫usb裝置的。我們先看usb class storage disk scsi2 usbdisk6.def檔案。在這個檔案中可以看到,該dll一共匯出了14個函式,其中兩個是上次內容當中被裝置驅動程式呼叫的usbdiskattach和...

USB裝置驅動程式導讀

隨著 usb裝置的不斷增加,我們這些開發人員也就多了對 usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難 一是對wince 的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作 二是對wince 自帶的usb 驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程...

USB裝置驅動程式導讀 2

接下來,我們就來分析一下ce中的樣例程式,我用的是4.2版本的,所以下面的內容是4.2版本中的程式。這裡的程式是通過資料夾的形式組織在一起的,所以我們還是像以前學習ce的時候那樣,先來了解與此相關的資料夾結構,如下圖。在usb資料夾下,分成了class,clients,common,hcd,inc,...