1. 程式人生 > 實用技巧 >龍尚4g模組U9300C在rk3368移植適配記錄

龍尚4g模組U9300C在rk3368移植適配記錄

一、模組連線 4g模組在系統中的連線: (4g模組是以usb外設的形式進行操作的) 二、除錯移植過程 1.準備工作 ①驅動加入 VID PID 根據模組產品型號在 kernel/drivers/usb/serial/option.c 加入 VID PID U9300C/U9507 為: { USB_DEVICE( 0x1c9e, 0x9b3c ) } U9507A/E/J 為: { USB_DEVICE( 0x2df3, 0x9b3e ) } U8300 為: { USB_DEVICE( 0x1c9e, 0x9b05 ) } 具體是:
在struct usb_device_id 中加入: 在option_probe()中新增: ②編譯配置 PPP 如果撥號上網則配置 PPP make menuconfig Device Drivers ---> -*-Network device support ---> {*}ppp(point-to-point protocol) support …… [*] ppp support for async serial ports [*] ppp support for sync tty ports
…… 一般選擇以上即可,如果需要更多 PPP 服務,則 PPP 相關都選擇上。 ③配置 USB MODEM Device Drivers ---> [*]USB support ---> [*]USB Serial Conerter support ---> [*]USB Generic Serial Driver …… [*]USB driver for GSM and CDMA modems …… 2.Ril庫適配 取到最新通用版的 Ril 庫(一般研發提供的 Ril 庫名字帶有日期等資訊,需要重新命名,例如重新命名為
libreference-ril-u9300c.so )放入客戶單板, 然後使用下面的方法進行適配 新增 init.rc 啟動 rild init.rc 中加入下面服務,例如: service ril-daemon /system/bin/rild -l /system/lib/libreference-ril- u9300c.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1 socket rild stream 660 root radio socket rild-debug stream 660 radio system class main user root socket rild-ppp stream 660 root radio group radio cache inet misc audio log v*n net_admin system 說明: system/lib/libreference-ril-u9300c.so --- 這個是 Ril 庫放的位置和名字,可以根據客戶喜好進行修改,讓 rild 程序能找到 Ril 庫就可以。 /dev/ttyUSB2 - -- 這個是 AT 口的名字,一般是 ttyUSB2 ,特殊情況是其他的需要更改。如果不指定預設為 ttyUSB2

具體操作如下:

①新增廠商的so庫

libreference-ril-u9300c.so放置如下地址 ./vendor/rockchip/common/phone/lib 注意:庫必須是32位的庫,放進去後需要加上可執行許可權(755) ②在下面的檔案中新增適配:(最好是把init.rc全改了) ./system/core/rootdir/init.rc ./bootable/recovery/etc/init.rc ./device/rockchip/rk3368/rk3368_box_taurus/init.rc ./device/rockchip/common/recovery/etc/init.rc ./out/target/product/rk3368_box_taurus/root/init.rc ./device/rockchip/rk3368/init.rc (init.rc的修改需要在device/rockchip/rk3368/init.rc中修改,否則重新編譯可能又被rockchip的配置所覆蓋)。 新增的內容: service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-u9300c.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1 socket rild stream 660 root radio socket rild-debug stream 660 radio system class main user root socket rild-ppp stream 660 root radio group radio cache inet misc audio log v*n net_admin system service pppd_gprs /system/bin/init.gprs-pppd user root group radio cache inet misc disabled on property:net.gprs.enable=1 start pppd_gprs on property:net.gprs.enable=0 stop pppd_gprs

3.ppp撥號適配

如果使用 ppp 撥號,需要 修改 ip-up 指令碼 ./vendor/rockchip/common/phone/etc/ppp 下的 ip-up 是否有下面資訊,若沒有則加入, (這裡要加上執行許可權) /system/bin/setprop "net.interfaces.defaultroute" "gprs" /system/bin/setprop "net.ppp0.dns1" "$DNS1" /system/bin/setprop "net.ppp0.dns2" "$DNS2" /system/bin/setprop "net.ppp0.local-ip" "$IPLOCAL" /system/bin/setprop "net.ppp0.remote-ip" "$IPREMOTE" /system/bin/setprop "net.dns1" "$DNS1" /system/bin/setprop "net.dns2" "$DNS2" 4. ./ hardware/ril/rild/rild.c 檔案修改如下部分: main函式新增: 然後再 遮蔽掉switchUser(); 這行程式碼 注意: 正常情況下通過上述 的配置模組就可以正常上網了。

