最近做一个项目需要用到5G模块,写个博客记录一下调试过程。调试尚未完成,先调到哪写到哪。使用的开发板是ADI公司的ADSP-SC589开发板,Linux内核版本是**经过ADI公司剪裁的4.0.0版本。**使用的内核版本不同操作会有差异,请大家多多留意。
1 修改源代码
1.1 添加VID和PID
查看文件 内核源码目录/include/linux/usb.h 中是否包含以下宏定义,如没有则添加:
#define USB_DEVICE_INTERFACE_CLASS(vend, prod, cl) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
USB_DEVICE_ID_MATCH_INT_CLASS, \
.idVendor = (vend), \
.idProduct = (prod), \
.bInterfaceClass = (cl)
如果内核版本大于3.2,小于4.4.131,则对文件 内核源码目录/drivers/usb/serial/option.c 做以下修改:
- 添加宏定义:
#define SIMCOM_VENDOR_ID 0x1e0e
- 添加结构体:
static const struct option_blacklist_info simcom_pid9001_blacklist = {
.reserved = BIT(5) | BIT(6),
};
static const struct option_blacklist_info simcom_pid9011_blacklist = {
.reserved = BIT(7),
};
- 在结构体
static const struct usb_device_id option_ids[]
中添加以下内容:
{USB_DEVICE(SIMCOM_VENDOR_ID, 0x9001),
.driver_info = (kernel_ulong_t)&simcom_pid9001_blacklist },
{USB_DEVICE_INTERFACE_CLASS(SIMCOM_VENDOR_ID, 0x9011, 0xff), /* Simcom SIM8200 RNDIS mode */
.driver_info = (kernel_ulong_t)&simcom_pid9011_blacklist },
- 如果文件中包含以下内容,将其删除:
{ USB_DEVICE(ALINK_VENDOR_ID, SIMCOM_PRODUCT_SIM7100E),
.driver_info = (kernel_ulong_t)&simcom_sim7100e_blacklist },
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9011, 0xff),
1.2 修改QMI WWAN驱动
首先查看 内核源码目录/drivers/net/usb/qmi_wwan.c 文件中是否含有以下内容,如果包含则删除:
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}
{QMI_FIXED_INTF(0x1e0e, 0x9001, 5)},
将simcom官方提供的驱动文件qmi_wwan_simcom.c拷贝进目录 **内核源码目录/drivers/net/usb/**下,并修改该目录下的Makefile如下:
obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan_simcom.o
obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
2 编译驱动模块
进入Linux内核的menuconfig配置界面:
进入Device Drivers —> USB support —> USB Serial Converter support —> USB driver for GSM and CDMA modems,将其配置为编译成模块。
进入Device Drivers —> Network device support —> USB Network Adapters —> QMI WWAN driver for Qualcomm MSM based 3G and LTE modems,将其配置为编译成模块。
配置完成后,在内核源码目录下执行make指令,重新编译内核。
3 加载驱动模块
3.1 安装depmod
在内核中加载驱动模块需要使用depmod指令来确定模块依赖关系,但很多文件系统都不支持depmod,其中也包括我使用的buildroot。本节介绍如何让使用buildroot构建的文件系统支持depmod指令。
- 进入 内核源码目录output/build/busybox-x.xx.x ,执行make menuconfig ,进入Linux Module Utilities 菜单。
- 选中insmod,rmmod,lsmod,modprobe,depmod,保存退出,然后将当前目录下的.config文件覆盖掉 内核源码目录package/busybox/busybox.config 文件,之后在buildroot根目录下执行make指令重新编译。新生成的文件系统即支持depmod指令。
3.2 加载模块
使用ssh命令将编译好的option.ko、qmi_wwan.ko、qmi_wwan_simcom.ko文件拷贝到开发板。其中option.ko拷贝到开发板下/lib/modules/4.0.0-ADI-1.3.1/kernel/drivers/usb/serial目录,qmi_wwan.ko和qmi_wwan_simcom.ko拷贝到开发板下/lib/modules/4.0.0-ADI-1.3.1/kernel/drivers/net/usb目录。
执行以下命令:
depmod
modprobe option.ko
modprobe qmi_wwan.ko
modprobe qmi_wwan_simcom.ko
之后使用lsmod即可查看模块是否被正确加载。