6.0 px30 sd卡移植的问题解决

写在前面

在给px30移植sd的时候,发现有两个问题
1 sd卡识别率低,有一部分sd卡识别不了,主要是一些老的sd卡
2 即使sd卡已经识别,但是给sd卡写入内容之后,sync之后消失
针对这两个问题,看了一下sd的相关的知识
网上的一些基础知识已经很完善了,主要是记录一下遇到的问题和解决方法,取自网上,分享网上。

问题1

可以正确识别fat格式,可以正常读到sd卡内容,但是写操作之后,会打印 I/O error 或者写操作没报错 但是执行sync之后,内容消失
查看内核打印信息

6,843,148882484,-;mmc0: new ultra high speed SDR25 SDXC card at address 5048
6,844,148891358,-;mmcblk0: mmc0:5048 SD64G 58.0 GiB
6,845,148895135,-; mmcblk0: p1
4,846,149131536,-;FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
3,847,159826238,-;FAT-fs (mmcblk0p1): Directory bread(block 16384) failed
3,848,159826978,-;FAT-fs (mmcblk0p1): Directory bread(block 16385) failed
3,849,159827941,-;FAT-fs (mmcblk0p1): Directory bread(block 16386) failed
3,850,159828790,-;FAT-fs (mmcblk0p1): Directory bread(block 16387) failed
3,851,159831333,-;FAT-fs (mmcblk0p1): Directory bread(block 16388) failed
3,852,159832206,-;FAT-fs (mmcblk0p1): Directory bread(block 16389) failed
3,853,159833568,-;FAT-fs (mmcblk0p1): Directory bread(block 16390) failed
3,854,159834436,-;FAT-fs (mmcblk0p1): Directory bread(block 16391) failed
3,855,159835629,-;FAT-fs (mmcblk0p1): Directory bread(block 16392) failed
3,856,159836793,-;FAT-fs (mmcblk0p1): Directory bread(block 16393) failed
3,857,170252772,-;mmcblk0: error -84 transferring data, sector 62489, nr 1, cmd response 0x900, card status 0x0
6,858,170262638,-;rockchip-iodomain ff140000.syscon:io-domains: Setting to 3300000 done
 SUBSYSTEM=platform
 DEVICE=+platform:ff140000.syscon:io-domains
7,859,170264537,-;vccio_sd: ramp_delay not set
6,860,170264589,-;rockchip-iodomain ff140000.syscon:io-domains: Setting to 3300000 done
 SUBSYSTEM=platform
 DEVICE=+platform:ff140000.syscon:io-domains
6,861,170278720,-;mmc_host mmc0: Bus speed (slot 0) = 400000Hz (slot req 400000Hz, actual 400000HZ div = 0)
 SUBSYSTEM=mmc_host
 DEVICE=+mmc_host:mmc0
6,862,170486432,-;rockchip-iodomain ff140000.syscon:io-domains: Setting to 3300000 done
 SUBSYSTEM=platform
 DEVICE=+platform:ff140000.syscon:io-domains
7,863,170488344,-;vccio_sd: ramp_delay not set
6,864,170488405,-;rockchip-iodomain ff140000.syscon:io-domains: Setting to 1800000 done
 SUBSYSTEM=platform
 DEVICE=+platform:ff140000.syscon:io-domains
6,865,170507110,-;mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
 SUBSYSTEM=mmc_host
 DEVICE=+mmc_host:mmc0
4,866,170508074,-;mmc0: tried to reset card
3,867,170508770,-;mmcblk0: error -84 transferring data, sector 62489, nr 1, cmd response 0x900, card status 0x0
3,868,170509860,-;blk_update_request: I/O error, dev mmcblk0, sector 62489
3,869,170510564,-;Buffer I/O error on dev mmcblk0p1, logical block 29721, lost async page write
3,870,170512196,-;mmcblk0: error -84 transferring data, sector 62489, nr 1, cmd response 0x900, card status 0x0
3,871,170513426,-;blk_update_request: I/O error, dev mmcblk0, sector 62489
3,872,170514021,-;Buffer I/O error on dev mmcblk0p1, logical block 29721, lost async page write

  
  
  • 这里主要是参考

    https://blog.csdn.net/jasonwang1002/article/details/102532862

    分析如下:
    sd卡驱动中,初始化操作分两步:
    第一步是用3.3v 400000Hz 去探测这个sd卡总线速度,(这里是uhs SDR25 SDXC 最高是50M),一些常见的总线速度列到下面

     Default Speed mode: 3.3V供电模式,频率上限25MHz,速度上限 12.5MB/sec
    ● High Speed mode: 3.3V供电模式,频率上限50MHz,速度上限 25MB/sec
    ● SDR12: UHS-I卡, 1.8V供电模式,频率上限25MHz,速度上限 12.5MB/sec
    ● SDR25: UHS-I卡, 1.8V供电模式,频率上限50MHz,速度上限 25MB/sec
    ● SDR50: UHS-I卡, 1.8V供电模式,频率上限100MHz,速度上限 50MB/sec
    ● SDR104: UHS-I卡, 1.8V供电模式,频率上限208MHz,速度上限 104MB/sec
    ● DDR50: UHS-I卡, 1.8V供电模式,频率上限50MHz,性能上限 50MB/sec
    ● UHS156: UHS-II RCLK Frequency Range 26MHz - 52MHz, up to 1.56Gbps per lane.
    

第二步是用提高到这相应的总线速度,做接来下的读写动作,但是在嵌入式中,可能会因为硬件走线或者其他问题,导致最高速度不能使用。最好的办法是修改硬件,如果不能修改硬件,可以参考我的方法,使用设备树限制下最高的时钟速度,看看能不能接受。

max-frequency = <10000000>;//限制一下最高速度,尽量兼容大部分设备

 
 
  • 问题2

    可以正常的识别到sd卡,具体可以看内核打印中识别成功了sd卡

    6,790,98197795,-;mmc0: new ultra high speed SDR25 SDXC card at address 5048
    6,791,98200999,-;mmcblk0: mmc0:5048 SD64G 58.0 GiB
    6,792,98204645,-; mmcblk0: p1
    

但是FAT格式的sd卡可以正常自动挂载成功,NTFS格式的sd卡就不能自动挂上去了,经过查找,linux中自动挂载可以使用写udev脚本的方式,我这个是因为mount -t ntfs /dev/mmcblk0px /sdcard 这种方式,挂载报错,emm。。。没有细查原因,改了一下/lib/udev/rules.d/61-sd-cards-auto-mount.rules 的脚本

-ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", RUN+="/bin/mount -t ntfs-3g -o %E{mount_options_ntfs} /dev/%k '/mnt/sdcard'"  
+ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", RUN+="/usr/bin/ntfs-3g -o %E{mount_options_ntfs} /dev/%k '/mnt/sdcard'"

参考资料

sd卡介绍

https://www.jianshu.com/p/6272e4cb1eeb

超能课堂

https://www.expreview.com/71505.html

写入sd卡失败

https://blog.csdn.net/jasonwang1002/article/details/102532862

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值