版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計專業(yè)綜合課程設(shè)計報告班級:通信10--02班姓名:王瑾學(xué)號:1006030218指導(dǎo)教師:楊春玲成績:電子與信息工程學(xué)院
信息與通信工程系摘要隨著人們生活水平的提高,我們用到的USB設(shè)備也越來越多,但是Linux在硬件配置上仍然沒有做到完全即插即用,對于Linux怎樣配置和使用他們,也越來越成為困擾我們的一大問題;本文的目地是使大家了解怎樣編制USB設(shè)備驅(qū)動,為更好地配置和使用USB設(shè)備提供方便;對于希望開發(fā)Linux系統(tǒng)下USB設(shè)備驅(qū)動的人員,也可作為進一步學(xué)習(xí)USB驅(qū)動的大體架構(gòu)進而編寫出特殊USB設(shè)備的驅(qū)動程序。關(guān)鍵詞:S3C2440A微處理器,Linux系統(tǒng),USB目錄TOC\o"1-5"\h\zUSB基礎(chǔ)知識1硬件電路的設(shè)計1USB馬驅(qū)動程序基礎(chǔ)1USB馬驅(qū)動程序4驅(qū)動模塊的編譯、配置和使用14總結(jié)157?參考文獻15#1.USB基礎(chǔ)知識USB是英文UniversalSerialBus的縮寫,意為通用串行總線。USB最初是為了替代許多不同的低速總線(包括并行、串行和鍵盤連接)而設(shè)計的,它以單一類型的總線連接各種不同的類型的設(shè)備。USB的發(fā)展已經(jīng)超越了這些低速的連接方式,它現(xiàn)在可以支持幾乎所有可以連接到PC上的設(shè)備。最新的USB規(guī)范修訂了理論上高達480Mbps的高速連接。Linux內(nèi)核支持兩種主要類型的USB驅(qū)動程序:宿主系統(tǒng)上的驅(qū)動程序和設(shè)備上的驅(qū)動程序,從宿主的觀點來看(一個普通的宿主也就是一個PC機),宿主系統(tǒng)的USB設(shè)備驅(qū)動程序控制插入其中的USB設(shè)備,而USB設(shè)備的驅(qū)動程序控制該設(shè)備如何作為一個USB設(shè)備和主機通信。2?硬件電路的設(shè)計步進電機開環(huán)控制系統(tǒng)主要由中央控制器、步進電機驅(qū)動器、傳感器以及步進電機四大部分組成。本系統(tǒng)采用基于ARM920t內(nèi)核的S3C2440A微處理器作為控制系統(tǒng)的中央控制器,該芯片主頻400MHz,最高可達到533MHz,內(nèi)含多種設(shè)備接口,存儲器使用64MB的NandFlash和64MB的SDRAM。圖1所示為控制系統(tǒng)框圖。幣1幣1漱比雕刻押制系統(tǒng)樁圖圖2壞席脈沖渝程圖3.USB驅(qū)動程序基礎(chǔ)USB驅(qū)動程序在內(nèi)核中的結(jié)構(gòu),如下圖:VFSj^網(wǎng)絡(luò)設(shè)需層TTYE衛(wèi)它.…USHUSB驅(qū)動程序存在于不同的內(nèi)核子系統(tǒng)和USB硬件控制器之間,USB核心為USB驅(qū)動程序提供了一個用于訪問和控制USB硬件的接口,而不必考慮系統(tǒng)當前存在的各種不同類型的USB硬件控制器。USB是一個非常復(fù)雜的設(shè)備,linux內(nèi)核為我們提供了一個稱為USB的核心的子系統(tǒng)來處理大部分的復(fù)雜性,USB設(shè)備包括配置(configuration)、接口(interface)和端點(endpoint),USB設(shè)備綁定到接口上,而不是整個USB設(shè)備。如下圖所示:USB通信最基本的形式是通過端點(USB端點分中斷、批量、等時、控制四種,每種用途不同),USB端點只能往一個方向傳送數(shù)據(jù),從主機到設(shè)備或者從設(shè)備到主機,端點可以看作是單向的管道(pipe)。所以我們可以這樣認為:設(shè)備通常具有一個或者更多的配置,配置經(jīng)常具有一個或者更多的接口,接口通常具有一個或者更多的設(shè)置,接口沒有或具有一個以上的端點。驅(qū)動程序把驅(qū)動程序?qū)ο笞缘経SB子系統(tǒng)中,稍后再使用制造商和設(shè)備標識來判斷是否已經(jīng)安裝了硬件。USB核心使用一個列表(是一個包含制造商ID和設(shè)備號ID的一個結(jié)構(gòu)體)來判斷對于一個設(shè)備該使用哪一個驅(qū)動程序,熱插撥腳本使用它來確定當一個特定的設(shè)備插入到系統(tǒng)時該自動裝載哪一個驅(qū)動程序。上面我們簡要說明了驅(qū)動程序的基本理論,在寫一個設(shè)備驅(qū)動程序之前,我們還要了解以下兩個概念:模塊和設(shè)備文件。模塊:是在內(nèi)核空間運行的程序,實際上是一種目標對象文件,沒有鏈接,不能獨立運行,但是可以裝載到系統(tǒng)中作為內(nèi)核的一部分運行,從而可以動態(tài)擴充內(nèi)核的功能。模塊最主要的用處就是用來實現(xiàn)設(shè)備驅(qū)動程序。Linux下對于一個硬件的驅(qū)動,可以有兩種方式:直接加載到內(nèi)核代碼中,啟動內(nèi)核時就會驅(qū)動此硬件設(shè)備。另一種就是以模塊方式,編譯生成一個.ko文件(在2.4以下內(nèi)核中是用.0作模塊文件,我們以2.6的內(nèi)核為準,以下同)。當應(yīng)用程序需要時再加載到內(nèi)核空間運行。所以我們所說的一個硬件的驅(qū)動程序,通常指的就是一個驅(qū)動模塊。4.USB驅(qū)動程序驅(qū)動程序支持的設(shè)備:有一個結(jié)構(gòu)體structusb_device_id,這個結(jié)構(gòu)體提供了一列不同類型的該驅(qū)動程序支持的USB設(shè)備,對于一個只控制一個特定的USB設(shè)備的驅(qū)動程序來說,structusb_device_id表被定義為:/*驅(qū)動程序支持的設(shè)備列表*/staticstructusb_device_idskel_table[]={{USB_DEVICE(USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID)},/*終止入口*/};MODULE_DEVICE_TABLE(usb,skel_table);對于PC驅(qū)動程序,MODULE_DEVICE_TABLE是必需的,而且usb必需為該宏的第一個值,而USB_SKEL_VENDOR_ID和USB_SKEL_PRODUCT_ID就是這個特殊設(shè)備的制造商和產(chǎn)品的ID了,我們在程序中把定義的值改為我們這款USB的,如:/*定義制造商和產(chǎn)品的ID號*/#defineUSB_SKEL_VENDOR_ID0x1234#defineUSB_SKEL_PRODUCT_ID0x2345這兩個值可以通過命令lsusb,當然你得先把USB設(shè)備先插到主機上了。或者查看廠商的USB設(shè)備的手冊也能得到,在我機器上運行l(wèi)susb是這樣的結(jié)果:Bus004Device001:ID0000:0000Bus003Device002:ID1234:2345AbcCorp.Bus002Device001:ID0000:0000Bus001Device001:ID0000:0000得到這兩個值后把它定義到程序里就可以了。注冊USB驅(qū)動程序:所有的USB驅(qū)動程序都必須創(chuàng)建的結(jié)構(gòu)體是structusb_driver。這個結(jié)構(gòu)體必須由USB驅(qū)動程序來填寫,包括許多回調(diào)函數(shù)和變量,它們向USB核心代碼描述USB驅(qū)動程序。創(chuàng)建一個有效的structusb_driver結(jié)構(gòu)體,只須要初始化五個字段就可以了,在框架程序中是這樣的:staticstructusb_driverskel_driver={.owner=THIS_MODULE,.name="skeleton",.probe=skel_probe,.disconnect=skel_disconnect,.id_table=skel_table,};structmodule*owner:指向該驅(qū)動程序的模塊所有者的指針。USB核心使用它來正確地對該USB驅(qū)動程序進行引用計數(shù),使它不會在不合適的時刻被卸載掉,這個變量應(yīng)該被設(shè)置為THIS_MODULE宏。constchar*name:指向驅(qū)動程序名字的指針,在內(nèi)核的所有USB驅(qū)動程序中它必須是唯一的,通常被設(shè)置為和驅(qū)動程序模塊名相同的名字。int(*probe)(structusb_interface*intf,conststructusb_device_id*id):這個是指向USB驅(qū)動程序中的探測函數(shù)的指針。當USB核心認為它有一個接口(usb_interface)可以由該驅(qū)動程序處理時,這個函數(shù)被調(diào)用。void(disconnect)(structusb_interface*intf):指向USB驅(qū)動程序中的斷開函數(shù)的指針,當一個USB接口(usb_interface)被從系統(tǒng)中移除或者驅(qū)動程序正在從USB核心中卸載時,USB核心將調(diào)用這個函數(shù)。conststructusb_device_id*id_table:指向ID設(shè)備表的指針,這個表包含了一列該驅(qū)動程序可以支持的USB設(shè)備,如果沒有設(shè)置這個變量,USB驅(qū)動程序中的探測回調(diào)函數(shù)就不會被調(diào)用。在這個結(jié)構(gòu)體中還有其它的幾個回調(diào)函數(shù)不是很常用,這里就不一一說明了。以structusb_driver指針為參數(shù)的usb_register_driver函數(shù)調(diào)用把structusb_driver注冊到USB核心。一般是在USB驅(qū)動程序的模塊初始化代碼中完成這個工作的:staticint__initusb_skel_init(void){intresult;/*驅(qū)動程序注冊到USB子系統(tǒng)中*/result=usb_register(&skel_driver);f(result)err("usb_registerfailed.Errornumber%d",result);returnresult;}當USB驅(qū)動程序?qū)⒁恍堕_時,需要把structusb_driver從內(nèi)核中注銷。通過調(diào)用usb_deregister_driver來完成這個工作,當調(diào)用發(fā)生時,當前綁定到該驅(qū)動程序上的任何USB接口都被斷開,斷開函數(shù)將被調(diào)用:staticvoid__exitusb_skel_exit(void){/*從子系統(tǒng)注銷驅(qū)動程序*/usb_deregister(&skel_driver);}探測和斷開:當一個設(shè)備被安裝而USB核心認為該驅(qū)動程序應(yīng)該處理時,探測函數(shù)被調(diào)用,探測函數(shù)檢查傳遞給它的設(shè)備信息,確定驅(qū)動程序是否真的適合該設(shè)備。當驅(qū)動程序因為某種原因不應(yīng)該控制設(shè)備時,斷開函數(shù)被調(diào)用,它可以做一些清理工作。探測回調(diào)函數(shù)中,USB驅(qū)動程序初始化任何可能用于控制USB設(shè)備的局部結(jié)構(gòu)體,它還把所需的任何設(shè)備相關(guān)信息保存到一個局部結(jié)構(gòu)體中,下面是探測函數(shù)的部分源碼,我們加以分析。/*設(shè)置端點信息*//*只使用第一個批量IN和批量OUT端點*/iface_desc=interface->cur_altsetting;for(i=0;i<iface_desc->desc.bNumEndpoints;++i){endpoint=&iface_desc->endpoint[i].desc;if(!dev->bulk_in_endpointAddr&&(endpoint->bEndpointAddress&USB_DIR_IN)&&((endpoint->bmAttributes&USB_ENDPOINT_XFERTYPE_MASK)==USB_ENDPOINT_XFER_BULK)){/*找到一個批量IN端點*/buffer_size=endpoint->wMaxPacketSize;dev->bulk_in_size=buffer_size;dev->bulk_in_endpointAddr=endpoint->bEndpointAddress;dev->bulk_in_buffer=kmalloc(buffer_size,GFP_KERNEL);訐(!dev->bulk_in_buffer){err("Couldnotallocatebulk_in_buffer");gotoerror;}}if(!dev->bulk_out_endpointAddr&&!(endpoint->bEndpointAddress&USB_DIR_IN)&&((endpoint->bmAttributes&USB_ENDPOINT_XFERTYPE_MASK)==USB_ENDPOINT_XFER_BULK)){/*找到一個批量OUT端點*/dev->bulk_out_endpointAddr=endpoint->bEndpointAddress;}}if(!(dev->bulk_in_endpointAddr&&dev->bulk_out_endpointAddr)){err("Couldnotfindbothbulk-inandbulk-outendpoints");gotoerror;}在探測函數(shù)里,這個循環(huán)首先訪問該接口中存在的每一個端點,給該端點一個局部指針以便以后訪問:for(i=0;i<iface_desc->desc.bNumEndpoints;++i){endpoint=&iface_desc->endpoint[i].desc;在一輪探測過后,我們就有了一個端點,在還沒有發(fā)現(xiàn)批量IN類型的端點時,探測該端點方向是否為IN,這可以通過檢查USB_DIR_IN是否包含在bEndpointAddress端點變量有確定,如果是的話,我們在探測該端點類型是否為批量,先用USB_ENDPOINT_XFERTYPE_MASK位掩碼來取bmAttributes變量的值,然后探測它是否和USB_ENDPOINT_XFER_BULK值匹配:if(!dev->bulk_out_endpointAddr&&!(endpoint->bEndpointAddress&USB_DIR_IN)&&((endpoint->bmAttributes&USB_ENDPOINT_XFERTYPE_MASK)==USB_ENDPOINT_XFER_BULK))如果所有這些探測都通過了,驅(qū)動程序就知道它已經(jīng)發(fā)現(xiàn)了正確的端點類型,可以把該端點的相關(guān)信息保存到一個局部結(jié)構(gòu)體中以便稍后用它來和端點進行通信:/*找到一個批量IN類型的端點*/buffer_size=endpoint->wMaxPacketSize;dev->bulk_in_size=buffer_size;dev->bulk_in_endpointAddr=endpoint->bEndpointAddress;dev->bulk_in_buffer=kmalloc(buffer_size,GFP_KERNEL);訐(!dev->bulk_in_buffer){err("Couldnotallocatebulk_in_buffer");gotoerror;}因為USB驅(qū)動程序要在設(shè)備的生命周期的稍后時間獲取和接口相關(guān)聯(lián)的局部數(shù)據(jù)結(jié)構(gòu)體,所以調(diào)用了usb_set_intfdata函數(shù),把它保存到structusb_interface結(jié)構(gòu)體中以便后面的訪問/*把數(shù)據(jù)指針保存到這個接口設(shè)備中*/usb_set_intfdata(interface,dev);我們以后調(diào)用usb_set_intfdata函數(shù)來獲取數(shù)據(jù)。當這一切都完成后,USB驅(qū)動程序必須在探測函數(shù)中調(diào)用usb_register_dev函數(shù)來把該設(shè)備注冊到USB核心里:/*注冊設(shè)備到USB核心*/retval=usb_register_dev(interface,&skel_class);訐(retval){/*有些情況下是不允許注冊驅(qū)動程序的*/err("Notabletogetaminorforthisdevice.");usb_set_intfdata(interface,NULL);gotoerror;當一個USB設(shè)備被斷開時,和該設(shè)備相關(guān)聯(lián)的所有資源都應(yīng)該被盡可能的清理掉,在此時,如果已在在探測函數(shù)中調(diào)用了注冊函數(shù)來為該USB設(shè)備分配了一個次設(shè)備號話,必須調(diào)用usb_deregister_dev函數(shù)來把次設(shè)備號交還給USB核心。在斷開函數(shù)中,從接口獲取之前調(diào)用usb_set_intfdata設(shè)置的任何數(shù)據(jù)也是很重要的。然后設(shè)置structusb_interface結(jié)構(gòu)體中的數(shù)據(jù)指針為NULL,以防任何不適當?shù)膶υ摂?shù)據(jù)的錯誤訪問。在探測函數(shù)中會對每一個接口進行一次探測,所以我們在寫USB驅(qū)動程序的時候,只要做好第一個端點,其它的端點就會自動完成探測。在探測函數(shù)中我們要注意的是在內(nèi)核中用結(jié)構(gòu)體structusb_host_endpoint來描述USB端點,這個結(jié)構(gòu)體在另一個名為structusb_endpoint_descriptor的結(jié)構(gòu)體中包含了真正的端點信息,structusb_endpoint_descriptor結(jié)構(gòu)體包含了所有的USB特定的數(shù)據(jù),該結(jié)構(gòu)體中我們要關(guān)心的幾個字段是:bEndpointAddress:這個是特定的USB地址,可以結(jié)合USB_DIR_IN和USB_DIR_OUT來使用,以確定該端點的數(shù)據(jù)是傳向設(shè)備還是主機。bmAttributes:這個是端點的類型,這個值可以結(jié)合位掩碼USB_ENDPOINT_XFERTYPE_MASK來使用,以確定此端點的類型是USB_ENDPOINT_XFER_ISOC(等時)、USB_ENDPOINT_XFER_BULK(批量)、USB_ENDPOINT_XFER_INT的哪一種。wMaxPacketSize:這個是端點一次可以處理的最大字節(jié)數(shù),驅(qū)動程序可以發(fā)送數(shù)量大于此值的數(shù)據(jù)到端點,在實際傳輸中,數(shù)據(jù)量如果大于此值會被分割。blnterval:這個值只有在端點類型是中斷類型時才起作用,它是端點中斷請求的間隔時間,以毫秒為單位。提交和控制urb:當驅(qū)動程序有數(shù)據(jù)要發(fā)送到USB設(shè)備時(大多數(shù)情況是在驅(qū)動程序的寫函數(shù)中),要分配一個urb來把數(shù)據(jù)傳輸給設(shè)備:/*創(chuàng)建一個urb,并且給它分配一個緩存*/urb=usb_alloc_urb(0,GFP_KERNEL);if(!urb){retval=-ENOMEM;gotoerror;}當urb被成功分配后,還要創(chuàng)建一個DMA緩沖區(qū)來以高效的方式發(fā)送數(shù)據(jù)到設(shè)備,傳遞給驅(qū)動程序的數(shù)據(jù)要復(fù)制到這塊緩沖中去:buf=usb_buffer_alloc(dev->udev,count,GFP_KERNEL,&urb->transfer_dma);訐(!buf){retval=-ENOMEM;gotoerror;}訐(copy_from_user(buf,user_buffer,count)){retval=-EFAULT;gotoerror;}當數(shù)據(jù)從用戶空間正確復(fù)制到局部緩沖區(qū)后,urb必須在可以被提交給USB核心之前被正確初始化:/*初始化urb*/usb_fill_bulk_urb(urb,dev->udev,usb_sndbulkpipe(dev->udev,dev->bulk_out_endpointAddr),buf,count,skel_write_bulk_callback,dev);urb->transfer_flags1=URB_NO_TRANSFER_DMA_MAP;然后urb就可以被提交給USB核心以傳輸?shù)皆O(shè)備了:/*把數(shù)據(jù)從批量OUT端口發(fā)出*/retval=usb_submit_urb(urb,GFP_KERNEL);訐(retval){err("%s-failedsubmittingwriteurb,error%d",__FUNCTION__,retval);gotoerror;}當urb被成功傳輸?shù)経SB設(shè)備之后,urb回調(diào)函數(shù)將被USB核心調(diào)用,在我們的例子中,我們初始化urb,使它指向skel_write_bulk_callback函數(shù),以下就是該函數(shù):staticvoidskel_write_bulk_callback(structurb*urb,structpt_regs*regs){structusb_skel*dev;dev=(structusb_skel*)urb->context;if(urb->status&&!(urb->status==-ENOENTIIurb->status==-ECONNRESET||urb->status==-ESHUTDOWN)){dbg("%s-nonzerowritebulkstatusreceived:%d",__FUNCTION__,urb->status);}/*釋放已分配的緩沖區(qū)*/usb_buffer_free(urb->dev,urb->transfer_buffer_length,urb->transfer_buffer,urb->transfer_dma);}有時候USB驅(qū)動程序只是要發(fā)送或者接收一些簡單的數(shù)據(jù),驅(qū)動程序也可以不用urb來進行數(shù)據(jù)的傳輸,這是里涉及到兩個簡單的接口函數(shù):usb_bulk_msg和usb_control_msg,在這個USB框架程序里讀操作就是這樣的一個應(yīng)用:/*進行阻塞的批量讀以從設(shè)備獲取數(shù)據(jù)*/retval=usb_bulk_msg(dev->udev,usb_rcvbulkpipe(dev->udev,dev->bulk_in_endpointAddr),dev->bulk_in_buffer,min(dev->bulk_in_size,count),&count,HZ*10);/*如果讀成功,復(fù)制到用戶空間*/訐(!retval){if(copy_to_user(buffer,dev->bulk_in_buffer,count))retval=-EFAULT;elseretval=count;}usb_bulk_msg接口函數(shù)的定義如下:intusb_bulk_msg(structusb_device*usb_dev,unsignedintpipe,void*data,intlen,int*actual_length,inttimeout);其參數(shù)為:structusb_device*usb_dev:指向批量消息所發(fā)送的目標USB設(shè)備指針。unsignedintpipe:批量消息所發(fā)送目標USB設(shè)備的特定端點,此值是調(diào)用usb_sndbulkpipe或者usb_rcvbulkpipe來創(chuàng)建的。void*data:如果是一個OUT端點,它是指向即將發(fā)送到設(shè)備的數(shù)據(jù)的指針。如果是IN端點,它是指向從設(shè)備讀取的數(shù)據(jù)應(yīng)該存放的位置的指針。intlen:data參數(shù)所指緩沖區(qū)的大小。int*actual_length:指向保存實際傳輸字節(jié)數(shù)的位置的指針,至于是傳輸?shù)皆O(shè)備還是從設(shè)備接收取決于端點的方向。inttimeout:以Jiffies為單位的等待的超時時間,如果該值為0該函數(shù)一直等待消息的結(jié)束。如果該接口函數(shù)調(diào)用成功,返回值為0否則返回一個負的錯誤值。usb_control_msg接口函數(shù)定義如下:intusb_control_msg(structusb_device*dev,unsignedintpipe,__u8request,__u8requesttype,__ul6value,__ul6index,void*data,__ul6size,inttimeout)除了允許驅(qū)動程序發(fā)送和接收USB控制消息之外,usb_control_msg函數(shù)的運作和usb_bulk_msg函數(shù)類似,其參數(shù)和usb_bulk_msg的參數(shù)有幾個重要區(qū)別:structusb_device*dev:指向控制消息所發(fā)送的目標USB設(shè)備的指針。unsignedintpipe:控制消息所發(fā)送的目標USB設(shè)備的特定端點,該值是調(diào)用usb_sndctrlpipe或usb_rcvctrlpipe來創(chuàng)建的?!猽8request:控制消息的USB請求值。—u8requesttype:控制消息的USB請求類型值?!猽16value:控制消息的USB消息值。—u16index:控制消息的USB消息索引值。void*data:如果是一個OUT端點,它是指身即將發(fā)送到設(shè)備的數(shù)據(jù)的指針。如果是一個IN端點,它是指向從設(shè)備讀取的數(shù)據(jù)應(yīng)該存放的位置的指針?!猽16size:data參數(shù)所指緩沖區(qū)的大小。inttimeout:以Jiffies為單位的應(yīng)該等待的超時時間,如果為0該函數(shù)將一直等待消息結(jié)束。如果該接口函數(shù)調(diào)用成功,返回傳輸?shù)皆O(shè)備或者從設(shè)備讀取的字節(jié)數(shù);如果不成功它返回一個負的錯誤值。這兩個接口函數(shù)都不能在一個中斷上下文中或者持有自旋鎖的情況下調(diào)用,同樣,該函數(shù)也不能被任何其它函數(shù)取消,使用時要謹慎。我們要給未知的USB設(shè)備寫驅(qū)動程序,只需要把這個框架程序稍做修改就可以用了,前面我們已經(jīng)說過要修改制造商和產(chǎn)品的ID號,把OxfffO這兩個值改為未知USB的ID號。#defineUSB_SKEL_VENDOR_ID0xfff0#defineUSB_SKEL_PRODUCT_ID0xfff0還有就是在探測函數(shù)中把需要探測的接口端點類型寫好,在這個框架程序中只探測了批量(USB_ENDPOINT_XFER_BULK)IN和OUT端點,可以在此處使用掩碼(USB_ENDPOINT_XFERTYPE_MASK)讓其探測其它的端點類型,驅(qū)動程序會對USB設(shè)備的每一個接口進行一次探測,當探測成功后,驅(qū)動程序就被綁定到這個接口上。再有就是urb的初始化問題,如果你只寫簡單的USB驅(qū)動,這塊不用多加考慮,框架程序里的東西已經(jīng)夠用了,這里我們簡單介紹三個初始化urb的輔助函數(shù):usb_fill_int_urb:它的函數(shù)原型是這樣的:voidusb_fill_int_urb(structurb*urb,structusb_device*dev,unsignedintpipe,void*transfer_buff,intbuffer_length,usb_complete_tcomplete,void*context,intinterval);這個函數(shù)用來正確的初始化即將被發(fā)送到USB設(shè)備的中斷端點的urb。usb_fill_bulk_urb:它的函數(shù)原型是這樣的:voidusb_fill_bulk_urb(structurb*urb,structusb_device*dev,unsignedintpipe,void*transfer_buffer,intbuffer_length,usb_complete_tcomplete)這個函數(shù)是用來正確的初始化批量urb端點的。usb_fill_control_urb:它的函數(shù)原型是這樣的:voidusb_fill_control_urb(structurb*urb,structusb_device*dev,unsignedintpipe,unsignedchar*setup_packet,void*transfer_buffer,intbuffer_length,usb_complete_tcomplete,void*context);這個函數(shù)是用來正確初始化控制urb端點的。還有一個初始化等時urb的,它現(xiàn)在還沒有初始化函數(shù),所以它們在被提交到USB核心前,必須在驅(qū)動程序中手工地進行初始化,可以參考內(nèi)核源代碼樹下的/usr/src/?/drivers/usb/media下的konicawc.c文件。5?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人教育培訓(xùn)機構(gòu)課程購銷擔(dān)保合同2篇
- 2025版新能源汽車停車位租賃與生態(tài)補償協(xié)議2篇
- 二零二五年度誠意金支付及退回協(xié)議合同4篇
- 看大數(shù)據(jù)時代下健康醫(yī)療傳播的發(fā)展與創(chuàng)新路徑
- 跨行業(yè)合作在展覽活動中的應(yīng)用
- 項目制學(xué)習(xí)在學(xué)科教學(xué)中的實踐與評價
- 2025版國際貿(mào)易項目轉(zhuǎn)讓居間協(xié)議書3篇
- 2025版土地承包經(jīng)營合同樣本4篇
- 湖南2025年湖南省生態(tài)環(huán)境廳直屬事業(yè)單位招聘44人筆試歷年參考題庫附帶答案詳解
- 溫州浙江溫州市龍灣區(qū)政務(wù)服務(wù)中心招聘編外工作人員筆試歷年參考題庫附帶答案詳解
- 小學(xué)六年級數(shù)學(xué)奧數(shù)題100題附答案(完整版)
- 湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試參考試題庫(含答案)
- 英漢互譯單詞練習(xí)打印紙
- 2023湖北武漢華中科技大學(xué)招聘實驗技術(shù)人員24人筆試參考題庫(共500題)答案詳解版
- 一氯二氟甲烷安全技術(shù)說明書MSDS
- 母嬰護理員題庫
- 老年人預(yù)防及控制養(yǎng)老機構(gòu)院內(nèi)感染院內(nèi)感染基本知識
- SWITCH暗黑破壞神3超級金手指修改 版本號:2.7.6.90885
- 2023高考語文全國甲卷詩歌閱讀題晁補之《臨江仙 身外閑愁空滿眼》講評課件
- 物流簽收回執(zhí)單
- 鋼結(jié)構(gòu)廠房造價指標
評論
0/150
提交評論