Help getting started with Quectel EC200 cellular module

Hello!

I am looking to integrate a quectel EC200U-CN module into a project. The communication medium will be uart.

I tried setting up the modemmanager with a udev rule but the modemmanager fails to detect the module.

ACTION=="add|change", KERNEL=="ttyACM2", ENV{ID_MM_DEVICE_PROCESS}="1"

There are no options on OS to open a terminal to the uart to check if the module is working or replying to any messages.

Any help would be appreciated.

Hi @geopaxpvtltd,

Why is that? You should be able to read and write to this serial device like any other, using standard Linux tools. There’s plenty of ways you can do this from command line, for example, just for testing. I’d try first to isolate the issue - is the UART that you are not able to communicate with, or is it Quectel EC200U-CN failure?

Please note, your question is related to some 3rd-party device, so it’s unlikely we will be able to provide you much support. I’d ask Quectel if you have any questions related to their products.

In any case, this is a modem, so I assume it should reply something to standard AT commands. But I do not have any manual of this module so I cannot say for sure.

That is right. I was unsure how to communicate with the device from a terminal. Torizoncore does not include screen, minicom or similar program so that i may ensure whether it is a communications issue or a module failure.

Hello @andrejs.tx ,

I am at the point where I can communicate with the modem using a serial port.

The issue is that I am unable to get the modem manager to recognize the device. The device is connected through a serial port on a usb to uart hub.

I tried creating a udev rule as follows:

# Rule for ModemManager to handle the device on ttyACM2
ACTION=="add|change", SUBSYSTEM=="tty", KERNEL=="ttyACM2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d5", ATTRS{bInterfaceNumber}=="04", ENV{ID_MM_TTY_BLACKLIST}="0", ENV{ID_MM_CANDIDATE}="1", ENV{ID_MM_TTY_BAUDRATE}="9600", ENV{ID_MM_TTY_FLOW_CONTROL}="none"

Journalctl reports the following:

torizon@verdin-imx8mm-14756428:~$ journalctl -xe | grep ModemManager
░░ Subject: A start job for unit ModemManager.service has begun execution
░░ A start job for unit ModemManager.service has begun execution.
Sep 08 09:52:01 verdin-imx8mm-14756428 ModemManager[685]: <info>  ModemManager (version 1.18.8) starting in system bus...
░░ Subject: A start job for unit ModemManager.service has finished successfully
░░ A start job for unit ModemManager.service has finished successfully.
Sep 08 09:52:02 verdin-imx8mm-14756428 NetworkManager[713]: <info>  [1694166722.8210] modem-manager: ModemManager available
Sep 08 09:52:04 verdin-imx8mm-14756428 ModemManager[685]: <info>  [base-manager] couldn't check support for device '/sys/devices/platform/soc@0/30800000.bus/30be0000.ethernet': not supported by any plugin
Sep 08 09:52:11 verdin-imx8mm-14756428 ModemManager[685]: <info>  [base-manager] couldn't check support for device '/sys/devices/platform/soc@0/30800000.bus/30b60000.mmc/mmc_host/mmc2/mmc2:0001/mmc2:0001:1': not supported by any plugin
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <info>  [device /sys/devices/platform/soc@0/32c00000.bus/32e50000.usb/ci_hdrc.1/usb1/1-1/1-1.1] creating modem with plugin 'generic' and '4' ports
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <warn>  [plugin/generic] could not grab port ttyACM1: Cannot add port 'tty/ttyACM1', unhandled port type
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <warn>  [plugin/generic] could not grab port ttyACM0: Cannot add port 'tty/ttyACM0', unhandled port type
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <warn>  [plugin/generic] could not grab port ttyACM3: Cannot add port 'tty/ttyACM3', unhandled port type
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <warn>  [plugin/generic] could not grab port ttyACM2: Cannot add port 'tty/ttyACM2', unhandled port type
Sep 08 09:52:23 verdin-imx8mm-14756428 ModemManager[685]: <warn>  [base-manager] couldn't create modem for device '/sys/devices/platform/soc@0/32c00000.bus/32e50000.usb/ci_hdrc.1/usb1/1-1/1-1.1': Failed to find primary AT port

It says the port type is unhandled.

Testing the udev rules gives the following:

