packages/providers/TelephonyProvider
// e.g. APN conf file, database imx8mp_evk:/ # system/etc/apn-conf.xml imx8mp_evk:/ # data/user_de/0/com.android.providers.telephony/databases $ ls -al total 1100 drwxr-xr-x 1 ting 1049089 0 Mar 17 13:06 ./ drwxr-xr-x 1 ting 1049089 0 Mar 17 13:06 ../ -r--r--r-- 1 ting 1049089 20480 Mar 17 12:06 CarrierInformation.db -r--r--r-- 1 ting 1049089 0 Mar 17 12:06 CarrierInformation.db-journal -r--r--r-- 1 ting 1049089 57344 Mar 17 12:06 HbpcdLookup.db -r--r--r-- 1 ting 1049089 0 Mar 17 12:06 HbpcdLookup.db-journal -r--r--r-- 1 ting 1049089 229376 Mar 17 12:06 carrierIdentification.db -r--r--r-- 1 ting 1049089 0 Mar 17 12:06 carrierIdentification.db-journal -r--r--r-- 1 ting 1049089 118784 Mar 17 12:06 mmssms.db -r--r--r-- 1 ting 1049089 0 Mar 17 12:06 mmssms.db-journal -r--r--r-- 1 ting 1049089 696320 Mar 17 12:06 telephony.db -r--r--r-- 1 ting 1049089 0 Mar 17 12:06 telephony.db-journal ☛ Android:一篇就够!全面&详细解析APN(涉及内容:GGSN,authtype,MVNO,pdp,Apns-conf,supl,hipri,dun)
frameworks/opt/telephony/
frameworks/base/telephony/
-
The client of HIDL Radio service of IRadio
frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
// frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java 39 import android.hardware.radio.V1_0.IRadio; 190 volatile IRadio mRadioProxy = null; 351 /** Returns a {@link IRadio} instance or null if the service is not available. */ 352 @VisibleForTesting 353 public IRadio getRadioProxy(Message result) { 354 if (!mIsMobileNetworkSupported) { 355 if (RILJ_LOGV) riljLog("getRadioProxy: Not calling getService(): wifi-only"); 356 if (result != null) { 357 AsyncResult.forMessage(result, null, 358 CommandException.fromRilErrno(RADIO_NOT_AVAILABLE)); 359 result.sendToTarget(); 360 } 361 return null; 362 } 363 364 if (mRadioProxy != null) { 365 return mRadioProxy; 366 } 367 368 try { 369 mRadioProxy = IRadio.getService(HIDL_SERVICE_NAME[mPhoneId == null ? 0 : mPhoneId], 370 true); 371 if (mRadioProxy != null) { 372 mRadioProxy.linkToDeath(mRadioProxyDeathRecipient, 373 mRadioProxyCookie.incrementAndGet()); 374 mRadioProxy.setResponseFunctions(mRadioResponse, mRadioIndication); 375 } else { 376 riljLoge("getRadioProxy: mRadioProxy == null"); 377 } 378 } catch (RemoteException | RuntimeException e) { 379 mRadioProxy = null; 380 riljLoge("RadioProxy getService/setResponseFunctions: " + e); 381 } 382 383 if (mRadioProxy == null) { 384 // getService() is a blocking call, so this should never happen 385 riljLoge("getRadioProxy: mRadioProxy == null"); 386 if (result != null) { 387 AsyncResult.forMessage(result, null, 388 CommandException.fromRilErrno(RADIO_NOT_AVAILABLE)); 389 result.sendToTarget(); 390 } 391 } 392 393 return mRadioProxy; 394 } 527 @Override 528 public void getIccCardStatus(Message result) { 529 IRadio radioProxy = getRadioProxy(result); 530 if (radioProxy != null) { 531 RILRequest rr = obtainRequest(RIL_REQUEST_GET_SIM_STATUS, result, 532 mRILDefaultWorkSource); 533 534 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 535 536 try { 537 radioProxy.getIccCardStatus(rr.mSerial); 538 } catch (RemoteException | RuntimeException e) { 539 handleRadioProxyExceptionForRR(rr, "getIccCardStatus", e); 540 } 541 } 542 }-
The client of HIDL Radio service of IRadioConfig
frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioConfig.java
// frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioConfig.java 26 import android.hardware.radio.config.V1_0.IRadioConfig; 56 private volatile IRadioConfig mRadioConfigProxy = null; 152 /** Returns a {@link IRadioConfig} instance or null if the service is not available. */ 153 public IRadioConfig getRadioConfigProxy(Message result) { 154 if (!mIsMobileNetworkSupported) { 155 if (VDBG) logd("getRadioConfigProxy: Not calling getService(): wifi-only"); 156 if (result != null) { 157 AsyncResult.forMessage(result, null, 158 CommandException.fromRilErrno(RADIO_NOT_AVAILABLE)); 159 result.sendToTarget(); 160 } 161 return null; 162 } 163 164 if (mRadioConfigProxy != null) { 165 return mRadioConfigProxy; 166 } 167 168 try { 169 mRadioConfigProxy = IRadioConfig.getService(true); 170 if (mRadioConfigProxy != null) { 171 mRadioConfigProxy.linkToDeath(mServiceDeathRecipient, 172 mRadioConfigProxyCookie.incrementAndGet()); 173 mRadioConfigProxy.setResponseFunctions(mRadioConfigResponse, 174 mRadioConfigIndication); 175 } else { 176 loge("getRadioConfigProxy: mRadioConfigProxy == null"); 177 } 178 } catch (RemoteException | RuntimeException e) { 179 mRadioConfigProxy = null; 180 loge("getRadioConfigProxy: RadioConfigProxy getService/setResponseFunctions: " + e); 181 } 182 183 if (mRadioConfigProxy == null) { 184 // getService() is a blocking call, so this should never happen 185 loge("getRadioConfigProxy: mRadioConfigProxy == null"); 186 if (result != null) { 187 AsyncResult.forMessage(result, null, 188 CommandException.fromRilErrno(RADIO_NOT_AVAILABLE)); 189 result.sendToTarget(); 190 } 191 } 192 193 return mRadioConfigProxy; 194 } 240 /** 241 * Wrapper function for IRadioConfig.getSimSlotsStatus(). 242 */ 243 public void getSimSlotsStatus(Message result) { 244 IRadioConfig radioConfigProxy = getRadioConfigProxy(result); 245 if (radioConfigProxy != null) { 246 RILRequest rr = obtainRequest(RIL_REQUEST_GET_SLOT_STATUS, result, mDefaultWorkSource); 247 248 if (DBG) { 249 logd(rr.serialString() + "> " + requestToString(rr.mRequest)); 250 } 251 252 try { 253 radioConfigProxy.getSimSlotsStatus(rr.mSerial); 254 } catch (RemoteException | RuntimeException e) { 255 resetProxyAndRequestList("getSimSlotsStatus", e); 256 } 257 } 258 } 259frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioConfigResponse.java
// frameworks/opt/telephony/src/java/com/android/internal/telephony/RadioConfigResponse.java 40 /** 41 * Response function for IRadioConfig.getSimSlotsStatus(). 42 */ 43 public void getSimSlotsStatusResponse(RadioResponseInfo responseInfo, 44 ArrayList<SimSlotStatus> slotStatus) { 45 RILRequest rr = mRadioConfig.processResponse(responseInfo); 46 47 if (rr != null) { 48 ArrayList<IccSlotStatus> ret = RadioConfig.convertHalSlotStatus(slotStatus); 49 if (responseInfo.error == RadioError.NONE) { 50 // send response 51 RadioResponse.sendMessageResponse(rr.mResult, ret); 52 Rlog.d(TAG, rr.serialString() + "< " 53 + mRadioConfig.requestToString(rr.mRequest) + " " + ret.toString()); 54 } else { 55 rr.onError(responseInfo.error, ret); 56 Rlog.e(TAG, rr.serialString() + "< " 57 + mRadioConfig.requestToString(rr.mRequest) + " error " 58 + responseInfo.error); 59 } 60 61 } else { 62 Rlog.e(TAG, "getSimSlotsStatusResponse: Error " + responseInfo.toString()); 63 } 64 }ting@ting-pc:~/aosp/android-9/hardware/interfaces/radio $ ls -al total 48 drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ../ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.0/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.1/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.2/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.3/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.4/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.5/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.6/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 config/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 deprecated/-
IRadio is implemented by libril
# e.g. java: android.hardware.radio.1.1.IRadio # e.g. c/C++: android::hardware::radio::1.1::IRadio ting@ting-pc:~/aosp/android-9/hardware/interfaces/radio/1.0 $ ls -al total 289 drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ../ -rw-r--r-- 1 ting 197121 413 十二月 25 17:53 Android.bp -rw-r--r-- 1 ting 197121 59221 十二月 25 17:53 IRadio.hal -rw-r--r-- 1 ting 197121 17849 十二月 25 17:53 IRadioIndication.hal -rw-r--r-- 1 ting 197121 92745 十二月 25 17:53 IRadioResponse.hal -rw-r--r-- 1 ting 197121 2961 十二月 25 17:53 ISap.hal -rw-r--r-- 1 ting 197121 6189 十二月 25 17:53 ISapCallback.hal -rw-r--r-- 1 ting 197121 97551 十二月 25 17:53 types.hal drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 vts/ ting@ting-pc:~/aosp/android-9/hardware/interfaces/radio/1.1 $ ls -al total 41 drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ../ -rw-r--r-- 1 ting 197121 423 十二月 25 17:53 Android.bp -rw-r--r-- 1 ting 197121 4899 十二月 25 17:53 IRadio.hal -rw-r--r-- 1 ting 197121 2013 十二月 25 17:53 IRadioIndication.hal -rw-r--r-- 1 ting 197121 3355 十二月 25 17:53 IRadioResponse.hal -rw-r--r-- 1 ting 197121 778 十二月 25 17:53 ISap.hal -rw-r--r-- 1 ting 197121 8644 十二月 25 17:53 types.hal drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 vts/
-
IRadioConfig is the optional implementation by modem vendor.
ting@ting-pc:~/aosp/android-9/hardware/interfaces/radio/config $ ls -al total 16 drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ../ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.0/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.1/ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 1.2/ ting@ting-pc:~/aosp/android-9/hardware/interfaces/radio/config/1.0 $ ls -al total 25 drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 ../ -rw-r--r-- 1 ting 197121 427 十二月 25 17:53 Android.bp drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 default/ -rw-r--r-- 1 ting 197121 3875 十二月 25 17:53 IRadioConfig.hal -rw-r--r-- 1 ting 197121 1419 十二月 25 17:53 IRadioConfigIndication.hal -rw-r--r-- 1 ting 197121 1847 十二月 25 17:53 IRadioConfigResponse.hal -rw-r--r-- 1 ting 197121 1905 十二月 25 17:53 types.hal drwxr-xr-x 1 ting 197121 0 十二月 25 17:53 vts/
◤ For Android versions prior to Android 8.0, RIL daemon use Socket to communicate with Anroid phone framework.
◤ On Android 8.0 or later versions, the communication interface between Android phone framework and ril-daemon service has been changed from socket to HIDL.
ting@ting-pc:~/aosp/android-9/hardware/ril$ ls -al total 36 drwxrwxr-x 7 ting ting 4096 Nov 12 21:23 ./ drwxrwxr-x 12 ting ting 4096 Dec 15 17:14 ../ -rw-rw-r-- 1 ting ting 2850 Nov 12 21:23 CleanSpec.mk -rw-rw-r-- 1 ting ting 152 Nov 12 21:23 OWNERS drwxrwxr-x 4 ting ting 4096 Nov 12 21:23 include/ drwxrwxr-x 2 ting ting 4096 Nov 12 21:23 libril/ // Radio HIDL Impl. drwxrwxr-x 3 ting ting 4096 Nov 12 21:23 librilutils/ drwxrwxr-x 2 ting ting 4096 Nov 12 21:23 reference-ril/ // Vendor RIL drwxrwxr-x 2 ting ting 4096 Nov 12 21:23 rild/ // RIL Daemon -
The RIL Daemon talks to the telephony services and dispatches "solicited commands" to the Vendor RIL.
ting@ting-pc:~/aosp/android-9/hardware/ril/rild$ ls -al total 40 drwxrwxr-x 2 ting ting 4096 Nov 12 21:23 ./ drwxrwxr-x 7 ting ting 4096 Nov 12 21:23 ../ -rw-rw-r-- 1 ting ting 788 Nov 12 21:23 Android.mk -rw-rw-r-- 1 ting ting 0 Nov 12 21:23 MODULE_LICENSE_APACHE2 -rw-rw-r-- 1 ting ting 10695 Nov 12 21:23 NOTICE -rw-rw-r-- 1 ting ting 7101 Nov 12 21:23 rild.c -rw-rw-r-- 1 ting ting 191 Nov 12 21:23 rild.legacy.rc -rw-rw-r-- 1 ting ting 198 Nov 12 21:23 rild.rc
ting@ting-pc:~/aosp/android-9/hardware/ril/rild$ cat rild.rc service vendor.ril-daemon /vendor/bin/hw/rild class main user radio disabled group radio cache inet misc audio log readproc wakelock capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW
ting@ting-pc:~/aosp/android-9/hardware/ril/rild $ cat rild.c int main(int argc, char **argv) { // vendor ril lib path either passed in as -l parameter, or read from rild.libpath property const char *rilLibPath = NULL; // ril arguments either passed in as -- parameter, or read from rild.libargs property char **rilArgv; ... // 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); ... dlHandle = dlopen(rilLibPath, RTLD_NOW);// indicate to Vendor RIL, libreference-ril.so
-
The Vendor RIL is specific to a particular radio implementation, and dispatches "unsolicited commands" up to the RIL Daemon.
Modem module vendor needs to implement this shared library that coding modem specific AT commands.
ting@ting-pc:~/aosp/android-9/hardware/ril/reference-ril $ ls -al total 198 drwxr-xr-x 1 ting 197121 0 十二月 25 17:52 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:52 ../ -rw-r--r-- 1 ting 197121 1157 十二月 25 17:52 Android.mk -rw-r--r-- 1 ting 197121 3850 十二月 25 17:52 at_tok.c -rw-r--r-- 1 ting 197121 1004 十二月 25 17:52 at_tok.h -rw-r--r-- 1 ting 197121 24710 十二月 25 17:52 atchannel.c -rw-r--r-- 1 ting 197121 4381 十二月 25 17:52 atchannel.h -rw-r--r-- 1 ting 197121 1309 十二月 25 17:52 misc.c -rw-r--r-- 1 ting 197121 904 十二月 25 17:52 misc.h -rw-r--r-- 1 ting 197121 0 十二月 25 17:52 MODULE_LICENSE_APACHE2 -rw-r--r-- 1 ting 197121 10885 十二月 25 17:52 NOTICE -rw-r--r-- 1 ting 197121 177 十二月 25 17:52 OWNERS -rw-r--r-- 1 ting 197121 122720 十二月 25 17:52 reference-ril.c -rw-r--r-- 1 ting 197121 26 十二月 25 17:52 ril.h
ting@ting-pc:~/aosp/android-9/hardware/ril/reference-ril $ cat reference-ril.c static void requestSignalStrength(void *data __unused, size_t datalen __unused, RIL_Token t) { ATResponse *p_response = NULL; int err; char *line; int count = 0; // Accept a response that is at least v6, and up to v10 int minNumOfElements=sizeof(RIL_SignalStrength_v6)/sizeof(int); int maxNumOfElements=sizeof(RIL_SignalStrength_v10)/sizeof(int); int response[maxNumOfElements]; memset(response, 0, sizeof(response)); err = at_send_command_singleline("AT+CSQ", "+CSQ:", &p_response); if (err < 0 || p_response->success == 0) { RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); goto error; } line = p_response->p_intermediates->line; err = at_tok_start(&line); if (err < 0) goto error; for (count = 0; count < maxNumOfElements; count++) { err = at_tok_nextint(&line, &(response[count])); if (err < 0 && count < minNumOfElements) goto error; } RIL_onRequestComplete(t, RIL_E_SUCCESS, response, sizeof(response)); at_response_free(p_response); return; error: RLOGE("requestSignalStrength must never return an error when radio is on"); RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); at_response_free(p_response); }
-
The library of rild that implement Radio HIDL service, e.g.
android::hardware::radio::V1_1::IRadio.ting@ting-pc:~/aosp/android-9/hardware/ril/libril $ ls -al total 560 drwxr-xr-x 1 ting 197121 0 十二月 25 17:52 ./ drwxr-xr-x 1 ting 197121 0 十二月 25 17:52 ../ -rw-r--r-- 1 ting 197121 1138 十二月 25 17:52 Android.mk -rw-r--r-- 1 ting 197121 0 十二月 25 17:52 MODULE_LICENSE_APACHE2 -rw-r--r-- 1 ting 197121 10885 十二月 25 17:52 NOTICE -rw-r--r-- 1 ting 197121 49496 十二月 25 17:52 ril.cpp -rw-r--r-- 1 ting 197121 11316 十二月 25 17:52 ril_commands.h -rw-r--r-- 1 ting 197121 10484 十二月 25 17:52 ril_event.cpp -rw-r--r-- 1 ting 197121 1517 十二月 25 17:52 ril_event.h -rw-r--r-- 1 ting 197121 3112 十二月 25 17:52 ril_internal.h -rw-r--r-- 1 ting 197121 343787 十二月 25 17:52 ril_service.cpp -rw-r--r-- 1 ting 197121 34538 十二月 25 17:52 ril_service.h -rw-r--r-- 1 ting 197121 4791 十二月 25 17:52 ril_unsol_commands.h -rw-r--r-- 1 ting 197121 8980 十二月 25 17:52 RilSapSocket.cpp -rw-r--r-- 1 ting 197121 6491 十二月 25 17:52 RilSapSocket.h -rw-r--r-- 1 ting 197121 1714 十二月 25 17:52 RilSocket.h -rw-r--r-- 1 ting 197121 3906 十二月 25 17:52 rilSocketQueue.h -rw-r--r-- 1 ting 197121 39253 十二月 25 17:52 sap_service.cpp -rw-r--r-- 1 ting 197121 1093 十二月 25 17:52 sap_service.h
// impl. of android::hardware::radio::V1_1::IRadio ting@ting-pc:~/aosp/android-9/hardware/ril/libril $ cat ril_service.cpp struct RadioImpl : public V1_1::IRadio { int32_t mSlotId; sp<IRadioResponse> mRadioResponse; sp<IRadioIndication> mRadioIndication; sp<V1_1::IRadioResponse> mRadioResponseV1_1; sp<V1_1::IRadioIndication> mRadioIndicationV1_1; Return<void> setResponseFunctions( const ::android::sp<IRadioResponse>& radioResponse, const ::android::sp<IRadioIndication>& radioIndication); Return<void> getIccCardStatus(int32_t serial); ...
Usually it needs to stop ril daemon before testing AT command with modem module
setprop ctl.start vendor.ril-daemon setprop ctl.stop vendor.ril-daemon console:/vendor # find | grep -w "rild" ./etc/init/rild.rc ./bin/hw/rild console:/vendor # cat ./etc/init/rild.rc service vendor.ril-daemon /vendor/bin/hw/rild -l /vendor/lib64/libreference-ril.so class main user radio group radio cache inet misc audio sdcard_rw log readproc wakelock capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW console:/vendor # console:/vendor # find | grep -w "ril.so" ./lib64/libreference-ril.so console:/ # getprop | grep -i -E "ril|radio" [gsm.version.ril-impl]: [Quectel_Android_RIL_Driver_V3.1.8] [init.svc.vendor.ril-daemon]: [running] [persist.radio.multisim.config]: [ssss] [persist.rild.nitz_long_ons_0]: [] [persist.rild.nitz_long_ons_1]: [] [persist.rild.nitz_long_ons_2]: [] [persist.rild.nitz_long_ons_3]: [] [persist.rild.nitz_plmn]: [] [persist.rild.nitz_short_ons_0]: [] [persist.rild.nitz_short_ons_1]: [] [persist.rild.nitz_short_ons_2]: [] [persist.rild.nitz_short_ons_3]: [] [persist.vendor.radio.apm_sim_not_pwdn]: [1] [persist.vendor.radio.atfwd.start]: [false] [persist.vendor.radio.custom_ecc]: [1] [persist.vendor.radio.rat_on]: [combine] [persist.vendor.radio.sib16_support]: [1] [ril.subscription.types]: [NV,RUIM] [rild.libargs]: [-d /dev/ttyUSB2] [rild.libpath]: [/vendor/lib64/libreference-ril.so] [ro.boottime.vendor.ril-daemon]: [17157893326] [vendor.rild.libpath]: [/vendor/lib64/libreference-ril.so] console:/ # ps -A | grep -E -i "radio|ril" system 559 1 16180 4824 binder_thread_read 0 S android.hardware.radio.config@1.0-service radio 1312 1 2132928 6752 binder_thread_read 0 S rild radio 1321 1 5084 1868 __skb_wait_for_more_packets 0 S ssgqmigd radio 1526 1 22500 5368 futex_wait_queue_me 0 S ipacm radio 2003 1259 3712124 84148 SyS_epoll_wait 0 S com.qualcomm.qti.telephonyservice radio 3065 1259 3699680 77996 SyS_epoll_wait 0 S com.qualcomm.qcrilmsgtunnel radio 4375 1259 3695368 78876 SyS_epoll_wait 0 S com.qualcomm.qti.lpa radio 4390 1259 3697792 81464 SyS_epoll_wait 0 S com.qualcomm.qti.modemtestmode radio 4442 1259 3698524 80652 SyS_epoll_wait 0 S com.qualcomm.simcontacts radio 5480 1259 3714564 95160 futex_wait_queue_me 0 S com.android.phone- Take modem module Quectel EC25 for example, it's the USB serial device.
console:/ # ls -l /dev/ttyUSB* crw-rw---- 1 radio radio 188, 0 1970-01-01 00:00 /dev/ttyUSB0 crw-rw---- 1 radio radio 188, 1 1970-01-01 00:00 /dev/ttyUSB1 crw-rw---- 1 radio radio 188, 2 2020-12-02 09:59 /dev/ttyUSB2 crw-rw---- 1 radio radio 188, 3 1970-01-01 00:00 /dev/ttyUSB3 ls -al /sys/bus/usb/drivers drwxr-xr-x 32 root root 0 2020-12-07 08:06 . drwxr-xr-x 4 root root 0 1970-01-01 00:00 .. drwxr-xr-x 2 root root 0 2020-12-07 08:06 asix drwxr-xr-x 2 root root 0 2020-12-07 08:06 ax88179_178a drwxr-xr-x 2 root root 0 2020-12-07 08:06 cdc_ether drwxr-xr-x 2 root root 0 2020-12-07 08:06 cdc_ncm drwxr-xr-x 2 root root 0 2020-12-07 08:06 cdc_subset drwxr-xr-x 2 root root 0 2020-12-07 08:06 cdc_wdm drwxr-xr-x 2 root root 0 2020-12-07 08:06 hub drwxr-xr-x 2 root root 0 2020-12-07 08:06 lvs drwxr-xr-x 2 root root 0 2020-12-07 08:06 net1080 drwxr-xr-x 2 root root 0 2020-12-07 08:06 option drwxr-xr-x 2 root root 0 2020-12-07 08:06 qmi_wwan_q drwxr-xr-x 2 root root 0 2020-12-07 08:06 snd-usb-audio drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-alauda drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-cypress drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-datafab drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-freecom drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-isd200 drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-jumpshot drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-karma drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-onetouch drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-sddr09 drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-sddr55 drwxr-xr-x 2 root root 0 2020-12-07 08:06 ums-usbat drwxr-xr-x 2 root root 0 2020-12-07 08:06 usb drwxr-xr-x 2 root root 0 2020-12-07 08:06 usb-storage drwxr-xr-x 2 root root 0 2020-12-07 08:06 usb_ehset_test drwxr-xr-x 2 root root 0 2020-12-07 08:06 usbfs drwxr-xr-x 2 root root 0 2020-12-07 08:06 usbhid drwxr-xr-x 2 root root 0 2020-12-07 08:06 usbserial drwxr-xr-x 2 root root 0 2020-12-07 08:06 zaurusconsole:/ # cat /dev/ttyUSB2 & echo "ati;+csub" > /dev/ttyUSB2 echo -e 'AT+CPIN?\r\n' > /dev/ttyUSB2 echo -e 'at+qsimdet=1,0\r\n' > /dev/ttyUSB2 echo -e 'AT+QSIMDET=?\r\n' > /dev/ttyUSB2 echo -e 'AT+QSIMDET?\r\n' > /dev/ttyUSB2 echo -e 'AT+QSIMSTAT=1\r\n' > /dev/ttyUSB2 echo -e 'AT+QSIMSTAT=?\r\n' > /dev/ttyUSB2 echo -e 'AT+QSIMSTAT?\r\n' > /dev/ttyUSB2-
中華電信 mcc/mnc 466/92
-
restart zygote
setprop ctl.stop zygote setprop ctl.start zygote
Ref. LTE 4G module Quectel EC25-E, based on AOSP Android 9 / Android 10
More porting cases :
- 5G module Fibocom FM150-AE on Android 10
- 5G module Quectel RM500Q-AE PCI-E interface on Android 11