uboot中SD 卡驱动移植

uboot中SD 卡驱动移植:2013版本的
----------------------

1.\u-boot-2013.10\drivers\mmc\ mmc.c和C:\u-boot-2013.10\board\samsung\goni\goni.c
C:\u-boot-2013.10\arch\arm\include\asm\arch-s5pc1xx\mmc.h
C:\u-boot-2013.10\drivers\mmc\s5p_sdhci.c
2.分析下面代码 掌握驱动中怎样操作gpio的读写代码实现的::

解决这个问题:2MMC: SAMSUNG SDHCI: 0
-----------------------------

int board_mmc_init(bd_t *bis)
{
	int i, ret, ret_sd = 0;

	/* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */
	s5p_gpio_direction_output(&s5pc110_gpio->j2, 7, 1);

	/*
	 * MMC0 GPIO
	 * GPG0[0]	SD_0_CLK
	 * GPG0[1]	SD_0_CMD
	 * GPG0[2]	SD_0_CDn	-> Not used
	 * GPG0[3:6]	SD_0_DATA[0:3]
	 */
	for (i = 0; i < 7; i++) {
		if (i == 2)
			continue;
		/* GPG0[0:6] special function 2 */
		s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2);
		/* GPG0[0:6] pull disable */
		s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE);
		/* GPG0[0:6] drv 4x */
		s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X);
	}

注册MMC::list_add_tail (&mmc->link, &mmc_devices);
**添加通道**2for (i = 0; i < 7; i++) {
		if (i == 2)
			continue;
		/* GPG0[0:6] special function 2 */
		s5p_gpio_cfg_pin(&s5pc110_gpio->g0, i, 0x2);/*gpg0_i*/
		/* GPG0[0:6] pull disable */
		s5p_gpio_set_pull(&s5pc110_gpio->g0, i, GPIO_PULL_NONE);
		/* GPG0[0:6] drv 4x */
		s5p_gpio_set_drv(&s5pc110_gpio->g0, i, GPIO_DRV_4X);
	}

	ret = s5p_mmc_init(0, 4);/*sd通道0初始化**/
	if (ret)
		error("MMC: Failed to init MMC:0.\n");
成功了:::::
2MMC:   SAMSUNG SDHCI: 0, SAMSUNG SDHCI: 1
查找错误:
**grep "bad CRC" -nR ***

doc/README.mpc85xxads:227:*** Warning - bad CRC, using default environment

/**sdhci.c里面是210cpu里面的控制器的驱动代码***/
包裹函数如下:
1.sdhci_reset
2.sdhci_cmd_done
3.sdhci_transfer_pio
4.sdhci_transfer_data
5.sdhci_send_command
6.sdhci_set_clock
7.sdhci_set_power
8.sdhci_set_ios
9.sdhci_init
10.add_sdhci

每个函数都有其特定的作用,一旦出错可以尝试在这里去找错误即可:
移植原来三星版本的uboot步骤分析:
/* MMC */
*#define CONFIG_GENERIC_MMC
*#define CONFIG_MMC*
//#define CONFIG_SDHCI注释
//#define CONFIG_S5P_SDHCI注释
*#define   CONFIG_S3C_HSMMC ---》y**

LIB	:= $(obj)libmmc.o

COBJS-$(CONFIG_S3C_HSMMC) += s3c_hsmmc.o
COBJS-$(CONFIG_BFIN_SDH) += bfin_sdh.o

void setup_hsmmc_clock(void)
{
	u32 tmp;
	u32 clock;
	u32 i;

	/* MMC0 clock src = SCLKMPLL */
	tmp = CLK_SRC4_REG & ~(0x0000000f);
	CLK_SRC4_REG = tmp | 0x00000006;

	/* MMC0 clock div */
	tmp = CLK_DIV4_REG & ~(0x0000000f);
	//clock = get_MPLL_CLK()/1000000;
	clock = s5pc110_get_pll_clk(MPLL)/1000000;
当你移植完这个函数之后,你要去看一下这个函数在原来的文件中定义时候是否在函数前面定义了static
如果定义了你要把他的这个static去掉,否则不可以调用
成功移植后就可以使用sd卡了:::
**测试SD卡:::**:

Goni # help mmc
mmc - MMC sub system

Usage:
mmc read <device num> addr blk# cnt
mmc write <device num> addr blk# cnt
mmc rescan <device num>
mmc list - list available devices

Goni 

mmc write 0 21000000 21# 1

MMC write: dev # 0, block # 21, count 1 ... 1 blocks written: OK
Goni # mmc read 0 31000000 21# 1

MMC read: dev # 0, block # 21, count 1 ...1 blocks read: OK
Goni # md 31000000
31000000: 12345678 87654321 ebdfffff fffffff9    xV4.!Ce.........
/***********sd 保存env 到sd卡中去个参数******/
if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
		puts("failed\n");
		ret = 1;
		goto fini;
	}
mmc, 

*保存env 到sd 卡的空闲扇区
*#if !defined(CONFIG_ENV_OFFSET)

define CONFIG_ENV_OFFSET 0 #endif**

void movi_bl2_copy(void)
{
	ulong ch;
	ch = *(volatile u32 *)(0xD0037488);
	copy_sd_mmc_to_mem copy_bl2 =
	    (copy_sd_mmc_to_mem) (*(u32 *) (0xD0037F98));

	u32 ret;
	if (ch == 0xEB000000) {
		ret = copy_bl2(0, MOVI_BL2_POS, MOVI_BL2_BLKCNT,
			CFG_PHY_UBOOT_BASE, 0);

MOVI_BL2_POS, 最后会是49
#if defined(CONFIG_EVT1)
	#if defined(CONFIG_SECURE) || defined(CONFIG_FUSED)
#define MOVI_BL2_POS		((eFUSE_SIZE / MOVI_BLKSIZE) + (FWBL1_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)
	#else
#define MOVI_BL2_POS(成立)		((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)
	#endif
#else
#define MOVI_BL2_POS		(MOVI_LAST_BLKPOS - MOVI_BL1_BLKCNT - MOVI_BL2_BLKCNT - MOVI_ENV_BLKCNT)
#endif
eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)

eFUSE_SIZE / MOVI_BLKSIZE) =1 扇区0(单位是扇区 )(0--1)
MOVI_BL1_BLKCNT =16(bl1)(1--16)
MOVI_ENV_BLKCNT) = 16(k)=32扇区(17---48)(存放env)
1+16+32=49::
49之后就是BL2了,,这是三星uboot推荐的分区方式,其实你可以自己做,没必要的。。
参考这个设计就可以了,,,所以将env放到第17个扇区即可
保存env 到sd 卡的空闲扇区
#if !defined(CONFIG_ENV_OFFSET)
#define CONFIG_ENV_OFFSET 0
#endif让这个宏生效;;;即可在s5p_210.h中定义这个红即可(CONFIG_ENV_OFFSET)
##define CONFIG_ENV_OFFSET 17*512

读取sd卡中的17扇区开始内容到ddr中查看如下‘
 mmc read 0 30000000 17# 32
   //MMC read: dev # 0, block # 17, count 32 ...32 blocks read: OK
 Goni # md 30000000 100
30000000: 99f431e7 64756162 65746172 3531313d    .1..baudrate=115
30000010: 00303032 746f6f62 73677261 6f6f723d    200.bootargs=roo
30000020: 642f3d74 6d2f7665 6c626474 386b636f    t=/dev/mtdblock8
30000030: 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值