通用usb设备驱动源码分析

通用usb设备驱动源码分析

ID:1319429

大小:62.73 KB

页数:98页

时间:2017-11-10

通用usb设备驱动源码分析_第1页
通用usb设备驱动源码分析_第2页
通用usb设备驱动源码分析_第3页
通用usb设备驱动源码分析_第4页
通用usb设备驱动源码分析_第5页
资源描述:

《通用usb设备驱动源码分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、通用USB设备驱动源码分析Author:aaron前段时间写了篇的文章, 描述了自己如何为高通的一个usbmodem设备写驱动的过程, 最近发现实际上可以使用linux自带的一个叫usbserial的模块作为这个modem的驱动并能良好的工作, 所以写了这片文章来详细的分析下usbserial模块的源码(2.6.16.3).应该来说, 对于那些仅仅是用USB来通信, 在上层可看作tty设备, 不属于任何USB设备类型, 没有什么流控等的普通USB设备来说都可以使用这个驱动来作为设备驱动程序.下面就来对这样一种通用的驱动程序来进行详细的分析. 不对之

2、处敬请指正! 为了能让usbserail模块支持我的设备, 我必须在命令行上输入如下命令:sudomodprobeusbserialvendor=0x12d1product=0x1003该命令用特权用户来加载usbserial模块,并把该模块依赖的模块一并加载进系统, 同时它还设置了usbserial的两个参数:vendor,product,  很显然这两个参数是厂商ID和设备ID, 而作用就是用于匹配设备.首先, 当然是要知道usbserial模块由哪些文件编译而成, 这样才能有目的性的去分析其代码. 而要知道其组成当然是去其目录下看Makefile了,  它位于内核源码目录下的./dri

3、vers/usb/serial/下./drivers/usb/serial/Makefile:##MakefilefortheUSBserialdevicedrivers.# #Objectfilelists. obj-$(CONFIG_USB_SERIAL)                 +=usbserial.o  #编译内核时如何编译该模块 usbserial-obj-$(CONFIG_USB_SERIAL_CONSOLE)      +=console.ousbserial-obj-$(CONFIG_USB_EZUSB)           +=ezusb.o usbserial-

4、objs :=usb-serial.ogeneric.obus.o$(usbserial-obj-y)   #OK, 就是usbserial模块的组成了. obj-$(CONFIG_USB_SERIAL_AIRPRIME)            +=airprime.oobj-$(CONFIG_USB_SERIAL_ANYDATA)            +=anydata.o.......我们重点看的是usb-serial.c,  generic.c,bus.c 在看源码之前我们先说说该模块的原理及整体结构:很简单跟应用层交互的是一个tty设备, 也就是说该模块把USB设备映射成一个tty

5、设备(即在/dev/目录下为该USB设备创建一个tty设备文件), 然后用于可以用minicom之类的串口工具来打开这个设备, 并同设备端的设备通信.对于发送过程:tty设备文件在获取了用户要求发送的数据之后传递到下层usbserial模块的核心层,而该核心层就是将数据打包成USB格式的数据并由USB通信发送到设备端去,对于接收过程:usbserial模块会在该设备打开时就启动一个urb在那等待设备端发数据过来, 收到数据后就push到上层tty设备的缓冲中去, 而tty设备在收到数据后就会给用户,或直接显示在minicom之类的工具上.usb-serial.c 就是usbserial模块的

6、核心, 它主要用来接收设备端发来的数据并传送到上层, 同时也接收来自上层应用的数据,并组装成urb包发送给设备.generic.c 对特定设备单独的操作,相当于是设备自己的驱动程序, 由于很多设备具有通用性, 所以对于没有特殊要求的设备都可以使用这个驱动来作为自己设备的驱动程序. 它有两个参数vendor和product,上面提过了.bus.c  每个usb驱动和设备都必须要归入某一条总线上, 即都是归属于某条总线的,只有这样系统才能从特定一条总线开始找到每个驱动和设备并为他们匹配. 这个文件就是用来模拟一条总线, 而usbserial的每个驱动和设备都会注册到这条总线上来. 好了,是时候分

7、析usbserial模块了. 我们知道当把一个模块加载进系统时会调用这个模块里的一个由module_init()声明的一个初始化函数.usbserial当然也不另外,usb-serial.c:module_init(usb_serial_init);   module_exit(usb_serial_exit);没错加载时调用的就是:   usb_serial_init().usb-serial.c:stru

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。