Android 4G模組除錯總結
最近除錯Android的4G模組;這裡做個總結;走個流程;程式碼就不貼了;公司保密;驅動方面沒什麼好說的;一般都是廠家會提供文件;其實也就是把4G模組虛擬機器成ttyUSB0~ttyUSB5等幾個虛擬串列埠;再開啟CDC_NCM虛擬網絡卡繫結到某一個虛擬串列埠;產生虛擬網絡卡usb0或者什麼的;
先走個大概流程;其實主要就是hardware/ril/幾個庫檔案;修改的也不多;有些公司主要是修改reference-ril.so庫的修改;有些公司為了公司保密直接給編譯好的reference-ril.so檔案;那更簡單了;直接新增進系統就OK了;
- hardware/ril/rild
- main()開啟reference-ril.so庫;呼叫reference-ril.so庫裡面的RIL_Init()函式;
- RIL_Init()函式建立執行緒呼叫mainLoop()函式;
- mainLoop()函式開啟4G模組的虛擬串列埠;然後:首先呼叫onUnsolicited()函式監聽4G模組主動上報的資訊;再呼叫initializeCallback()函式初始化4G模組;
- onRequest()函式接收上層傳下來的指令轉換成AT指令撥號等;
關鍵函式:
initializeCallback()4G 模組初始化函式;裡面就是一些發給4G模組的AT指令;不能出錯;
onUnsolicited()函式接收4G模組對AT指令的返回值;可以在裡面新增根據返回值相應的動作;比如根據撥號成功返回值做出繫結網絡卡分配IP的動作;
onRequest()主動撥號、上層發下來的所有AT指令都在這裡;
一般除錯4G模組就是修改上面的三個檔案;
開機自動撥號實現:
frameworks/base/services/Java/com/android/server/ConnectivityService.java
- publicboolean getMobileDataEnabled() {
-
// TODO: This detail should probably be in DataConnectionTracker's
- // which is where we store the value and maybe make this
- // asynchronous.
- enforceAccessPermission();
- boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.MOBILE_DATA, 1/*預設是0,改為1就可以了*/) == 1;
- if (VDBG) log("getMobileDataEnabled returning " + retVal);
- return retVal;
- }
其實就是預設開機就打開了上網流量開關;手機的4G上網開關;
還有個關鍵點:apns-conf.xml
根據你使用的SIM修改apns-conf.xml檔案;就是apn接入點;如果apns-conf.xml檔案裡面沒有相應的核心網的mcc和mnc則Android系統不能自動撥號;如下圖;
注意點:
如果有些4G模式使用軟卡、或者硬體是在4G模組初始化的時候決定的;修改相應的AT指令;在initializeCallback()函式裡;