android11调试4g模块EC200M-CN详解

目录

一、Linux USB架构

二、内核配置

A.相关配置文件:

B.驱动配置

1.dts配置

2.添加pid/vid

3.使用USBNET驱动

3.修改内核配置

4.添加零包机制

5.添加Reset-resume机制

6.驱动qmi_wwan

C.常见问题和内核log

1.如何检查设备中是否存在 USB 驱动

2.如何检查模块与对应的 USB 驱动程序是否正常工作

三、上层配置

A.添加RIL

B.进入device/rockchip/common目录

四、验证

五、日志抓取



一、Linux USB架构

        USB 是一种分层总线结构。 USB 设备与主机之间的数据传输由 USB 控制器控制。 Linux USB 驱动程序架构如下图所示。 Linux USB 主机驱动包括三部分: USB 主机控制器驱动、 USB 核心和 USB 设备驱动。

        USB 主机控制器驱动在分层结构的最底层,直接与硬件交互。 USB 核心是整个 USB 主机驱动的核心,用于管理 USB 总线、 USB 总线设备和 USB 总线带宽;它为 USB 设备驱动程序提供接口,应用程序可以通过这些接口访问 USB 系统文件。

USB 设备驱动程序与应用程序交互并提供用于访问特定 USB 设备的接口。

        其实这一部分的讲析,在你调试的4g模块文档中也有,在此,不再作过多描述。

以下是我配置4g的原理图:

二、内核配置

A.相关配置文件:

dts文件

configs/rockchip_defconfig

option.c

usb_wwan.c

qmi_wwan_q.c

B.驱动配置
1.dts配置
rk_modem: rk-modem {
                compatible="4g-modem-platdata";
                4G,vbat-gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>; //4g_en
                4G,power-gpio = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; //4g_disabled
                4G,reset-gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>;//4g_rst
                pinctrl-0 = <&mobile_4g>;
                pinctrl-names = "default";
                status = "okay";
         };

其实这部分配置貌似不需要配置的很详细,只配置一个4g的供电就行了。这个compatible用到的驱动lte_rm310.c,这部分其实并没有按照驱动认真的跑,这个默认的源文件还是有问题的。

2.添加pid/vid

        为了识别模块,需将模块的 VID 和 PID 信息添加到[KERNEL]/drivers/usb/serial/option.c 文件中,对应的 VID 和 PID,如下所示:

static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel
        { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC20 R2.0/EC20 R2.1/EC25/EG25-G/EM05 */
        { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21/EG21-G */
        { USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */
        { USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */
        { USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */
        { USB_DEVICE(0x2C7C, 0x0512) }, /* Quectel EG12/EM12/EG18 */
        { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */
        { USB_DEVICE(0x2C7C, 0x0700) }, /* Quectel BG95/BG77/BG600L-M3/BC69 */
        { USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */
        { USB_DEVICE(0x2C7C, 0x0415) }, /* Quectel AG15 */
        { USB_DEVICE(0x2C7C, 0x0452) }, /* Quectel AG520R */
        { USB_DEVICE(0x2C7C, 0x0455) }, /* Quectel AG550R */
        { USB_DEVICE(0x2C7C, 0x0620) }, /* Quectel EG20 */
        { USB_DEVICE(0x2C7C, 0x0800) }, /* Quectel RG500Q/RM500Q/RG510Q/RM510Q */
        { USB_DEVICE(0x2C7C, 0x6002) }, // ec200s/ec200m/ec200n/ec600n/ec600m/ec800m/ec800n
        { USB_DEVICE(0x2C7C, 0x6005) }, // Quectel EC200A
 #endif
3.使用USBNET驱动

        前面第二点中配置使模块的所有 USB 接口均绑定 USB 转串口 option 驱动程序,导致 USBNet 驱动程序接口无法工作。用户可以添加以下语句来防止 USBNet 驱动程序接口绑定 USB 转串口 option 驱动程序。

        高于 2.6.30 的 Linux 内核版本,用户可以在[KERNEL]/drivers/usb/serial/option.c 文件中添加以下语句

static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) {
    struct usb_wwan_intf_private *data;
    ……
#if 1 //Added by Quectel
    if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
        __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
        struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;
        
        if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {
            //ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB
            return -ENODEV;
        }
        if ((idProduct&0xF000) == 0x0000) {
            //MDM interface 4 is QMI
            if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3
                && intf->bInterfaceSubClass == 0xFF &&
            intf->bInterfaceProtocol == 0xFF)
            return -ENODEV;
        }
    }
#endif
    /* Store device id so we can use it during attach. */
    usb_set_serial_data(serial, (void *)id);
    return 0;
}
3.修改内核配置

用户需启用以下配置项。
 

CONFIG_USB_SERIAL
CONFIG_USB_SERIAL_WWAN
CONFIG_USB_SERIAL_OPTION
4.添加零包机制

根据 USB 协议的要求,通过添加如下语句在 bulk-out 传输过程中添加处理零包的机制:

        高于 2.6.34 的 Linux 内核版本,需在[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(0x2C7C))
            urb->transfer_flags |= URB_ZERO_PACKET;
    }
#endif
    return urb;
}
  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 单片机与4G模块 EC200S 的串口通信程序,一般分为初始化模块、发送数据和接收数据三个步骤。 首先,要初始化单片机的串口口和4G模块的串口口。单片机和EC200S的串口口需要配置波特率、数据位、停止位和奇偶校验位等参数,以确保它们之间的通信能够正常进行。 其次,要通过单片机的串口口发送数据到EC200S模块。可以使用单片机的发送函数,在发送缓冲区中放入待发送的数据,然后通过串口口发送出去。在发送之前,还需要检查发送缓冲区是否为空,以确保没有数据丢失。 最后,要在单片机上接收来自EC200S模块的数据。单片机也需要设置接收缓冲区,并通过中断或轮询方式来读取接收缓冲区中的数据。读取完成后,可以对接收到的数据进行处理,比如打印到显示屏上或进行其他操作。 需要注意的是,在进行单片机和EC200S模块的串口通信时,还需要处理数据的传输格式。比如,可以使用ASCII码或二进制格式进行数据的传输。在发送和接收数据时,需要进行格式的转换和拆装,以确保数据能够正确传输和解析。 以上就是单片机与4G模块EC200S串口通信程序的一般步骤,具体实施时还需根据实际情况进行调整和优化。 ### 回答2: 单片机与4G模块EC200S之间的串口通信程序主要包含以下几个步骤: 1. 硬件连接:将单片机的串口TX(发送)引脚连接到EC200S的串口RX(接收)引脚,同时将单片机的串口RX(接收)引脚连接到EC200S的串口TX(发送)引脚。 2. 初始化串口:在单片机代码中,首先需要设置串口的波特率、数据位、停止位和校验位等参数,并使能串口的接收和发送功能。 3. 发送AT指令:通过串口向EC200S发送AT指令,以进行4G网络的连接、断开、发送短信等操作。可以使用串口发送函数将指令发送给EC200S。 4. 接收和解析响应:通过串口接收函数,单片机可以接收到EC200S返回的响应信息。需要对响应信息进行解析,判断操作是否成功,并根据具体情况作出相应处理。 5. 串口中断处理:可以使用串口中断,当EC200S返回数据时,单片机可以通过中断响应快速处理接收到的数据,提高响应速度。 6. 错误处理:在通信过程中可能出现各种错误,如串口通信错误、AT指令错误等。需要对可能出现的错误进行处理,例如重新发送指令、检查串口连接等。 7. 其他功能扩展:根据具体需求,还可以实现其他功能,例如接收EC200S主动推送的数据、实现双向通信等。 综上所述,单片机与4G模块EC200S之间的串口通信程序主要包括串口初始化、AT指令发送与接收、响应解析、错误处理等步骤。通过这些步骤,可以实现单片机与4G模块之间的双向通信,并实现各种操作和功能。 ### 回答3: 单片机和4G模块EC200S的串口通信可以通过以下步骤实现: 1. 首先,将单片机的串口与4G模块的串口进行连接。确保连接正确,包括连接正确的引脚和设置正确的电平转换电路。 2. 在单片机的程序中,使用相应的串口通信库来配置和初始化单片机的串口通信功能。 3. 在单片机的程序中,设置好与4G模块通信的波特率、数据位、停止位等参数,确保与4G模块的串口通信参数一致。 4. 编写单片机程序,通过串口向4G模块发送指令或数据。可以使用串口发送函数将指令或数据发送到4G模块。 5. 在单片机程序中,通过串口接收函数接收4G模块返回的数据或响应。可以使用中断或轮询的方式进行接收。 6. 解析和处理4G模块返回的数据。根据4G模块的通信协议,对接收到的数据进行解析和处理,以获取所需的信息或进行相应的操作。 7. 根据需要,可以设置超时机制或错误处理,以确保通信的稳定性和可靠性。 8. 最后,测试和调试单片机与4G模块的串口通信程序,确保正常通信和数据的正确传输。 总之,单片机与4G模块EC200S之间的串口通信需要进行连接、初始化、设置参数、发送指令和数据、接收返回的数据等步骤,并对返回的数据进行解析和处理,以实现双方之间的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值