[[labs.beatcraft.com]]~ #contents * bc9 向け ALSA 統合 android-1.5r2 ビルド手順 [#qb3f9ac8] Android の開発環境の構築手順などは以下のサイトを参照してください。~ http://source.android.com/download ~ bc9 では2009年6月末時点での最新安定版と考えられる android-1.5r2 branch を使用しています。~ Android の起動には Android 用 driver の追加された kernel が必要です。~ ~ まず android-1.5r2 branch を指定して repo の初期化を実行します。~ $ mkdir android-1.5r2 $ cd android-1.5r2 $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5r2 local_manifest.xml を以下の内容で android1.5r2/.repo/ の下に作成します。~ (kernel version の更新は別途行っていますので必須ではありませんが、ここでは kernel の更新も加えています。)~ <?xml version="1.0" encoding="UTF-8"?> <manifest> <remove-project name="kernel/common"/> <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> android-1.5r2 ディレクトリに戻って以下のコマンドでファイルを取得します。~ $ repo sync ※alsamixer、applay などを含む alsa-utils は master branch にしか含まれておらず使用しないので、取得内容に含めていません。~ もし必要な場合は以下のコマンドで取得し、ディレクトリごと android-1.5r2/externel/ にコピーして下さい。 $ git clone git://android.git.kernel.org/platform/external/alsa-util $ cp -a alsa-utils android-1.5r2/externel/ **build 内容の調整 [#q371a63b] *** ALSA の調整 [#z5aab19e] ALSA が audio hardware library として使用されるよう、android-1.5r2/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 ※コメントアウト alsa-utils も build する場合は、上記に以下の一行を追加します。 BUILD_WITH_ALSA_UTILS := true また、android-1.5r2/external/alsa-lib/Android.mk を以下のように修正します。~ (chroot で android が起動した時 /dev/snd/ ができず /dev/ 直下に直接 alsa の interface ができているので、それに合わせます。)~ --- 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)) ***電源状態 patch [#v3c39483] このまま build すると起動時にローバッテリーと判断して起動しない状態になるので、~ (参考 http://androidzaurus.seesaa.net/article/116995835.html)~ 以下のファイルにpatchを当て、常にフルバッテリーに見せかけます。 android-1.5r2/framework/base/services/java/com/android/server/BatteryService.java android-1.5r2/framework/base/services/java/com/android/server/PowerManagerService.java android-1.5r2/framework/base/services/java/com/android/server/SystemServer.java android-1.5r2/framework/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java この &ref(dummy-battery.patch);をダウンロードして android-1.5r2/ と同じディレクトリに置き、以下のようにして patch を当てて下さい。 $ cd android-1.5r2/ $ patch -p1 < ../dummy-battery.patch ** build [#td9a9723] android-1.5r2 ディレクトリで以下のコマンドを実行し、build します。 $ make build が完了したら android-1.5r2/out/target/product/generic/ 以下に必要なファイルができていますが、~ sound リソースファイルは必要な位置にコピーされません。~ そこで以下の要領で sound リソースファイルを out/target/product/generic/system/media/audio/ にコピーします。~ ** ogg sound リソースファイル [#ebe8831d] android-1.5r2/frameworks/base/data/sounds/ ~ にある AudioPackage2.mk を Android.mk にリネームし、 ~ $ cp AudioPackage2.mk Android.mk ~ $ cd android-1.5r2/build/ $ source envsetup.sh $ cd android-1.5r2/frameworks/base/data/sounds/ $ mm これで out/target/product/generic/system/media/audio/ 以下に ogg 形式の sound リソースファイルがコピーされます。~ **android-root 作成 [#e3d23780] 上記の作業が完了しましたら、以下のコマンドで android の userland を起動可能な配置に整えます。~ $ cd ~/ $ mkdir android-root $ cp -a ~/android-1.5r2/out/target/product/generic/root/* ~/android-root/ $ cp -a ~/android-1.5r2/out/target/product/generic/system/* ~/android-root/system/ **init.rcの編集 [#d6ee6c91] ***ALSAの設定 [#dbe71121] android-root/init.rc の on boot の項目の前に以下の ALSA 設定項目を追加します。~ 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 ***その他 [#w4b78fea] yaffs2でマウントされている箇所をコメントアウトします。~ diff -u init.rc.orig init.rc --- init.rc.orig 2009-03-31 12:50:16.000000000 +0900 +++ init.rc 2009-03-31 12:57:19.000000000 +0900 @@ -36,16 +36,16 @@ # mount mtd partitions # Mount /system rw first to give the filesystem a chance to save a checkpoint - mount yaffs2 mtd@system /system - mount yaffs2 mtd@system /system ro remount +# mount yaffs2 mtd@system /system +# mount yaffs2 mtd@system /system ro remount # We chown/chmod /data again so because mount is run as root + defaults - mount yaffs2 mtd@userdata /data nosuid nodev +# mount yaffs2 mtd@userdata /data nosuid nodev chown system system /data chmod 0771 /data # Same reason as /data above - mount yaffs2 mtd@cache /cache nosuid nodev +# mount yaffs2 mtd@cache /cache nosuid nodev chown system cache /cache chmod 0770 /cache **asound.conf asound.state [#ic6a2a36] android-root/system/etc/ に ALSA の設定ファイル asound.conf と asound.state をコピーします。~ ***asound.state [#p995eaa6] 以下の &ref(asound.state); は bc9 用に gumstix-oe で OpenEmbedded 環境を build した際に OpenEmbedded の /etc/ に生成されたものです。~ 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 } } ***asound.conf [#jd7ab206] 以下の &ref(asound.conf); は 上記の asound.state を元に各 control が正しく設定されるよう作成したものです。~ 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 } ] } } ** vold [#cfe88d90] Android での sdcard の mount は vold がおこないます。~ voldは 以下の設定ファイルに従って動作するので、まず設定ファイルを作ります。~ android-root/system/etc/vold.conf ~ 書式は以下のようにします。~ ## 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 } これを設定することで microSD の第1パーティションがメディアファイルの保存用にマウントされます。~ ** ボタン配置 [#t151b9e9] bc9 のボタン配置以下のように設定しています。~ (上から)~ --HOME (ENDCALL) --MENU --BACK bc9には3つのボタンがあり、上からキーボードの F1, F2, F3 として割り振られています。~ それぞれを ENDCALL, MENU, BACK に割り当てます。~ Android を起動した際 Spare Parts アプリケーションに ENDCALL behavior という設定項目があり、~ そこで ENDCALL ボタンの動作を「Go to Home」にすることで HOMEボタンと同等の役割を与えることができます。~ ~ android-root/system/usr/keylayout/qwerty.kl を以下のように編集してください。~ --- 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 ENDCALL 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 ** Screen Timeout [#na5cac04] Power Management機能に無効化パッチを当てた状態では、Screen Timeout でスリープモードに入った android を復帰させることができません。~ これを回避するために、Screen Timeout を無効にしておく必要があります。~ android 起動時に、以下の設定をおこないます。~ - [Menu] - [Settings] - [Sound & display] - [Screen timeout] - [Never timeout] ** device_provisioned [#v004c1a5] アクティベート関連の処理が OpenSource 版にも影響を与えています。~ 以下のコマンドを実行することで、アクティベートされた状態になります。~ # cd /data/data/com.android.providers.settings/databases # sqlite3 settings.db sqlite> insert into "secure" values(NULL,"device_provisioned", "1"); sqlite> .exit アクティベートされると、android 起動時 の home 画面に キーロックダイアログ表示が追加され、~ END_CALL キー長押しによる電源断処理確認画面に silent mode 選択などが追加されます。~ アクティベートされていない場合は、以下のような問題が確認されています。~ - HOMEキーが無効になっている。 - 起動時のキーロックダイアログが表示されない。 以上で ALSA を統合した bc9 用 android-1.5r2 の build は終了です。~ **参考 URL [#j8dc33c0] -http://code.google.com/p/patch-hosting-for-android-x86-support/wiki/ALSA -http://d.hatena.ne.jp/bs-android/20090603/1244043649 -http://labs.embinux.org/index.php/Android_Porting_Guide_to_Beagle_Board -http://nemustech.blogspot.com/2009/04/android-on-s3c6410-target-board.html