简介
SDIO(Secure Digital Input and Output),即安全数字输入输出接口。它是在SD卡接口
的基础上发展而来,通常的存储设备,如TF卡,以及EMMC等存储芯片都是通过SDIO总线来通信的。
一.s5p4418的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中然后运行
注意: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!!!
六.测试结果
七. 源码工程文件
下载方式:
链接:https://pan.baidu.com/s/1wS_pLhFwkH7FD0JmD42Wkw
提取码:uku7