官方标准uboot2013移植9之SD卡移植
1.uboot2013.10中SD/MMC驱动浏览
1.1相关函数和文件
drivers/mmc/mmc.c、
drivers/mmc/sdhci.c
board/samsung/goni/goni.c
arch/arm/include/asm/arch-s5pc1xx/mmc.h
2.当前错误定位及解决方案分析
1)错误发生路径定位
board_init_r
mmc_initialize
do_preinit
mmc_start_init
mmc_go_idle
mmc_send_cmd
sdhci_send_command
sdhci_transfer_data 错误在这个函数中
2)错误原因分析
sdhic.c中的所有函数构成了三星210CPU的SD/MMC控制器的驱动。这里面的函数是三星公司的工程师写的,内容就是用来控制210CPU的内部的SD/MMC控制器和外部的SD卡通信的。这就是所谓的驱动。
sdhci_transfer_data函数出错,说明是SoC的SD/MMC控制器和外部SD卡(其实现在用的是SD0的iNand)的数据传输出了问题。(细节分析发现是控制器内部有一个中断状态错误标志被置位了。)
3)解决方案分析:
两条思路:第一是去逐行的分析SD卡驱动实现(分析中要对SD卡通信协议和210这个SoC的SD控制器非常熟悉),然后发现错误所在,然后修改代码解决问题;第二个是投机取巧的方法,就是把原来三星移植版本的uboot中的SD/MMC驱动整个移植过来替换掉uboot2013.10中的MMC驱动。其实还有第三条折中思路,就是综合第一种和第二种,譬如参考三星移植版本的uboot中的驱动实现来修补uboot2013.10中的驱动实现。
添加通道2初始化代码。
3.分析两个版本的uboot中SD卡驱动差异
1)uboot2013.10中:驱动相关的文件主要有:
drivers/mmc/mmc.c
drivers/mmc/sdhci.c
drivers/mmc/s5p_sdhci.c
board/samsung/goni/goni.c
2)三星移植版本中,驱动相关的文件主要有:
drivers/mmc/mmc.c
drivers/mmc/s3c_hsmmc.c
cpu/s5pc11x/cpu.c
cpu/s5pc11x/setup_hsmmc.c
3)经过分析发现:SD卡驱动要工作要包含2部分内容,一部分是drivers/mmc目录下的是驱动,另外一部分是uboot自己提供的初始化代码(譬如GPIO初始化、时钟初始化)
4.复制必要的文件并修改相应Makefile
1)首先解决drivers/mmc目录下的文件替换。
屏蔽S5p_goni.h中的宏。
Makefile添加:
2)修改初始化代码。
3)复制上述函数的文件至goni.c,修改makefile
5.代码浏览及修补
按照代码运行时的流程来逐步浏览代码,看哪里需要修补。
6.继续修补驱动代码
1)include/mmc.h
2)include/s3c_hsmmc.h
7.同步及编译、问题解决
1)出错1:cmd_mmc.c中出错。原因是cmd_mmc.c和mmc驱动密切相关,所以改了驱动后这个实现文件也要跟着改,解决方法是从三星版本的直接同名文件复制过来替换
2)出错2:drivers/mmc/mmc_write.c编译出错。原因是这个文件和本来版本中的mmc.c文件相关,但是mmc.c被替换掉了所以这个文件编译报错。解决方案就是修改makefile去掉这个文件的依赖,让他不被编译。
3)出错3:#include<regs.h>注释掉,然后添加#include <s5pc110.h
8.解决每次编译时间都很长的问题。
1)每次编译脚本cp.sh执行时都会先cp同步代码,然后make distclean•••所以每次都会清空后从头编译,这就很费时间了。
2)但是实际上有时候是不会make distclean的,只需要先cp然后直接make即可(当更改没有涉及到配置头文件s5p_goni.h,没有涉及到makefile文件,或者其他项目配置文件,也就是说我们的更改只是普通代码文件的更改时)
9. MMC: unrecognised EXT_CSD structure version 7
unrecognised EXT_CSD structure version 7
Card init fail!
unrecognised EXT_CSD structure version 7
MMC init failed
Using default environmen
我们复制九鼎的官方的mmc.c覆盖mmc文件夹下的文件。问题解决。添加头文件。
10.效果测试
(1)读写测试均成功