Kernel / Linux / 软件积累 · 2023年8月22日

高通枚举多ACM接口用于多APN【9X07】

在使用ACM接口前,先来介绍一下高通的MODEM侧与AP侧进行通信交互的中间层,SMD是一个轻量级的处理器中间通信层,它主要专注于在处理器之间的通信,不需要关注数据本身

高通提供一般提供了API用于操作处理器之间,使用SMD即共享内存的API

SMD一般对内,表现为/dev/smdx,常用的有sdm7,sdm8,smd11,smd21, 分别用的的smd数据通道,1,4,11,21;这四个通道

aliases {
    /* smdtty devices */
    smd7 = &smdtty_data1;
    smd8 = &smdtty_data4;
    smd11 = &smdtty_data11;
    smd21 = &smdtty_data21;
    smd36 = &smdtty_loopback;
    /* spi device */
    spi1  = &spi_1;
    i2c4 = &i2c_4;
    sdhc2 = &sdhc_2; /* SDC2 SD card slot */
};

高通内部对MODEM提供了4个通道用于内部芯片之间的通信,除了这4个通道 ,另外还提供了一个modem通道,一个GPS,一个diag诊断口,一个ACM的DS口 用于外部调试。

现在来讲一个如何将内部的4个通道分别映射作为USB的ACM口,或者UART口,其实它们不论映射为ACM口还是UART口,对外来说都可以当作一个普通串口:

    smdtty_data1: qcom,smdtty-data1 {
        qcom,smdtty-remote = "modem";
        qcom,smdtty-port-name = "DATA1";
    };
    smdtty_data4: qcom,smdtty-data4 {
        qcom,smdtty-remote = "modem";
        qcom,smdtty-port-name = "DATA4";
    };

    smdtty_data11: qcom,smdtty-data11 {
        qcom,smdtty-remote = "modem";
        qcom,smdtty-port-name = "DATA11";
    };

    smdtty_data21: qcom,smdtty-data21 {
        qcom,smdtty-remote = "modem";
        qcom,smdtty-port-name = "DATA21";
    };

ACM口新增,首先USB要打开ACM功能就需要先使能

echo 0 > /sys/class/android_usb/android0/enable

//#echo smd,smd,smd > /sys/class/android_usb/android0/f_serial/transports

echo smd,smd,smd > /sys/class/android_usb/android0/f_acm/acm_transports

echo acm > /sys/class/android_usb/android0/functions

echo 1 > /sys/devices/virtual/android_usb/android0/enable

其次要新增口,并放开对ACM口的限制

define SMD_N_PORTS 3-4 //最多只能有4个口

struct smd_port_info {
struct smd_channel *ch;
char *name;
unsigned long flags;
};

struct smd_port_info smd_pi[SMD_N_PORTS] = {
{
.name = “DS”,
},
{
.name = “DATA11”,
},
{
.name = “DATA4”,
},

};

默认波特率为9600, 8N1

在WINDOWS下,因为ACM需要驱动,有可能会导致WINDOW10-11蓝屏,所有的操作最好的LINUX下进行。

打赏作者