bc9
Summary †
This article shows how to set up an Android development environment. The article argues mainly for android-1.5, but the method
can be applicable to other versions of Android. The development environment either uses the pre-build VMware virtual machine file,
bc9-android-sdk—release20090801.vmx or build a development environment on VMware. Also, the virtual machine can be replaced
with Linux environment in general. (Caution: the version of Linux may differ. It is highly dependent on the version of Android-sdk.)
Some information listed here may similar to the information of bc9/Software/android/android-1.5r3. This page is aimed at providing
an overview of the process. To seek farther detail information, please visit bc9/Software/android/android-1.5r3.
VMware †
The configuration of the VMware for bc9-android-sdk is shown below.
- Version: VMware 6.5 compatible
- Disk Space: Virtual Disk 20G (the space is divided into 2G)
- number of CPUs: 1
- Memory: 512 M
- To increase the number of CPU and the size of memory, change numvcpus and memsize at the configuration file of VMware
virtual machine.
- Network: bridge network
- OS
- Ubuntu 8.04.3 LTS (install 8.04.2 first, then update it)
- The setting of Applications basically remains in default, but the exceptions are shown shown below.
android (Android Open Source project) †
Please look at URL below for the information of repo and other requirements. Please follow the instructions of the build process.
Initialization †
Make a directory, which is called android-sdk-1.5r3, and whose location is under /home/beat/. Initialize repo'''.
$ cd ~/
$ mkdir android-sdk-1.5_r3
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3
Adding information for extra source code †
The original source code does not contain all requirements of bc9. Obtain the extra source code, adding extra
information for needed source code. After initializing repo, create local_manifest.xml at .repo.
local_manifest.xml allows downloading extra source code for bc9.
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project path="kernel" name="kernel/common" revision="refs/heads/android-2.6.29"/>
<project path="external/alsa-lib" name="platform/external/alsa-lib"/>
<project path="hardware/alsa_sound" name="platform/hardware/alsa_sound"/>
</manifest>
Obtain source code †
After the configuration described above is completed, obtain the source code by repo sync.
$ repo sync
Modification of source files †
After repo sync is finished, modify obtained source code. The changes are shown below.
- Add alsa
Change Android.mk, which is located at android-sdk-1.5_r3/external/alsa-lib/Android.mk.
--- Android.mk.orig 2009-07-09 07:05:41.000000000 -0700
+++ Android.mk 2009-07-09 07:05:48.000000000 -0700
@@ -55,7 +55,7 @@
-fPIC -DPIC -D_POSIX_SOURCE \
-DALSA_CONFIG_DIR=\"/system/usr/share/alsa\" \
-DALSA_PLUGIN_DIR=\"/system/usr/lib/alsa-lib\" \
- -DALSA_DEVICE_DIRECTORY=\"/dev/snd/\"
+ -DALSA_DEVICE_DIRECTORY=\"/dev/\"
LOCAL_SRC_FILES := $(sort $(call all-c-files-under, src))
- Change the content of BoardConfig.mk
To use ALSA for audio hardware library, change the content of BoardConfig.mk. This file is located at
android-sdk-1.5r3/build/target/board/generic/BoardConfig.mk.
# config.mk
#
# Product-specific compile-time definitions.
#
# The generic product target doesn't have any hardware-specific pieces.
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_NO_RADIOIMAGE := true
HAVE_HTC_AUDIO_DRIVER := true
BOARD_USES_ALSA_AUDIO := true
#BOARD_USES_GENERIC_AUDIO := true ※ comment out
- Apply a patch on power management
$ cd android-sdk-1.5_r3
$ patch -p1 < ../dummy-battery.patch
Patch is available from here.
Build †
The adjustment of source code is over. Now start building.
$ cd android-sdk-1.5_r3
$ make
OpenWnn †
At the previous build, OpenWnn is not build. OpenWnn of android-sdk-1.5r3 branch is not built since landscape becomes effective.
To prevent this happening, shift the branch of android-sdk-1.5_r3/packages/inputmethods/OpenWnn/.
$ cd android-sdk-1.5_r3/packages/inputmethods/OpenWnn
$ git checkout korg/cupcake-release
After shifting the branch, make software keyboard effective as landscape is displayed.
$ vim android-sdk-1.5_r3/packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/JAJP/DefaultSoftKeyboardJAJP.java
At the line 843 “Create the keyboard for landscape mode” and below, let all keylist,which is located in createKeyboardsLandscape,
effective. After this modification is completed, add OpenWnn and build agin.
$ cd abdroid-sdk-1.5_r3/build/
$ source envsetup.sh
$ cd abdroid-sdk-1.5_r3/packages/inputmethods/OpenWnn
$ mm
After executing these command lines, the lib files for OpenWnn are built inside OpenWnn.apk and under the directory of
'''android-sdk-1.5r3/out/target/product/generic/system/lib/.
egg file †
Change the name of the file from AudioPackage2.mk to Android.mk. Then, make android as shown below.
$ cp AudioPackage2.mk Android.mk
$ cd android-sdk-1.5_r3/build/
$ source envsetup.sh
$ cd android-sdk-1.5_r3/frameworks/base/data/sounds
$ mm
The audio files are copied under the directory of android-sdk-1.5_r3/out/target/product/generic/system/media/audio/.
Creating rootfilesystem †
As the build process of android has succeeded, place these files under the directory of android-root.
$ cd ~/
$ mkdir android-root
$ cp -a ~/android-sdk-1.5_r3/out/target/product/generic/root/* ~/android-root/
$ cp -a ~/android-sdk-1.5_r3/out/target/product/generic/system/* ~/android-root/system/
Edit init.rc †
The extra code is added at android-root/init.rc, and the location in which these additional lines of code are placed is right
before on boot.
chmod 0666 /dev/bc9_leds
setprop alsa.mixer.playback.master Master
setprop alsa.mixer.capture.master Capture
setprop alsa.mixer.playback.earpiece Master
setprop alsa.mixer.capture.earpiece Capture
setprop alsa.mixer.playback.headset Master
setprop alsa.mixer.playback.speaker Master
chmod 0777 /dev/pcmC0D0c
chmod 0777 /dev/pcmC0D0p
chmod 0777 /dev/controlC0
chmod 0777 /dev/timer
chown root audio /dev/controlC
chown root audio /dev/pcmC0D0c
chown root audio /dev/pcmC0D0p
chown root audio /dev/timer
on boot
# basic network init
Also, put comment out (#) on the lines of code, which start with mount yaffs2.....
Modify default.prop †
The lines of code shown below are attached to the end of android-root/default.prop.
net.eth0.dns1=208.66.222.222
net.dns1=208.67.222.222
Create asound.state †
Create asound.state and asound.conf in the directory of android/system/etc/. The code below is asound.state,
which is generated by alsamixer as OpenEmbedded is booted on bc9.
state.Gumstix {
control.1 {
comment.access 'read write'
comment.type INTEGER
comment.count 1
comment.range '0 - 4'
iface MIXER
name 'Tone Control - Bass'
value 0
}
control.2 {
comment.access 'read write'
comment.type INTEGER
comment.count 1
comment.range '0 - 2'
iface MIXER
name 'Tone Control - Treble'
value 0
}
control.3 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'Headphone Playback Switch'
value true
}
control.4 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name De-emphasis
value false
}
control.5 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'DC Filter'
value true
}
control.6 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'Hi-pass Filter'
value true
}
control.7 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'ADC Filter'
value true
}
control.8 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'Master Playback Switch'
value true
}
control.9 {
comment.access 'read write'
comment.type INTEGER
comment.count 2
comment.range '0 - 63'
iface MIXER
name 'Master Playback Volume'
value.0 63
value.1 63
}
control.10 {
comment.access 'read write'
comment.type ENUMERATED
comment.count 2
comment.item.0 Mic
comment.item.1 CD
comment.item.2 Video
comment.item.3 Aux
comment.item.4 Line
comment.item.5 Mix
comment.item.6 'Mix Mono'
comment.item.7 Phone
iface MIXER
name 'Capture Source'
value.0 Mic
value.1 Mic
}
control.11 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'Capture Switch'
value true
}
control.12 {
comment.access 'read write'
comment.type INTEGER
comment.count 2
comment.range '0 - 15'
iface MIXER
name 'Capture Volume'
value.0 15
value.1 15
}
control.13 {
comment.access 'read write'
comment.type BOOLEAN
comment.count 1
iface MIXER
name 'Loudness (bass boost)'
value false
}
}
Create asound.conf †
asound.conf is created from asound.state
ctl.AndroidPlayback {
type hw
card 0
}
ctl.AndroidRecord {
type hw
card 0
}
pcm.AndroidPlayback {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Speaker_normal {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Speaker {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Headset {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Speaker_incall {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Headset_incall {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Earpiece_incall {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidPlayback_Bluetooth {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
pcm.AndroidRecord_Microphone {
type hooks
slave.pcm {
type hw
card 0
device 0
}
hooks.0 {
type ctl_elems
hook_args [
{ name 'Tone Control - Bass' value 0 }
{ name 'Tone Control - Treble' value 0 }
{ name 'Headphone Playback Switch' value true }
{ name 'De-emphasis' value false }
{ name 'DC Filter' value true }
{ name 'Hi-pass Filter' value true }
{ name 'ADC Filter' value true }
{ name 'Master Playback Switch' value true }
{ name 'Master Playback Volume' value [ 55 55 ] }
{ name 'Capture Source' value [ Mic Mic ] }
{ name 'Capture Switch' value true }
{ name 'Capture Volume' value [ 15 15 ] }
{ name 'Loudness (bass boost)' value false }
]
}
}
Generate vold.conf †
vold manages the mount of SD card. vold takes directions from a configuration file. The configuration file is needed to
be created and placed at the directory shown below.
$ vi android-root/system/etc/vold.conf
This is how to write the configuration file.
## vold configuration file for bc9
volume_sdcard {
media_path /devices/platform/pxa2xx-mci.0/mmc_host/mmc0
media_type mmc
mount_point /sdcard
ums_path /devices/platform/usb_mass_storage/lun0
}
Key assignment †
bc9 does have three buttons. From the top, F1, F2, and F3 are already assigned. These keys appoint to act as HOME,
MENU, and BACK buttons of Android, respectively.
qwerty.kl manages the key board of Android. Edit this file, which is located at android-root/system/usr/keylayout.
This is how to change the file.
--- qwerty.kl-orig 2009-07-02 20:28:21.000000000 +0900
+++ qwerty.kl 2009-07-02 20:29:42.000000000 +0900
@@ -11,18 +11,18 @@ key 10 9
key 11 0
key 158 BACK WAKE_DROPPED
key 230 SOFT_RIGHT WAKE
-key 60 SOFT_RIGHT WAKE
+key 60 MENU WAKE
key 107 ENDCALL WAKE_DROPPED
key 62 ENDCALL WAKE_DROPPED
key 229 MENU WAKE_DROPPED
key 139 MENU WAKE_DROPPED
-key 59 MENU WAKE_DROPPED
+key 59 HOME WAKE
key 127 SEARCH WAKE_DROPPED
key 217 SEARCH WAKE_DROPPED
key 228 POUND
key 227 STAR
key 231 CALL WAKE_DROPPED
-key 61 CALL WAKE_DROPPED
+key 61 BACK WAKE
key 232 DPAD_CENTER WAKE_DROPPED
key 108 DPAD_DOWN WAKE_DROPPED
key 103 DPAD_UP WAKE_DROPPED
android-SDK †
Install Android 1.5 SDK, Release 3. For the details of installation,
please visit at http://developer.android.com/sdk/android-1.5.html.
After the installation is completed, ADB, emulator and other software are used.
eclipse †
Follow the instruction listed at Installing the Android ASK, install Eclipse 3.4.2 and the plugins for android development.
Linux kernel source †
androi-2.6.29 kernel is used. Adding local_manifest to android-sdk-1.5_r3, this kernel is obtained. Creating kernel_work directly is create
at the /home/beat/, kernel is copied there. Then, the kernel is renamed to linux-android-2.639. Patches for bc9 are installed.
$ cd /home/beat/kernel_work/linux-android-2.6.29/
$ mv ../patch-kernel-2.6.29.4-bc9/patch-all.sh .
$ mv ../patch-kernel-2.6.29.4-bc9/*.patch .
$ ./patch-all.sh
After all 17 patches are installed, change the name of kernel. Change the name of kernel for the distinguishing
between before and after applying the patches.
$ mv linux-android-2.6.29 linux-android-2.6.29-bc9-r3
cross toolchain †
The cross toolchain of gumstix-oe which is built with bc9-oe-sdk is copied at /home/beat/kernel/cross.
At /home/beat/kernel_work/envsetup.sh, make ARM cross compile work. Then, the cross build of the
kernel is completed.