Android - Radio Layer Interface
Android - Radio Layer Interface
2008 Google
SDK
Docs
FAQ
Blog
Group
Terms
Report a Problem
Introduction
Android's Radio Interface Layer (RIL) provides an abstraction layer between Android telephony services (android.telephony) and radio hardware. The RIL is radio agnostic, and includes support for Global System for Mobile communication (GSM)-based radios. The diagram below illustrates the RIL in the context of Android's Telephony system architecture.
netmite.com/android//telephony.html
1/7
3/16/2011
Solid elements represent Android blocks and dashed elements represent partner-specific proprietary blocks. The RIL consists of two primary components: RIL Daemon: The RIL daemon initializes the Vendor RIL, processes all communication from Android telephony services, and dispatches calls to the Vendor RIL as solicited commands. Vendor RIL: The radio-specific Vendor RIL of ril.h that processes all communication with radio hardware and dispatches calls to the RIL Daemon (rild) through unsolicited commands.
RIL Initialization
Android initializes the telephony stack and the Vendor RIL at startup as described in the sequence below: 1. RIL daemon reads rild.lib path and rild.libargs system properties to determine the Vendor RIL library to use and any initialization arguments to provide to the Vendor RIL 2. RIL daemon loads the Vendor RIL library and calls RIL_Init to initialize the RIL and obtain a reference to RIL functions 3. RIL daemon calls RIL_register on the Android telephony stack, providing a reference to the Vendor RIL functions See the RIL Daemon source code at //device/commands/rild/rild.c for details.
netmite.com/android//telephony.html
2/7
3/16/2011
RIL Interaction
There are two forms of communication that the RIL handles: Solicited commands: Solicited commands originated by RIL lib, such as DIAL and HANGUP. Unsolicited responses: Unsolicited responses that originate from the baseband, such as CALL_STATE_CHANGED and NEW_SMS.
Solicited
The following snippet illustrates the interface for solicited commands: void OnRequest (int request_id, void *data, size_t datalen, RIL_Token t); void OnRequestComplete (RIL_Token t, RIL_Error e, void *response, size_t responselen); There are over sixty solicited commands grouped by the following families: SIM PIN, IO, and IMSI/IMEI (11) Call status and handling (dial, answer, mute) (16) Network status query (4) Network setting (barring, forwarding, selection) (12) SMS (3) PDP connection (4) Power and reset (2) Supplementary Services (5) Vendor defined and support (4) The following diagram illustrates a solicited call in Android.
Unsolicited
The following snippet illustrates the interface for unsolicited commands:
netmite.com/android//telephony.html
3/7
3/16/2011
void OnUnsolicitedResponse (int unsolResponse, void *data, size_t datalen); There are over ten unsolicited commands grouped by the following families: Network status changed (4) New SMS notify (3) New USSD notify (2) Signal strength or time changed (2) The following diagram illustrates an unsolicited call in Android.
RIL_Init
Your Vendor RIL must define a RIL_Init function that provides a handle to the functions which will process all radio requests. RIL_Init will be called by the Android RIL Daemon at boot time to initialize the RIL.
netmite.com/android//telephony.html
4/7
3/16/2011
RIL_RadioFunctions *RIL_Init (RIL_Env* env, int argc, char **argv); RIL_Init should return a RIL_RadioFunctions structure containing the handles to the radio functions: type structure { int RIL_version; RIL_RequestFunc onRequest; RIL_RadioStateRequest onStateRequest; RIL_Supports supports; RIL_Cancel onCancel; RIL_GetVersion getVersion; } RIL_RadioFunctions;
RIL Functions
ril.h defines RIL states and variables, such as RIL_UNSOL_STK_CALL_SETUP, RIL_SIM_READY, RIL_SIM_NOT_READY, as well as the functions described in the tables below. Skim the header file (/device/include/telephony/ril.h) for details.
Name
void (*RIL_RequestFunc) (int request, void *data, size_t datalen, RIL_Token t);
Description This is the RIL entry point for solicited commands and must be able to handle the various RIL solicited request types defined in ril.h with the RIL_REQUEST_ prefix.
request data
is one of RIL_REQUEST_*
RIL_REQUEST_* t
RIL_onResponse
Must be completed with a call to RIL_onRequestComplete(). RIL_onRequestComplete() may be called from any thread before or after this function returns. This will always be called from the same thread, so returning here implies that the radio is ready to process another command (whether or not the previous command has completed).
RIL_RadioState (*RIL_RadioStateRequest) (); int (*RIL_Supports)(int
This function should return the current radio state synchronously. This function returns "1" if the specified RIL_REQUEST code
5/7
netmite.com/android//telephony.html
3/16/2011 requestCode);
void (*RIL_Cancel) (RIL_Token t);
is supported and 0 if it is not. This function is used to indicate that a pending request should be canceled. This function is called from a separate thread--not the thread that calls RIL_RequestFunc. On cancel, the callee should do its best to abandon the request and call RIL_onRequestComplete with RIL_Errno CANCELLED at some later point. Subsequent calls to RIL_onRequestComplete for this request with other results will be tolerated but ignored (that is, it is valid to ignore the cancellation request). calls should return immediately and not wait for cancellation.
RIL_Cancel
The vendor RIL uses the following callback methods to communicate back to the Android RIL daemon.
Name
void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
Description
t
RIL_Notification
If e != SUCCESS, then response can be null and is ignored is owned by caller, and should not be modified or freed by callee RIL_onRequestComplete will return as soon as possible
response
void RIL_requestTimedCallback (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime);
Call user-specified callback function on the same thread that RIL_RequestFunc is called. If relativeTime is specified, then it specifies a relative time value at which the callback is invoked. If relativeTime is NULL or points to a 0-filled structure, the callback will be invoked as soon as possible.
Name
void RIL_onUnsolicitedResponse(int
Description
unsolResponse
is one of
6/7
netmite.com/android//telephony.html
3/16/2011 Android - Radio Layer Interface unsolResponse, const void *data, size_t RIL_UNSOL_RESPONSE_* datalen); data is pointer to data defined
for that RIL_UNSOL_RESPONSE_* is owned by caller, and should not be modified or freed by callee
data
v0.3 - 9 June 2008
netmite.com/android//telephony.html
7/7