Android RIL driver for Android 14

Hi support team,

  • Are there any plans to provide RIL drivers for the EC-25 for Android 14 (or driver version Radio1.6)?

  • I’ve seen in another thread that Android 13 should work using Radio1.5 – are there any other steps then integrating Radio1.1 (apart from chaing the version number in manifest.xml and w.r.t to libril.so, etc?)

Thanks in advance!

I will send you the libril.so and libreference-ril.so for IRadio 1.6.

I am sorry it is not recommended to talk via chat or PM on the Quectel Forums.
Form the log you provided, the Quectel modem is restarting.
The USB connection seems not stable.

Actually I have the Kvim3.
But as far as I know, it only support the Android 9.
And I have try the Quectel modem on it.

Khadas Documentation [Khadas Docs]

For how the Quectel modem used on kvim3 you can also discuss it here.

Thank you for the files!

I managed to start the Quectel RIL on both Hikey960 and Vim3 with some basic communication to the modem.
However, there I get the following errors:

D RILC : dlopen /vendor/lib64/hw/radio.quectel.module.so failed: dlopen failed: library “/vendor/lib64/hw/radio.quectel.module.so” not found
D RILC : start the service through api…
D RILC : ql_radio_config_init start
E RadioConfigFactory: ‘/vendor/manifest.xml’ not exist.

and it seems, like the Android Telephony Framework is not loaded properly:

E RILC : radioStateChangedInd: radioService[0]->mRadioIndication == NULL

do you have any idea what could go wrong?

I’ve attached the full log: RadioRilLog.txt (27.0 KB)

It is Android 12.

If you would like the IRadio 1.5.
Please put the libril.so from Quectel into vendor/lib64/.

And add the IRadio 1.5 declaration i manifest.xml.

I cannot find the log of libril.so.

Ah yes, i moved back to Android 12 on the VIM because I thought it might be more stable.

I have a problem copying the libril.so directly to the device while building, because the ‘default’ libril.so needs to be built for the rild service:

error: overriding commands for target `out/target/product/yukawa/vendor/lib64/libril.so’, previously defined at build/make/core/base_rules.mk:525

I tried copying it to the devices afterwards using adb and restarting the ril daemon, but this does not change anything.

Please provide the log

It is better to resolve it by yourself.

Sorry how do I retrieve the libril.so log?

I can prevent this error if I don’t build AOSP’s default libril.so, but then rild does not start because librilutils.so is missing. Could you provide all the required ril-libary files for arm64?

You can compile the libcutils.so
mmm hardware/ril/librilutils -j12

I mean that if you have put the libril.so into vendor/lib64/ and it still do not work please provide the log.

logcat -b all

Hi again,

thanks again for all the hints – in the meantime we have a running stable RIL integration using Radio@1.5 in Android 14 for both the Hikey and the Khadas VIM3 board.

When we try to use Radio@1.6, we get an error during initialization within the RIL daemon:

01-01 00:08:13.424     0     0 I init    : starting service 'vendor.ril-daemon'...
01-01 00:08:13.459     0     0 I init    : ... started service 'vendor.ril-daemon' has pid 4836
03-06 14:49:17.102  4836  4836 D RILD    : **RIL Daemon Started**
03-06 14:49:17.102  4836  4836 D RILD    : **RILd param count=3**
03-06 14:49:17.106  4836  4836 D RILD    : RIL_Init argc = 4 clientId = 0
03-06 14:49:17.106  4836  4836 D RILC    : Quectel RIL Version: Quectel_Android_RIL_Driver_V4.0.1_IRadio1.6_Release_20231211_10_47
03-06 14:49:17.106  4836  4836 D RIL_READ_CONF: original conf line: stop_sent_at=1
03-06 14:49:17.106  4836  4836 D RIL_READ_CONF: stop_sent_at = 1
03-06 14:49:17.106  4836  4836 D RIL_READ_CONF: original conf line: vzw_test=1
03-06 14:49:17.106  4836  4836 D RIL_READ_CONF: vzw_test = 1
03-06 14:49:17.106  4836  4836 E RILC    : '/vendor/manifest.xml' not exist.
03-06 14:49:17.106  4836  4836 D RILC    : 34.0</version>
03-06 14:49:17.106  4836  4836 F libc    : FORTIFY: memcpy: prevented 305954416-byte write into 32-byte buffer
03-06 14:49:17.107  4836  4836 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 4836 (rild), pid 4836 (rild)
03-06 14:49:17.146  4840  4840 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstoneProto
03-06 14:49:17.147   254   254 I tombstoned: received crash request for pid 4836
03-06 14:49:17.150  4840  4840 I crash_dump64: performing dump of process 4836 (target tid = 4836)
01-01 00:08:13.577     0     0 I logd    : logdr: UID=1001 GID=1001 PID=4840 n tail=500 logMask=8 pid=4836 start=0ns deadline=0ns
01-01 00:08:13.593     0     0 I logd    : logdr: UID=1001 GID=1001 PID=4840 n tail=500 logMask=1 pid=4836 start=0ns deadline=0ns
03-06 14:49:17.212  4840  4840 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-06 14:49:17.212  4840  4840 F DEBUG   : Build fingerprint: 'Android/yukawa/vim3:14/UP1A.231105.003.A1/eng.infine.20240306.114104:userdebug/test-keys'
03-06 14:49:17.212  4840  4840 F DEBUG   : Revision: '0'
03-06 14:49:17.212  4840  4840 F DEBUG   : ABI: 'arm64'
03-06 14:49:17.212  4840  4840 F DEBUG   : Timestamp: 2024-03-06 14:49:17.152001843+0000
03-06 14:49:17.212  4840  4840 F DEBUG   : Process uptime: 1s
03-06 14:49:17.212  4840  4840 F DEBUG   : Cmdline: /vendor/bin/hw/rild -l /vendor/lib64/hw/libquectel-ril.so
03-06 14:49:17.212  4840  4840 F DEBUG   : pid: 4836, tid: 4836, name: rild  >>> /vendor/bin/hw/rild <<<
03-06 14:49:17.212  4840  4840 F DEBUG   : uid: 1001
03-06 14:49:17.212  4840  4840 F DEBUG   : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
03-06 14:49:17.212  4840  4840 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
03-06 14:49:17.212  4840  4840 F DEBUG   : Abort message: 'FORTIFY: memcpy: prevented 305954416-byte write into 32-byte buffer'
03-06 14:49:17.212  4840  4840 F DEBUG   :     x0  0000000000000000  x1  00000000000012e4  x2  0000000000000006  x3  0000ffffedc37f50
03-06 14:49:17.212  4840  4840 F DEBUG   :     x4  3438342f321f6364  x5  3438342f321f6364  x6  3438342f321f6364  x7  7f7f7f7f7f7f7f7f
03-06 14:49:17.212  4840  4840 F DEBUG   :     x8  00000000000000f0  x9  0000f20a958eb090  x10 0000000000000001  x11 0000f20a95934f00
03-06 14:49:17.213  4840  4840 F DEBUG   :     x12 0000000000000000  x13 000000007fffffff  x14 00000000000180ec  x15 000000000000000a
03-06 14:49:17.213  4840  4840 F DEBUG   :     x16 0000f20a959a1d08  x17 0000f20a9597d810  x18 0000f20a9c084000  x19 00000000000000ac
03-06 14:49:17.213  4840  4840 F DEBUG   :     x20 00000000000000b2  x21 00000000000012e4  x22 00000000000012e4  x23 00000000ffffffff
03-06 14:49:17.213  4840  4840 F DEBUG   :     x24 0000ffffedc381f0  x25 0000000000000000  x26 0000000000000000  x27 0000000000000002
03-06 14:49:17.213  4840  4840 F DEBUG   :     x28 0000ba6a9c09a348  x29 0000ffffedc37fd0
03-06 14:49:17.213  4840  4840 F DEBUG   :     lr  0000f20a95925414  sp  0000ffffedc37f30  pc  0000f20a95925444  pst 0000000000000000
03-06 14:49:17.213  4840  4840 F DEBUG   : 8 total frames
03-06 14:49:17.213  4840  4840 F DEBUG   : backtrace:
03-06 14:49:17.213  4840  4840 F DEBUG   :       #00 pc 000000000005c444  /apex/com.android.runtime/lib64/bionic/libc.so (abort+180) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #01 pc 000000000005e39c  /apex/com.android.runtime/lib64/bionic/libc.so (__fortify_fatal(char const*, ...)+124) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #02 pc 0000000000089f18  /apex/com.android.runtime/lib64/bionic/libc.so (__check_buffer_access(char const*, char const*, unsigned long, unsigned long)+40) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #03 pc 000000000008a0c4  /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy_chk_fail+68) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #04 pc 000000000008b0a0  /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy_chk+16) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #05 pc 000000000003dea8  /vendor/lib64/hw/libquectel-ril.so (RIL_Init+1196) (BuildId: 4c5946f37cb74d34f80cf17d8fe151f6)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #06 pc 0000000000002354  /vendor/bin/hw/rild (main+756) (BuildId: 39e8837d02fab8874bbf678c150865ed)
03-06 14:49:17.213  4840  4840 F DEBUG   :       #07 pc 0000000000054838  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+104) (BuildId: e28e590ca0e65ae6ef686c6e737bc371)
03-06 14:49:17.222   642  1863 W NativeCrashListener: Couldn't find ProcessRecord for pid 4836
03-06 14:49:17.223   254   254 E tombstoned: Tombstone written to: tombstone_43
03-06 14:49:17.223   642   750 E NativeTombstoneManager: Tombstone's UID (1001) not an app, ignoring
03-06 14:49:17.224   642   750 E NativeTombstoneManager: Tombstone's UID (1001) not an app, ignoring
01-01 00:08:13.621     0     0 I init    : Untracked pid 4840 exited with status 0
01-01 00:08:13.621     0     0 I init    : Untracked pid 4840 did not have an associated service entry and will not be reaped
01-01 00:08:13.630     0     0 I init    : Service 'vendor.ril-daemon' (pid 4836) received signal 6
01-01 00:08:13.637     0     0 I init    : Sending signal 9 to service 'vendor.ril-daemon' (pid 4836) process group...
01-01 00:08:13.646     0     0 I libprocessgroup: Successfully killed process cgroup uid 1001 pid 4836 in 0ms
01-01 00:08:13.655     0     0 I init    : Untracked pid 4842 exited with status 0
01-01 00:08:13.659     0     0 I init    : Untracked pid 4842 did not have an associated service entry and will not be reaped
03-06 14:49:17.528  3349  3349 W HidlServiceManagement: Waited one second for android.hardware.radio@1.6::IRadio/slot1
03-06 14:49:17.528   216   216 I hwservicemanager: Since android.hardware.radio@1.6::IRadio/slot1 is not registered, trying to start it as a lazy HAL (if it's not configured to be a lazy HAL, it may be stuck starting or still starting).
03-06 14:49:17.529  3349  3349 I HidlServiceManagement: getService: Trying again for android.hardware.radio@1.6::IRadio/slot1...
03-06 14:49:17.538   216  4845 W libc    : Unable to set property "ctl.interface_start" to "android.hardware.radio@1.6::IRadio/slot1": error code: 0x20
03-06 14:49:17.538   216  4845 I hwservicemanager: Tried to start android.hardware.radio@1.6::IRadio/slot1 as a lazy service, but was unable to. Usually this happens when a service is not installed, but if the service is intended to be used as a lazy service, then it may be configured incorrectly.
01-01 00:08:13.926     0     0 E init    : Control message: Could not find 'android.hardware.radio@1.6::IRadio/slot1' for ctl.interface_start from pid: 216 (/system/bin/hwservicemanager)

Do you have any idea what could cause this issue?

If so you can use the IRadio 1.5 libs.

Hi @Bean.Wang-Q ,
I would have a follow-up question:
We would like to switch from USB to UART for communication. Do you know if this is possible with the EC25 or only with modems that support the multiplexing (CMUX)?

I am asking this, because we can communicate with plain UART with the modem, but when using the Android RIL, the mux driver complains that the modem isn’t answering (although on the physical lines, we see a response).

Here are some logs of the problem:

01-01 00:00:09.115   463   463 D RIL_SERVICE_1_5: RadioImpl_1_5::registerAsService(slot1)
01-01 00:00:09.121   463   496 D MUXD    : MUXD 2687:gsm0710muxd(): gsm0710muxd serialname = /dev/ttyAML6, gsm0710muxd_pid = 0
01-01 00:00:09.129   463   463 D RIL_SERVICE_1_1: status = 0
01-01 00:00:09.129   463   463 I RILC    : RILHIDL called registerService
01-01 00:00:09.129   463   463 D RILD    : RIL_Init RIL_register completed
01-01 00:00:09.129   463   463 D RILD    : RIL_register_socket started
01-01 00:00:09.129   463   463 D RIL_UIM_SOCKET: Adding socket with id: 0
01-01 00:00:09.129   463   463 D RILD    : RIL_register_socket completed
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2528:main(): Quectel CMUX Revision: Quectel_Linux_CMUX_Driver_V2.0.3
01-01 00:00:09.288   511   511 V MUXD    : MUXD 2529:main(): Enter
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2638:main(): Called with following options:
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2639:main(): 	-d: Fork, get a daemon [yes]
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2640:main(): 	-v: Set verbose logging level. 0 (Silent) - 7 (Debug) [6]
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2641:main(): 	-s <serial port name>: Serial port device to connect to [/dev/ttyAML6]
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2642:main(): 	-c <hardware flow control>:  Hardware flow control [disabled]
01-01 00:00:09.288   511   511 D MUXD    : MUXD 2643:main(): 	-t <timeout>: reset modem after this number of seconds of silence [0]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2644:main(): 	-P <pin-code>: PIN code to unlock SIM [-1]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2645:main(): 	-p <number>: use ping and reset modem after this number of unanswered pings [0]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2646:main(): 	-b <baudrate>: mode baudrate [115200]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2647:main(): 	-m <modem>: Mode (basic, advanced) [basic]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2648:main(): 	-f <framsize>: Frame size [127]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2649:main(): 	-n <number of ports>: Number of virtual ports to create, must be in range 1-4 [3]
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2650:main(): 	-o <output log to file>: Output log to /tmp/gsm0710muxd.log [no]
01-01 00:00:09.289   511   511 V MUXD    : MUXD 2271:watchdog(): Enter
01-01 00:00:09.289   511   511 V MUXD    : MUXD 2274:watchdog(): Serial state is 0
01-01 00:00:09.289   511   511 V MUXD    : MUXD 2043:open_serial_device(): Enter
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2050:open_serial_device(): Opened serial port
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2068:open_serial_device(): Configured serial device
01-01 00:00:09.289   511   511 V MUXD    : MUXD 2072:open_serial_device(): Switched Mux state to 1 
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2282:watchdog(): Watchdog started
01-01 00:00:09.289   511   511 D MUXD    : MUXD 2099:start_muxer(): Configuring modem
01-01 00:00:09.289   511   511 V MUXD    : MUXD 1386:chat(): Enter
01-01 00:00:09.289   511   511 V MUXD    : MUXD 732:syslogdump(): >s 00000000: 41 54 0d 0a  .  .  .  .- .  .  .  .  .  .  .  .  AT..
01-01 00:00:09.289   511   511 V MUXD    : MUXD 1393:chat(): Wrote 4 bytes
01-01 00:00:09.289   511   511 V MUXD    : MUXD 1395:chat(): CHAT++++++++++++
01-01 00:00:09.291   511   511 V MUXD    : MUXD 1406:chat(): Selected 1
01-01 00:00:09.391   511   511 V MUXD    : MUXD 1413:chat(): Read 11 bytes from serial device
01-01 00:00:09.391   511   511 V MUXD    : MUXD 732:syslogdump(): <s 00000000: 41 a8 35 ff 0d 14 9e 2d-6a 14 ff  .  .  .  .  .  A�5�..�-j.�
01-01 00:00:09.933   409   409 W HidlServiceManagement: Waited one second for android.hardware.radio.config@1.1::IRadioConfig/default
01-01 00:00:10.115   463   492 D RILC    : dlopen /vendor/lib64/hw/radio.quectel.module.so failed: dlopen failed: library "/vendor/lib64/hw/radio.quectel.module.so" not found
01-01 00:00:10.115   463   492 D RILC    : start the service through api...
01-01 00:00:10.116   463   492 D RILC    : ql_radio_config_init start
01-01 00:00:10.116   463   492 E RadioConfigFactory: '/vendor/manifest.xml' not exist.
01-01 00:00:10.116   463   492 D RadioConfigImpl: RadioConfigImpl()
01-01 00:00:10.116   463   492 D RadioConfigImpl_1_2: RadioConfigImpl_1_2:registerAsService(default)
01-01 00:00:10.118   463   492 D RadioConfigFactory: radio_config_register_service status=0
01-01 00:00:10.118   463   492 D RILC    : ql_radio_config_init finish
01-01 00:00:10.118   463   492 D RILC    : ql_radio_sap_init start
01-01 00:00:10.118   463   492 D RIL_SAP_1_2: ql_radio_sap_init() start.
01-01 00:00:10.119   463   492 D RIL_SAP_1_2: radio_sap_register_service status=0
01-01 00:00:10.119   463   492 D RILC    : ql_radio_sap_init finish
01-01 00:00:10.120   409   409 I radiocompat: Found 1 slot(s)
01-01 00:00:10.122   409   409 I radiocompat: android.hardware.radio.data.IRadioData/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.122   409   409 I radiocompat: android.hardware.radio.messaging.IRadioMessaging/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.123   409   409 I radiocompat: android.hardware.radio.modem.IRadioModem/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.123   409   409 I radiocompat: android.hardware.radio.network.IRadioNetwork/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.123   409   409 I radiocompat: android.hardware.radio.sim.IRadioSim/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.123   409   409 I radiocompat: android.hardware.radio.voice.IRadioVoice/slot1 is not declared in VINTF (this may be intentional)
01-01 00:00:10.124   409   409 D radiocompat: Radio HAL compat service is operational
01-01 00:00:10.390   511   511 V MUXD    : MUXD 1406:chat(): Selected 0
01-01 00:00:10.390   511   511 W MUXD    : MUXD 2104:start_muxer(): Modem does not respond to AT commands, trying close mux mode
01-01 00:00:10.390   511   511 V MUXD    : MUXD 758:write_frame(): write_frame Enter
01-01 00:00:10.390   511   511 V MUXD    : MUXD 766:write_frame(): Sending frame to channel 0
01-01 00:00:10.390   511   511 V MUXD    : MUXD 732:syslogdump(): >s 00000000: f9 03 c3 01 40 f9  .  .- .  .  .  .  .  .  .  .  �.�.@�
01-01 00:00:10.390   511   511 V MUXD    : MUXD 810:write_frame(): Leave
01-01 00:00:10.390   511   511 V MUXD    : MUXD 758:write_frame(): write_frame Enter
01-01 00:00:10.390   511   511 V MUXD    : MUXD 766:write_frame(): Sending frame to channel 0
01-01 00:00:10.391   511   511 V MUXD    : MUXD 732:syslogdump(): >s 00000000: f9 03 ef 05 c3 01 f2 f9- .  .  .  .  .  .  .  .  �.�.�.��
01-01 00:00:10.391   511   511 V MUXD    : MUXD 810:write_frame(): Leave
01-01 00:00:10.391   511   511 V MUXD    : MUXD 1386:chat(): Enter
01-01 00:00:10.391   511   511 V MUXD    : MUXD 732:syslogdump(): >s 00000000: 41 54 0d 0a  .  .  .  .- .  .  .  .  .  .  .  .  AT..
01-01 00:00:10.391   511   511 V MUXD    : MUXD 1393:chat(): Wrote 4 bytes
01-01 00:00:10.391   511   511 V MUXD    : MUXD 1395:chat(): CHAT++++++++++++
01-01 00:00:11.392   511   511 V MUXD    : MUXD 1406:chat(): Selected 0
01-01 00:00:11.392   511   511 V MUXD    : MUXD 1386:chat(): Enter
01-01 00:00:11.392   511   511 V MUXD    : MUXD 732:syslogdump(): >s 00000000: 41 54 0d 0a  .  .  .  .- .  .  .  .  .  .  .  .  AT..
01-01 00:00:11.392   511   511 V MUXD    : MUXD 1393:chat(): Wrote 4 bytes
01-01 00:00:11.392   511   511 V MUXD    : MUXD 1395:chat(): CHAT++++++++++++

Thanks in advance!

If you have only Main uart connected with the EC25, the RIL will automatically to use CMUX.
Because the RIL need both the AT port and modem port to set up ppp connection.

Yes, that I have seen.
But should that in theory work? Because it doesn’t (see above).

Please provide the info

getprop | grep ril

Here it is:

vim3:/ # getprop | grep ril
[gsm.version.ril-impl]: [Quectel_Android_RIL_Driver_V3.6.24_master_Release_20231211_10_47]
[init.svc.vendor.ril-daemon]: [running]
[init.svc_debug_pid.vendor.ril-daemon]: [458]
[rild.libargs]: [-d/dev/ttyAML6]
[rild.libpath]: [/vendor/lib64/hw/libquectel-ril.so]
[ro.boottime.vendor.ril-daemon]: [9552199170]
[ro.radio.noril]: [no]
[vendor.rild.libargs]: [-d/dev/ttyAML6]
[vendor.rild.libpath]: [/vendor/lib64/hw/libquectel-ril.so]