Am335x 平臺上GSM 3G/4G modem的一些硬件和軟件的雜事

Am335x 平臺上GSM 3G/4G modem的一些硬件和軟件的雜事

 

項目需求

上帝說要有光, 世界就有了光明。

老闆說我們的產品需要移動聯網,我的一個月時間就沒有了。。。

 

 需求細說

既然老闆發話, 做小弟的只能埋頭苦幹了。

第一個問題就是硬件如何互聯?

考慮到我們的AM33x平臺開發已經基本完成,萬幸的是其中的兩個USB口全部以擴展口的方式連接出來。

因此最簡單的方式就是直接通過USB口擴展。

直接google “USB GSM”, 出來滿屏的U盤形狀的GSM模塊。 哇, 這麼簡單就解決了。

“老闆, 我們可以直接買一個USB的GSM modem,插到我們的板子上就可以了。”

“真的麼, 用的什麼牌子的產品? 它的尺寸多大?能放入我們的小盒子裏麼?”

“這。。具體牌子還沒有查, 尺寸也不知道。。。”

“滾!”

 

第二個問題能否尋找到適合我們的產品?

於是去下載N家產品資料,查看產品參數,就一個尺寸問題就把所有的產品排除在外。

“爲啥我當初把我們的產品設計的這麼小呢, 我真是自己作孽啊”。

(附註:爲了美觀和其他特性要求,我們的GSM dougle 不能裸露在盒子外面)。

 

第三個問題,在尋尋找找的過程中形成我們自己的需求?

沒有現成的產品, 只剩下一條路了:自己設計。

經過3個臭皮匠的一番海闊天空的泛談, 得出如下結論:

1, 通過USB外擴GSM。

2,使用MiniPCI接口的GSM 模塊,比較簡單,易於更換,而且產家不少。

3,需要自己設計一個簡單PCB板,實現USB到MiniPCIE的轉換。

4,調研GSM模塊在Linux下的驅動移植。是否需要對應的應用程序?

5,對於問題4, 可以先期購買某一產品在PC機上測試。

具體開發

分爲硬件設計和軟件開發(BSP支持)

硬件開發

這個硬件是比較簡單的。主要就是把USB的信號線連接到MiniPCIe的接口上。

注意這裏其實並沒有MiniPCIe的接口,只是使用它的物理連接器本身以及他們的電源和地的管腳定義。

1, 將USB信號從am335x的擴展口連接出來。

下圖中的I2C和UART有其他用途,和GSMmodem沒有關係, 請忽略。

 

2,和MiniPCIe接口的連接關係。

從下圖可以看出, AM335x就是D+和D-連接到了Modem中,外加一些GPIO的控制。

需要注意的是Am335x的GPIO是3.3V的電平,而GSM中的一些控制管腳有可能是1.8V的, 需要注意電平轉換。

3,GSM模塊的電源。

GSM模塊可能工作在2G模式下,在該模式下,需要設備提供很大的電流(3A)。

所以電源設計需要滿足最大電流的要求。

4,AM335x USB信號的設計。

這裏按照Am335x的Host模式設計。

5, 完整的電路設計

第一版設計還有一些缺陷,待改正後上傳。

 

6, 參考設計

http://www.imx6rex.com/wp-content/uploads/2016/04/iMX6-Rex-Development-Baseboard-Schematic.pdf

BSP支持

我們的平臺是基於Linux的, 所以需要在Linux進行BSP的移植。

SDK版本: ti-processor-sdk-linux-rt-am335x-evm-04.02.00.09

 

1,DTS文件, 將USB0改爲主設備。

/* USB0 - Peripheral */
&usb0 {
	pinctrl-0 = <&usb0_pins_default>;
	status = "okay";
	dr_mode = "host";
	//dr_mode = "peripheral";
};

2,在menu config 的配置。

我們選用的GSM modem是華爲的ME909s-120p(必須支持國貨)。

從供應商那裏下載了《華爲模塊 Linux內核驅動集成指導》。

雖然該文檔比較舊(2014年版), 不過大體還是夠用。

在該文檔中提及到需要代碼修改, 以及一些具體的配置選項,可能在比較新的LInux內核中不能一一對應。因此需要我們自己動手嘗試。

在此,我將我自己的配置選項貼出:

