关于sdcard异常问题分析

在个别手机项目中进程可以见到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

等等


猜你喜欢

转载自blog.csdn.net/qq_37610155/article/details/79884827