版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
因为周五研讨催货。当然,还会顺带提一下其他的驱动程式写法。用术语来说,就是这个驱动器对象所拥有的属性及成员。由于Linuxc来编写,所义的设备结构体就叫做usb-skel:structusb_skelstructusb_device* /*theusbdeviceforthisdevice*/structusb_interface* /*theinterfaceforthisdevice*/struct /*limitingthenumberofwritesinunsignedchar /*thebuffertoreceivedata /*thesizeofthereceivebuffer /*theaddressofthebulkinendpoint*/ /*theaddressofthebulkoutendpointstruct Linux已提供相应的解决方案。就我目前的理解来说,USB的驱动分为要了解他的功能。形象得说,USBbus驱动相当于铺出一条路来,让所有的信息都能通细节我们不用管,我们要做的是另一块工作??usb的设备驱动。也就是说,我们就等着usb_core告诉我们要工作了,我们才工作。usb设备有若干个设置(configuration)组成,每个设置用于发送数据到USB设备以控制设备,一般不用于传送大量数据。bEndpointAddress(bfor掩码USB_DIR_OUT和USB_DIR_IN来确定。USB_ENDPOINT_XFER_ISOC(等时)、USB_ENDPOINT_XFER_BULK(批量)USB_ENDPOINT_XFER_INT(中断。USBUSB扬声ACL跟EVENTSCO链Linuxstructusb_interface来描述,以下是的数组(一个接口能有多个设置),usb_host_interface都包含一套由structusb_host_endpoint定义的端点设置。但这些设置次序是不定的。unsignedint仅在成功调用usb_register_dev之后才有效。内核。要写一个Linux的模块并不复杂,以一个oworld为例:static {printk(KERN_ALERT“ return0;}static {} 这个简单的程式告诉大家应该怎么写一个模块,MODULE_LICENSE告诉内核该模块 信息,非常多情况下,用GPL或BSD,或两个,因为一个私有模块一般非常难得到 o_init,而退出函数是o_exit。ifneqKDIR:=/usr/src/linux-headers-$(suname-r)BDIR:=$(spwd)
make-C$(KDIR)M=$(BDIR)普通用户加susudoUbuntu上的测试是不行的。static init{int/*registerthisdriverwiththeUSBsubsystem*/result=usb_register(&skel_driver);iferr("usb_registerfailed.Errornumber%d",return}static exit{/*deregisterthisdriverwiththeUSBsubsystem*/}module_init(usb_skel_init);module_exit(usb_skel_exit);从代码开来,这个init跟exit函数的作用只是用来驱动程式,这个描述驱动程式的结构体是系统定义的标准结构structusb_driver,和注销的方法非常简单,*usb_diverstaticstructusb_driverskel_driver=.name .probe .disconnect=.id_table usb_driver需要初始化四个东西:模块的名字skeletonprobestructusb_skelstructusb_device* /*theusbdeviceforthisdevice*/structusb_interface* /*theinterfaceforthisdevice*/struct /*limitingthenumberofwritesinunsignedchar /*thebuffertoreceivedata /*thesizeofthereceivebuffer /*theaddressofthebulkinendpoint*/ /*theaddressofthebulkoutendpointstruct 个接口interface,用于并发控制的semaphore(信号量)limit_sem,用于接收数据的缓冲bulk_out_endpointAddr,最后是个内核使用的计数器。他们的作用在后面的代码id_table用来告诉内核该模块支持的设备。usb子系统通过设备的productionID和vendor处理。我们能看看这个id_table到底是什么东西:/*Definethesevaluestomatchyourdevices*/#defineUSB_SKEL_VENDOR_ID #defineUSB_SKEL_PRODUCT_ID0xfff0/*tableofdevicesthatworkwiththisdriver*/staticstructusb_device_idskel_table[]={{ PCI设备的驱动了,在此先不深究。后面一个参数是设备表,这个设备表的最后一个元素USB_SKEL_VENDOR_ID是0xfff0,USB_SKEL_PRODUCT_ID0xfff0,也就是说,当有一个设备接到集线器时,usb子系统vendorIDproductID0xfff0时,那么子系统就会调用这个skeleton模块作为设备的驱动。probeusbUSB设备接到硬件集线器时,usb子系统productionIDvendorIDclass、subclass跟protocol的组合来识别probe(探测)函数,对于skeleton来说,就是skel_probe。系统会usb_interface*structusb_device_id*作为参数。他们分别是该dev->interface=interface;要用interface_to_usbdev就够了,但因为要增加对该usb_device的计数,我们应该在做一个usb_get_dev的操作,来增加计数,并在释放设备时用usb_put_dev来减少计模块的计数要由kref来。所以,probe一开始就有初始化kref。事实上,kref_init操作向一个清理函数。注意,该指针不能为空,或k。该函数会在最后一个对kref的释kref_put-decrementrefcountfor@kref:@release:pointertothefunctionthatwillcleanuptheobjectwhenlastreferencetotheobjectisThispointerisrequired,anditisnotacceptabletopassinasthisDecrementtherefcount,andif0,callReturn1iftheobjectwasremoved,otherwisereturn Beware,iffunctionreturns0,youstillcannotcountonthekreffromremaining Onlyusethereturnvalueifyouwanttoseeifthekrefisgone,notintkref_put(structkref*kref,void(*release)(structkref{ifcurrentcountisone,wearethelastuserandcanreleaserightnow,avoidinganatomicoperationonif((atomic_read(&kref->refcount)==1)||return1;}return}usb_interface_descriptor的知识,但因为内核源码对该结构体的注释不多,所以只能靠个人interface的一些属性,其中bNumEndpoints8位(bforbyte)的数字,他代表了该接口的端点数。probe然后遍历所有的端点,检查他们的类型跟方向,到usb_skel中。/*setuptheendpointinformation/*useonlythefirstbulk-inandbulk-outendpoints*/iface_desc=interface->cur_altsetting;for(i=0;idesc.bNumEndpoints;{endpoint= & = USB_ENDPOINT_XFER_BULK)){/*wefoundabulkinendpointbuffer_size=le16_to_cpu(endpoint->wMaxPacketSize);dev->bulk_in_size=buffer_size;dev->bulk_in_endpointAddr=endpoint->bEndpointAddress;dev->bulk_in_buffer=kmalloc(buffer_size,GFP_KERNEL);if(!dev->bulk_in_buffer){err("Couldnotallocatebulk_in_buffer");gotoerror;}} USB_ENDPOINT_XFER_BULK)){/*wefoundabulkoutendpoint}}{err("Couldnotfindbothbulk-inandbulk-outendpoints");gotoerror;}接下来的工作是向系统一些以后会用的的信息。首先我们来说明一下了一个usb_skel结构,就是我们刚刚看到的被初始化的那个,这个data能在以后用usb_get_intfdata .fops .minor_base=号的基准值。事实上他才是定义真正完成对设备IO操作的函数。所以他的内容应该所定义的IO操作可能不相同,所以向系统的usb_class_driver需求到某一个数就是某一个usb_class_driver。通常情况下,linux系统用主设备号来识别某类设备的驱动staticstructfile_operationsskel_fops=.owner=.read这个文件操作结构中定义了对设备的读写、打开、释放(USB设备通常使用这个术语当设备被拔出集线器时,usbdisconnect,他做的事情不多,最重要的是注销class_driver(交还次设备号)和interface的data:dev=usb_get_intfdata(interface);/*givebackourminor*/对USB设备的IO操作。usbIOusbrequestblockurb。事实上,能打一个这样的比喻,usb总线就像一条高速公路,货物、人流之类的能看成是系统和设备交互的数需求的,所以urb能运载四种数据,不过你要先告诉你要运什么,目的地是什么。我们structurb的具体内容。他的内容非常多,为了不让我的理解误导各位,大家最佳还是看一看内核源码的注释,具体内容参见源码树下include/linux/usbh。struct unsignedintunsignedintusb_sndctrlpipe(structusb_device*dev,unsignedintunsignedintusb_sndintpipe(structusb_device*dev,unsignedintunsignedintint成功的话会是0。structurb*usb_alloc_urb(intisoc_packets,intmem_flags);voidusb__urb(structurb同的函数,对于中断urb,我们用voidusb_fill_int_urb(structurb*urb,structusb_device*dev,unsignedintpipe,void*transfer_buffer,intbuffer_length,plete_tcomplete,void*context,intinterval就是urb被调度的间隔。 plete_tvoidint plete_tcomplete,void对于等时urb,系统没有专门的fill函数,只能对各urb字段显示赋值。intusb_submit_urb(structurb*urb,intmem_flags);境我们会用GFP_ATOMIC。和否。下面是用urb来传送数据的细节。/*initializetheurbproperly*/buf,writesize,skel_write_bulk_callback,dev);/*sendthedataoutthebulkportretval=usb_submit_urb(urb,输状态和释放urb:dev=(structusb_skel*)urb-/*sync/asyncunlinkfaultsaren’terrorsif(urb->status&&!(urb->status==-ENOENT||urb->status
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实验室建设与职业病危害因素控制考核试卷
- 新高考历史三轮冲刺过关练习专题16 综合冲刺专练(16+3模式)(解析版)
- DB11∕T 1777-2020 人民防空工程维护技术规程
- 认识左右课件教学课件
- 《木兰诗》培训课件
- 人教版四年级下册语文表格教案第二单元
- 淮阴工学院《工程施工1》2022-2023学年第一学期期末试卷
- 沼气冰箱相关行业投资规划报告范本
- 2024年城市更新土方工程合同
- 2024年基金合伙权益委托代持具体条款
- 虫害分析分析报告
- 《民间文学导论》课件
- 《输血查对制度》课件
- 湘少版五年级下册英语全期教案
- 高速公路收费站常见特情处理办法课件
- 《行政许可法培训》课件
- 颅内占位性的病变护理查房课件
- 山东省烟台市芝罘区(五四制)2023-2024学年九年级上学期期末考试物理试题
- DB14∕T 1851-2019 中华鼢鼠防治技术规程
- 2024年风电铸件行业市场研究报告
- 中耳胆脂瘤的护理查房
评论
0/150
提交评论