Quectel EC20 LTE Module
-
Hi all,
I'm trying to configure my Quectel EC20 miniPCIe Module (Qualcomm, Inc. Acer Gobi 2000 Wireless Modem from linux lsusb)
I tried to configure a ppp on the /dev/cuau0 device and associate an OPT1 interface
usbconfig dump_device_desc ugen3.2: <quectel quectel="" lte="" module="">at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA) bLength = 0x0012 bDescriptorType = 0x0001 bcdUSB = 0x0200 bDeviceClass = 0x0000 <probed by="" interface="" class="">bDeviceSubClass = 0x0000 bDeviceProtocol = 0x0000 bMaxPacketSize0 = 0x0040 idVendor = 0x05c6 idProduct = 0x9215 bcdDevice = 0x0232 iManufacturer = 0x0001 <quectel>iProduct = 0x0002 <quectel lte="" module="">iSerialNumber = 0x0000 <no string="">bNumConfigurations = 0x0001</no></quectel></quectel></probed></quectel>
Mar 3 01:02:35 ppp [opt1_link0] CHAT: The modem is not responding to "AT" at ModemCmd: label. Mar 3 01:02:35 ppp [opt1_link0] MODEM: chat script failed Mar 3 01:02:35 ppp [opt1_link0] Link: DOWN event Mar 3 01:02:35 ppp [opt1_link0] LCP: Down event
it's not registered in the Known_Working_3G-4G_Modems page https://doc.pfsense.org/index.php/Known_Working_3G-4G_Modems
any ideas ?
-
You will have to figure out the usb mode switching commands before you can use this. On top of that, pfSense doesn't support the fast protocols like MBIM.
-
Those are very similar to the Sierra modems I believe. You may be able to change the presented USB profile under Windows or Linux to something FreeBSD recognises.
What do you see from?:
usbconfig -d ugen3.2 dump_all_config_desc
Steve
-
Hi, thanks for the replies !
I don't know if the modem requires the usb mode switching.
It works well under linux grace to modemmanager (perhaps mm does the usb mode switching) and I'm not sure about the differences between qmi and mbim but the modem seems to use qmi :root@linux# ls -l /sys/class/net/wwp0s20f0u12i4/device/driver/module lrwxrwxrwx 1 root root 0 Mar 4 22:53 /sys/class/net/wwp0s20f0u12i4/device/driver/module -> ../../../../module/qmi_wwan root@linux# ls /dev/cdc* /dev/cdc-wdm0 root@linux# ls -l /dev/serial/by-id/ total 0 lrwxrwxrwx 1 root root 13 Mar 4 22:44 usb-Quectel_Quectel_LTE_Module-if00-port0 -> ../../ttyUSB0 lrwxrwxrwx 1 root root 13 Mar 4 22:44 usb-Quectel_Quectel_LTE_Module-if01-port0 -> ../../ttyUSB1 lrwxrwxrwx 1 root root 13 Mar 4 22:44 usb-Quectel_Quectel_LTE_Module-if02-port0 -> ../../ttyUSB2 lrwxrwxrwx 1 root root 13 Mar 4 22:44 usb-Quectel_Quectel_LTE_Module-if03-port0 -> ../../ttyUSB3
For test purpose I must admit that I use a virtualize pfsense under kvm from linux where I "mount" the host USB lte device into the pfsense guest, but this should not be a problem.
As pfSense doesn't support the fast protocols like MBIM, perhaps it supports qmi ?
Here is the output of command : usbconfig -d ugen3.2 dump_all_config_desc
usbconfig -d ugen3.2 dump_all_config_desc ugen3.2: <quectel quectel="" lte="" module="">at usbus3, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA) Configuration index 0 bLength = 0x0009 bDescriptorType = 0x0002 wTotalLength = 0x00d1 bNumInterfaces = 0x0005 bConfigurationValue = 0x0001 iConfiguration = 0x0000 <no string="">bmAttributes = 0x00a0 bMaxPower = 0x00fa Interface 0 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0000 bAlternateSetting = 0x0000 bNumEndpoints = 0x0002 bInterfaceClass = 0x00ff <vendor specific="">bInterfaceSubClass = 0x00ff bInterfaceProtocol = 0x00ff iInterface = 0x0000 <no string="">Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0081 <in>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 1 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0001 <out>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Interface 1 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0001 bAlternateSetting = 0x0000 bNumEndpoints = 0x0003 bInterfaceClass = 0x00ff <vendor specific="">bInterfaceSubClass = 0x0000 bInterfaceProtocol = 0x0000 iInterface = 0x0000 <no string="">Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x00 RAW dump: 0x00 | 0x05, 0x24, 0x00, 0x10, 0x01 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x05, 0x24, 0x01, 0x00, 0x00 Additional Descriptor bLength = 0x04 bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x04, 0x24, 0x02, 0x02 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x05, 0x24, 0x06, 0x00, 0x00 Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0083 <in>bmAttributes = 0x0003 <interrupt>wMaxPacketSize = 0x000a bInterval = 0x0009 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 1 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0082 <in>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 2 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0002 <out>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Interface 2 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0002 bAlternateSetting = 0x0000 bNumEndpoints = 0x0003 bInterfaceClass = 0x00ff <vendor specific="">bInterfaceSubClass = 0x0000 bInterfaceProtocol = 0x0000 iInterface = 0x0000 <no string="">Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x00 RAW dump: 0x00 | 0x05, 0x24, 0x00, 0x10, 0x01 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x05, 0x24, 0x01, 0x00, 0x00 Additional Descriptor bLength = 0x04 bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x04, 0x24, 0x02, 0x02 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x05, 0x24, 0x06, 0x00, 0x00 Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0085 <in>bmAttributes = 0x0003 <interrupt>wMaxPacketSize = 0x000a bInterval = 0x0009 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 1 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0084 <in>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 2 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0003 <out>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Interface 3 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0003 bAlternateSetting = 0x0000 bNumEndpoints = 0x0003 bInterfaceClass = 0x00ff <vendor specific="">bInterfaceSubClass = 0x0000 bInterfaceProtocol = 0x0000 iInterface = 0x0000 <no string="">Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x00 RAW dump: 0x00 | 0x05, 0x24, 0x00, 0x10, 0x01 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x01 RAW dump: 0x00 | 0x05, 0x24, 0x01, 0x00, 0x00 Additional Descriptor bLength = 0x04 bDescriptorType = 0x24 bDescriptorSubType = 0x02 RAW dump: 0x00 | 0x04, 0x24, 0x02, 0x02 Additional Descriptor bLength = 0x05 bDescriptorType = 0x24 bDescriptorSubType = 0x06 RAW dump: 0x00 | 0x05, 0x24, 0x06, 0x00, 0x00 Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0087 <in>bmAttributes = 0x0003 <interrupt>wMaxPacketSize = 0x000a bInterval = 0x0009 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 1 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0086 <in>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 2 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0004 <out>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Interface 4 bLength = 0x0009 bDescriptorType = 0x0004 bInterfaceNumber = 0x0004 bAlternateSetting = 0x0000 bNumEndpoints = 0x0003 bInterfaceClass = 0x00ff <vendor specific="">bInterfaceSubClass = 0x00ff bInterfaceProtocol = 0x00ff iInterface = 0x0000 <no string="">Endpoint 0 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0089 <in>bmAttributes = 0x0003 <interrupt>wMaxPacketSize = 0x0040 bInterval = 0x0009 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 1 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0088 <in>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 2 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0005 <out>bmAttributes = 0x0002 <bulk>wMaxPacketSize = 0x0200 bInterval = 0x0000 bRefresh = 0x0000 bSynchAddress = 0x0000</bulk></out></bulk></in></interrupt></in></no></vendor></bulk></out></bulk></in></interrupt></in></no></vendor></bulk></out></bulk></in></interrupt></in></no></vendor></bulk></out></bulk></in></interrupt></in></no></vendor></bulk></out></bulk></in></no></vendor></no></quectel>
-
I believe the E20 runs the same Qualcom linux flavour (or very similar) that the Sierra devices do so you may be able to change the USB profile from it's command line.
It looks like currently it's presenting a QMI interface only (there is only one config index) which means pfSense cannot talk to it.
Try connecting to those ttyUSB ports in Linux and look for an AT prompt. Looks like it's probably ttyUSB3.
If you do get a command line you might try this or something similar:
https://forum.pfsense.org/index.php?topic=140301.msg766861#msg766861You might just get one of those Sierra modems instead though.
Steve