参考文档:《SMDK6410_IROM_APPLICATION NOTE_REV 1.00》(可以从这里下载到》

参考博客:Tekkaman的博文《u-boot-2010.09 for mini6410 (add MMC support)

Tiny6410_SMDK从SD卡直接启动裸板代码

使uboot支持S3C6410的SD启动

S3C6410开发全纪录(一)《还原SD卡启动的真相》

sd卡启动布局方式(假定一个扇区是512个字节):

File System Kernel BL2 BL1(16个扇区) Signature(1个扇区) Reserved(1个或者1025个扇区)

我的配置文件中关于mmc相关定义:

/* **************************************************************** *
* mmc spl config
* **************************************************************** */
#define CONFIG_S3C64X0_MMC 1
#define CONFIG_CMD_MMC
//#define CONFIG_ENV_IS_IN_MMC 1
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_SYS_MMC_U_BOOT_SIZE (512 *1024)
#define CONFIG_SYS_MMC_U_BOOT_OFFS (4 * 1024)
#define MMC_BOOT_CHANNEL 0
#define MMC_INIT_REQUIRED 0
#define CONFIG_GENERIC_MMC #define TCM_BASE (0x0C004000) /* movinand definitions */
#define MMC_BLKSIZE (512) #define MMC_SIGNATURE_SIZE (512)
#define MMC_RESERVED_SIZE (512)
#define MMC_TOTAL_BL12 (400 * 1024 + 8 * 1024)
#define MMC_TOTAL_UNUSE (MMC_SIGNATURE_SIZE + MMC_RESERVED_SIZE) #define MMC_TOTAL_BLKCNT (*((volatile unsigned int*)(TCM_BASE - 0x4)))
#define MMC_HIGH_CAPACITY (*((volatile unsigned int*)(TCM_BASE - 0x8))) #define MMC_UBOOT_POS_BACKWARD (0x300000)
#define MMC_ENV_POS_BACKWARD (0x280000)
#define MMC_BACKGROUND_POS_BACKWARD (0x260000) #define MMC_UBOOT_POS (MMC_TOTAL_BLKCNT - MMC_TOTAL_BL12/MMC_BLKSIZE - MMC_TOTAL_UNUSE/MMC_BLKSIZE) //#define MMC_UBOOT_POS (MMC_TOTAL_BLKCNT - (MMC_UBOOT_POS_BACKWARD/MMC_BLKSIZE))
#define MMC_ENV_POS (MMC_TOTAL_BLKCNT - (MMC_ENV_POS_BACKWARD/MMC_BLKSIZE)) #define MMC_UBOOT_BLKCNT (400 * 1024/ MMC_BLKSIZE)
#define MMC_ENV_BLKCNT (CONFIG_ENV_SIZE / MMC_BLKSIZE)
//#define CONFIG_MMC_ENV_DST (CONFIG_SYS_UBOOT_BASE + CONFIG_SYS_UBOOT_SIZE) #define CONFIG_SYS_MMC_U_BOOT_DST CONFIG_SYS_PHY_UBOOT_BASE /* NUB load-addr */
#define CONFIG_SYS_MMC_U_BOOT_START CONFIG_SYS_MMC_U_BOOT_DST /* NUB start-addr */ #define CONFIG_MOVINAND

u-boot代码占据400个1024字节,即800个扇区。

如果使用1G的sd卡,那么最后的RESERVED只需要一个扇区就够了,而2G及以上的SD卡则需要多用1024个扇区。

将1G容量sd卡放入到读卡器中插入到pc的usb接口,然后使用下面命令查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdb

Disk /dev/sdb:  MB,  bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000d8a6f Device Boot Start End Blocks Id System
/dev/sdb1 b W95 FAT32

其中最关键的就是扇区数目,我的sd卡扇区数目为1984000个扇区。

而BL1中存放u-boot-spl-16k.bin,其起始位置应该是1984000-18=1983982个扇区(18=16+1+1,16个扇区BL1,1个扇区signature,1个扇区Reserved)。

BL2中存放u-boot.bin,其起始位置应该是1983982-800=1983182个扇区(前面的配置文件中uboot偏移位置是800个扇区)。

另外有个4G容量sd卡,将其装入读卡器插入usb口,然后查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdc

Disk /dev/sdc:  MB,  bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x00000000 Device Boot Start End Blocks Id System
/dev/sdc1 b W95 FAT32

其中扇区数目为7684096。而IROM能识别的扇区数目是7684096-1024=7683072个扇区。

BL1中u-boot-spl-16k.bin起始位置是7683072-18=7683054

BL2中u-boot.bin存放起始位置是7683054-800=7682254

还有个容量为4g的sd卡,将其装入读卡器插入usb口,查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdb
[sudo] password for host: Disk /dev/sdb: MB, bytes
heads, sectors/track, cylinders, total sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x00000000 Device Boot Start End Blocks Id System
/dev/sdb1 b W95 FAT32

总扇区数目是7744512个扇区,而IROM能识别的扇区数目是7744512-1024=7743488个扇区。

BL1中u-boot-spl-16k.bin起始位置是-18=7743470

BL2中u-boot.bin存放起始位置是7743470-800=7742670

我制作了一个脚本(名为create_sd.sh)来自动完成烧写,内容如下:

#!/bin/bash
# sd卡最后部分内容布局(假定一个扇区大小为512个字节):
# =-=================================================================================================================
# BL2(u-boot.bin) BL1(u-boot-spl-16k.bin,16个扇区) Signature(1个扇区) Reserved(1个或者1025个扇区,跟sd卡大小相关)
# ===================================================================================================================
# 其中,Reserved扇区在SD卡小于等于1G时为1个字节,在4G及以上情况下为1025个字节)(我仅仅测试了1G和4G容量sd卡,其他大小未测试)
#
# 使用当前脚本时需要注意需要配置SD_DEV,SD_IS_1G,UBOOT_SECTORS,UBOOT_ROOT这几个变量的值 SD_DEV=/dev/sdb #sd卡分区名称
SD_IS_1G=n #sd卡是否1G(只能是y或者n)
UBOOT_SECTORS= #uboot所占大小,通常在开发板配置文件(请查看CONFIG_SYS_MMC_U_BOOT_SIZE的配置,转换成扇区数)
UBOOT_ROOT=. #uboot根目录路径 TOTAL_SECTORS=`sudo fdisk -l $SD_DEV | grep 'total.*sectors' | tr -d '[:lower:][:upper:][:punct:]'| awk '{print $4}'`
case $SD_IS_1G in
"n") IROM_SECTORS=`expr $TOTAL_SECTORS - ` ;; #如果sd卡大于1G,那么IROM能识别的扇区数需要减去1024.
"y") IROM_SECTORS=$TOTAL_SECTORS ;; #如果sd卡小于等于1G,那么IROM能识别的扇区数等于sd卡的扇区数目
*) IROM_SECTORS=$TOTAL_SECTORS ;; #如果sd卡小于等于1G,那么IROM能识别的扇区数等于sd卡的扇区数目
esac
LAST1M_OFF=`expr $TOTAL_SECTORS - ` #最后1M字节开始地址
SPL_START=`expr $IROM_SECTORS - ` #u-boot-spl-16k.bin文件的开始地址
UBOOT_START=`expr $SPL_START - $UBOOT_SECTORS` #u-boot.bin文件的开始地址
#echo $TOTAL_SECTORS $IROM_SECTORS $LAST1M_OFF $SPL_START $UBOOT_START sudo dd if=/dev/zero of=$SD_DEV bs= seek=$LAST1M_OFF count=
sudo dd if=$UBOOT_ROOT/mmc_spl/u-boot-spl-16k.bin of=$SD_DEV bs= seek=$SPL_START conv=fdatasync
sudo dd if=$UBOOT_ROOT/u-boot.bin of=$SD_DEV bs= seek=$UBOOT_START conv=fdatasync