@@ -1871,8 +1871,17 @@ CONFIG_SMSC_PHY=y
 # CONFIG_VITESSE_PHY is not set
 # CONFIG_XILINX_GMII2RGMII is not set
 # CONFIG_MICREL_KS8995MA is not set
-# CONFIG_PPP is not set
+CONFIG_PPP=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_FILTER=y
+# CONFIG_PPP_MPPE is not set
+CONFIG_PPP_MULTILINK=y
+# CONFIG_PPPOE is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
 # CONFIG_SLIP is not set
+CONFIG_SLHC=m
 
 #
 # Host-side USB support is needed for USB Network Adapter support
@@ -1890,7 +1899,7 @@ CONFIG_USB_NET_AX88179_178A=m
 CONFIG_USB_NET_CDCETHER=m
 # CONFIG_USB_NET_CDC_EEM is not set
 CONFIG_USB_NET_CDC_NCM=m
-# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
+CONFIG_USB_NET_HUAWEI_CDC_NCM=m
 # CONFIG_USB_NET_CDC_MBIM is not set
 # CONFIG_USB_NET_DM9601 is not set
 # CONFIG_USB_NET_SR9700 is not set
@@ -3819,7 +3828,7 @@ CONFIG_USB_R8A66597_HCD=m
 #
 CONFIG_USB_ACM=m
 # CONFIG_USB_PRINTER is not set
-# CONFIG_USB_WDM is not set
+CONFIG_USB_WDM=m
 # CONFIG_USB_TMC is not set
 
 #
@@ -3938,7 +3947,8 @@ CONFIG_USB_SERIAL=m
 # CONFIG_USB_SERIAL_TI is not set
 # CONFIG_USB_SERIAL_CYBERJACK is not set
 # CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SERIAL_OPTION is not set
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
 # CONFIG_USB_SERIAL_OMNINET is not set
 # CONFIG_USB_SERIAL_OPTICON is not set
 # CONFIG_USB_SERIAL_XSENS_MT is not set

3, 驅動的測試和檢測

通過dmesg的信息,查看已經生成ttyUSB0等設備。

root@am335x-evm:~# dmesg | grep usb
[   57.507976] am335x-phy-driver 47401300.usb-phy: GPIO lookup for consumer reset
[   57.508000] am335x-phy-driver 47401300.usb-phy: using device tree for GPIO lookup
[   57.508018] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[   57.508028] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[   57.508037] am335x-phy-driver 47401300.usb-phy: using lookup tables for GPIO lookup
[   57.508049] am335x-phy-driver 47401300.usb-phy: lookup for GPIO reset failed
[   57.508060] am335x-phy-driver 47401300.usb-phy: GPIO lookup for consumer vbus-detect
[   57.508067] am335x-phy-driver 47401300.usb-phy: using device tree for GPIO lookup
[   57.508076] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpios' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[   57.508084] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpio' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[   57.508092] am335x-phy-driver 47401300.usb-phy: using lookup tables for GPIO lookup
[   57.508100] am335x-phy-driver 47401300.usb-phy: lookup for GPIO vbus-detect failed
[   57.508217] 47401300.usb-phy supply vcc not found, using dummy regulator
[   57.646111] am335x-phy-driver 47401b00.usb-phy: GPIO lookup for consumer reset
[   57.646135] am335x-phy-driver 47401b00.usb-phy: using device tree for GPIO lookup
[   57.646154] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[   57.646164] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[   57.646173] am335x-phy-driver 47401b00.usb-phy: using lookup tables for GPIO lookup
[   57.646185] am335x-phy-driver 47401b00.usb-phy: lookup for GPIO reset failed
[   57.646195] am335x-phy-driver 47401b00.usb-phy: GPIO lookup for consumer vbus-detect
[   57.646202] am335x-phy-driver 47401b00.usb-phy: using device tree for GPIO lookup
[   57.646211] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpios' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[   57.646220] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpio' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[   57.646227] am335x-phy-driver 47401b00.usb-phy: using lookup tables for GPIO lookup
[   57.646236] am335x-phy-driver 47401b00.usb-phy: lookup for GPIO vbus-detect failed
[   57.646355] 47401b00.usb-phy supply vcc not found, using dummy regulator
[   57.925713] usbcore: registered new interface driver usbfs
[   57.925823] usbcore: registered new interface driver hub
[   57.926058] usbcore: registered new device driver usb
[   58.194553] musb-hdrc musb-hdrc.0: MUSB HDRC host driver
[   58.200319] musb-hdrc musb-hdrc.0: new USB bus registered, assigned bus number 1
[   58.619238] musb-hdrc musb-hdrc.1: MUSB HDRC host driver
[   58.619307] musb-hdrc musb-hdrc.1: new USB bus registered, assigned bus number 2
[   58.808022] musb-hdrc musb-hdrc.1: VBUS_ERROR in a_wait_vrise (81, <SessEnd), retry #1, port1 00000104
[   58.915451] usb 1-1: new high-speed USB device number 2 using musb-hdrc
[   58.960459] musb-hdrc musb-hdrc.1: VBUS_ERROR in a_wait_vrise (81, <SessEnd), retry #2, port1 00000104
[   59.112908] musb-hdrc musb-hdrc.1: VBUS_ERROR in a_wait_vrise (81, <SessEnd), retry #3, port1 00000104
[   59.265310] musb-hdrc musb-hdrc.1: VBUS_ERROR in a_wait_vrise (80, <SessEnd), retry #3, port1 0008010c
[   62.334720] usbcore: registered new interface driver usbserial
[   62.394630] cdc_ether 1-1:2.0 usb0: register 'cdc_ether' at usb-musb-hdrc.0-1, CDC Ethernet Device, 02:1e:10:1f:00:00
[   62.453873] usbcore: registered new interface driver cdc_ether
[   62.555318] usbcore: registered new interface driver option
[   62.593170] usbserial: USB Serial support registered for GSM modem (1-port)
[   62.693263] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   62.764627] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   62.867403] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[   62.965723] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
[   63.070435] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB4
[   63.098289] cdc_ether 1-1:2.0 usb0: kevent 11 may have been dropped
[   63.106861] cdc_ether 1-1:2.0 usb0: kevent 12 may have been dropped
[   63.106884] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[   67.537071] cdc_ether 1-1:2.0 usb0: kevent 12 may have been dropped
root@am335x-evm:~#