三、驗證除錯 (重要:一定要將模組天線接上在除錯) 除錯時候經常用到的幾個小命令: netcfg : 檢視當前所有網路介面 getprop net.dns : 檢視dns(有時候dns不對也會上不了網,比如8.8.8.8,這時候需要修改pppd) logcat -s pppd :  檢視pppd log logcat -b radio: 檢視radio log cat ttyUSB2 & 然後echo AT+CMD > ttyUSB2: 對modem發命令看是否有應答。 dmesg 檢視driver層有沒有相關報錯 根據列印資訊去尋找bug出現的位置, 可以(文末有常見問題及解決辦法) 具體測試可以參照: 1.重新編譯整個android原始碼,將打包的統一韌體燒錄到開發板 2.檢視是否有節點tyUSB* 和 ppp 產生 3.輸入 busyboxlsusb 檢視usb裝置,看是否存在4G模組 4.傳送AT測試 (更多at指令見4g模組AT指令文件) catttyUSB2 & //後臺開啟節點 echoAT+CGMI>ttyUSB2 //給出模組廠商的標識 echo AT+CGMM > ttyUSB2 //獲得模組標識 echoAT+COPS? >ttyUSB2 //運營商資訊獲取 echo AT+SYSINFO > ttyUSB2 //查詢網路狀態,返回2代表有網 echoAT+PSRAT >ttyUSB2 //返回模組當前註冊的網路資訊 echo AT+BNDPRF? > ttyUSB2 //返回當前的網路頻段 echo AT+CSQ > ttyUSB2 //查訊號強度 舉例: 5. (手動撥號) 傳送 pppd call gprsdial & (撥號指令碼 gprsdial 需要提前新增) 或者 pppdcallunicom& (撥號指令碼unicom 需要提前新增) 撥號成功後 netcfg檢視網路節點:ppp0是否出現: 如圖: 6.嘗試ping百度, 看j81指示燈是否正常亮起 ping www.baidu.com ping 220.181.112.244

