SD 调试(个人经验存档)

SD卡一线转四线调试:(增加代码的开头都带有/* added by liudl in 2011-03-..*/ 的注释)

1.主要修改了kernel/cpu/omap3/目录下面的mmc.c,mmc_protocol.h,mmc_host_def.h以及cpu.c文件.
    a) mmc.c文件主要增加了mmc_send_cmd_with_blk,mmc_read_data_with_blk,mmc_set_buswith,
  host_set_buswith等函数,并在MMC初始化调用的configure_mmc函数中调用mmc_set_buswith,
  host_set_buswith进行初始化设置4-bit数据传输模式.

 unsigned char mmc_send_cmd_with_blk(unsigned int cmd, unsigned int arg,
     unsigned int num_blks, unsigned int blk_len, unsigned int *response)
  带有指定块数量以及块大小的命令发送函数(U-BOOT带有的是指定512byte的块大小的命令发送函数
             不能读取寄存器的内容).

 unsigned char mmc_read_data_with_blk(unsigned int *output_buf,
                       unsigned int num_blks, unsigned int blk_len)
  带有指定块数量以及块大小的数据读取函数(U-BOOT带有的是指定512byte的块大小的数据读取函数
             不能读取指定大小的数据内容).

 unsigned reg_date_low(unsigned char *source, unsigned int num)
  大端数据转成小端数据函数(SD卡大端传输,host小端接收,在读取块内容的时候没有影响,但是读取寄            存器内容的时候,需要做转换).

 unsigned char mmc_set_buswith(mmc_card_data * mmc_card_cur)
  SD卡端设置4-bit数据传输模式.

 unsigned char host_set_buswith(mmc_card_data * mmc_card_cur)
  host端设置4-bit数据传输模式.

    b) mmc_protocol.h文件主要增加了SD卡SCR寄存器数据结构.
 typedef struct { 
  unsigned reserved_32:32;
  unsigned reserved_16:16;
  unsigned sd_bus_with:4;
  unsigned sd_security:3;
  unsigned data_stat_after_erase:1;
  unsigned sd_spec:4;
  unsigned scr_structure:4; 
 } mmc_scr_reg_t;

    c) mmc_host_def.h 主要增加了操作相关的数据宏.

    d) cpu.c主要增加了操作Dcache的dcache_disable和dcache_status函数.
  (配合U-BOOT中的cache命令,要启用此命令在config文件定义CONFIG_CMD_CACHE宏)
 void dcache_disable(void)
 {
  ulong reg;

  reg = read_p15_c1();
  cp_delay();
  write_p15_c1(reg & ~C1_DC);
 }

 int dcache_status(void)
 {
 return (read_p15_c1() & C1_DC) != 0;
 }

2.实现过程.
 a) 在MMC初始化设置完成后(configure_mmc()函数中),先判断是否是SD卡,不是则结束.
 b) 给SD发送ACMD51读取SD卡SCR寄存器,判断是否支持4线协议,不支持则结束.
  (发ACMD前需发CMD55切换到支持ACMD命令状态,发送CMD命令后退出)
 c) 给SD卡发送ACMD6设置SD卡为四线协议模式.
 d) 设置HOST为四线协议状态.

3.其他考虑的方法:
 a) 时钟设置最大.
 b) 增大每次读取块数据.
 c) 采用DMA内存拷贝.

----------------------------------------------------------

你可能感兴趣的:(SD 调试(个人经验存档))