uboot mmc驱动移植
uboot mmc驱动移植
将三星官方uboot的mmc驱动移植到uboot官方的uboot中。
1,相关文件
需要一致的c源文件有如下几个
2,三星uboot的mmc初始化流程
1,调用mmc_initialize()函数,这个函数在mmc.c中
2,在mmc_initialize()函数中调用cpu_mmc_init()函数,这个函数在cpu.c中
3,在cpu_mmc_init()函数中初始化了mmc的gpio,时钟,并调用了smdk_s3c_hsmmc_init()这个函数,在这些函数中通过USE_MMC0,USE_MMC1等宏来决定初始化哪个mmc。(对应的函数在setup_hsmmc.c中)
4,而smdk_s3c_hsmmc_init()这个函数,通过调用s3c_hsmmc_initialize()这个函数来将对应mmc的参数和初始化函数赋值给对应的mmc结构体中的变量,并将这个mmc的结构体注册到mmc设备列表中。
5,调用mmc_initialize()函数,还调用了mmc_init()函数初始化具体的mmc设备,这个函数就是通调用在s3c_hsmmc_initialize()函数中注册的初始化函数来初始化mmc。
2,修改对应文件夹下的Makefile
修改对应文件夹下的Makefile,使得uboot编译时编译对应的文件
3,浏览对应的.c源文件,并进行修改
从三星移植过来的那些.c源文件中一些没有被定义的函数和宏,需要将这些函数和宏移植过来(其中包括将对应的.h文件拷贝过来)
修改的内容:
1,在配置头文件中添加#define USE_MMC0,#define USE_MMC2这两个宏
2,uboot官方没有提供get_MPLL_CLK()这个函数,用get_pll_clk(MPLL)来替代。
3,uboot的官方的代码中没有reg.h这个头文件
4,在需要添加clk.h的地方添加这个头文件
4,移植cmd_mmc.c
uboot的cmd_mmc.c文件中定义了和mmc相关的命令,这些命令是通过调用mmc驱动文件中的函数实现的。
所以,移植完三星的mmc驱动后,还需要用替换成三星uboot的cmd_mmc.c替换uboot官方原有的cmd_mmc.c文件,这样才能调用对应的mmc驱动程序。
5,编译时报错:mmc_write.c文件中有些函数没有定义
mmc_write.c文件依赖于cmd_mmc.c等文件,所以会报错。
我们移植的三星uboot的mmc驱动中没有对应的文件,所以我们不需要编译这个文件,直接把该文件从对应的Makefile中去掉。