四、常見BUG及解決方案 1、 問題: 通過 logcat -b radio發現無法開啟ip-up或者ttyUSB* 解決: 在init.rc 新增修改ttyUSB許可權: on boot chmod 0777 /dev/ppp chmod 0777 /dev/ttyUSB* chmod 0775 /etc/ppp/ip-up chmod 0775 /etc/ppp/ip-down 2、 問題: 新增的so檔案無法開啟 解決: 新增完庫檔案後需要加上可執行的許可權 3、 問題: 解決: 還需要更改系統配置適配自己的4G模組,4G模組生成了/dev/ttyUSB0~4共5個串列埠,AT指令埠為/dev/ttyUSB2,進行如下操作: 地址:./ device/rockchip/rk3368/rk3368_box_taurus/system.prop 增加: 4、 問題: 解決: 在init.rc新增修改ttyUSB許可權: on boot chmod 0775 /proc/cmdline 5、 問題: 解決: 4g模組沒有插天線(坑),插上天線 6、 問題: 發現始終開啟的不是自己的so庫檔案: 解決: 將打印出的的庫檔案刪除,把自己的庫檔案重名為這個庫檔名字,新增系統,重新編譯( 新增上許可權 7、 問題: 撥號失敗 解決: 根據你使用的SIM修改apns-conf.xml檔案;就是apn接入點;如果apns-conf.xml檔案裡面沒有相應的核心網的mcc和mnc則Android系統不能自動撥號 8、 問題:ping www.baidu.comk 不行但是 ping 220.181.112.244 可以 解決: dns存在問題 9、新增開機執行AT命令 對於客戶想開機執行的AT命令,Ril中進行了動態執行時載入,不用改庫,只修改在init.rc中新增屬性值即可。 首先在init.rc中設定 setprop ril.audio 1,然後設定setprop ril.audio.config1 AT+XXX=XXX 這樣開機時Ril庫就會去執行這些AT命令。 例如如果需要進行聲音設定, 則首先設定 setprop ril.audio 1,然後根據需要設定其他引數具體值。例如,需要更改下行耳機聲音大小,則設定 setprop ril.audio.config1 AT+CLVL=3 即可。可除錯的聲音相關引數的有: setprop ril.audio.config1 AT+AUDIOPATH=XXX setprop ril.audio.config2 AT+PCMCONFIG= XXX setprop ril.audio.config3 AT+PCMAUDIO= XXX setprop ril.audio.config4 AT+CLVL= XXX setprop ril.audio.config5 AT+RXVOL= XXX setprop ril.audio.config6 AT+CMIC= XXX setprop ril.audio.config7 AT+SIDET= XXX setprop ril.audio.config8 AT+ECHO= XXX setprop ril.audio.config9 AT+ECHOOFF= XXX setprop ril.audio.config0 AT+PCMPAD= XXX setprop ril.audio.config0 AT+ECHO1= XXX 以上屬性只是介面,也可以用於配置其他指令,例如setprop ril.audio.config1 AT^DSCI=1 不需要以上設定時,屬性置空(setprop ril.audio “”),或不進行屬性設定。可以先通過命令列輸入進行除錯,除錯好後寫入init.rc即可。 五、相關補充: 1.廠商提供的so庫解讀: 呼叫流程: 核心是reference-ril.c: 關鍵函式: initializeCallback() 4G 模組初始化函式;裡面就是一些發給4G模組的AT指令;不能出錯; onUnsolicited() 函式接收4G模組對AT指令的返回值;可以在裡面新增根據返回值相應的動作;比如根據撥號成功返回值做出繫結網絡卡分配IP的動作; onRequest() 主動撥號、上層發下來的所有AT指令都在這裡; 2.PPPOE和pppd的流程瞭解 (具體見詳細筆記) PPD是使用者態應用程式,負責PPP協議的具體配置,如MTU、撥號模式、認證方式、認證所需使用者名稱/密碼等 ①終端介紹 終端是一種字元型裝置,它有多種型別,通常使用tty來簡稱各種型別的終端裝置。 終端驅動程式的主要功能是在程式與相關裝置之間進行資料傳遞。在一個LINUX核心自身的內部,終端基本上包括兩個主要的軟體部分:裝置驅動程式和行規則(見下圖)。 ②偽終端 偽終端(Pseudo Terminal)是成對的邏輯終端裝置,在Linux系統上建立偽終端裝置,使用了”pty master”方式,例如/dev/ptm3,它的對應端則會被自動地建立成/dev/pts/3。 偽終端從裝置上的資料輸入成為偽終端主裝置的輸入,反之亦然。 ③PPPOE 概述 PPPOE協議是基於PPP協議的協議,在PPPOE應用程式中並沒有將PPP協議實現,PPP協議是由PPPD這個使用者空間程式實現的,PPPOE程式只實現PPPOE協議部分 程式碼,在適當的時候PPPD程式進行PPP協議。 在PPPOE使用者程式與PPPOE伺服器連線後,他將會建立一個PPP0裝置,此裝置是在PPPD程式中進行的,如果與伺服器連線成功,他將會一直存在,此裝置就與正常的網絡卡裝置一樣,但他是個虛擬裝置,經過此裝置的資料發出去時還是從真實存在的網絡卡裝置介面傳送出去的,但這已經在系統中做了轉換。 ④ PPPD 上文中說過PPPD是PPP協議的實現程式,PPP的實現由四部分組成 PPPD程式首先會進行一些初始化工作,讀引數配置引數等,這部分工作非常重要,會在讀程式碼時分析。 然後就開始走協議,程式碼流向見下: main.c->main() { 讀引數 配置引數 從LCP協議開始,這是整個協議的開始部分,狀態機開始發動了 lcp_lowerup(0); lcp_open(0); /* Start protocol */ 下面 while (phase != PHASE_DEAD) { handle_events(); get_input();等待資料報文進入然後根據狀態機處理報文 ………… ………… } } PPP協議與PPPOE有著重要的聯絡,但是PPP協議建立連線部分不是討論重點,所以會著重討論在pppoe連線成功後資料的報文流向,資料是如何被處理的。