2009年6月29日月曜日

Android Music App on Beagle Board (3)

SDカードをAndroid上で正しくmountするため,vold他を設定する。

(1) SDカードのパーティション構成
SDカードはBeagleBoard自体のブートにも使用するため以下のようなパーティション構成とする。
/dev/mmcblk0p1  W95 FAT32 (LBA)
/dev/mmcblk0p2 W95 FAT32 (LBA)
/dev/mmcblk0p3 Linux
mmcblk0p1はuBoot, Linux kernel (uImage)を格納したvfat,mmcblk0p2はMusicなどのコンテンツを格納するvfat,mmcblk0p3はubuntuのユーザランド,androidを格納するext2とした。

(2) vold.confの設定
BeagleBoard上のSDは/sys/devices/platform/mmci-omap-hs.0/mmcに見えているので,以下のようにandroidの/system/etc/vold.confを設定する。
## vold configuration file for beagleboard
volume_sdcard {
media_path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
media_type mmc
mount_point /sdcard
ums_path /devices/platform/usb_mass_storage/lun0
}
(3) voldソースコードの修正
voldはSDカード上の最初に見つかったvfatパーティションを/sdcardにmountしようとするが,それだとBeagleBoardのブート用パーティションがmountされてしまうため,最初のパーティション(mmcblk0p1)をスキップするようvoldのコードを修正する。
diff --git a/vold/volmgr.c b/vold/volmgr.c
index 17c9a49..4aa7397 100644
--- a/vold/volmgr.c
+++ b/vold/volmgr.c
@@ -573,7 +573,12 @@ static int _volmgr_consider_disk_and_vol(volume_t *vol, blk
dev_t *dev)

rc = -ENODEV;
int i;
- for (i = 0; i dev->nr_parts; i++) {
+ /*
+ * 1st partition of mmc is used as boot partition,
+ * so skip this partition from mounting on /sdcard.
+ */
+ // for (i = 0; i dev->nr_parts; i++) {
+ for (i = 1; i dev->nr_parts; i++) {
blkdev_t *part = blkdev_lookup_by_devno(dev->major, (i+1));
if (!part) {
LOGE("Error - unable to lookup partition for blkdev %d:%d", dev->major, (i+1));
これでSDカードのmmcblk0p2が/sdcardにmountされ,Musicアプリから曲の再生ができるようになる。

I/vold    ( 1725): Android Volume Daemon version 2.0
E/vold ( 1725): Unable to chdir to /sys/class/mmc_host/mmc0/slot_name (m)
E/vold ( 1725): Error bootstrapping card '/sys/class/mmc_host/mmc0/slot_name' (m)
I/vold ( 1725): New MMC card 'SD8GB' (serial 1526730553) added @ /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007
I/vold ( 1725): Disk (blkdev 179:0), 16019456 secs (7822 MB) 3 partitions
I/vold ( 1725): New blkdev 179.0 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 3
I/vold ( 1725): Partition (blkdev 179:1), 240912 secs (117 MB) type 0xc
I/vold ( 1725): New blkdev 179.1 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 2
I/vold ( 1725): Partition (blkdev 179:2), 2120580 secs (1035 MB) type 0xc
I/vold ( 1725): New blkdev 179.2 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 1
I/vold ( 1725): Partition (blkdev 179:3), 13655250 secs (6667 MB) type 0x83
I/vold ( 1725): New blkdev 179.3 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 0
I/vold ( 1725): Evaluating dev '/devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007/block/mmcblk0' for mountable filesystems for '/sdcard'
D/vold ( 1725): Bootstrapping complete

2009年6月22日月曜日

Android Music App on Beagle Board (2)

MusicやContactアプリ等を起動するとacoreがエラーとなる。これはtouchscreenがない場合のres/layoutが存在しないため。
res/layout-finger以下のリソースをres/layout-notouchにコピーすることで回避は可能だが,uinputの使い方を調べるついでにダミーのtouchscreenデバイスを作ってやることで回避してみる。以下のようなコードを実行することで/dev/inputの下にダミーのtouchscreenデバイスが作成される。この状態でchrootでandroidを起動してやればMusic,Contactは普通に使用できるようになる。

#define UINPUT_DEV "/dev/input/uinput"
#define DEV_NAME "Dummy Touch Screen"

static int uinput_fd = 0;

void uinput_touch_init(const char* uinput_dev, const char* dev_name) {
struct uinput_user_dev dev;

uinput_fd = open(uinput_dev, O_WRONLY);
if (uinput_fd <= 0) {
perror("Error opening uinput device.\n");
return;
}
memset(&dev, 0, sizeof(dev));
strcpy(dev.name, dev_name);
write(uinput_fd, &dev, sizeof(dev));

/* touch screen event */
ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);
ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);

/* register */
ioctl(uinput_fd, UI_DEV_CREATE, 0);
}

int main(int argc, char* argv[]) {
uinput_touch_init(UINPUT_DEV, DEV_NAME);
while(1) {
sleep(60);
}
}

参考:
http://groups.google.co.jp/group/android-porting/browse_thread/thread/f13cb06a4bff0b9
Instead of hacking up the default Google apps, I just added a trivial
fake touchscreen driver using uinput, it only has to register an abs
event uinput device to made Android happy. We use it on our non-
touchscreen Android ports since those apps are easily navigated using
keyboard and trackpad/mouse.
-Matt

2009年6月20日土曜日

Android Music App on Beagle Board (1)

Android on Beagle Board 上で音楽アプリを使えるようにするための手順。
(1) ALSA ドライバをkernelに組み込む。
(2) ALSA関連のプロジェクトをrepoできるようにmydroid/.repo/local_manifest.xmlに以下のプロジェクトを追加してrepo syncする。
<project path="external/alsa-lib" name="platform/external/alsa-lib"/>
<project path="external/alsa-utils" name="platform/external/alsa-utils"/>
<project path="hardware/alsa_sound" name="platform/hardware/alsa_sound"/>

(3) ALSAを有効にするため vendor/embinux/beagle/BoardConfig.mkに以下を追加してmake
#BOARD_USES_GENERIC_AUDIO := true
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true

(4) ビルドされたkernel, androidで起動すると以下のようなエラーが発生する。
adb logcat:
E/ALSALib ( 2204): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidPlayback
E/AudioHardwareALSA( 2204): Unable to attach mixer to device AndroidPlayback: No such file or directory
E/AudioHardwareALSA( 2204): Unable to attach mixer to device default: No such file or directory
E/ALSALib ( 2204): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidRecord
E/AudioHardwareALSA( 2204): Unable to attach mixer to device AndroidRecord: No such file or directory
E/AudioHardwareALSA( 2204): Unable to attach mixer to device default: No such file or directory

原因はAudioFlingerが参照するALSAデバイスファイルの位置が/dev/sndではなく/dev直下なため。シンボリックリンクを作成するようinit.rcを修正する。
# setup for alsa snd device
symlink /dev/snd/pcmC0D0c /dev/pcmC0D0c
symlink /dev/snd/pcmC0D0p /dev/pcmC0D0p
symlink /dev/snd/controlC0 /dev/controlC0
symlink /dev/snd/timer /dev/timer
chmod 0777 /dev/pcmC0D0c
chmod 0777 /dev/pcmC0D0p
chmod 0777 /dev/controlC0
chmod 0777 /dev/timer
chown root audio /dev/snd/controlC0
chown root audio /dev/snd/pcmC0D0c
chown root audio /dev/snd/pcmC0D0p
chown root audio /dev/snd/timer
参考:
http://d.hatena.ne.jp/bs-android/20090603/1244043649

2009年6月1日月曜日

embinux Android

embinuxのgit repositryからrepo syncしたAndroidにはTLSパッチがあたっていないようなので,とりあえず以下の修正を入れてAndroidを起動。

diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index da34344..5b8d8fc 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -81,7 +81,9 @@ extern int __set_tls(void *ptr);

/* get the TLS */
#ifdef __arm__
-# define __get_tls() ( *((volatile void **) 0xffff0ff0) )
+/*# define __get_tls() ( *((volatile void **) 0xffff0ff0) )*/
+typedef void* (__get_tls_t) (void);
+static const __get_tls_t* __get_tls = (const __get_tls_t *)0xffff0fe0;
#else
extern void* __get_tls( void );
#endif

diff --git a/opengl/libs/hooks.h b/opengl/libs/hooks.h
index 63fb017..22c7b98 100644
--- a/opengl/libs/hooks.h
+++ b/opengl/libs/hooks.h
@@ -35,7 +35,7 @@
#define MAX_NUMBER_OF_GL_EXTENSIONS 32


-#if defined(HAVE_ANDROID_OS) && !USE_SLOW_BINDING && !GL_LOGGER && __OPTIMIZE__
+#if 0 && defined(HAVE_ANDROID_OS) && !USE_SLOW_BINDING && !GL_LOGGER && __OPTIM
IZE__
#define USE_FAST_TLS_KEY 1
#else
#define USE_FAST_TLS_KEY 0