最近新入手一块板子,里面Gobinet 和 usbserial 这些都是模块编insmod插入进去的,虽然提供了源码但是还是看不明白什么意思,于是对这块就有了兴趣,因为公司有和移远有合作,就要来了他们的Linux源码(本身也是开源的)研究了一下,发现其实很简单,主要参考移远官方的文件《Quectel_WCDMA<E_Linux_USB_Driver_User_Guide_V1.7.pdf》下面我就结合这个文档给大家再捋一遍。
=======================================================================
一 、USB Serial
如果你用的是ec20**********并且需要USB串口的启动,请细度此章否则直接跳过。。。。
1.1 添加VID和PID
VID和PID其实就相当于USB硬件的识别ID系统也是通过他们来找到你的EC20设备的,修改Kernel中文件来添加,方法如下
注意:如果其他的usb设备也用到了这些资源的话就把冲突的地方删掉,比如在[KERNEL]/drivers/usb/serial/qcserial.c中和[KERNEL]/drivers/net/usb/qmi_wwan.c文件中都有对(0x05c6, 0x9215)ID的重复描述,官方文档是让删掉的,我没有删试了没事,想来应该是我的板卡上没有这些设备的原因。
1.2添加 Zero Packet Mechanism
通过USB协议的要求,你需要在bulkout传输添加加工零包的机制(直接翻译过来的照着做就可以了)。
如果你的Linuxkernel版本新于2.6.34,在文件File: [KERNEL]/drivers/usb/serial/usb_wwan.c中添加:
static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{
……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#if 1 //Added by Quectel for Zero Packet
if (dir == USB_DIR_OUT) {
struct usb_device_descriptor *desc = &serial->dev->descriptor;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003))
urb->transfer_flags |= URB_ZERO_PACKET;
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215))
urb->transfer_flags |= URB_ZERO_PACKET;
i