版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式linux下usb驅(qū)動程序的設(shè)計(universal serial bus)即通用串行,是一種全新的雙向同步傳輸?shù)闹С譄岵灏蔚臄?shù)據(jù)傳輸總線,其目的是為了提供一種兼容不同速度的、可擴(kuò)充的并且用法便利的外圍設(shè)備接口,同時也是為了解決計算機(jī)接口的太多的弊端而設(shè)計的。一個usb系統(tǒng)主要有三部分組成:usb互連、usb主機(jī)、usb設(shè)備三部分組成的,其結(jié)構(gòu)1所示。在編寫usb設(shè)備驅(qū)動程序設(shè)計時,可以分為三部分編寫:主機(jī)端設(shè)備驅(qū)動程序、主機(jī)控制器驅(qū)動程序設(shè)計和設(shè)備端驅(qū)動程序三部分,在本文中重點(diǎn)介紹主機(jī)端驅(qū)動程序的設(shè)計。二、usb設(shè)備驅(qū)動程序的設(shè)計usb設(shè)備驅(qū)動程序的設(shè)計包括主機(jī)端設(shè)備驅(qū)動程序設(shè)計、主機(jī)
2、控制器驅(qū)動程序設(shè)計和設(shè)備端驅(qū)動程序設(shè)計三部分組成。主機(jī)端設(shè)備驅(qū)動程序就是通常說的設(shè)備驅(qū)動程序,它是主機(jī)環(huán)境中為用戶應(yīng)用程序提供一個拜訪usb外設(shè)的接口。為這部分驅(qū)動程序提供編程接口,驅(qū)動程序設(shè)計者只要根據(jù)需求編寫驅(qū)動程序框架,通過調(diào)用操作系統(tǒng)提供的api接口函數(shù)可以完成對usb外設(shè)的特定拜訪。主機(jī)控制驅(qū)動主要是對usb主機(jī)控制器的驅(qū)動,在大多數(shù)pc環(huán)境下,主機(jī)控制器都是由操作系統(tǒng)提供。設(shè)備普通都沒有usb主機(jī)控制器,只是工作在slave模式下。假如要使usb具有主機(jī)功能,那么設(shè)備中需要選用一個帶主機(jī)控制器的usb接口控制芯片, 同時自己還要有實(shí)現(xiàn)該主機(jī)控制器的驅(qū)動程序。目前l(fā)inux內(nèi)核中只提
3、供usb主機(jī)控制器的開放主機(jī)控制器和通用主機(jī)控制器接口兩種規(guī)格,而這兩種規(guī)格主要用在pc架構(gòu)中。usb主機(jī)端驅(qū)動程序與主機(jī)控制器的結(jié)構(gòu)2所示。其中usb核是linux的一個子模塊,集中定義了一組usb相關(guān)的數(shù)據(jù)結(jié)構(gòu)、宏以及api函數(shù)。usb設(shè)備驅(qū)動程序是常說的設(shè)備固件程序的一部分,提供設(shè)備信息與主機(jī)的通信接口。設(shè)備端usb驅(qū)動程序設(shè)計由以下幾部分處理程序組成。初始化例程:完成描述符指針、端點(diǎn)、配置轉(zhuǎn)變等操作。數(shù)據(jù)傳輸例程:完成控制傳輸、批量傳輸、中斷傳輸及同步傳輸?shù)葌鬏敺绞较碌臄?shù)據(jù)收發(fā)工作。標(biāo)準(zhǔn)設(shè)備處理哀求:處理標(biāo)準(zhǔn)設(shè)備哀求。廠商哀求處理:處理生產(chǎn)商指定哀求。其他操作:處理主機(jī)發(fā)出的端口復(fù)位、
4、配置轉(zhuǎn)變等操作。1.usb設(shè)備驅(qū)動程序框架usb驅(qū)動程序首先要向linux內(nèi)核注冊自己,并告知系統(tǒng)它所支持的設(shè)備類型以及它所支持的操作。這些信息通過一個usb_driver結(jié)構(gòu)來傳遞。usb_driver結(jié)構(gòu)如下:static struct usb_driver skel_driver = name: "skeleton";/*驅(qū)動程序的名稱*/probe: skel_probe; /*設(shè)備列舉時被調(diào)用*/disconnect: skel_disconnect; /*設(shè)備被卸載時被調(diào)用*/fops: &skel_fops; /*指向一個file_operation結(jié)
5、構(gòu),內(nèi)核通過它來拜訪驅(qū)動程序的文件操作函數(shù),與用戶程序的read、write等操作舉行交互*/minor usb_skel_minor_base; /*指向設(shè)備的次設(shè)備號,用于系統(tǒng)識別主設(shè)備號相同的設(shè)備(即一個驅(qū)動程序可以同時支持多個usb設(shè)備*/id_table: skel_table; /*保存設(shè)備的廠商id和產(chǎn)品id,作為該設(shè)備的唯一標(biāo)識,驅(qū)動程序向系統(tǒng)注冊后,當(dāng)下次插入時,系統(tǒng)按照這個標(biāo)識查找正確的驅(qū)動程序,實(shí)現(xiàn)設(shè)備的即插即用*/;static struct file_operation skel_fops=owner:this_module,read:skel_read,write:
6、skel_write,ioctl:skel_ioctl,open:skel_open,release:skel_release,;(1)注冊和注銷usb驅(qū)動程序注冊,就是把在初始化函數(shù)中填好的use_driver結(jié)構(gòu)作為參數(shù)傳遞給use_register()函數(shù)即可,函數(shù)的調(diào)用辦法為:result=usb_register(&skel_driver);當(dāng)要從系統(tǒng)卸載驅(qū)動程序時,也是將use_driver結(jié)構(gòu)作為參數(shù)傳遞給usb_deregister 函數(shù)處理。 函數(shù)的調(diào)用格式為:static void _exit usb_skel_exit(void) /* deregister th
7、is driver with the usb subsystem */usb_deregister(&skel_driver);module_exit(usb_skel_exit);當(dāng)usb設(shè)備插入時,為了使linux-hotplug(linux中pci、usb等設(shè)備熱插拔支持)系統(tǒng)自動裝載驅(qū)動程序,需要創(chuàng)建一個module_device_table。核心代碼如下(這個模塊僅支持某一特定設(shè)備):/* table of devices that work with this driver */static struct usb_device_id skel_table = usb_dev
8、ice(usb_skel_vendor_id,usb_skel_product_id) , /* terminating entry */;module_device_table (usb, skel_table);usb_device宏利用廠商id和產(chǎn)品id提供了一個設(shè)備的唯一標(biāo)識。當(dāng)系統(tǒng)插入一個id匹配的usb設(shè)備到usb總線時,驅(qū)動會在usb core中注冊,驅(qū)動程序中probe 函數(shù)也就會被調(diào)用。usb_device 結(jié)構(gòu)指針、接口號和接口id都會被傳遞到函數(shù)中。(2)probe()函數(shù)probe()函數(shù)的編寫格式為:static void * skel_probe(struct us
9、b_device *dev, unsigned int ifnum, const struct usb_device_id *id);驅(qū)動程序需要確認(rèn)插入的設(shè)備是否可以被接受,假如不接受,或者在初始化的過程中發(fā)生任何錯誤,probe()函數(shù)返回一個null值。否則返回一個含有設(shè)備驅(qū)動程序狀態(tài)的指針,通過這個指針,就可以拜訪全部結(jié)構(gòu)中的回調(diào)函數(shù)。在驅(qū)動程序里,最后一點(diǎn)是要注冊devfs(設(shè)備文件系統(tǒng))。首先創(chuàng)建一個緩沖用來保存那些被發(fā)送給usb設(shè)備的數(shù)據(jù)和那些從設(shè)備上接受的數(shù)據(jù),并為設(shè)備傳輸創(chuàng)建一個usb哀求塊(urb)以向設(shè)備寫入數(shù)據(jù),同時usb urb 被初始化,然后在devfs子系統(tǒng)中注冊
10、設(shè)備,允許devfs用戶拜訪usb的設(shè)備。注冊過程如下:/* initialize the devfs node for this device and register it */sprintf(name, "skel%d", skel->minor);skel->devfs = devfs_register (usb_devfs_handle, name, devfs_fl_default, usb_major, usb_skel_minor_base + skel->minor, s_ifchr | s_irusr | s_iwusr | s_irg
11、rp | s_iwgrp | s_iroth, &skel_fops, null);假如devfs_register函數(shù)失敗, devfs子系統(tǒng)會將此狀況報告給用戶。假如設(shè)備從usb總線拔掉,設(shè)備指針會調(diào)用disconnect 函數(shù)。驅(qū)動程序就需要清除那些被分配了的全部私有數(shù)據(jù)、關(guān)閉urbs,并且從devfs上注銷調(diào)自己。調(diào)用函數(shù)的格式為:/* remove our devfs node */devfs_unregister(skel->devfs);現(xiàn)在,skeleton驅(qū)動就已經(jīng)和設(shè)備綁定上了,任何用戶態(tài)程序要操作此設(shè)備都可以通過file_operations結(jié)構(gòu)所定義的函數(shù)
12、舉行了。(3)open()、write()和read()函數(shù)首先,要打開此設(shè)備。在open()函數(shù)中module_inc_use_count 宏是一個關(guān)鍵,它起到一個計數(shù)的作用,有一個用戶態(tài)程序打開一個設(shè)備,計數(shù)器就加1。例如,以模塊方式加入一個驅(qū)動,若計數(shù)器不為零,就解釋仍然實(shí)用戶程序在用法此驅(qū)動,這時候,就不能通過rmmod指令卸載驅(qū)動模塊了。/* increment our usage count for the module */mod_inc_use_count;+skel->open_count;/* save our object in the file's pri
13、vate structure */file->private_data = skel;當(dāng)open完設(shè)備后,read()、write()函數(shù)就可以收、發(fā)數(shù)據(jù)了。read()函數(shù)首先從open()函數(shù)中保存的fi。write()函數(shù)和read()函數(shù)是完成驅(qū)動對讀寫等操作的響應(yīng)。在skel_write中,一個fill_bulk_urb函數(shù),就完成了urb 系統(tǒng)callbak和的skel_write_bulk_callback之間的聯(lián)系。注重skel_write_bulkcallback是中斷方式,所以要注重時光不能太久,本程序中它就只是報告一些urb的狀態(tài)等。 read 函數(shù)與write 函
14、數(shù)稍有不同在于:程序并沒實(shí)用urb 將數(shù)據(jù)從設(shè)備傳送到驅(qū)動程序,而是用usb_bulk_msg 函數(shù)代替,這個函數(shù)能夠不需要創(chuàng)建urbs 和操作urb函數(shù)的狀況下,來發(fā)送數(shù)據(jù)給設(shè)備,或者從設(shè)備來接收數(shù)據(jù)。調(diào)用usb_bulk_msg函數(shù)并傳到一個存儲空間,用來緩沖和放置驅(qū)動收到的數(shù)據(jù),若沒有收到數(shù)據(jù)表示失敗并返回一個錯誤信息。usb_bulk_msg函數(shù):當(dāng)對usb設(shè)備舉行一次讀或者寫時,usb_bulk_msg 函數(shù)是十分實(shí)用的; 然而, 當(dāng)需要延續(xù)地對設(shè)備舉行讀/寫時,應(yīng)建立一個自己的urbs,同時將urbs 提交給usb子系統(tǒng)。skel_disconnect函數(shù):當(dāng)釋放設(shè)備文件句柄時,這
15、個函數(shù)會被調(diào)用。mod_dec_use_count宏也會被調(diào)用到(和mod_inc_use_count剛好對應(yīng),它削減一個計數(shù)器),首先確認(rèn)當(dāng)前是否有其他的程序正在拜訪這個設(shè)備,假如是最后一個用戶在用法,可以關(guān)閉任何正在發(fā)生的寫,操作如下:/* decrement our usage count for the device */-skel->open_count;if (skel->open_count /* shutdown any bulk writes that might begoing on */usb_unlink_urb (skel->write_urb);s
16、kel->open_count = 0;/* decrement our usage count for the module */mod_dec_use_count;usb設(shè)備可以在任何時光點(diǎn)從系統(tǒng)中取走,即使程序目前正在拜訪它。usb驅(qū)動程序必需要能夠很好地處理解決此問題,它需要能夠切斷任何當(dāng)前的讀寫,同時通知用戶空間程序:usb設(shè)備已經(jīng)被取走。2.設(shè)計實(shí)例下面通過介紹鍵盤飛梭驅(qū)動程序的實(shí)例來讓讀者更好的理解usb驅(qū)動程序的工作原理,實(shí)現(xiàn)代碼如下:/*需要的頭文件*/includeincludeincludeincludeincludeincludeinclude/* 驅(qū)動程序版本信
17、息*/define driver_version ""define driver_author " tge hotkey "define driver_desc "usb hid tge hotkey driver"define usb_hotkey_vendor_id 0x07e4define usb_hotkey_product_id 0x9473/*廠商和產(chǎn)品id信息就是/proc/bus/usb/devices中看到的值,通過cat/proc/bus/usb/devices得到當(dāng)前系統(tǒng)探測到的usb總線上的設(shè)備信息。它包括ve
18、ndor、prodid、product等*/module_author( driver_author );module_description( driver_desc );/*此結(jié)構(gòu)來自內(nèi)核中drivers/usb/usbkbd.c*/struct usb_kbd struct input_dev dev;struct usb_device *usbdev;unsigned char new8;unsigned char old8;struct urb irq, led;struct usb_ctrlrequest dr;unsigned char leds, newleds;char na
19、me128;int open;static void usb_kbd_irq(struct urb *urb) /*urb為usb哀求塊*/struct usb_kbd *kbd = urb->context;int *new;new = (int *) kbd->new;if(kbd->new0 = (char)0x01)if(kbd->new1>>4)&0x0f)!=0x7)handle_scancode(0xe0,1);handle_scancode(0x4b,1);handle_scancode(0xe0,0);handle_scancode
20、(0x4b,0);else handle_scancode(0xe0,1);handle_scancode(0x4d,1);handle_scancode(0xe0,0);handle_scancode(0x4d,0);printk("new=%x %x %x %x %x %x %x %x", kbd->new0,kbd->new1,kbd->new2,kbd->new3,kbd->new4,kbd->new5,kbd->new6,kbd->new7);static void *usb_kbd_probe(struct usb
21、_device *dev, unsigned int ifnum, const struct usb_device_id *id)struct usb_interface *iface;struct usb_interface_descriptor *interface;struct usb_endpoint_descriptor *endpoint;struct usb_kbd *kbd;int pipe, maxp;iface = &dev->actconfig->interfaceifnum;interface = &iface->altsettingi
22、face->act_altsetting;if (dev->descriptor.idvendor != usb_hotkey_vendor_id) | (dev->descriptor.idproduct != usb_hotkey_product_id) | (ifnum != 1)return null;if (dev->actconfig->bnuminterfaces != 2)return null;if (interface->bnumendpoints != 1) return null;endpoint = interface->en
23、dpoint + 0;pipe = usb_rcvintpipe(dev, endpoint->bendpointaddress);maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe);usb_set_protocol(dev, interface->binterfacenumber, 0);usb_set_idle(dev, interface->binterfacenumber, 0, 0);printk(kern_info "guo: vid = %.4x, pid = %.4x, device = %.2x, i
24、fnum = %.2x, bufcount = %.8xn", dev->descriptor.idvendor,dev->descriptor.idproduct,dev->descriptor.bcddevice, ifnum, maxp);if (!(kbd = kmalloc(sizeof(struct usb_kbd), gfp_kernel) return null;memset(kbd, 0, sizeof(struct usb_kbd);kbd->usbdev = dev;fill_int_urb(&kbd->irq, dev,
25、pipe, kbd->new, maxp > 8 ? 8 : maxp, usb_kbd_irq,kbd, endpoint->binterval); kbd->irq.dev = kbd->usbdev;if (dev->descriptor.imanufacturer) usb_string(dev, dev->descriptor.imanufacturer, kbd->name, 63);if (usb_submit_urb(&kbd->irq) kfree(kbd); return null; printk(kern_info "input%d: %s on usb%d:%d.%dn", kbd->dev.number, kbd->name, dev->bus->busnum, dev-&
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度企業(yè)高級管理人員競業(yè)限制勞動合同樣本2篇
- 2024年度盾構(gòu)掘進(jìn)勞務(wù)分包與施工圖設(shè)計合同3篇
- 2024年度綠色出行交通設(shè)施改造工程合同范本3篇
- 2024年度軟件許可合同許可的軟件產(chǎn)品和用戶權(quán)限3篇
- 2024年在線購房協(xié)議3篇
- 智能化技術(shù)在幼兒教育中的應(yīng)用
- 2024版光伏發(fā)電項(xiàng)目按揭貸款借款合同3篇
- 2024年度房產(chǎn)公證服務(wù)收費(fèi)標(biāo)準(zhǔn)合同3篇
- 數(shù)字化轉(zhuǎn)型:零售業(yè)的核心驅(qū)動力
- 汽車以舊換新實(shí)施路徑與步驟
- 2024年廣東公需科目答案
- ABB工業(yè)機(jī)器人基礎(chǔ)知識
- 中國校服產(chǎn)業(yè)挑戰(zhàn)與機(jī)遇分析報告 2024
- 2022版義務(wù)教育物理課程標(biāo)準(zhǔn)
- 山東省日照市2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 上海華東師大二附中2025屆高一數(shù)學(xué)第一學(xué)期期末檢測試題含解析
- 新教科版六年級上冊科學(xué)全冊知識點(diǎn)(期末總復(fù)習(xí)資料)
- 《靜女》《涉江采芙蓉》對比閱讀教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文必修上冊
- 2024-2030年水培蔬菜行業(yè)市場發(fā)展分析及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2024年部編版語文五年級上冊全冊單元檢測題及答案(共8套)
- 集成電路制造工藝 課件 6光刻工藝2
評論
0/150
提交評論