另外通過手動輸入一些簡單的AT命令給ttyUSB0口能夠獲得輸出信息, 進一步確認模塊工作正常。

這個時候, 急匆匆和老闆彙報:

“老闆,老闆, 好消息, 好消息!”

“啥?”

“GSM 模塊能夠正常工作了?”

“真的麼?”

“千真萬確。 你看, 這都有ttyUSB設備了。”

“啥設備, 他能打電話麼, 他能發短信麼, 他能上網了麼?”

“這。。。還不知道如何打電話,發短信,上網?”

“滾!”

 

GSM連接

雖然GSM的驅動已經可以正常工作,而且通過AT命令也能和模塊進行通信,但是GSM模塊還是沒有“用”起來,

即如何讓我們的設備和外部通信,例如能夠ping "www.google.com"?

 

本人在老闆的一番辱罵下, 繼續埋頭苦幹。

google就是好用啊,馬上搜索到對用的文章,在此向文章作者感謝!

https://blog.csdn.net/WXXGoodJob/article/details/78880100

http://www.cnblogs.com/chenfulin5/p/6951290.html?utm_source=itdadao&utm_medium=referral

原來要讓GSM模塊能“用”, 還需要一個pppd的應用來進行撥號連接。

1, 編譯和安裝pppd

在默認的Ti SDK中是沒有pppd的命令的, 即需要我們自己編譯和安裝。

編譯步驟參考Ti的e2e論壇。

https://e2e.ti.com/support/arm/sitara_arm/f/791/t/666632?PROCESSOR-SDK-AM335X-Package-installation

我把具體的步驟拷貝如下:

Do these steps on your computer.

$ sudo apt-get install git build-essential python diffstat texinfo gawk chrpath dos2unix wget unzip socat doxygen libc6:i386 libncurses5:i386 libstdc++6:i386 libz1:i386

$ sudo dpkg-reconfigure dash
# Select "No" when prompted.

$ wget https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/arm-linux-gnueabihf/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz
$ tar -Jxvf gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz -C $HOME

$ git clone git://arago-project.org/git/projects/oe-layersetup.git tisdk
$ cd tisdk
$ ./oe-layertool-setup.sh -f configs/processor-sdk/processor-sdk-04.02.00.09-config.txt
$ cd build
$ . conf/setenv
$ export PATH=$HOME/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin:$PATH
$ MACHINE=am335x-evm bitbake ppp

