SD驱动根据硬件电路设计的一些调整方法

  1. 开发板上使用SD卡的步骤

    1. Insmod scsi_mod.ko mmc_core.ko mmc_block.ko kdrv_sdmmc.ko

    2. Insmod fat.ko vfat.ko

    3. 挂载:mount -t vfat /dev/block/mmcblk0p1 /mnt/sdcard

  2. 硬件设计上,sd 供电引脚直接接到电源,不需要sdmmc驱动控制供电,把供电GPIO腾出来做其他功能

    在infinity6b0.dtsi里的sdmmc节点slot-pwr-gpios=<PAD_FUART_RTS>,<PAD_PM_GPIO9>,<0>,分别对应三个slot,客户一般用的是第一个SDIO接口。将默认的PAD_FUART_RTS改成PAD_UNKNOW.也可以把代码里的_SetPower()注释掉调用FUART_RTS的部分逻辑。

  3. SDIO的CDZ引脚,因电路设计需改成CDZ高表示检测到SD卡,低表示没有检测到SD卡,软件调整方法

    在infinity6b0.dtsi里的sdmmc节点revcdz = <0>;改成1.

  4. 默认SD clk是48Mhz,有哪些档位可选,如何修改

    Hal_CARD_FindClockSetting()可以看出clk有几个档位: 48000000,43200000,40000000,36000000,32000000,20000000,12000000,300000。

    在infinity6b0.dtsi里的sdmmc节点:slot-max-clks = <48000000>,<48000000>,<48000000>;分别对应三个slot,一般用第一个SDIO接口。

  5. 在uboot下使用sd卡,怎么改uboot下sd卡的clk

    uboot/drivers/mstar/sdmmc/inc/ms_sdmmc_ub.h

    把#define V_SDMMC1_MAX_CLK 32000000改成想要的clk档位。

  6. 量测的信号波形较差,想要拉高sd驱动能力,怎么改?

    修改内核代码hal_card_platform.c的函数void Hal_CARD_InitPADPin(PADEmType ePAD, BOOL_T bTwoCard),

    把CARD_REG_CLRBIT(GET_CARD_REG_ADDR(A_CHIPTOP_BANK, 0x32), BIT05_T|BIT04_T|BIT03_T|BIT02_T|BIT01_T|BIT00_T); //CLK, D3, D2, D1, D0, CMD => drv: 0

    改为CARD_REG_SETBIT(GET_CARD_REG_ADDR(A_CHIPTOP_BANK, 0x32), BIT05_T|BIT04_T|BIT03_T|BIT02_T|BIT01_T|BIT00_T);

    对应位1: 8mA 0: 4mA

  7. 开发板上格式化SD卡

    1. mkfs.vfat /dev/block/mmcblk0p1(mkfs.vfat来自Busybox,如果没有要重新编译busybox,make menuconfig勾选Linux System Utilities --> mkfs_vfat即可)

    2. 开源工具dosfstools等