Summary
•Background
•RIL stack overview
•RIL daemon (rild)
•Example: RIL with Mc39i on versatile
•Example: RIL with HUAWEI E169 on
Eeepc 900
•Screenshots
Background
•What is RIL ?
–RIL is the abbreviation of Android's Radio Interface Layer (RIL),
–it provides an abstraction layer between Android telephony services (
android.telephony) and radio hardware.
–It consists of two primary components RIL Daemon and Vendor RIL.
–RIL Daemon
•it initializes the Vendor RIL,
•and processes all communication from Android telephony services, and dispatches calls to
the Vendor RIL as solicited commands.
•Solicited Request, all the request that sent by RILJ belong this category. For example : dial,
hung up send SMS
–Vendor RIL
•It initialize the baseband device
•and processes all communication with radio hardware and dispatches calls to the RIL
Daemon (rild) through unsolicited commands.
•Unsolicited Request, the event that coming from outside. For example : incoming calling,
MS change BS, signal strength
•The purpose of this section is to introduce RIL control flow, but not includes
voice and packet services.
Summary
•Background
•RIL stack overview
•RIL daemon (rild)
•Example: RIL with Mc39i on versatile
•Example: RIL with HUAWEI E169 on
Eeepc 900
•Screenshots
RIL Overview
Android RIL stack
Summary
•Background
•RIL stack overview
•RIL daemon (rild)
•Example: RIL with Mc39i on versatile
•Example: RIL with HUAWEI E169 on
Eeepc 900
•Screenshots
Component naming
•the RIL component, RILJ RILD RILC and RIL,
are the name used in the android LOG
functions.
•Android has a set of functions for recording
different type log message, ex: LOGE() for error
message, LOGW() for warning message, and
LOGI() for normal information, we call those
function ( or method whatever ) as LOG
functions.
•You can use logcat to watch those message via
adb.
RIL stack component
•RILJ
–java/android/telephony/gsm
–Send Requests ( dial, hang up,
signal strength ... ) to RIL via local
socket “rild”
•RILD ( log tag name )
–hardware/ril/rild
–Ril Daemon ,initiates the telephony
stack of RILC and RIL, then go to
sleep forever
•RILC
–hardware/ril/libril
–Libril, a event scheduler library for
processing solicited and unsolicited
request and as a bridge between
RILJ and Vendor RIL.
•RIL
–hardware/ril/reference-ril
–Vendor library, launches the device
and processes the RIL_Request.
RIL daemon startup flow
•Init read /init.rc start rild services
–service ril-daemon /system/bin/rild
– socket rild stream 660 root radio
– socket rild-debug stream 660 radio system
– user root
– group radio cache inet misc
RIL daemon startup flow
watch_table
eventLoop
Event
Name :s_wakeupfd_event
Watch Fd : s_fdWakeupRead
Persist : true
Callback :
processWakeupCallback
Extra param : null
It do nothing more than just
read s_fdWakeupRead
Introduction to RIL Event
timer_list
linking list
Store event related
with time
watch_table
Max Size: 8
Store event related with
fd ( socket , pipe , and
device node)
Introduction to RIL Event(2)
•RIL has two category event,
which corresponds to Time
and I/O event.
–Time event is put on timer_list.
–I/O event is inserted into
watch_table.
•time_list is a linked-list data
structuture
•watch_table is a array, it’s
maximal size is 8.
•All event use the same data
structure ril_event
Introduction to RIL Event(3)
Time event
Introduction to RIL Event(4)
add time event flow
Introduction to RIL Event(5)
I/O event
Introduction to RIL Event(6)
insert I/O event flow
Introduction to RIL Event(7)
schedule and fire event
ril_event_loop
RIL_Register
Event
Name :s_listen_event
Watch Fd : s_fdListen
Persist : false
Callback : listenCallback
Extra param : null
Event listenCallback
Event
Name :s_commands_event
Watch Fd : s_fdCommand
Persist : 1
Callback :
processCommandsCallback
Extra param :
RecordStream *p_rs
Event processCommandsCallback
processCommandBuffer
The usage of RequestInfo, CommandInfo
and UnsolResponseInfo
•In Android, RIL stack has two command table that
corresponding to solicited and unsolicited request
–Solicited Request, all the request that sent by
RILJ belong this category. For example : dial,
hung up send SMS
–Unsolicited Request, the event that coming from
outside. For example : incoming calling, MS
change BS, signal strength
•CommandInfo stores Solicited Request processing
function
–hardware\ril\libril\ril_commands.h
•UnsolResponseInfo stores Unsolicited Request
processing function
–hardware\ril\libril\ril_unsol_commands.h
•RequestInfo link multiple CommandInfo into a
linked-list
Summary
•Background
•RIL stack overview
•RIL daemon (rild)
•Example: RIL with Mc39i on versatile
•Example: RIL with HUAWEI E169 on
Eeepc 900
•Screenshots
RIL with Mc39i on versatile
•Building process
•Turn on telephony service on android
Building process
•pre-requirement
–Android release 1.0
–Linux Kernel 2.6.25 for
android
–Siemens Mc39i Module
•It was connected to versatile
serial port 2
–Versatile development
board
Building process
•Kernel configuration
–make versatile_defconfig
–make menuconfig
–Kernel Features->Use the ARM EABI ...
–Networking->Networking options->IP: DHCP
–Device Drivers->Input device support->Event interface
–Device Drivers->Real Time Clock
–Device Drivers->Android->Android power driver
–Device Drivers->Android->Android power driver lock stats
Building process
•Kernel modification
–arch/arm/mach-versatile/core.c
•Line 578
–val |= SYS_CLCD_MODE_565_BLSB;
•Line 611
–framesize=640*480*2*2;
–drivers/video/amba-clcd.c
•Line 370 fb->fb.fix.ypanstep = 1;
•Line 377 fb->fb.var.yres_virtual = fb->panel->mode.yres * 2;
•clcdfb_disable, directly return;
•clcdfb_enable, insert below line into the function’s head.
–static int e=0; if (en==1) return; en=1;
Building process
• Download android open source release 1.0
– $ mkdir mydroid
$ cd mydroid
– repo init -u
git://android.git.kernel.org/platform/manife
st.git –b release-1.0
– repo sync
• Modification for Mc39i
– hardware/ril/reference-ril/reference-
ril.c
– Function initializeCallback
• Remove line 1742
at_send_command("AT+CMOD=0",
NULL);
• Alter line line 1754
at_send_command("AT+CSCS=\" HEX\"",
NULL);
at_send_command("AT+CSCS=\“ GSM\"",
NULL);
Building process
•Modification for Mc39i (cont.)
–hardware/ril/reference-ril/reference-
ril.c (requestOperator)
–No operator name on screen lock
•Mc39i is not supported AT+COPS=3,1
•AT+COPS=3,0 : Full Name, ex: ChungHwa
•AT+COPS=3,1 : Short Name, ex: CHT
•AT+COPS=3,2 : Location Area Identification,
ex: 46692
–Solution :
•Create a mapping table, before return from
requestOperator, assign the short name to
the Name vector.
Building process
•Compile android open source release 1.0
–$ cd mydroid && make
•NFS setup
–mkdir /opt/rootfs/
–cp –R out/target/product/generic/root/* /opt/rootfs
–cp –R out/target/product/generic/system/* /opt/rootfs/system
–chmod 777 /opt/rootfs/system ( to solve keymap file
problem )
–vi /etc/exports
•/opt/rootfs *(rw, no_root_squash )
–Restart NFS services
Building process
•Modification RIL configuration
–/opt/rootfs/system/build.prop
–rild.libargs=-d /dev/ttyS0
rild.libargs=-d /dev/ttyAMA2
•Kernel command line
–Enter Uboot
•setenv bootargs console=ttyAMA0 mem=128M
root=/dev/nfs ip=dhcp nfsroot=“your_ip_address”:/opt/rootfs
init=/init
–Reboot versatile for into Android
Reference
•Android RIL porting guide
–http://www.kandroid.org/android_pdk/telephony.html
–The original document has been obsolete by
google.
RIL with Mc39i on versatile
•Building process
•Turn on telephony service on android
Turn on telephony service
•Problem : No startup wizard on android release 1.0
–The android is not active .
–Some services can not worked, ex: incoming call.
•To active the android, the device_provisioned flag must
be set by manually.
–$cd
/opt/rootfs/data/data/com.android.providers.settings/databases
–sqlite3 settings.db
–INSERT INTO system (name,value) VALUES
(‘device_provisioned’, ‘1’);
–.quit
flag device_provisioned usage
•device_provisioned usage in android donut
(android 2.0)
•define in class android.provider.Settings.Secure
–public static final String DEVICE_PROVISIONED =
"device_provisioned";
–framework/base/core/java/com/android/provider/
Settings.java
Building Process
•Kernel configuration
–Use cupcake/kernel
–Get eeepc 901 kernel config from http://pastebin.com/f26fe5376 ,.
–Make menuconfig
•EXT2 ( installer needs it to mount ramdisk )
•PPP ( choose all options )
•USB serial
–Includes USB GSM and CDMA option
•Framebuffer
–VESA VGA Driver
–drivers/rtc/alarm.c revision
•Delete #include <time.h>
•Add below code to alarm.c
•#ifdef __i386__
•static void save_time_delta(struct timespec *delta, struct timespec *rtc)
•{
set_normalized_timespec(delta,
xtime.tv_sec - rtc->tv_sec,
xtime.tv_nsec - rtc->tv_nsec);
•}
•#endif
Building Process
•Source tree Modification
–cd cupcake
–mv verdor/asus/eee_701/Android.mk verdor/asus/eee_701
/AndroidBoard.mk
–vi external/e2fsprogs/Android.mk
•Unmark include $(call all-subdir-makefiles)
–vi framework/base/preloaded-classes (mark below lines )
•#com.android.internal.policy.impl.PhoneLayoutInflater
•#com.android.internal.policy.impl.PhoneWindow
•#com.android.internal.policy.impl.PhoneWindow$1
•#com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
•#com.android.internal.policy.impl.PhoneWindow$DecorView
•#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
•#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedStat
e
•#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedStat
e$1
Building Process
•Source tree Modification (cont.)
–vi vendor/asus/eee_701/init.rc:
•# Define the oom_adj values for the classes of processes that can be killed by the kernel.
These are used in ActivityManagerService.
• setprop ro.FOREGROUND_APP_ADJ 0
• setprop ro.VISIBLE_APP_ADJ 1
• setprop ro.SECONDARY_SERVER_ADJ 2
• setprop ro.HOME_APP_ADJ 4
• setprop ro.HIDDEN_APP_MIN_ADJ 7
• setprop ro.CONTENT_PROVIDER_ADJ 14
• setprop ro.EMPTY_APP_ADJ 15
•# Define the memory thresholds at which the above process classes will
•# be killed. These numbers are in pages (4k).
• setprop ro.FOREGROUND_APP_MEM 1536
• setprop ro.VISIBLE_APP_MEM 2048
• setprop ro.SECONDARY_SERVER_MEM 4096
• setprop ro.HOME_APP_MEM 4096
• setprop ro.HIDDEN_APP_MEM 8192
• setprop ro.CONTENT_PROVIDER_MEM 8704
• setprop ro.EMPTY_APP_MEM 16384
Building Process
•Source tree Modification (cont.)
–vi bootable/diskinstaller/init.rc :
•service installer /system/bin/installer -p
/dev/block/sdc2
–vi vendor/asus/eeepc_701/BoardConfig.mk
•add vga=788 into BOOT_KERNEL_CMDLINE
–Vi external/ppp/pppd/Android.mk
•Del first line and last line to enable pppd compiling
for x86 platform
Building Process
•Add ppp and chat script to source tree
–mkdir external/ppp/chat
–get chat source from ftp://ftp.samba.org/pub/ppp/ppp-2.4.3.tar.gz
–vi external/ppp/chat/Android.mk
•LOCAL_PATH:= $(call my-dir)
•include $(CLEAR_VARS)
•LOCAL_SRC_FILES:= \
• chat.c
•LOCAL_SHARED_LIBRARIES := \
• libcutils libc
•LOCAL_C_INCLUDES := \
• $(LOCAL_PATH)/include
•LOCAL_CFLAGS := -DANDROID_CHANGES -DTERMIOS -DSIGTYPE=void -
UNO_SLEEP -DFNDELAY=O_NDELAY
•LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
•LOCAL_MODULE_TAGS := eng
•LOCAL_MODULE:= chat
•include $(BUILD_EXECUTABLE)
Building Process
•Add ppp and chat script to source tree
(cont.)
–vi system/core/rootdir/etc/ppp/ppp-startup.sh
#!/system/bin/sh
setprop net.dns1 168.95.1.1
/system/xbin/pppd –detach modem crtscts debug \
/dev/ttyUSB0 460800 noipdefault \
defaultroute usepeerdns \
connect “/etc/ppp/pppondialer”
Building Process
•Add ppp and chat script to source tree (cont.)
–vi system/core/rootdir/etc/ppp/pppondialer
#!/system/bin/sh
chat –v –s \
TIMEOUT 30 \
ABORT BUSY \
ABORT ERROR \
“” ‘AT’ \
OK ‘ATZ’ \
OK ‘ATQ0 V1 E1 S0=0 &C1 &C2 +FCLASS=0’ \
OK ‘AT+CGDCONT=1,”IP”,”internet”’ \ internet 為中華電信 APN
name
OK ‘AT+CSQ’ \
OK ‘ATD*99#’ \
CONNECT ‘’
Building Process
•Add ppp and chat script to source tree (cont.)
–vi system/core/rootdir/Android.mk
copy_from := \
etc/dbus.conf \
etc/init.goldfish.sh \
etc/hosts \
etc/ppp/ppp-startup.sh \
etc/ppp/pppondialer
–vi vendor/asus/eeepc_701/init.rc
Add “chmod 777 /etc/ppp/ppp-startup.sh”
Add “chmod 777 /etc/ppp/pppondialer ”
Add “symlink /dev/ttyUSB0 /dev/3GModem”
Add “chmod 777 /dev/3GModem”
Building Process
•Compile source tree and install image into
eeepc 900
–Compile source
•TARGET_ARCH=x86
TARGET_PRODUCT=eee_701
DISABLE_DEXPREOPT=true make installer_img
–Create USB installer
•dd if= out/target/product/
eee_701/installer.img of=/dev/<USB HDD>
I915 resolution solution
•The uvesafb denotes the userspace VESA frame
buffer driver, a generic frame buffer driver for Linux
systems. It offers more features than the original
vesafb, such as adjustable resolution and adjustable
refresh rates with VBE 3.0-compliant graphic cards.
•UvesafbHowTo
–http://www.android-x86.org/documents/uvesafbhowto
•Uvesafb project
–http://dev.gentoo.org/~spock/projects/uvesafb/
RIL with E169 on Eeepc 900
•Building Process
•Surfing internet
Surfing internet
•Insert HUAWEI E169 into Eeepc
900
•Press ALT+F1 into framebuffer
console
●
/etc/ppp/ppp-startup.sh
•Press ALT+CTRL+F7, back to
Android
Summary
•Background
•RIL stack overview
•RIL daemon (rild)
•Example: RIL with Mc39i on versatile
•Example: RIL with HUAWEI E169 on
Eeepc 900
•Screenshots
Screenshots
Screenshots
Screenshots
Screenshots
Screenshots
RILJ Overview
Connect to “rild”
Handle solicited and
unsolicited response
Store solicited
request that sent by
mSender
All request args.
would be stored to
Parcel object
for holding solicited
request code, EX:
REQUEST_DIAL
for sending response to
the activity that solicits this
request