前言
??4G模塊主要利用于無(wú)線上網(wǎng)和通話功能的移動(dòng)設(shè)備,或者用以沒(méi)有WIFI或者以太網(wǎng)的地方;這篇文章主要以廣和通NL668為例,講述調(diào)試4G上網(wǎng)過(guò)程,通話功能暫時(shí)不講;4G上網(wǎng)模塊一般是以USB接口呈現(xiàn),所以也是個(gè)熱插拔設(shè)備;一、Kernel調(diào)試
1. 查看系統(tǒng)是否支持該4G NL668模塊
??ls /dev/ttyUSB*
??看下是否有相對(duì)應(yīng)的節(jié)點(diǎn):??沒(méi)有找到設(shè)備虛擬串口節(jié)點(diǎn),說(shuō)明底層驅(qū)動(dòng)需要移植NL668模塊驅(qū)動(dòng),實(shí)際上是添加該模塊的PID和VID,該模塊走的是歡迎大家訪問(wèn)USB接口;
2.底層驅(qū)動(dòng)調(diào)試
(1)第一步當(dāng)然是找4G模塊供應(yīng)商提供一份調(diào)試資料和對(duì)應(yīng)系統(tǒng)使用的RIL庫(kù);
(2)根據(jù)驅(qū)動(dòng)一直的文檔《Fibocom_RIL集成指南_Android_V2.2.pdf》進(jìn)行調(diào)試;
(3)添加廣和通NL668模塊的PID和VID
路徑:kernel/drivers/usb/serial/option.c
static const struct usb_device_id option_ids[] = {
+ { USB_DEVICE(0x1508, 0x1001) }, /* Fibocom NL668 */
(4)過(guò)濾機(jī)制
??Android 11系統(tǒng)自帶過(guò)濾機(jī)制,特殊情況下需要另行添加。
(5)配置串口驅(qū)動(dòng)的Linux內(nèi)核
??a,執(zhí)行cd kernel命令,進(jìn)入內(nèi)核根目錄。
??b,執(zhí)行make menuconfig命令。
??c,在彈出來(lái)的界面中依次選擇:Device Drivers > USB support > USB Serial Converter support。
??d,選中如下USB driver for GSM and CDMA modems組件后,保存推出。
??注意:關(guān)于Linux 內(nèi)核配置以客戶系統(tǒng)配置規(guī)則為準(zhǔn),本文描述的方法僅供參考。
(6)DTS配置,RM310的參考配置。
../../../dts/rockchip/rk**.dtsi:
rk_modem: rk-modem {
compatible="4g-modem-platdata";
pinctrl-names = "default";
pinctrl-0 = <<e_vbat <e_power_en <e_reset>;
4G,vbat-gpio = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
4G,power-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_LOW>;
4G,reset-gpio = <&gpio4 RK_PD4 GPIO_ACTIVE_LOW>;
status = "okay";
};
(7)4G模塊的驅(qū)動(dòng)控制,可以參考RM310。
kernel/drivers/net/lte/lte_rm310.c
(8)配置kernel支持ECM 網(wǎng)卡方式和模塊交互(推薦使用 ECM 驅(qū)動(dòng));
??修改內(nèi)核配置選項(xiàng):
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_NETDEVICES=y
CONFIG_USB_NET_CDCETHER=y
????模塊連接到目標(biāo)板,主機(jī)會(huì)枚舉出一個(gè) ethx 的網(wǎng)絡(luò)設(shè)備。RM310 模塊,可以自動(dòng)撥號(hào)上網(wǎng),自動(dòng)注冊(cè)網(wǎng)絡(luò),并附著 PDP 業(yè)務(wù)。
3.設(shè)備加載檢測(cè)
??NL668 4G 模塊,PID:0x1508,VID:0x1001。模塊成功上電后,枚舉出 ttyUSB0~ttyUSB3,用于調(diào)試口、AT 口、上網(wǎng)口。撥號(hào)后,生成 lte0 網(wǎng)口設(shè)備。若加載成功,會(huì)有以下內(nèi)容返回。
??ls /dev/??或者??ls /dev/yytUSB*
二、Android層調(diào)試
1.在引入新庫(kù)之前先將RK源碼中,系統(tǒng)啟動(dòng)時(shí)啟動(dòng)RILD的進(jìn)程關(guān)閉
--- a/hardware/ril/rild/init.rc
+++ b/hardware/ril/rild/init.rc
-service vendor.ril-daemon /vendor/bin/hw/rild
- class main
- user radio
- group radio cache inet misc audio log readproc wakelock
- capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
2.添加NL668模塊的RIL庫(kù)和相關(guān)組件,以及存放位置
??需要模組廠提供RIL庫(kù)libreference-ril.so,另外需組件chat、ip-down、ip-up。若模組廠只提供RIL庫(kù),其余組件可使用RK自帶的組件。
??注意:因?yàn)镽K源碼會(huì)編譯生成RIL庫(kù),庫(kù)名字也是libreference-ril.so,因此需要將模組廠的庫(kù)修改名字:libreference-ril-nl668.so。
??存放位置:(一般存放位置,也可自行選擇目錄,最終也是拷貝到out目錄下)
vendor/rockchip/common/phone/bin/chat
vendor/rockchip/common/phone/etc/ppp/ip-down
vendor/rockchip/common/phone/etc/ppp/ip-up
vendor/rockchip/common/phone/lib/libreference-ril-nl668.so
3.RIL庫(kù)和相關(guān)組件,配置到編譯文件中
--- a/vendor/rockchip/common/phone/phone.mk
+++ b/vendor/rockchip/common/phone/phone.mk
CUR_PATH := vendor/rockchip/common
#########################################################
# 3G Dongle SUPPORT
#########################################################
- PRODUCT_COPY_FILES += \
- $(CUR_PATH)/phone/etc/ppp/ip-down:system/etc/ppp/ip-down \
- $(CUR_PATH)/phone/etc/ppp/ip-up:system/etc/ppp/ip-up \
- $(CUR_PATH)/phone/etc/ppp/ip-down:system/etc/ppp/ip-down \
- $(CUR_PATH)/phone/etc/ppp/ip-up:system/etc/ppp/ip-up \
- $(CUR_PATH)/phone/etc/ppp/call-pppd:system/etc/ppp/call-pppd \
- $(CUR_PATH)/phone/etc/operator_table:system/etc/operator_table
+PRODUCT_COPY_FILES += \
+ $(CUR_PATH)/phone/etc/ppp/ip-down:system/etc/ppp/ip-down \
+ $(CUR_PATH)/phone/etc/ppp/ip-up:system/etc/ppp/ip-up \
+ $(CUR_PATH)/phone/etc/ppp/call-pppd:system/etc/ppp/call-pppd \
+ $(CUR_PATH)/phone/etc/operator_table:system/etc/operator_table \
+ $(CUR_PATH)/phone/lib/libreference-ril-nl668.so:vendor/lib64/libreference-ril-nl668.so
4.radio配置
(1)庫(kù)和組件加載好后,需要啟動(dòng)ril-daemon服務(wù),可以在hardware/ril/rild/init.rc指定,
--- a/hardware/ril/rild/init.rc
+++ b/hardware/ril/rild/init.rc
-service vendor.ril-daemon /vendor/bin/hw/rild
- class main
- user radio
- group radio cache inet misc audio log readproc wakelock
- capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
+service ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril-nl668.so -- -d /dev/ttyUSB0
+ class main
+ socket rild stream 660 root radio
+ socket rild-debug stream 660 radio system
+ user root
+ group radio cache inet misc audio sdcard_rw log
??也可以在/device/rockchip/目錄指定:
- rild.libpath=/system/lib/libril-rk29-dataonly.so \
- rild.libargs=-d /dev/ttyACM0 \
+ vendor.rild.libpath=/vendor/lib64/libreference-ril-nl668.so \
+ vendor.rild.libargs=-d /dev/ttyUSB0 \
(2)配置使用網(wǎng)絡(luò)類(lèi)型和指定的RIL庫(kù)
--- a/device/rockchip/rk356x/device.mk
+++ b/device/rockchip/rk356x/device.mk
PRODUCT_PROPERTY_OVERRIDES += \
ro.ril.ecclist=112,911 \
ro.opengles.version=196610 \
wifi.interface=wlan0 \
+ rild.libpath=/vendor/lib64/libreference-ril-nl668.so \
+ rild.libargs=-d /dev/ttyUSB0 \
ro.audio.monitorOrientation=true \
debug.nfc.fw_download=false \
debug.nfc.se=false \
5.打開(kāi)BOARD_HAS_RK_4G_MODEM開(kāi)關(guān)
??打開(kāi)BOARD_HAS_RK_4G_MODEM開(kāi)關(guān),是系統(tǒng)開(kāi)啟4G服務(wù)功能。
--- a/device/rockchip/common/BoardConfig.mk
+++ b/device/rockchip/common/BoardConfig.mk
#for rk 4g modem
-BOARD_HAS_RK_4G_MODEM ?= false
+BOARD_HAS_RK_4G_MODEM ?= true
6.撥號(hào)方式
??根據(jù)模組廠提供的文檔,修改撥號(hào)方式。
PRODUCT_PROPERTY_OVERRIDES += \
ril.fibocom.dialmode=1 (ECM撥號(hào)方式) \
ril.fibocom.dialmode=0 (PPP撥號(hào)方式) \ /*撥號(hào)方式二選一*/
ril.fibocom.usbmode=18 (USB端口模式)
??串口下getprop可以查看當(dāng)前添加的屬性。
7.Android 11.0 注意事項(xiàng)
??device/rockchip/common 目錄,打開(kāi)宏 BOARD_HAS_RK_4G_MODEM,不需要打開(kāi)
BOARD_HAVE_DONGLE。vendor.rild.libpath 修改為模組提供的庫(kù)的路徑。
??以 RK356x 為例,在/device/rockchip/rk356x 對(duì)應(yīng)的配置文件中加入以下修改:
--- a/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml
<!-- the 6th element indicates boot-time dependency-met value. -->
<string-array translatable="false" name="networkAttributes">
<item>"wifi,1,1,2,-1,true"</item>
+ <item>"mobile,0,0,0,-1,true"</item>
+ <item>"mobile_mms,2,0,2,60000,false"</item>
+ <item>"mobile_supl,3,0,2,60000,true"</item>
+ <item>"mobile_dun,4,0,2,60000,true"</item>
+ <item>"mobile_hipri,5,0,3,60000,true"</item>
+ <item>"mobile_fota,10,0,2,60000,true"</item>
+ <item>"mobile_ims,11,0,2,60000,true"</item>
+ <item>"mobile_cbs,12,0,2,60000,true"</item>
<item>"bluetooth,7,7,0,-1,true"</item>
<item>"ethernet,9,9,9,-1,true"</item>
</string-array>
??該配置文件是修改設(shè)置應(yīng)用和下拉框沒(méi)有移動(dòng)數(shù)據(jù)選項(xiàng)。
??設(shè)置->網(wǎng)絡(luò)和互聯(lián)網(wǎng)->"移動(dòng)網(wǎng)絡(luò)"
8.優(yōu)選網(wǎng)絡(luò)接入模式
??設(shè)置網(wǎng)絡(luò)接入模式優(yōu)選:ro.telephony.default_network
??(1)若需要支持 5G,請(qǐng)?jiān)?device/rockchip/……/device.mk,設(shè)置
ro.telephony.default_network = 33 即 NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA。
??(2)優(yōu)選網(wǎng)絡(luò)接入模式為 4G,設(shè)置
ro.telephony.default_network = 9 即 NETWORK_MODE_LTE_GSM_WCDMA。
9.編譯Android升級(jí)
10.模塊測(cè)試
??(1)查看RIL庫(kù)是否加載成功
????在log中查看是否有以下打印信息:
.../hardware/ril/rild/rild.c
// ril/socket id received as -c parameter, otherwise set to 0
const char *clientId = NULL;
RLOGD("**RIL Daemon Started**");
RLOGD("**RILd param count=%d**", argc);
umask(S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);
for (i = 1; i < argc ;) {
??(2)模塊測(cè)試
????測(cè)試 AT 功能,查詢(xún)網(wǎng)絡(luò)駐留狀態(tài),SIM 卡狀態(tài),PDP 激活情況等。
#microcom -s 115200 /dev/ttyUSB1
????SIM 卡是否正常識(shí)別:
AT+CPIN?
+CPIN: READY
OK
????查詢(xún) CS 域注冊(cè)狀態(tài):
AT+CREG?
+CREG: 2,1,"27A3","2C3DE15",7
OK
????查詢(xún) EPS 域注冊(cè)狀態(tài):
AT+CEREG?
+CEREG: 1,"252C","0A26C916",7
OK
????確認(rèn) 4G 系統(tǒng)狀態(tài):
AT^SYSINFO
^SYSINFO: 2,3,0,17,1,7
OK
????查詢(xún) PDP 激活信息:
AT+CGDCONT?
+CGDCONT:1," IPV4V6 "," cmnet ","10.27.12.98",0,0,,,,
OK
????注意:AT指令的使用,例如查看USB端口號(hào):
echo -e "AT+GTUSBMODE=18\n" > /dev/ttyUSB2
cat /dev/ttyUSB2 &
三、移植過(guò)程
1.獲取 log 信息
??打開(kāi)串口,輸入以下命令,查看串口信息
logcat –b radio & //ril log
logcat –s pppd & //ppp 撥號(hào) log
logcat –c –b radio & //清除以前 raido log
logcat -b system -b main -b radio -v time &// 完整的系統(tǒng) logcat
四、問(wèn)題與解決
1.ril_daemon服務(wù)不斷在重啟
??打印的kernel信息如下:
init: Control message: Could not find 'android.hardware.radio@1.1::IRadio/slot1' for ctl.interface_start from pid: 144 (/system/bin/hwservicemanager)
init: Control message: Could not find 'android.hardware.radio@1.1::IRadio/slot1' for ctl.interface_start from pid: 144 (/system/bin/hwservicemanager)
init: Control message: Could not find 'android.hardware.radio@1.1::IRadio/slot1' for ctl.interface_start from pid: 144 (/system/bin/hwservicemanager)
init: starting service 'ril-daemon'...
init: Untracked pid 14226 exited with status 0
init: Service 'ril-daemon' (pid 14222) received signal 11
init: Sending signal 9 to service 'ril-daemon' (pid 14222) process group...
libprocessgroup: Successfully killed process cgroup uid 1001 pid 14222 in 5ms
init: Untracked pid 14228 exited with status 0
??然后查看logcat信息,發(fā)現(xiàn)系統(tǒng)加載/vendor/lib64/libreference-ril-nl668.so時(shí)會(huì)崩潰;查看這個(gè)RIL庫(kù)是否適合在Android 11上使用,若不支持Android 11需找模組廠提供新的庫(kù)。
??若只是單純報(bào)錯(cuò)一下內(nèi)容,則查看是否接入4G模塊或于硬件接觸是否良好。
[ 103.991016] init: Control message: Processed ctl.interface_start for 'android.hardware.radio@1.1::IRadio/slot1' from pid: 144 (/system/bin/hwservicemanager)
[ 104.992025] init: Control message: Processed ctl.interface_start for 'android.hardware.radio@1.1::IRadio/slot1' from pid: 144 (/system/bin/hwservicemanager)
[ 105.992868] init: Control message: Processed ctl.interface_start for 'android.hardware.radio@1.1::IRadio/slot1' from pid: 144 (/system/bin/hwservicemanager)
[ 106.993940] init: Control message: Processed ctl.interface_start for 'android.hardware.radio@1.1::IRadio/slot1' from pid: 144 (/system/bin/hwservicemanager)
2.獲取APN數(shù)據(jù)為空,導(dǎo)致APN設(shè)置失敗不注網(wǎng)
??報(bào)相關(guān)錯(cuò)誤:
07-12 17:23:48.361 D/Phone ( 866): getImsRegistrationTechnology =-1
07-12 17:23:48.362 E/DCT-C-0 ( 866): getPreferredApnSetId: cursor is null
07-12 17:23:48.362 D/DCT-C-0 ( 866): hasMatchedTetherApnSetting: APNs=[]
07-12 17:23:48.380 D/DCT-C-0 ( 866): shouldRestrictDataForEcbm: isInEcm=false isInImsEcm=false
??因系統(tǒng)獲取不到APN數(shù)據(jù),沒(méi)法匹配SIM卡對(duì)應(yīng)的APN,導(dǎo)致無(wú)法注網(wǎng)的解決辦法:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-401569.html
--- a/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
public class DcTracker extends Handler {
if (!isCarrierConfigApplied()) {
log("onCarrierConfigChanged: Carrier config is not ready yet.");
- return;
+ //return;
}
3.上網(wǎng)成功,但狀態(tài)欄上移動(dòng)信號(hào)圖標(biāo)顯示只有空三角圖標(biāo)顯示
??修改qi-ril.conf文件:LTE_ls_Report_SignalStrength=1
?
?
參考:[RK3568 Android11] 開(kāi)發(fā)之4G模塊(移遠(yuǎn)模塊)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-401569.html
到了這里,關(guān)于【RK356X Android11】開(kāi)發(fā)之4G模塊(廣和通模塊NL668)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!