Then transfer to your board and install the ipks from <tisdk>/build/arago-tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/ppp/2.4.7-r0/deploy-ipks/armv7ahf-neon/ with opkg.

2,pppd的配置

pppd的配置選項非常多, 具體的意義參看

https://linux.die.net/man/8/pppd

本人在配置的過程中偷懶,直接按照上面的博客文章依葫蘆畫瓢。

root@am335x-evm:/etc/ppp# cat chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"live.vodafone.com"    *     "live.vodafone.com"    *

root@am335x-evm:/etc/ppp# cat gprs-connect-chat
# vim etc/ppp/gprs-connect-chat
#/etc/ppp/gprs-connect-chat
#    chat script for China Mobile, used GPRS module.
TIMEOUT         15
ABORT           "DELAYED"
ABORT           "BUSY"
ABORT           "ERROR"
ABORT           "NO DIALTONE"
ABORT           "NO CARRIER"
TIMEOUT         40
''              AT
OK              ATS0=0
OK              ATE0V1
OK      AT+CGDCONT=1,"IP","live.vodafone.com"
OK              ATDT*99#
CONNECT         ''
root@am335x-evm:/etc/ppp# cat options
# vi /etc/ppp/options
#
#auth
#crtscts
lock
#hide-password
#modem
#mru 296
#mtu 296
#lcp-echo-interval 30
#lcp-echo-failure 4
#noipx
#persist
#asyncmap 0xa0000
#mru 1500
#refuse-chap
#ipcp-max-failure 30
usepeerdns
logfile /home/root/ppplog
root@am335x-evm:/etc/ppp# cat peers/gprs
#     vim  /etc/ppp/peers/gprs
#/etc/ppp/peers/gprs
# This is pppd script for China Mobile, used GPRS Module
# Usage:   root>pppd call gprs
/dev/ttyUSB0
115200
nocrtscts
modem
noauth
debug
#nodetach
hide-password
usepeerdns
noipdefault
defaultroute
user "live.vodafone.com"
0.0.0.0:0.0.0.0
ipcp-accept-local
ipcp-accept-remote
#lcp-echo-failure  12
#lcp-echo-interval 3
#noccp
#novj
#novjccomp
replacedefaultroute
#persist
#connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
connect '/usr/sbin/chat -v -s -f /etc/ppp/gprs-connect-chat'
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'
root@am335x-evm:/etc/ppp#

配置的設定主要是有兩個地方需要注意,

(1)APN(Access Point Name)的設定, 這個名稱在各個電信供應商的網站上可以查到。

在上面的例子,我在用的是 vodafone的 SIM卡,他的APN 是live.vodafone.com

(2)在gprs-connect-chat文件中有一行

OK              ATDT*99#

其中的*99# 是需要撥號上網的號碼。大部分供應商應該是一樣的。 不過不同的國家和地區的設定就可能不一樣了,需要確認。

3 GSM的鏈接和測試

在設備的控制終端輸入:

pppd call gprs   

可以通過log file查看GSM的連接狀態。

在上面的options文件中,設定的log文件位於

logfile /home/root/ppplog。

打開ppplog文件,可以看到具體連接信息。

如果一切正常, Linux會生成一個ppp0的網絡接口。

通過ifconfig可以確認。

4, 連接外網。

噹噹噹當。。。到此到了最後一個步驟。

在終端輸入: ping 8.8.8.8

8.8.8.8是google的ip。

“需要張貼ping的log信息”。

輸入命令:

ping www.google.com

" ping: bad address 'www.google.com' 

太着急了, DNS服務器還沒有設定!

創建文件/etc/resolv.conf ,

將ppplog中查看到的DNS服務器寫入

nameserver xxx.xxx.xxx

ping www.google.com

“需要張貼ping的log信息”。

 

結束語

"老闆,老闆,好消息,好消息!"

“啥?”

“GSM 模塊能夠正常工作了?”

“真的麼?”

“千真萬確。 你看, 這都能ping google了。”

“太好了, 他能打電話麼, 他能發短信麼?”

“不能, 因爲我們沒有語音輸入輸出,不需要電話功能, 也不需要短信功能,我們只需要上網功能!”

“Well done!”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章