[[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

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS