在个别手机项目中进程可以见到sdcard不识别,sdcard已损坏等问题
该问题分析方法,一般都是底层问题巨多。
在kernel log中可以搜索 msdc 关键字。
在android main 或system log中搜索vold 和mountservice。
例如
1.sdcard已损坏的问题
在上层查到:
04-04 10:46:44.484937 225 1382 V vold : public:179,129 mFsType:
04-04 10:46:44.484974 225 1382 E vold : public:179,129 unsupported filesystem
04-04 10:46:44.484998 225 1382 W vold : public:179,129 setState: 6
04-04 10:46:44.485061 225 1382 D SocketClient: SocketClient sendData done: 651 public:179,129 6
04-04 10:46:44.485105 225 1382 W vold : power_control_for_external_sd, state=15
04-04 10:46:44.485271 225 1382 W vold : ioctl error!
04-04 10:46:44.494502 1169 1238 W MountService: mount volume fail, ignored=com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '6 volume mount public:179,129 2 0' failed with '400 6 Command failed'
04-04 10:46:44.494975 1169 1238 W MountService: mount volume fail, vol=VolumeInfo{public:179,129}:
04-04 10:46:44.494975 1169 1238 W MountService: type=PUBLIC diskId=disk:179,128 partGuid=null mountFlags=VISIBLE
04-04 10:46:44.494975 1169 1238 W MountService: mountUserId=0 state=UNMOUNTABLE
04-04 10:46:44.494975 1169 1238 W MountService: fsType=null fsUuid=null fsLabel=
04-04 10:46:44.494975 1169 1238 W MountService: path=null internalPath=null
04-04 10:46:44.494975 1169 1238 W MountService: , return code=400
400 返回码去查
95 /**
96 * Test if event represents a remote native daemon error.
97 */
98 public boolean isClassServerError() {
99 return mCode >= 400 && mCode < 500;
100 }
各种信息表明是 mountservice去发送mount, vold执行,vold本地native那边出现的问题。
在kernel log:
<4>[ 1.666251] -(0)[0:swapper/0][Power/swap]dpidle_block_mask: 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
<6>[ 1.672339] (0)[115:kworker/u8:2]mmc1: new ultra high speed SDR104 SDXC card at address 59b4
<6>[ 1.672747] (1)[115:kworker/u8:2]mmcblk1: mmc1:59b4 NCard 118 GiB
<3>[ 1.674913] (1)[51:kworker/1:1][sd]msdc1 -> XXX CMD<18>.arg<0x00000000>,DAT block<8> Error<-5> <- msdc_dump_trans_error() : L<6601> PID<kworker/1:1><0x33>
<3>[ 1.674931] (1)[51:kworker/1:1][sd]msdc1 -> XXX STOP<12><0x0> Error<0> Resp<0x0> <- msdc_dump_trans_error() : L<6605> PID<kworker/1:1><0x33>
<3>[ 1.674961] (1)[51:kworker/1:1][sd]msdc1 -> state<5> need cmd12 to stop <- msdc_status_verify_case1() : L<2646> PID<kworker/1:1><0x33>
<3>[ 1.676943] (1)[51:kworker/1:1][sd]msdc1 -> CRC TUNE READ Times(1) <- msdc_reset_crc_tune_counter() : L<1874> PID<kworker/1:1><0x33>
<3>[ 1.680656] (2)[17:kworker/2:0][sd]msdc1 -> XXX CMD<18>.arg<0x0ec7f7f8>,DAT block<8> Error<0> <- msdc_dump_trans_error() : L<6601> PID<kworker/2:0><0x11>
<3>[ 1.680673] (2)[17:kworker/2:0][sd]msdc1 -> XXX STOP<12><0x0> Error<-5> Resp<0x0> <- msdc_dump_trans_error() : L<6605> PID<kworker/2:0><0x11>
<3>[ 1.680690] (2)[17:kworker/2:0][sd]msdc1 TUNE_CMD: rsmpl<1> rrdly<0> cmdrtc<1> dl_cksel<0> sfreq.<200000000>
<3>[ 1.682588] (2)[17:kworker/2:0][sd]msdc1 -> CRC TUNE CMD Times(1) <- msdc_reset_crc_tune_counter() : L<1869> PID<kworker/2:0><0x11>
<6>[ 1.682661] (1)[115:kworker/u8:2] mmcblk1: p1
再次确定sdcard底层那边问题。交由bsp同事在进行深度分析!
2. sdcard不识别问题
搜索msdc发现这张SD卡在识别的过程中发生了非常非常多的MSDC_INT_DATCRCERR;需要先看下卡的速度,不过一般这种error都是和手机硬件的走线有关,但也不排除跟SD卡有关
同步可以查询 adb shell cat /sys/kernel/debug/mmc1/ios
并check /kernel-3.10/drivers/misc/mediatek/mmc-host/mt6735/sd.c文件
后面继续分析发现:
从log看,在访问这张SD卡的sector 0 开始的一些扇区的时候;发生了非常多的MSDC_INT_DATCRCERR;需要先看下卡的速度,不过一般这种error都是和手机硬件的走线有关,请贵司HW帮忙检查下SD这块的走线。
从软件角度讲,您可以尝试着修改下data line的驱动电流:
/kernel-3.10/drivers/misc/mediatek/mach/${Project_name}/project_name/core/board.c
struct msdc_hw msdc1_hw = {
545 .clk_src = MSDC_CLKSRC_200MHZ,
546 .cmd_edge = MSDC_SMPL_FALLING,
547 .rdata_edge = MSDC_SMPL_FALLING,
548 .wdata_edge = MSDC_SMPL_FALLING,
549 .clk_drv = 1,
550 .cmd_drv = 1,
551 .dat_drv = 1, // 把贵司的这个值加1
等等