昨日に引き続き、 SDカードを認識させる為に、更にいろいろと修正した。
(昨日のものではまったく足りなかった。)
stableではないのであろうが、汎用性なさすぎだし、しまいにはデバッグ文でクラッシュする始末。
以下は現時点のvoldに対応する為の関連するパッチで、昨日の分も含まれる。
カーネルは2.6.28で、元が元なので、修正もハードコディングになってしまったが、これでもう、コマンドでマウントする必要はない。
尚、SDカードは、1番目のパーティションをmkdosfsコマンドで作成しており、2番目のパーティションをext3のrootファイルシステムにしている為、1番目のパーティションしか見ないようにしてある。


diff --git a/vold/blkdev.c b/vold/blkdev.c
index 3167507..fa0cb61 100644
--- a/vold/blkdev.c
+++ b/vold/blkdev.c
@@ -301,6 +301,9 @@ int blkdev_get_num_pending_partitions(blkdev_t *blk)
struct blkdev_list *list_scan = list_root;
int num = blk->nr_parts;

+ if (!num && (blk->type == blkdev_partition))
+ return num;
+
if (blk->type != blkdev_disk)
return -EINVAL;

diff --git a/vold/mmc.c b/vold/mmc.c
index 0f08964..b7be9f5 100644
--- a/vold/mmc.c
+++ b/vold/mmc.c
@@ -85,7 +85,8 @@ static int mmc_bootstrap_controller(char *sysfs_path)
if ((!strcmp(de->d_name, "uevent")) ||
(!strcmp(de->d_name, "subsystem")) ||
(!strcmp(de->d_name, "device")) ||
- (!strcmp(de->d_name, "power"))) {
+ (!strcmp(de->d_name, "power")) ||
+ (!strcmp(de->d_name, "slot_name"))) {
continue;
}

@@ -170,8 +171,8 @@ static int mmc_bootstrap_card(char *sysfs_path)
* Check for block drivers
*/
char block_devpath[255];
- sprintf(tmp, "%s/block", devpath);
- sprintf(filename, "/sys%s/block", devpath);
+ sprintf(tmp, "%s/block:mmcblk0", devpath);
+ sprintf(filename, "/sys%s/block:mmcblk0", devpath);
if (!access(filename, F_OK)) {
if (mmc_bootstrap_block(tmp)) {
LOGE("Error bootstrapping block @ %s", tmp);
@@ -203,9 +204,30 @@ static int mmc_bootstrap_block(char *devpath)

if (de->d_name[0] == '.')
continue;
- sprintf(tmp, "%s/%s", devpath, de->d_name);
+
+ if ((!strcmp(de->d_name, "uevent")) ||
+ (!strcmp(de->d_name, "dev")) ||
+ (!strcmp(de->d_name, "subsystem")) ||
+ (!strcmp(de->d_name, "device")) ||
+ (!strcmp(de->d_name, "range")) ||
+ (!strcmp(de->d_name, "ext_range")) ||
+ (!strcmp(de->d_name, "removable")) ||
+ (!strcmp(de->d_name, "ro")) ||
+ (!strcmp(de->d_name, "size")) ||
+ (!strcmp(de->d_name, "capability")) ||
+ (!strcmp(de->d_name, "stat")) ||
+ (!strcmp(de->d_name, "power")) ||
+ (!strcmp(de->d_name, "holders")) ||
+ (!strcmp(de->d_name, "slaves")) ||
+ (!strcmp(de->d_name, "queue")) ||
+ (!strcmp(de->d_name, "bdi"))) {
+ continue;
+ }
+
+ sprintf(tmp, "%s/%s", devpath, de->d_name);
if (mmc_bootstrap_mmcblk(tmp))
LOGE("Error bootstraping mmcblk @ %s", tmp);
+ break;
}
closedir(d);
return 0;
diff --git a/vold/uevent.c b/vold/uevent.c
index cfb5786..6eb88d3 100644
--- a/vold/uevent.c
+++ b/vold/uevent.c
@@ -301,7 +301,7 @@ static int handle_block_event(struct uevent *event)
} else if (!strcmp(get_uevent_param(event, "DEVTYPE"), "disk"))
n = 2;
else if (!strcmp(get_uevent_param(event, "DEVTYPE"), "partition"))
- n = 3;
+ n = 2;
else {
LOGE("Bad blockdev type '%s'", get_uevent_param(event, "DEVTYPE"));
return -EINVAL;
diff --git a/vold/volmgr_vfat.c b/vold/volmgr_vfat.c
index 344a166..5856a99 100644
--- a/vold/volmgr_vfat.c
+++ b/vold/volmgr_vfat.c
@@ -125,7 +125,7 @@ int vfat_mount(blkdev_t *dev, volume_t *vol, boolean safe_mode)
}

#if VFAT_DEBUG
- LOG_VOL("vfat_mount(%s, %d:%d): mount rc = %d", dev->major,k dev->minor,
+ LOG_VOL("vfat_mount(%d:%d, %s): mount rc = %d", dev->major, dev->minor,
vol->mount_point, rc);
#endif
free (devpath);

以前はmountd(現時点ではまだソースも含まれており、まぎらわしい)だったが、voldに変わった為、設定ファイルはmountd.confではなく、vold.confとなるが、ざっと確認したところでは特に変更する必要はないように見受けられた。
あまり必要には思えなかったが、一応エラーになるので、以下の行は追加しておいたほうが無難だろう。

media_path /class/mmc_host/mmc0

また、カーネル2.6.28では、logcatの表示上、以下のようなエラーになる。
---
I/vold ( 832): Android Volume Daemon version 2.0
E/vold ( 832): Unable to chdir to /sys/class/mmc_host/mmc0/slot_name (m)
E/vold ( 832): Error bootstrapping card '/sys/class/mmc_host/mmc0/slot_name' (m)
I/vold ( 832): New MMC card 'SDC ' (serial 651) added @ /class/mmc_host/mmc0/mmc0:b368
D/vold ( 832): Bootstrapping complete
---

slot_nameというのは、ディレクトリではなくファイルなので、chdir()出来なかったようだ。
これは古いカーネルにはなかったので、こういったことで今後も変更する必要が出てくるかもしれない。
以下のようにvoldのソースを変更する必要がある。

diff --git a/vold/mmc.c b/vold/mmc.c
index 0f08964..17b19a0 100644
--- a/vold/mmc.c
+++ b/vold/mmc.c
@@ -85,7 +85,8 @@ static int mmc_bootstrap_controller(char *sysfs_path)
if ((!strcmp(de->d_name, "uevent")) ||
(!strcmp(de->d_name, "subsystem")) ||
(!strcmp(de->d_name, "device")) ||
- (!strcmp(de->d_name, "power"))) {
+ (!strcmp(de->d_name, "power")) ||
+ (!strcmp(de->d_name, "slot_name"))) {
continue;
}


コンソールより以下のようにマウントし、それをシステムに認識させるのは、以前の方法がそのまま利用できた。
マウントしたんだから認識しようよと思うのだが、ざっと調べたところではわからなかった。

# mount -t vfat /dev/block/mmcblk0p1 /sdcard
# setprop EXTERNAL_STORAGE_STATE mounted

これで一度は認識出来たのだが、リブートすると、それ以降は同じ手順でも認識しない?
つづきは次回

いよいよドコモからGooglePhoneの発売が始まる。



先週、ビックサイトの展示会を見てきたけど

Androidを掲げたブースもちらほらあった。



今後、安度露娘の仲間増えそうだ。



安度露娘も秋のお披露目?に向けて、すくすく育っています。