正點原子freertos開發手冊(正點原子Linux連載第七十一章Linux)
2023-05-08 06:44:00
1)實驗平臺:正點原子Linux開發板
2)摘自《正點原子I.MX6U嵌入式Linux驅動開發指南》關注官方微信號公眾號,獲取更多資料:正點原子
第七十一章Linux 4G通信實驗前面我們學習了如何在Linux中使用有線網絡或者WIFI,但是使用有線網絡或者WIFI有很多限制,因為要布線,即使是WIFI你也得先布線,然後在接個路由器。有很多場合是不方便布線的,這個時候就是4G大顯身手的時候,產品可以直接通過4G連接到網絡,實現無人值守。本章我們就來學一下如何在I.MX6U-ALPHA開發板中使用4G來實現聯網功能。
71.1 4G網絡連接簡介提起4G網絡連接,大家可能會覺得是個很難的東西,其實對於嵌入式Linux而言,4G網絡連接恰恰相反,不難!大家可以看一下其他的嵌入式Linux或者Android開發板,4G模塊都是MiniPCIE接口的,包括很多4G模塊都是MiniPCIE接口的。但是大家稍微深入研究一下就會發現,這些4G模塊雖然用了MiniPCIE接口,但是實際上的通信接口都是usb,所以4G模塊的驅動就轉換為了USB驅動。而這些4G模塊廠商都提供了詳細的文檔講解如何在Linux下使用4G模塊,以及如何修改Linux內核加入4G模塊驅動。正點原子的I.MX6U-ALPHA開發板也有一個MiniPCIE形式的4G模塊接口,雖然外形是MiniPCIE的,但是內心卻是USB的。I.MX6U-ALPHA開發板的4G模塊原理圖如圖71.4.1所示:
圖71.4.1 4G模塊原理圖
圖71.4.1中的U8就是MiniPCIE接口,MiniPCIE接口連接到了GL850這個HUB晶片的DP2和DM2,也就是GL850的USB2接口上。U11就是Nano SIM接口,I.MX6U-ALPHA開發板使用Nano SIM卡,這樣大家就可以直接拿自己的手機卡進行測試。I.MX6U-ALPHA開發板的4G接口位置如圖71.1.2所示:
圖71.1.2 ALPHA開發板4G接口
在使用之前需要將4G模塊插入到圖71.1.2所示的MiniPCIE接口上,然後上緊兩邊的螺絲,Nano SIM卡插入到圖71.1.2中的Nano SIM座裡面,注意Nano SIM卡的方向!
Nano SIM卡的金屬觸點朝下!
Nano SIM卡的金屬觸點朝下!
Nano SIM卡的金屬觸點朝下!
理論上所有的MiniPCIE接口的4G模塊都可以連接到正點原子的I.MX6U-ALPHA開發板上,因為這些4G模塊都遵循同樣的接口標準,但是大家在使用的時候還是要詳細的看一下4G模塊的接口引腳描述。不同的4G模塊其驅動形式也不同,本章我們講解兩款4G模塊在I.MX6U-ALPHA開發板上的使用,一個是上海移遠公司的EC20,另外一個是高新興物聯的ME3630,這兩款4G模塊都有MiniPCIE接口的,這兩個4G模塊如圖71.4.2所示:
圖71.4.2 4G模塊
圖71.4.2中左側的是高新興物聯的ME3630-W 4G模塊,右側的是上海移遠的EC20 4G模塊。本章我們就分別來講解一下如何在I.MX6U-ALPHA開發板上使用EC20和ME3630這兩個4G模塊。
4G模塊工作是需要天線的,因此在選購4G模塊的時候一定要記得購買天線,否則無法進行測試。一般MiniPCIE接口的4G模塊留出來的天線接口為IPEX座,因此購買天線的時候也要選擇IPEX接口的,或者使用IPEX轉SMA線來轉接。推薦大家到正電原子官方店鋪購買4G模塊和相應的天線。
71.2高新興ME3630 4G模塊實驗71.2.1 ME3630 4G模塊簡介ME36304G模塊是正點原子官方推薦的4G通信模塊,ME3630 4G模塊是深圳高新興物聯出品的4G LTE模塊,前身是中興物聯,正點原子是高新興物聯官方代理商,因此在模塊質量以及售後服務這一塊是有保證的。
ME3630是一款LTE Cat.4七模全網通4G模塊,在LTE模式下可以提供50Mbps上行速率以及150Mbps的下行速率,並支持回退到3G或2G網絡。此模組支持分集接收、分集接收是終端產品支持雙天線以提高通信質量和通信可靠性的無線連接技術。ME3630支持多種網絡協議,比如PAP、CHAP、PPP等,擁有多種功能,比如GNSS、Remotewakeup、SMS、支持FoTA空中升級等。ME3630 4G模塊廣泛應用於智能抄表、安防信息採集、工業路由器、車載通信以及監控等等M2M領域。ME3630 4G模組特性如下:
①、一路USB2.0接口。
②、一路UART接口。
③、SIM卡接口支持1.8/3.0V。
④、內置TCP、UDP、FTP和HTTP等協議。
⑤、支持RAS/ECM/NDIS。
⑥、支持AT指令。
ME3630 4G模塊有多種配置,比如純數據版本、集成GNSS版本、全網通版本等等,本節教程我們主要使用到ME3630的數據通信功能,因此推薦大家購買全網通數據版,如果想要定位功能的話就購買全網通數據 GNSS版本,至於其他的版本大家根據自己的實際需求選擇即可。在正式使用ME3630 4G模塊之前,請先將其插入到開發板的MiniPCIE座上、上緊螺、插入Nano SIM卡、接上天線,如圖71.2.1.1所示:
圖71.2.1.1 ALPHA開發板連接ME3630模塊
一切準備就緒以後就可以開始驅動ME3630 4G模塊了。
71.2.2 ME3630 4G模塊驅動修改1、添加USB設備信息
我們需要先在Linux內核中添加ME3630的USB設備信息,因為我們前面說了,ME3630 4G模塊用的USB接口。打開Linux源碼的drivers/usb/serial/option.c文件,找到options_ids數組,然後在裡面添加ME3630的PID和VID,要添加的內容如下:
示例代碼71.2.2.1 ME3630 PID和VID信息
1{ USB_DEVICE(0x19d2,0x0117)},/* ME3630*/
2{ USB_DEVICE(0x19d2,0x0199)},
3{ USB_DEVICE(0x19d2,0x1476)},
完成以後的options_ids數組如圖71.2.2.1所示:
圖71.2.2.1 添加PID和VID後的option_ids數組
2、添加ECM支持程序
ME3630支持ECM接口,可以通過ECM接口輕鬆聯網,如果要使用ECM接口的話需要修改drivers/usb/serial/option.c文件裡面的option_probe函數。找到此函數,然後在裡面輸入如下內容:
示例代碼71.2.2.2 option_probe函數需要添加的內容
1/* EM3630 */
2if(serial->dev->descriptor.idVendor ==0x19d2&&
3 serial->dev->descriptor.idProduct ==0x1476&&
4 serial->interface->cur_altsetting->desc. binterfaceNumber ==3)
5 return-ENODEV;
6
7if(serial->dev->descriptor.idVendor ==0x19d2&&
8 serial->dev->descriptor.idProduct ==0x1476&&
9 serial->interface->cur_altsetting->desc. bInterfaceNumber ==4)
10 return-ENODEV;
11
12if(serial->dev->descriptor.idVendor ==0x19d2&&
13 serial->dev->descriptor.idProduct ==0x1509&&
14 serial->interface->cur_altsetting->desc. bInterfaceNumber ==4)
15 return-ENODEV;
16
17if(serial->dev->descriptor.idVendor ==0x19d2&&
18 serial->dev->descriptor.idProduct ==0x1509&&
19 serial->interface->cur_altsetting->desc. bInterfaceNumber ==5)
20 return-ENODEV;
添加完成以後的option_probe函數如圖71.2.2.2所示:
圖71.2.2.2 向option_probe添加的內容
3、配置Linux內核
我們需要配置Linux內核,首先使能USBNET功能,路徑如下:
-> Device Drivers
->-*- Network device support
-> USB Network Adapters
-> -*- Multi-purpose USB Networking Framework
配置如圖71.2.2.3所示:
圖71.2.2.3 使能USB網絡
接下來我們還需要使能USB串口GSM、CDMA驅動,配置路徑如下:
-> Device Drivers
-> [*] USB support
->USB Serial Converter support
-> USB driver for GSM and CDMA modems
配置如圖71.2.2.4所示:
圖71.2.2.4 USB GSM和CDMA
繼續配置Linux內核,使能USB的CDC ACM模式,配置路徑如下:
-> Device Drivers
->[*] USB support
->Support for Host-side USB
-> USB Modem (CDC ACM) support
配置如圖71.2.2.5所示:
圖71.2.2.5 使能USB的CDC ACM功能
關於Linux內核的配置就到此為止,編譯一下Linux內核,然後使用新的zImage啟動開發板。如果ME3630已經插上的話,系統啟動以後就會輸出如圖71.2.2.6所示的信息:
圖71.2.2.6 ME3630虛擬USB信息
從圖71.2.2.6可以看出,ME3630虛擬出了3個USB設備,分別為ttyUSB0~ttyUSB2。對於支持ECM接口的4G模塊來講,比如ZM5330/ZM8620/ME3620/ME3630。如果模塊工作在ECM模式下,可以通過運行"ifconfig -a"命令查看對應的網卡,網卡的名字可能為usbX/ecmX/ethX等,X是具體的數字,如果存在的話就說明ECM接口驅動加載成功。輸入"ifconfig -a"命令,會發現多了一個名為"usb0"的網卡,圖71.2.2.7所示:
圖71.2.2.7 ME3630對應的usb0網卡
71.2.3 ME3630 4G模塊ppp聯網測試1、使能Linux內核ppp功能
ME3630支持通過ppp撥號上網,也是支持使用ECM接口上網,我們先來學習一下如何通過ppp撥號上網。首先我們需要配置Linux內核,打開Linux內核的ppp功能,配置路徑如下:
-> Device Drivers
-> [*] Network device support
->PPP (point-to-point protocol) support
-> PPP BSD-Compress compression
-> PPP Deflate compression
-> [*] PPP filtering
-> PPP MPPE compression (encryption)
-> [*] PPP multilink support
-> PPP over Ethernet
-> PPP support for async serial ports
-> PPP support for sync tty ports
配置完成以後如圖71.2.3.1所示:
圖71.2.3.1 Linux內核PPP使能
配置完成以後重新編譯一下Linux內核,得到新的zImage鏡像文件,然後使用新的zImage鏡像文件啟動開發板。
2、移植pppd軟體
我們需要通過pppd這個軟體來實現ppp撥號上網,這個軟體需要我們移植。
在移植之前先刪除掉/usr/sbin/chat這個軟體!
在移植之前先刪除掉/usr/sbin/chat這個軟體!
在移植之前先刪除掉/usr/sbin/chat這個軟體!
我們使用Busybox製作根文件系統的時候會生成/usr/sbin/chat這個軟體,我們一會移植pppd的時候也會編譯出chat軟體。因此需要將根文件系統中原來的/usr/sbin/chat軟體刪除掉,否則的話我們移植的chat軟體工作將會出問題!
pppd源碼已經放到了開發板光碟中,路徑為:1、例程源碼->7、第三方庫源碼-> ppp-2.4.7.tar.gz,將ppp-2.4.7.tar.gz拷貝到Ubuntu下並解壓,解壓以後會生成一個名為ppp-2.4.7的文件夾。進入到ppp-2.4.7目錄中,然後編譯pppd源碼,命令如下:
cd ppp-2.4.7/
make CC=arm-linux-gnueabihf-gcc //編譯
編譯完成以後就會在當前目錄下生成chat/chat、pppd/pppd、pppdump/pppdump和pppstats/pppstats這四個文件,將這個四個文件拷貝到開發板根文件系統中的/sur/bin目錄下,命令如下:
sudo cp chat/chat /home/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppd/pppd /home/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppdump/pppdump /home/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppstats/pppstats /home/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
完成以後輸入"pppd-v"查看一下pppd的版本號,如果pppd版本號顯示正常的話就說明pppd移植成功,如圖71.2.3.2所示:
圖71.2.3.2 pppd版本號信息
3、ppp上網測試
在使用pppd進行撥號上網之前需要先創建4個文件,這個4個文件必須放到同一個目錄下。在開發板根文件系統下創建/etc/gosuncn目錄,進入到剛剛創建的/etc/gosuncn目錄下,然後新建一個名為"ppp-on"的shell腳本文件,在ppp-on文件裡面輸入如下所示內容:
示例代碼71.2.3.1 ppp-on文件內容
1 #!/bin/sh
2 clear
3 OPTION_FILE="gosuncn_options"
4 DIALER_SCRIPT=$(pwd)/gosuncn_ppp_dialer
5 exec pppd file $OPTION_FILE connect "chat -v -f ${DIALER_SCRIPT}"
再新建一個名為"gosuncn_option"的文件,在文件裡面輸入如下所示內容:
示例代碼71.2.3.2 gosuncn_option文件內容
1/dev/ttyUSB2
2115200
3 crtscts
4 modem
5 persist
6 lock
7 noauth
8 noipdefault
9 debug
10 nodetach
11 user Anyname
12 password Anypassword
13 ipcp-accept-local
14 ipcp-accept-remote
15 defaultroute
16 usepeerdns
17 noccp
18 nobsdcomp
19 novj
20 dump
第1行,如果是聯通或移動的卡就是用ttyUSB2,如果是電信的卡就是用ttyUSB0。
第11~12行,這兩行內容和所使用的卡有關,如果是聯通或者移動的卡就按照上面的寫,如果是電信的卡,要改為如下所示內容:
usercard
passwordcard
再新建一個名為"gosuncn_ppp_dialer"的文件,輸入如下所示內容:
示例代碼71.2.3.3 gosuncn_ppp_dialer文件內容
1 ABORT "NO CARRIER"
2 ABORT "ERROR"
3 TIMEOUT 120
4"" ATE
5 SAY "ATE"
6 ECHO ON
7 OK ATH
8 OK ATP
9 OK AT CGDCONT=1,\"IP\",\"3GNET\"
10 OK ATD*99#
11 CONNECT
第9行,後面的3GNET是網絡的APN碼,這個要根據自己所使用的手機卡來確定,聯通卡的APN為3GNET,移動卡的APN為CMNET。因為我使用的是聯通卡進行測試的,所有這裡設置APN為3GNET,如果使用的移動卡,那麼要將APN設置為CMNET。如果是電信的卡,那麼第9行要改為:
OK "AT ZCAPN=card,card"
第10行,如果是聯通或移動的卡,那麼第10行就不變。如果是電信的卡,那麼第10行要改為:
OK ATD#777
最後新建一個名為"disconnect"的shell腳本,輸入如下所示內容:
示例代碼71.2.3.4 disconnect文件內容
1 #!/bin/sh
2 killall pppd
這四個文件編寫完成以後要給予ppp-on和disconnect這兩個文件可執行權限,命令如下:
chmod 777 ppp-on disconnect
完成以後輸入如下命令連接4G網絡:
./ppp-on &
在ME3630連接4G網絡的過程中,可能會出現如圖71.2.3.3所示的錯誤提示:
圖71.2.3.3ppp撥號上網錯誤提示
從圖71.2.3.3可以看出,提示不能創建"Can't create lock file /var/lock/LCK..ttyUSB2",檢查根文件系統是否存在/var/run和/var/lock這兩個目錄,如果沒有的話就手動創建這兩個文件夾,命令如下:
mkdir /var/run //創建/var/run文件夾
mkdir /var/lock //創建/var/lock文件夾
完成以後重新輸入"./pppd-on &"命令連接4G網絡,連接成功以後會輸入如圖71.2.3.4所示信息:
圖71.2.3.4 4G網絡連接信息
從圖71.2.3.4可以看出,在ME3630 4G模塊聯網過程中,需要用到/etc/ppp/resolv.conf文件,但是我們當前根文件系統沒有此文件,所以需要手動創建此文件。創建完成以後重啟開發板!開發板重啟以後進入到/etc/gosuncn目錄,然後輸入如下命令完成撥號上網:
./ppp-on &
ppp撥號成功以後就會生成一個名為"ppp0"的網卡,如圖71.2.3.5所示:
圖71.2.3.5 ppp0網卡信息
4G網絡測試需要關閉其他網卡,否則的話網絡測試可能有問題,但是我們現在是通過網絡啟動的系統,並且通過NFS掛載的根文件系統,因此我們沒法關閉其他的網卡,比如eth0。為了解決這個問題,我們只能將uboot、Linuxkernel、.dtb設備樹和根文件系統都燒寫到板子的EMMC或NAND上,然後直接啟動EMMC或NAND上的系統即可,這樣就不需要其他網卡工作了。燒寫方法請參考我們的《第二十九章系統燒寫》,這裡就不詳細的講解了。系統燒寫完成以後設置開發板從EMMC或NAND啟動,因為我使用的是EMMC核心板,因此設置從EMMC啟動,啟動以後按照前面的步驟先讓ME3630 4G模塊連接上網絡。確保當前開發板只有一個ME3630對應的ppp0網卡,最後直接ping百度官網即可,結果如圖71.2.3.6所示:
圖71.2.3.6 ME3630 4G模塊ping百度官網
71.2.4 ME3630 4G模塊ECM聯網測試對於支持ECM接口的模塊可以直接通過ECM上網,ME3630模塊支持ECM接口,重啟開發板,輸入"ifconfig-a"命令可以看到有一個名為"usb0"的網卡,如圖71.2.4.1所示:
圖71.2.4.1 usb0網卡
這個usb0網卡就是ECM接口對應的網卡,我們需要使用minicom輸入一些AT指令,所以要先用minicom打開ttyUSB1,ttyUSB1就是ME3630的AT指令串口,波特率設置為115200。打開以後依次輸入如下指令:
①、輸入AT指令:
AT ZSWITCH=L
然後重啟開發板。如果模塊已經設置為ECM模式的話此步驟就不需要了。
②、使用AT指令 CGDCONT來設置數據參數。聯通卡的APN為3gnet,電信卡的APN為ctnet,移動卡的APN為cmnet。比如我現在用的聯通卡,所以設置APN為3gnet,命令如下:
AT CGDCONT=1,"IP","CMNET"
③、發送連接AT命令:
AT ZECMCALL=1
等待連接成功,連接成功以後會輸出如圖71.2.4.2所示信息:
圖71.2.4.2 ME3630 ECM接口網路連接成
功
連接成功以後打開usb0網卡,命令如下:
ifconfigusb0 up //打開usb0網卡
usb0網卡打開以後輸入如下命令獲取IP位址:
udhcpc -i usb0
IP位址獲取過程如圖71.2.4.3所示:
圖71.2.4.3 usb0網卡獲取IP位址過程
從圖71.2.4.3可以看出,usb0網卡獲取到的IP位址為10.164.232.36,然後ping一下百度官網,如果能ping通就說明ME3630的ECM接口聯網成功。如果提示"bad address 'www.baidu.com'",那麼請檢查一下DNS伺服器地址設置是否正確,打開/etc/resolv.conf文件,然後加入"nameserver 114.114.114.114"即可。
至此ME3630 4G模塊的網絡連接就已經全部測試完成,大家既可以在正點原子的I.MX6U-ALPHA開發板上使用4G上網了。
71.3 EC20 4G模塊實驗71.3.1 EC20 4G模塊簡介關於EC20 4G模塊的詳細資料請找賣家索要!
EC20有多種不同的配置,比如全網通純數據版本、語音版、帶GNSS版等等,建議大家購買的時候至少要選擇全網通數據版,因為我們使用4G模塊主要還是用於數據通信的。移遠的EC20 4G模塊採用LTE 3GPP Rel.11技術,支持最大下行速率150Mbps,最大上行速率50Mbps。EC20 4G模塊特性如下:
1、一路USB2.0高速接口,最高可達480Mbps。
2、一組模擬語音接口(可選)。
3、1.8V/3.0V SIM接口。
4、1個UART接口。
5、W_DISABLE#(飛行模式控制)。
6、LED_WWAN#(網絡狀態指示)。
EC20也支持AT指令,本教程不講AT指令,關於AT指令的使用請參考EC20的相關文檔。在正式使用EC20 4G模塊之前,請先將其插入到開發板的MiniPCIE座上、上緊螺、插入Nano SIM卡、接上天線,如圖71.3.1.1所示:
一切準備就緒以後就可以開始驅動EC20 4G模塊了。
71.3.2 EC20 4G模塊驅動修改1、添加USB設備信息
我們需要先在Linux內核中添加EC20的USB設備信息,因為我們前面說了,EC20 4G模塊用的USB接口。打開Linux源碼的drivers/usb/serial/option.c文件,首先定義EC20的ID宏,內容如下:
示例代碼71.3.2.1 EC20 4G模塊ID
1/* EC20 4G */
2 #define QUECTEL_VENDOR_ID 0X2C7C
3 #define QUECTEL_PRODUCT_EC20 0X0125
完成以後如圖71.3.2.1所示:
繼續在drivers/usb/serial/option.c文件裡面找到option_ids數組,在此數組裡面加入如下內容:
示例代碼71.3.2.2 option_ids數組添加EC20 ID信息
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC20)},/* EC20 4G */
完成以後option_ids數組如圖71.2.2.2所示:
繼續在drivers/usb/serial/option.c文件裡面找到option_probe函數,在此函數裡面添加如下內容:
示例代碼71.3.2.3 option_probe函數添加的代碼
1 /* EC20 */
2if(dev_desc->idVendor == cpu_to_le16(0x05c6)&&
3 dev_desc->idProduct == cpu_to_le16(0x9003)&&
4 iface_desc->bInterfaceNumber >=4)
5 return-ENODEV;
6
7if(dev_desc->idVendor == cpu_to_le16(0x05c6)&&
8 dev_desc->idProduct == cpu_to_le16(0x9215)&&
9 iface_desc->bInterfaceNumber >=4)
10 return-ENODEV;
11
12if(dev_desc->idVendor == cpu_to_le16(0x2c7c)&&
13 iface_desc->bInterfaceNumber >=4)
14 return-ENODEV;
添加完成以後的option_probe函數如圖71.3.2.3所示:
圖71.3.2.3修改後的option_probe函數
繼續在drivers/usb/serial/option.c文件裡面找到option_1port_device結構體變量,在裡面加入休眠後喚醒接口,如圖71.3.2.4所示:
圖71.3.2.4添加的休眠喚醒接口
打開drivers/usb/serial/usb_wwan.c文件,在usb_wwan_setup_urb函數中添加零包處理代碼,完成後的usb_wwan_setup_urb函數如下所示:
示例代碼71.3.2.4 修改後的usb_wwan_setup_urb函數
1staticstruct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
2int endpoint,
3int dir,void*ctx,char*buf,int len,
4void(*callback)(struct urb *))
5{
6 struct usb_serial *serial = port->serial;
7 struct urb *urb;
8
9 urb = usb_alloc_urb(0, GFP_KERNEL);/* No ISO */
10 if(!urb)
11 returnNULL;
12
13 usb_fill_bulk_urb(urb, serial->dev,
14 usb_sndbulkpipe(serial->dev, endpoint)| dir,
15 buf, len, callback, ctx);
16
17 /* EC20 */
18 if(dir == USB_DIR_OUT){
19 struct usb_device_descriptor *desc =
&serial->dev->descriptor;
20 if(desc->idVendor == cpu_to_le16(0x05c6)&&
21 desc->iProduct == cpu_to_le16(0x9090))
22 urb->transfer_flags |= URB_ZERO_PACKET;
23
24 if(desc->idVendor == cpu_to_le16(0x05c6)&&
25 desc->iProduct == cpu_to_le16(0x9003))
26 urb->transfer_flags |= URB_ZERO_PACKET;
27
28 if(desc->idVendor == cpu_to_le16(0x05c6)&&
29 desc->iProduct == cpu_to_le16(0x9215))
30 urb->transfer_flags |= URB_ZERO_PACKET;
31
32 if(desc->idVendor == cpu_to_le16(0x2c7c))
33 urb->transfer_flags |= URB_ZERO_PACKET;
34 }
35
36 return urb;
37}
第18~34行就是要添加到usb_wwan_setup_urb函數裡面的零包處理代碼。至此,Linux內核需要修改的地方就完了。編譯一下Linux內核,檢查一下代碼修改有沒有問題,如果修改正確的話就是沒有任何問題的。
2、配置Linux內核
我們需要配置Linux內核,使能USB NET、GSM、CDMA驅動等,配置方法和我們在71.2.2小節講解的ME3630 4G模塊的配置方法一樣,大家參考71.2.2小節即可。配置完成以後編譯一下Linux內核,然後使用新的zImage啟動開發板。如果EC20已經插上的話,系統啟動以後就會輸出如圖71.3.2.5所示的信息:
圖71.3.2.5 EC20虛擬出的USB接口
從圖71.3.2.5可以看出,多了ttyUSB0~ttyUSB3,這4個tty接口就是EC20虛擬出來的,可以查看一下/dev/ttyUSB0~ttyUSB3是否存在,結果如圖71.3.2.6所示:
圖71.3.2.6 EC20虛擬出來的tty接口
圖71.3.2.6中的這4路ttyUSB的含義見表71.3.2.1:
表71.3.2.1四路ttyUSB函數
我們用到最多的就是ttyUSB1和ttyUSB2,如果你購買的EC20模塊帶有GPS功能,那麼就可以通過ttyUSB1接口讀取GPS數據。如果你想使用EC20的AT指令功能,那麼就使用ttyUSB2接口即可。
3、添加移遠官方的GobiNet驅動
移遠為EC20提供了GobiNet驅動,驅動源碼我們已經放到了開發板光碟中,路徑為:1、例程源碼->5、模塊驅動源碼->3、4G模塊->移遠EC20\EC20_R2.1_Mini_PCIe-C->05 Driver->Linux->GobiNet-> Quectel_WCDMA<E_Linux&Android_GobiNet_Driver_V1.3.0.zip。將Quectel_WCDMA<E_Linux&Android_GobiNet_Driver_V1.3.0/src下的所有.c和.h文件都拷貝到Linux內核中的/driver/net/usb目錄下,也就是圖71.3.2.7中所示的文件:
圖71.3.2.7 需要拷貝的文件
拷貝完成以後打開Linux內核的drivers/net/usb/Makefile文件,在此文件末尾加入如下內容:
示例代碼71.3.2.5 修改後的drivers/net/usb/Makefile文件
1 obj-$(CONFIG_USB_GOBI_NET) = GobiNet.o
2 GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o
最後在drivers/net/usb/Kconfig文件中加入下所示內容:
示例代碼71.3.2.6 drivers/net/usb/Kconfig要添加的內容
1 config USB_GOBI_NET
2 tristate"Gobi USB Net driver for Quectel module"
3 help
4 Support Quectelmodule.
5
6 A modemmanager with support for GobiNet is recommended.
7 Tocompile this driver as a module, choose M here: the module will be calledGobiNet.1
上述內容在drivers/net/usb/Kconfig文件中的位置如圖71.3.2.8所示:
圖71.3.2.8 內容要添加的位置
完成以後打開Linux內核配置界面,使能前面添加的Gobi驅動,配置路徑如下:
-> Device Drivers
->[*] Network device support
->-*- USB Network Adapters
-> Gobi USB Net driver for Quectel module
配置如圖71.3.2.9所示:
圖71.3.2.9 使能Gobi驅動
配置完成以後就重新編譯一下Linux內核,然後使用新的zImage啟動開發板。啟動以後檢查一下"/dev/qcqmi2"這個文件是否存在,如果存在的話就說明Gobi驅動工作成功。至此,EC20的驅動就已經修改完成了,接下來就是使用EC20來實現聯網。
71.3.3 quectel-CM移植要使用EC20,我們需要用到移遠提供的quectel-CM這個軟體,這個軟體是移遠提供的網絡管理工具,軟體源碼已經放到了開發板光碟中,路徑為:1、例程源碼->5、模塊驅動源碼->3、4G模塊->移遠EC20->EC20_R2.1_Mini_PCIe-C->05 Driver->Linux->GobiNet->WCDMA<E_QConnectManager_Linux&Android_V1.1.34.zip。將WCDMA<E_QConnectManager_Linux&Android_V1.1.34.zip這個壓縮包進行解壓,得到quectel-CM這個文件夾,然後將quectel-CM文件夾拷貝到Ubuntu中。拷貝完成以後進入到Ubuntu中的quectel-CM文件夾,使用如下命令進行交叉編譯:
make CROSS_COMPILE=arm-linux-gnueabihf-
編譯完成以後得到一個名為"quectel-CM"軟體,如圖71.3.3.1所示:
圖71.3.3.1 編譯出來的quectel-CM軟體
將圖71.3.3.1中編譯出來的quectel-CM軟體拷貝到開發板根文件系統的/usr/bin目錄下,命令如下:
sudo cp quectel-CM /home/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
拷貝完成以後就可以使用quectel-CM軟體來實現EC20聯網測試了。
71.3.4 EC20上網測試在開發板上輸入如下命令完成EC20的4G網絡連接:
quectel-CM -s cenet &
注意,quectel-CM軟體會使用到udhcpc來獲取IP位址,所以一定要確保當前根文件系統下存在udhcpc。當4G網絡連接成功以後就會獲取到IP位址,如圖71.3.4.1所示:
圖71.3.4.1 EC20 4G網絡連接成功並獲取到IP位址
從圖71.3.4.1可以看出,EC20對應的網卡名字為"eth2",輸入"ifconfigeth2"即可查看eth2網卡的詳細信息,如圖71.3.4.2所示:
圖71.3.4.2 eth2網卡詳細信息
4G網絡測試需要關閉其他網卡,否則的話網絡測試可能有問題,但是我們現在是通過網絡啟動的系統,並且通過NFS掛載的根文件系統,因此我們沒法關閉其他的網卡,比如eth0。為了解決這個問題,我們只能將uboot、Linuxkernel、.dtb設備樹和根文件系統都燒寫到板子的EMMC或NAND上,然後直接啟動EMMC或NAND上的系統即可,這樣就不需要其他網卡工作了。燒寫方法請參考我們的《第二十九章系統燒寫》,這裡就不詳細的講解了。系統燒寫完成以後設置開發板從EMMC或NAND啟動,因為我使用的是EMMC核心板,因此設置從EMMC啟動,啟動以後按照前面的步驟先讓EC20連接上網絡。確保當前開發板只有一個EC20對應的eth2網卡,然後直接直接ping百度官網即可,結果如圖71.3.4.3所示:
圖71.3.4.3 ping百度官網成功
如果ping百度官網沒有問題,那麼就表示EC20 4G模塊在我們的I.MX6U-ALPHA開發板上工作
,