Air720模块Linux USB驱动以及PPP拨号说明

                        <p>&nbsp;&nbsp;&nbsp;&nbsp;本文章介绍了在linux系统下,如何修改usb驱动支持合宙 Air720模块,以及使用Air720进行ppp拨号上网流程</p>


    Air720正常启动后,通过USB连接到linux设备上,驱动正常加载后会产生如下设备:



一、修改驱动

   
    首先需要对Linux内核驱动做一定的修改,使操作系统能够支持Air720

    1.Add VID add PID

    File: [KERNEL]/drivers/usb/serial/option.c

static const struct usb_device_id option_ids[] = {
    //+add by airm2m for Air72x
    { USB_DEVICE(0x1286, 0x4e3d) },
     //-add by airm2m for Air72x
   { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },   

    

    2. Add the Zero Packet Mechanism   

    ⦁For linux Kernel Version newer than 2.6.34:
     File: [KERNEL]/drivers/usb/serial/usb_wwan.c
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
                      int endpoint,                                                             
                      int dir, void *ctx, char *buf, int len,
                      void (*callback) (struct urb *))
{
    struct usb_serial *serial = port->serial;
    struct urb *urb;
    urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
    if (!urb)
        return NULL;
    usb_fill_bulk_urb(urb, serial->dev,
              usb_sndbulkpipe(serial->dev, endpoint) | dir,
              buf, len, callback, ctx);
    //+add by airm2m for Air72x
    if(dir == USB_DIR_OUT){
        struct usb_device_descriptor *desc = &serial->dev->descriptor;
        if(desc->idVendor == cpu_to_le16(0x1286) && desc->idProduct == cpu_to_le16(0x4e3d))
        {
            urb->transfer_flags |= URB_ZERO_PACKET;
        }
    }
    //-add by airm2m for Air72x
    return urb;
}

    ⦁For linux Kernel Version older than 2.6.35:

    File: [KERNEL]/drivers/usb/serial/option.c

static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,
void (*callback)(struct urb *))
{
......
/* Fill URB using supplied data. */
usb_fill_bulk_urb(urb, serial->dev,
      usb_sndbulkpipe(serial->dev, endpoint) | dir,
      buf, len, callback, ctx);
//+add by airm2m for Air72x
if(dir == USB_DIR_OUT)
{
        struct usb_device_descriptor *desc = &serial->dev->descriptor;
        if(desc->idVendor == cpu_to_le16(0x1286) && desc->idProduct == cpu_to_le16(0x4e3d))
        {
            urb->transfer_flags |= URB_ZERO_PACKET;
        }
}
//-add by airm2m for Air72x
return urb;
}

     3. Add Reset Resume

    ⦁For linux Kernel Version newer than 3.4:
       File: [KERNEL]/drivers/usb/serial/option.c
static struct usb_serial_driver option_1port_device = {
    .driver = {                                                                                                  
        .owner =    THIS_MODULE,
        .name =     "option1",
    },   
    ....
#ifdef CONFIG_PM
    .suspend           = usb_wwan_suspend,
    .resume            = usb_wwan_resume,
    //+add by airm2m for Air720
    .reset_resume      = usb_wwan_resume,
    //-add by airm2m for Air720
#endif

};

    ⦁For linux Kernel Version older than 3.5:
    File: [kernel]/drivers/usb/serial/usb-serial.c
/* Driver structure we register with the USB core */
static struct usb_driver usb_serial_driver = {
.name ="usbserial",
.probe =usb_serial_probe,
.disconnect =usb_serial_disconnect,
.suspend =usb_serial_suspend,
.resume =usb_serial_resume,
//+add by airm2m for Air72x
          .reset_resume      = usb_serial_resume,
          //-add by airm2m for Air72x
.no_dynamic_id = 1,
};

    4. Modify Kernel Configuration

    Step 1:
    cd <your kernel directory>
    Step 2:
    make menuconfig
    Step 3:Enable CONFIG_USB_SERIAL_OPTION
[*] Device Drivers →
  [*] USB Support →
    [*] USB Serial Converter support →
      [*] USB driver for GSM and CDMA modems

attachments-2018-09-UvLI6qjo5b8b7c3fabe04.png

    Step 4:Configure Kernel to Support PPP
[*] Device Drivers →
  [*] Network device support →
    [*] PPP (point-to-point protocol) support

attachments-2018-09-0MkDlKPS5b8b7cde500a3.png


   5.编译内核

    make    
    将编译好的内核下载到开发板。

    

 二、模块测试

    将重新编译好的内核下载到开发板之后,待系统重新启动,如果是带RNDIS网卡的驱动,在/dev/目录下会出现如下设备节点:



Air720的AT端口是/dev/ttyUSB2,现在你可以使用UART端口工具如“minicom”或“busybox microcom”测试AT功能,结果如下:
attachments-2018-09-VciAwk855b8b81601e624.png



三、PPP拨号

    通过几个不同的配置文件,在拨号的时候选择相应的配置文件,现将配置文件列举如下:

下面的拨号脚本ttyUSB3 有可能要改成 ttyUSB2  请注意 按照上方表格修改!!!!

 

    /etc/ppp/peers/air-ppp

debug
nodetach
dump
/dev/ttyUSB1
115200
nolock
nocrtscts
modem
hide-password
novj
novjccomp
ipcp-accept-local
ipcp-accept-remote
noipdefault
usepeerdns
noccp
connect 'chat -s -v -f /etc/ppp/peers/air-chat-connect'
disconnect 'chat -s -v -f /etc/ppp/peers/air-chat-disconnect'

    /etc/ppp/peers/air-chat-connect
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "NO ANSWER"
ABORT "BUSY"
ABORT "Username/Password Incorrect"
""      AT
OK-+++-OK ATH0
OK      AT+CREG?
OK      AT+CPIN?
OK      AT+CESQ
OK      ATD*99#
CONNECT ""


    /etc/ppp/peers/air-chat-disconnect           
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
"" "\K"
"" "+++ATH0"
SAY "\nGood bay\n"

    编辑好这几个文件之后,便可以通过pppd进行拨号:
    # pppd call air-ppp &
   如果拨号成功会有以下信息打印出来:

attachments-2018-09-IlJCjHPz5b8b8a394bfdf.png

attachments-2018-09-fFu9jAXX5b8b8a7160164.png

此时通过ifconfig命令查看网卡就有一个ppp0网卡出现,这时可以禁用其他网卡,就可以用Air720模块连接到互联网了。

attachments-2018-09-GGlDY8xC5b8b8aa468bb5.png

    

上次更新 2021-01-28