官方标准uboot2013移植9之SD卡移植

1.uboot2013.10SD/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中的驱动实现。

官方标准uboot2013移植9之SD卡移植

添加通道2初始化代码。

3.分析两个版本的ubootSD卡驱动差异

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目录下的文件替换。

官方标准uboot2013移植9之SD卡移植

屏蔽S5p_goni.h中的宏。

官方标准uboot2013移植9之SD卡移植

Makefile添加:

官方标准uboot2013移植9之SD卡移植

2)修改初始化代码。

官方标准uboot2013移植9之SD卡移植

3)复制上述函数的文件至goni.c,修改makefile

官方标准uboot2013移植9之SD卡移植

官方标准uboot2013移植9之SD卡移植

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文件夹下的文件。问题解决。添加头文件。

官方标准uboot2013移植9之SD卡移植

10.效果测试

官方标准uboot2013移植9之SD卡移植

(1)读写测试均成功

官方标准uboot2013移植9之SD卡移植

官方标准uboot2013移植9之SD卡移植