免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1117 | 回复: 0
打印 上一主题 下一主题

[20100713]Android VOLD 和SDIO冲突问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
开发板有两个MMC接口,一个挂载SD卡,另外一个挂载SDIO接口,当同时工作,启动Android时Vold会崩溃导致无法启动。
错误代码如下:
# logcat
I/DEBUG   (  810): debuggerd: Jun  9 2010 21:50:44
I/vold    (  809): Android Volume Daemon version 2.0
I/vold    (  809): New MMC card 'SD01G' (serial 2685562678) added @ /devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:e624
I/vold    (  809): Disk (blkdev 179:0), 1984000 secs (968 MB) 1 partitions
I/vold    (  809): New blkdev 179.0 on media SD01G, media path /devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:e624, Dpp 1
I/vold    (  809): Partition (blkdev 179:1), 1983171 secs (968 MB) type 0xb
I/vold    (  809): New blkdev 179.1 on media SD01G, media path /devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:e624, Dpp 0
I/vold    (  809): Evaluating dev '/devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:e624/block/mmcblk0' for mountable filesystems for '/sdcard'
I/vold    (  809): Aborting start of /sdcard (bootstrap = 1)
I/vold    (  809): Volmgr not ready to handle device
I/DEBUG   (  810): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  810): Build fingerprint: 'ky6410/ky6410/ky6410/:2.1-update1/ECLAIR/eng.kyon.20100609.214617:eng/test-keys'
I/DEBUG   (  810): pid: 809, tid: 809  >>> /system/bin/vold <<<
I/DEBUG   (  810): signal 11 (SIGSEGV), fault addr 00000000
I/DEBUG   (  810):  r0 00000000  r1 00020000  r2 80808080  r3 00000000
I/DEBUG   (  810):  r4 000111d8  r5 bef185bc  r6 bef185a8  r7 bef187c0
I/DEBUG   (  810):  r8 00000000  r9 00000000  10 00000000  fp 00000000
I/DEBUG   (  810):  ip 00011324  sp bef18588  lr 0000a88d  pc afe0e7f4  cpsr 40000010
I/DEBUG   (  810):          #00  pc 0000e7f4  /system/lib/libc.so
I/DEBUG   (  810):          #01  pc 0000a88a  /system/bin/vold
I/DEBUG   (  810):          #02  pc 0000aa30  /system/bin/vold
I/DEBUG   (  810):          #03  pc 0000ab0e  /system/bin/vold
I/DEBUG   (  810):          #04  pc 00009844  /system/bin/vold
I/DEBUG   (  810):          #05  pc 0000c2c6  /system/lib/libc.so
I/DEBUG   (  810):          #06  pc b00018aa  /system/bin/linker


查看Vold的源码,Vold使用while循环读取SYSFS_CLASS_MMC_PATH,估计读到SD卡后会继续去读取SDIO设备,导致fault addr 00000000

/*
 * Bootstrap our mmc information.
 */
int mmc_bootstrap()
{
    DIR *d;
    struct dirent *de;
    if (!(d = opendir(SYSFS_CLASS_MMC_PATH))) {
        LOG_ERROR("Unable to open '%s' (%s)", SYSFS_CLASS_MMC_PATH,
                  strerror(errno));
        return -errno;
    }
    while ((de = readdir(d))) {
        char tmp[255];
        if (de->d_name[0] == '.')
            continue;
        sprintf(tmp, "%s/%s", SYSFS_CLASS_MMC_PATH, de->d_name);
        if (mmc_bootstrap_controller(tmp)) {
            LOG_ERROR("Error bootstrapping controller '%s' (%s)", tmp,
                      strerror(errno));
        }
    }
    closedir(d);
    return 0;
}

正好网上有人提供了patch,一次mmc_bootstrap_controller后退出

--- a/system/core/vold/mmc.c    2009-07-02 16:15:08.000000000 -0400
+++ b/system/core/vold/mmc.c    2009-07-17 10:35:02.000000000 -0400
@@ -54,8 +54,14 @@
             continue;

         sprintf(tmp, "%s/%s", SYSFS_CLASS_MMC_PATH, de->d_name);
-        if (mmc_bootstrap_controller(tmp))
+        if (mmc_bootstrap_controller(tmp)) {
             LOG_ERROR("Error bootstrapping controller '%s' (%m)",
tmp);
+        }
+        else {
+            //a controller has already been bootstrapped, lets stop
trying to get more
+            //TODO: hack fix to get around segfault on boostrapping
sdio card connected to mmc bus
+            break;
+        }
     }

     closedir(d);

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP