labs.beatcraft.com

bc9 向け ALSA 統合 android-1.5r2 ビルド手順

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 内容の調整

ALSA の調整

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

このまま 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

この filedummy-battery.patchをダウンロードして android-1.5r2/ と同じディレクトリに置き、以下のようにして patch を当てて下さい。

$ cd android-1.5r2/
$ patch -p1 < ../dummy-battery.patch

build

android-1.5r2 ディレクトリで以下のコマンドを実行し、build します。

$ make

build が完了したら android-1.5r2/out/target/product/generic/ 以下に必要なファイルができていますが、
sound リソースファイルは必要な位置にコピーされません。
そこで以下の要領で sound リソースファイルを out/target/product/generic/system/media/audio/ にコピーします。

ogg sound リソースファイル

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 作成

上記の作業が完了しましたら、以下のコマンドで 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の編集

ALSAの設定

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

その他

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

android-root/system/etc/ に ALSA の設定ファイル asound.conf と asound.state をコピーします。

asound.state

以下の fileasound.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

以下の fileasound.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

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パーティションがメディアファイルの保存用にマウントされます。

ボタン配置

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

Power Management機能に無効化パッチを当てた状態では、Screen Timeout でスリープモードに入った android を復帰させることができません。
これを回避するために、Screen Timeout を無効にしておく必要があります。
android 起動時に、以下の設定をおこないます。

  • [Menu] - [Settings] - [Sound & display] - [Screen timeout] - [Never timeout]

device_provisioned

アクティベート関連の処理が 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


添付ファイル: fileasound.state 1299件 [詳細] fileasound.conf 1361件 [詳細] filedummy-battery.patch 1389件 [詳細]

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-07-21 (火) 20:23:30 (3046d)