返回信息流我现在有一个usb接口3G模块,有支持TQ2440开发板的usb驱动,现在我要修改这个驱动,使这个3G模块工作到其他嵌入式系统中,现在感觉无从下手。希望同学们给我指导一下。如: usb驱动的架构以及移植步骤
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #10567同步于 2011/5/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
求助:帮忙指导一下linux下usb驱动的移植方法
sslsky2009
2011/5/8镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
一般这种USB设备USB通信都是通过控制传输和BULK传输和模块通信的(?没有使用过3G模块,猜想),这两种USB传输在linux上分为同步和异步两种方式(其实两者区别就是同步使用linux的wait queue的同步机制),同步传输接口函数为usb_control_msg/usb_bulk_msg,异步统一为usb_submit_urb,楼主在你的驱动里这几个函数就找到了数据流的接口了。
另外,驱动的注册,linux上核心是注册USB设备驱动程序,USB总线驱动检测到设备插入时进行枚举,枚举成功后根据设备类型或者vendor_id和product_id匹配注册到总线上的驱动,调用驱动的probe函数进行设备的初始化,卸载使调用disconnect函数卸载设备。加载和卸载驱动的接口函数为usb_register和usb_deregister,楼主找到这两个函数就可以找到驱动的入口了。
把这个几个接口换成你需要移植的系统类似的接口就可以完成移植了,其实有好多的系统上USB总线驱动都是移植linux上的那一套,楼主有兴趣可以阅读这部分代码,不过有点复杂。
【 在 yujun065682 的大作中提到: 】
: 一般这种USB设备USB通信都是通过控制传输和BULK传输和模块通信的(?没有使用过3G模块,猜想),这两种USB传输在linux上分为同步和异步两种方式(其实两者区别就是同步使用linux的wait queue的同步机制),同步传输接口函数为usb_control_msg/usb_bulk_msg,异步统一为usb_submit_urb,楼主在你的驱动里这几个函数就找到了数据流的接口了。
: 另外,驱动的注册,linux上核心是注册USB设备驱动程序,USB总线驱动检测到设备插入时进行枚举,枚举成功后根据设备类型或者vendor_id和product_id匹配注册到总线上的驱动,调用驱动的probe函数进行设备的初始化,卸载使调用disconnect函数卸载设备。加载和卸载驱动的接口函数为usb_register和usb_deregister,楼主找到这两个函数就可以找到驱动的入口了。
: 把这个几个接口换成你需要移植的系统类似的接口就可以完成移植了,其实有好多的系统上USB总线驱动都是移植linux上的那一套,楼主有兴趣可以阅读这部分代码,不过有点复杂。
: ...................
好的谢谢你!我的内核版本是2.6.30.4,USB3G模块在linux下用的是usb串口驱动,源文件/drivers/usb/usb-serial.c,我现在正在研究这个驱动程序,如果有问题我再向你请教。
【 在 yujun065682 的大作中提到: 】
: 一般这种USB设备USB通信都是通过控制传输和BULK传输和模块通信的(?没有使用过3G模块,猜想),这两种USB传输在linux上分为同步和异步两种方式(其实两者区别就是同步使用linux的wait queue的同步机制),同步传输接口函数为usb_control_msg/usb_bulk_msg,异步统一为usb_submit_urb,楼主在你的驱动里这几个函数就找到了数据流的接口了。
: 另外,驱动的注册,linux上核心是注册USB设备驱动程序,USB总线驱动检测到设备插入时进行枚举,枚举成功后根据设备类型或者vendor_id和product_id匹配注册到总线上的驱动,调用驱动的probe函数进行设备的初始化,卸载使调用disconnect函数卸载设备。加载和卸载驱动的接口函数为usb_register和usb_deregister,楼主找到这两个函数就可以找到驱动的入口了。
: 把这个几个接口换成你需要移植的系统类似的接口就可以完成移植了,其实有好多的系统上USB总线驱动都是移植linux上的那一套,楼主有兴趣可以阅读这部分代码,不过有点复杂。
: ...................
我想问一下,你对linux下的usb串口驱动有研究吗?我现在发现我的TQ2440开发板的usb串口驱动程序和我之前用的那个usb3G模块的驱动程序是基本是一样的,就是在/drivers/usb/serial/generic.c中的厂商id和产品id字段不一样,如果我要是用其他开发板,难道只需要改这两个地方吗?如果是这样的话,我猜测是这个usb串口驱动(/drivers/usb/serial/usb-serial.c)就是个通用驱动,只是在不同版本的linux内核下代码有所不同;还有可能是开发板提供的内核已经把usb底层的驱动开发好了,如usb core,所以usb串口的驱动的核心代码我们就不用改了。
如果我自己画板子的话,linux usb core的核心代码需要我去改吗?
在/drivers/usb/serial/下有个option.c,此文件针对gsm/cdma modems,可以用于你的3g模块,对其增加自己的productid 和vendorid 就基本ok了。generic那个是个通用的usb串口驱动,对于3G模块大数据量的传输,可以适当修改usb_serial_probe()函数中的le16_to_cpu(endpoint->wMaxPacketSize),改为buffer_size = 4096;这样应该好点。
【 在 sslsky2009 的大作中提到: 】
: : 一般这种USB设备USB通信都是通过控制传输和BULK传输和模块通信的(?没有使用过3G模块,猜想),这两种USB传输在linux上分为同步和异步两种方式(其实两者区别就是同步使用linux的wait queue的同步机制),同步传输接口函数为usb_control_msg/usb_bulk_msg,异步统一为usb_submit_urb,楼主在你的驱动里这几个函数就找到了数据流的接口了。
: : 另外,驱动的注册,linux上核心是注册USB设备驱动程序,USB总线驱动检测到设备插入时进行枚举,枚举成功后根据设备类型或者vendor_id和product_id匹配注册到总线上的驱动,调用驱动的probe函数进行设备的初始化,卸载使调用disconnect函数卸载设备。加载和卸载驱动的接口函数为usb_register和usb_deregister,楼主找到这两个函数就可以找到驱动的入口了。
: : 把这个几个接口换成你需要移植的系统类似的接口就可以完成移植了,其实有好多的系统上USB总线驱动都是移植linux上的那一套,楼主有兴趣可以阅读这部分代码,不过有点复杂。
: ...................