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内存拷贝.
----------------------------------------------------------