- Linux下域格模组的加载与应用
- 前言
- 一、模组在Linux下驱动加载
- 1.域格在Linux下加载需要使用 USB 转串口的驱动,这个驱动系统基本都是配备的,简单介绍下,添加驱动需要配置 Linux内核
- 2.检测驱动
- 3.驱动创建原理
- 二、模组在Linux下过滤接口以及option.c介绍
- 1.黑名单过滤接口
- 2.interface 过滤接口
- 3.临时加载驱动
- 4.检测过滤情况
- 二、Linux下AT指令交互
前言
Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。意思就是Linux系统蛮重要的,模块在这个系统下的使用是必要的。
一、模组在Linux下驱动加载 1.域格在Linux下加载需要使用 USB 转串口的驱动,这个驱动系统基本都是配备的,简单介绍下,添加驱动需要配置 Linux内核
cd kernel
make menuconfig
device drivers -> usb support -> usb serial converter support
选中如下组件:
USB driver for GSM and CDMA modems
选中后保存配置。
option驱动分别注册到了usb总线和usb-serial总线,当接口驱动和id匹配后,我们通过id可以找到它的驱动,这里即是option驱动,option驱动在注册时就绑定了探测函数usb_serial_probe(),所以会执行它,而在usb_serial_probe()函数内又会调用端口的匹配,即usb_wwan_port_probe(),待这些工作完成之后,最后通过tty_register_device(usb_serial_tty_driver, minor, dev)完成ttyUSBx设备的创建。
具体驱动创建过程可以参考链接: linux options.
在介绍过滤接口之前先介绍option.c,就以域格 ASR模块需加载 DIAG口,AT 口及 modem 口,其他无关端口需过滤,可根据实际情况选择处理
过滤的黑名单方式是kernel 版本支持 blacklist 的,在 option.c (路径一般为 drivers/usb/serial/option.c)中的 option_ids 中添加 blacklist,可使驱动在加载时自动跳过 blacklist 指定的 interface。
在文件中找到 option_ids[]的数组,添加域格模块的 VID 和 PID,模块的PID、VID可以参考上图lsusb所圈,参照以下方法添加VID、PID:
设置 interface 0、1 不加载 option 驱动,添加内容如下:
黑名单过滤源码如下:
static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason,
const struct option_blacklist_info *blacklist)
{
unsigned long num;
const unsigned long *intf_list;
if (blacklist) {
if (reason == OPTION_BLACKLIST_SENDSETUP)
intf_list = &blacklist->sendsetup;
else if (reason == OPTION_BLACKLIST_RESERVED_IF)
intf_list = &blacklist->reserved;
else {
BUG_ON(reason);
return false;
}
添加相应的ID以及黑名单到 option_ids 数组中:代码如下
option_ids格式如下::
static struct usb_serial_driver option_1port_device = {
.driver = { //设备驱驱动
.owner = THIS_MODULE,
.name = "option1", //设备驱动名称
},
.description = "GSM modem (1-port)", //描述符
.id_table = option_ids, //厂商id和产品id表
.num_ports = 1,
.probe = option_probe, //探测之后存储该usb串口设备对应的id(VID/PID)
.open = usb_wwan_open,
.close = usb_wwan_close,
2.interface 过滤接口
还是先添加域格模块的 VID 和 PID:
相比黑名单方式,只需要添加相应的ID到 option_ids 数组中
在 option_probe 函数内判断当前 interface 号进行过滤:
代码如下(示例):
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
struct usb_interface_descriptor *iface_desc =
&serial->interface->cur_altsetting->desc;
struct usb_device_descriptor *dev_desc = &serial->dev->descriptor;
3.临时加载驱动
这个应用于usb驱动加载不了的情况,在命令行发送指令:
sudo modprobe usbserial vendor=0x1286 product=0x4e3c
过滤后模块开机,加载 USB 驱动,获取 USB端口:ttyUSB0~ttyUSB2。
ttyUSB0 -> DIAG
ttyUSB1 -> AT
ttyUSB2 -> Modem
操作AT指令可以使用echo cat,以向 ttyUSB2 发送命令 AT 为例,可按以下命令操作(通过 ctrl+c 退出)
注:附加一个权限错误以示为证。
echo cat一般是用于系统固件不可相关的指令工具,工具就以minicom为例:
命令行输入minicom -s
选择ttyUSB1,波特率相关的也可以设置
直接进入发送AT指令