在使用该脚本前需要先编译uboot,生成u-boot.bin和u-boot-spl-16k.bin,然后再用该脚本将这两个文件烧写到sd卡即可。

由于1G的sd卡磁条有些问题(导致sd卡在pc中是只读的),我测试了4G和8G的sd卡,烧写后都能从sd卡启动uboot。

6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤的更多相关文章

  1. 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)

    目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...

  2. 讯为开发板的最小LINUX系统烧写及U盘的挂载及卸载

    fdisk -c 0 fatformat mmc 0:1ext3format mmc 0:2ext3format mmc 0:3ext3format mmc 0:4 fastboot fastboot ...

  3. Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

    /*********************************************************************************** * * linux 3.5,U ...

  4. Exynos4412从SD卡启动的简单网络文件系统制作

    Exynos4412从SD卡启动的简单网络文件系统制作 1. 简介 嵌入式系统能够在开发板上正常运行,需要先进行系统配置,一个完整的嵌入式系统应该包含的几个部分::uboot,kernel,rootf ...

  5. [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统

    转自:http://www.07net01.com/linux/2016/02/1232094.html 参照1:http://blog.csdn.net/girlkoo/article/detail ...

  6. 基于tiny4412原生uboot修改制作SD启动并烧写到emmc

    最近入手tiny4412的标准板,底板SDK型号为1506.但是因为友善之臂提供的superboot不能进入boot菜单,此时我就不能通过tftp下载内核和通过nfs挂载根文件系统,于是想自己做个ub ...

  7. 制作SD卡启动自己编译的uboot.bin

    README for FriendlyARM Tiny4412 -----------------------------------------------------1. Build uboot ...

  8. ZYNQ的Linux Linaro系统镜像制作SD卡启动

    ZYNQ的Linux Linaro系统镜像制作SD卡启动 0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ...

  9. s5p6818 从SD卡启动程序(制作SD启动卡)

    背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...

随机推荐

  1. Web支持可暂停的超大文件上传

    代码镇顶:https://github.com/dna2github/petalJS/blob/master/upload 前些天遇到用户须要上传10GB大小以上的文件的需求,查查网上的库.都不好用. ...

  2. 在容器内执行go编译程序的坑

    如果你编译了一个go程序,让后把它放到容器里面.很多时候这个程序都会无法执行,大概的样子是: /tmp # ls pub sub /tmp # ./pub /bin/ash: pub: not fou ...

  3. 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...

  4. C#面试:抽象类与接口

    本人近日面试遇到此等问题.然后又一次补习了一下下.希望对同行们有所帮助. 一.抽象类:       抽象类是特殊的类,仅仅是不能被实例化:除此以外.具有类的其它特性:重要的是抽象类能够包括抽象方法,这 ...

  5. js:|| 和 && 运算符 特殊用法

    引用:http://www.jb51.net/article/21339.htm 先总结一下: 几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不 ...

  6. 在Centos 7上安装配置 Apche Kafka 分布式消息系统集群

    Apache Kafka是一种颇受欢迎的分布式消息代理系统,旨在有效地处理大量的实时数据.Kafka集群不仅具有高度可扩展性和容错性,而且与其他消息代理(如ActiveMQ和RabbitMQ)相比,还 ...

  7. Web安全系列(三):XSS 攻击进阶(挖掘漏洞)

    前言 在前些章节 (web安全系列(一):XSS 攻击基础及原理)以及(Web安全系列(二):XSS 攻击进阶(初探 XSS Payload))中,我详细介绍了 XSS 形成的原理以及 XSS 攻击的 ...

  8. python多进程生成缩略图

    在img目录下7张图片 分别是 11.jpg 22.jpg 33.jpg 44.jpg 55.jpg 66.jpg 77.jpg #encoding=utf-8 import os import ti ...

  9. Minify把CSS和JS压缩和削减

    Minify把CSS和JS压缩和削减(Minify:去掉空格回车符等),以及把多个CSS,JS文件整合到一个文件里.不要以为你的大带宽没有必要进行这类优化.使用它的理由更重要的是文件合并,而不是压缩, ...

  10. Array容易被忽略的join

    var lists, items = '', i; lists = [{ Fruits:'苹果' },{ Fruits:'香蕉' },{ Fruits:'菠萝' }]; /*items += '< ...