torizon@verdin-imx8mm-14756428:~$ sudo udevadm test /sys/class/tty/ttyACM2
Password:
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Trying to open "/etc/systemd/hwdb/hwdb.bin"...
Trying to open "/etc/udev/hwdb.bin"...
Trying to open "/usr/lib/systemd/hwdb/hwdb.bin"...
Trying to open "/usr/lib/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          250
file size:         9764875 bytes
header size             80 bytes
strings            2429283 bytes
nodes              7335512 bytes
Load module index
Found cgroup2 on /sys/fs/cgroup/unified, unified hierarchy for systemd controller
Found container virtualization none.
Loaded timestamp for '/etc/systemd/network'.
Loaded timestamp for '/run/systemd/network'.
Parsed configuration file /usr/lib/systemd/network/99-default.link
Parsed configuration file /etc/systemd/network/10-toradex-wifi-ifnames.link
Created link configuration context.
Loaded timestamp for '/etc/udev/rules.d'.
Reading rules file: /usr/lib/udev/rules.d/10-dm.rules
Reading rules file: /etc/udev/rules.d/10-imx.rules
Reading rules file: /etc/udev/rules.d/10-toradex-net-rename.rules
Reading rules file: /usr/lib/udev/rules.d/11-dm-lvm.rules
Reading rules file: /usr/lib/udev/rules.d/13-dm-disk.rules
Reading rules file: /usr/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /usr/lib/udev/rules.d/60-autosuspend.rules
Reading rules file: /usr/lib/udev/rules.d/60-block.rules
Reading rules file: /usr/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /usr/lib/udev/rules.d/60-drm.rules
Reading rules file: /usr/lib/udev/rules.d/60-evdev.rules
Reading rules file: /usr/lib/udev/rules.d/60-fido-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-input-id.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /usr/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /usr/lib/udev/rules.d/60-sensor.rules
Reading rules file: /usr/lib/udev/rules.d/60-serial.rules
Reading rules file: /usr/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /usr/lib/udev/rules.d/69-dm-lvm-metad.rules
Reading rules file: /usr/lib/udev/rules.d/70-camera.rules
Reading rules file: /usr/lib/udev/rules.d/70-joystick.rules
Reading rules file: /usr/lib/udev/rules.d/70-memory.rules
Reading rules file: /usr/lib/udev/rules.d/70-mouse.rules
Reading rules file: /usr/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /usr/lib/udev/rules.d/70-touchpad.rules
Reading rules file: /usr/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /usr/lib/udev/rules.d/71-seat.rules
Reading rules file: /usr/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /usr/lib/udev/rules.d/75-net-description.rules
Reading rules file: /usr/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-broadmobi-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-cinterion-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-dell-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-dlink-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-ericsson-mbm.rules
Configuration file /usr/lib/udev/rules.d/77-mm-fibocom-port-types.rules is marked executable. Please remove executable permission bits. Proceeding anyway.
Reading rules file: /usr/lib/udev/rules.d/77-mm-fibocom-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-foxconn-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-gosuncn-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-haier-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-huawei-net-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-linktop-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-longcheer-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-mtk-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-nokia-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-qcom-soc.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-quectel-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-sierra.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-simtech-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-telit-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-tplink-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-ublox-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-x22x-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/77-mm-zte-port-types.rules
Reading rules file: /usr/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /usr/lib/udev/rules.d/80-drivers.rules
Reading rules file: /usr/lib/udev/rules.d/80-mm-candidate.rules
Reading rules file: /usr/lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /usr/lib/udev/rules.d/80-udisks2.rules
Reading rules file: /usr/lib/udev/rules.d/81-net-dhcp.rules
Reading rules file: /usr/lib/udev/rules.d/85-nm-unmanaged.rules
Reading rules file: /usr/lib/udev/rules.d/90-daxctl-device.rules
Reading rules file: /usr/lib/udev/rules.d/90-nm-thunderbolt.rules
Reading rules file: /etc/udev/rules.d/90-toradex-gpio.rules
Reading rules file: /usr/lib/udev/rules.d/90-vconsole.rules
Reading rules file: /etc/udev/rules.d/91-toradex-i2cdev.rules
Reading rules file: /etc/udev/rules.d/92-toradex-spidev.rules
Reading rules file: /etc/udev/rules.d/93-toradex-backlight.rules
Reading rules file: /etc/udev/rules.d/94-toradex-pwm.rules
Reading rules file: /usr/lib/udev/rules.d/95-dm-notify.rules
Reading rules file: /usr/lib/udev/rules.d/99-fuse3.rules
Reading rules file: /etc/udev/rules.d/99-my-modem.rules
Reading rules file: /usr/lib/udev/rules.d/99-systemd.rules
Reading rules file: /etc/udev/rules.d/99-toradex.rules
Reading rules file: /etc/udev/rules.d/bootpart-automount.rules
Reading rules file: /etc/udev/rules.d/touchscreen.rules
ttyACM2: /usr/lib/udev/rules.d/50-udev-default.rules:26 GROUP 20
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:8 Importing properties from results of builtin command 'usb_id'
1-1.1:1.4: if_class:2 protocol:0
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:8 Importing properties from results of builtin command 'hwdb --subsystem=usb'
ttyACM2: hwdb modalias key: "usb:v1A86p55D5d0148dcEFdsc02dp01ic02isc02ip01in04"
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:15 Importing properties from results of builtin command 'path_id'
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:16 LINK 'serial/by-path/platform-ci_hdrc.1-usb-0:1.1:1.4'
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:19 Skipping builtin 'usb_id' in IMPORT key
ttyACM2: /usr/lib/udev/rules.d/60-serial.rules:23 LINK 'serial/by-id/usb-WCH.CN_USB_Quad_Serial_BC17A5ABCD-if04'
ttyACM2: Preserve permissions of /dev/ttyACM2, uid=0, gid=20, mode=0660
ttyACM2: Handling device node '/dev/ttyACM2', devnum=c166:2
ttyACM2: sd-device: Created db file '/run/udev/data/c166:2' for '/devices/platform/soc@0/32c00000.bus/32e50000.usb/ci_hdrc.1/usb1/1-1/1-1.1/1-1.1:1.4/tty/ttyACM2'
DEVPATH=/devices/platform/soc@0/32c00000.bus/32e50000.usb/ci_hdrc.1/usb1/1-1/1-1.1/1-1.1:1.4/tty/ttyACM2
DEVNAME=/dev/ttyACM2
MAJOR=166
MINOR=2
ACTION=add
SUBSYSTEM=tty
TAGS=:systemd:
ID_VENDOR=WCH.CN
ID_VENDOR_ENC=WCH.CN
ID_VENDOR_ID=1a86
ID_MODEL=USB_Quad_Serial
ID_MODEL_ENC=USB\x20Quad_Serial
ID_MODEL_ID=55d5
ID_REVISION=0148
ID_SERIAL=WCH.CN_USB_Quad_Serial_BC17A5ABCD
ID_SERIAL_SHORT=BC17A5ABCD
ID_TYPE=generic
ID_BUS=usb
ID_USB_INTERFACES=:020201:0a0000:
ID_USB_INTERFACE_NUM=04
ID_USB_DRIVER=cdc_acm
ID_USB_CLASS_FROM_DATABASE=Miscellaneous Device
ID_USB_PROTOCOL_FROM_DATABASE=Interface Association
ID_VENDOR_FROM_DATABASE=QinHeng Electronics
ID_PATH=platform-ci_hdrc.1-usb-0:1.1:1.4
ID_PATH_TAG=platform-ci_hdrc_1-usb-0_1_1_1_4
DEVLINKS=/dev/serial/by-path/platform-ci_hdrc.1-usb-0:1.1:1.4 /dev/serial/by-id/usb-WCH.CN_USB_Quad_Serial_BC17A5ABCD-if04
ID_MM_CANDIDATE=1
UDISKS_FILESYSTEM_SHARED=1
CURRENT_TAGS=:systemd:
USEC_INITIALIZED=9723750
Unload module index
Unloaded link configuration context.

It can be seen here that the custom udev rule in 99-my-modem.rules is being loaded

Any help will be appreciated.

Okay I figured it out. the following:

ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d5"

was the issue. these ids pointed to the uart hub itself. not the ttyACM2.

The following rule worked and mmcli is able to detect the modem:

ACTION=="add|change", SUBSYSTEM=="tty", KERNEL=="ttyACM2", ENV{ID_MM_CANDIDATE}="1", ENV{ID_MM_TTY_BAUDRATE}="9600", ENV{ID_MM_TTY_FLOW_CONTROL}="none"

Just for future reference if anyone encounters this.

Best Regards.