简介

SDIO(Secure Digital Input and Output),即安全数字输入输出接口。它是在SD卡接口
的基础上发展而来,通常的存储设备,如TF卡,以及EMMC等存储芯片都是通过SDIO总线来通信的。

一.s5p4418的SDIO说明

emmc可以用sdio吗_初始化

 s5p4418的SDIO总线的属性如上图所示,兼容MMC4.41,eMMC4.5规范,兼容SDIO3.0,最高时钟为50MHZ,总线三个通道,分别是SDIO0,SDIO1,SDIO2。
 另外TF卡和EMMC是嵌入式设备中比较重要的存储设备,也是比较常用的启动设备,大多数Soc芯片上电后都是通过SDIO总线从外部存储设备中读取bootloader和镜像文件来启动我们的板子。

二. s5p4418的启动流程

  本次仅仅针对TF卡启动来说明,对于s5p4418的TF卡启动流程默认是上电执行IORM代码,IROM代码是第一启动程序,然后从TF卡中读取扇区1~扇区64到内部SRAM(0xFFFF_0000)中运行,这段代码称为2ndboot,最后执行的是DDR中UBOOT程序。

三. 2ndboot的工作流程简单介绍

  本来2ndboot是三星不开源的一部分代码,但是笔者不幸从网上找到了这份代码,并做了简单的研究,得出2ndboot大概的流程如下:

1. 初始化PLL等时钟
2. 初始化串口
3. 初始化DDR3
4. 初始化SDIO总线
5. 读取TF中的uboot到DDR中然后运行

emmc可以用sdio吗_嵌入式硬件_02


emmc可以用sdio吗_初始化_03


emmc可以用sdio吗_嵌入式硬件_04


  注意:2ndboot不是简单的启动,它会读出TF卡的64号扇区,并检查这个扇区最后的4个字节是不是“NSIH”,然后从64号扇区解析出uboot.bin的大小,还有加载到内存哪个位置,以及运行时内存的地址,因此简单的用dd命令把2ndboot烧写到TF卡是无法正常启动uboot.bin。

  这也是把uboot.bin直接用dd命令更新的到tf卡的扇区65中,有可能会启动失败的原因(仅仅针对2014版本的uboot)。而fastboot烧写uboot.bin的时候,是会更新TF卡的64号扇区的!!!

四. 裸机的SDIO程序简介

  由于裸机程序是借助2ndboot启动的,因此裸机是运行在DDR中的,所以不需要初始化DDR了,我们仅仅初始化串口和SDIO,然后读出我们期望的扇区数据,由串口打印出来即可。

  由于篇幅有限仅仅贴出main函数的代码:

void main(void)
{
	int i ,sector;
	U8 data[512];
    struct NX_SecondBootInfo    TBI;//2ndboot信息表,来自扇区64
    
    
	Clk_Pll0_Init();
	Uart0_Init(); //串口初始化
	uart_puts("Uart Init Ok\r\n");

	Clk_Pll1_Init();
	Cpu_Freq_Init();
	uart_puts("CPU FCLK Init Ok\r\n");	

	//读出s5p4418 2ndboot 部分的加载信息
	SDMMC_Init_And_ReadSectors(64, (U32 *)&TBI);
	print_2ndboot_load_info(&TBI);

	/* 普通扇区读测试 */
	sector = 65; /* 读测试扇区 */
	SDMMC_Init_And_ReadSectors(sector, (U32 *)data);
	/* 打印扇区内容 */
	uart_puts("Sectors: ");
	uart_put_hex((U32)sector);
	uart_puts("\r\n");
	for(i = 0; i < sizeof(data); i++) {
		uart_put_hex8(data[i]);
		uart_puts(" ");
		if((i + 1) % 16 == 0)
			uart_puts("\r\n");
	}

	GPIOB12_LED_Init();

	while(1)
	{
		/* 翻转GPIOB12作为心跳指示灯 */
		gpio_led_set_high();
		delay(50000000);
		gpio_led_set_low();
		delay(50000000);
	}
}

五. 裸机程序烧写

  烧写方式,如果读者用的是全新的TF卡,需要把前置镜像烧写到扇区1~扇区64,然后再把
裸机程序烧写到扇区65开始的位置,上电才能正常运行,即boot_sec1~sec64.bin 文件。

5.1 烧写前置bin文件

dd if=boot_sec1~sec64.bin of=/dev/sdx seek=1
sync

注意:如果卡内事先有可以启动的镜像可以忽略烧写扇区1~扇区64,然后直接把固件烧到扇区65中
注意:/dev/sdx 要根据实际的TF卡来定,比如/dev/sdc!!!

5.2 烧写裸机程序main.bin文件

dd if=main.bin of=/dev/sdx seek=65
sync

注意:/dev/sdx 要根据实际的TF卡来定,比如/dev/sdc!!!

六.测试结果

emmc可以用sdio吗_emmc可以用sdio吗_05

七. 源码工程文件

emmc可以用sdio吗_单片机_06


下载方式:

链接:https://pan.baidu.com/s/1wS_pLhFwkH7FD0JmD42Wkw

提取码:uku7