一、概述
提起 4G 网络连接,大家可能会觉得是个很难的东西,其实对于嵌入式 Linux 而言,4G 网络连接恰恰相反,不难!大家可以看一下其他的嵌入式 Linux 或者 Android 开发板,4G 模块都是 MiniPCIE 接口的,包括很多 4G 模块都是 MiniPCIE 接口的。但是大家稍微深入研究一下就会发现,这些 4G 模块虽然用了 MiniPCIE 接口,但是实际上的通信接口都是 USB,所以 4G 模块的驱动就转换为了 USB 驱动。而这些 4G 模块厂商都提供了详细的文档讲解如何在 Linux 下使用 4G 模块,以及如何修改 Linux 内核加入 4G 模块驱动。
二、确认硬件接口
1、原理图:
2、供电:
需软件配置对应GPIO拉高
3、RESET:
手册上说明是低有效,使用是拉高
但具体介绍中提到,模块接收到1s低电平信号后复位硬件。它在内部上拉到VDD_1V8,不需要在外部上拉。
三、软件配置
1、添加 PID 和 VID
在解压的内核代码 dirvers/usb/serial/option.c 文件中的 option_ids 数组下面加
入 L501 模块 的 VID 和 PID:
某些 linux 下的版本会有 rndis 网口无法正确枚举问题,如果遇到,请修改内核 option.c文件中的 option_probe 函数,增加如下判断条件代码:(PID VID根据实际情况修改)
2、内核配置
RNDIS
USBNET
如使用PPP的话,将其相关的全部勾选,还有其他相应模块就不一一例举
四、编译测试
模块上电开机,在 Linux 下使用 lsusb 查看目前模块的 PID 和 VID 是否为内核修改编译的 PID 和 VID
奇怪的问题出现了,在lsusb时一直未出现我们添加的PID和VID
万用表测量供电脚,以及模块的电压是否正常
测量后均为正常,之后就怀疑是不是复位脚的问题,但是上述手册已经提到不用进行操作
修改尝试,LTE_MOUDLE_RST脚的链接到了DISP0_CLK
查看手册得知为GPIO4_IO16
GPIO 号计算公式: (n-1)*32 +m
(M-1)*32+n = (4-1)*32+16=112
修改GPIO状态测试
GPIO 同样也是通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示:
root@qiyang:~# echo 112 > /sys/class/gpio/export
root@qiyang:~# echo out > /sys/class/gpio/gpio112/direction
root@qiyang:~# echo 0 > /sys/class/gpio/gpio112/value
再次lsusb时,成功
添加脚本文件
#!/bin/sh
RESET_GPIO=112
#PWR_GPIO=89
io_cfg() {
if [ ! -d /sys/class/gpio/gpio${RESET_GPIO} ];then
echo ${RESET_GPIO} > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio${RESET_GPIO}/direction
echo 0 > /sys/class/gpio/gpio${RESET_GPIO}/value
fi
}
start() {
io_cfg
while [ ! -e /dev/ttyUSB2 ];do
usleep 50000
done
udhcpc -i eth1
sleep 3
echo -e "AT+QNETDEVCTL=1,1,1\r\n" > /dev/ttyUSB2
#pppd call quectel-ppp&
#/etc/init.d/quectel-CM &
#sleep 30
#ifconfig eth0 up
#ifconfig eth1 up
}
stop() {
#killall pppd
#killall quectel-CM
echo -e "AT+QNETDEVCTL=0,1,1\r\n" > /dev/ttyUSB2
pwr_off
}
if [ -z $1 ];then
echo "usage:"
echo "\t./ec20.sh start|stop|restart"
exit 0
fi
if [ $1 = "start" ];then
start
#while [ ! -e /dev/ttyUSB23 ];do
# usleep 50000
#done
fi
if [ $1 = "stop" ];then
stop
fi
if [ $1 = "restart" ];then
stop
start
fi
烧录系统,执行如下,成功上网