记录Ok6410 sd 启动uboot
1\参考资料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot
2\参考资料https://blog.csdn.net/xinxin_2011/article/details/85228961
3\编译sd ram128版本的uboot
make ARCH=arm CROSS_COMPILE=$(编译器路径)/arm-linux- forlinx_sd_ram128_config
make ARCH=arm CROSS_COMPILE=$(编译器路径)/arm-linux- all -j8
4\操作编译出来的u-boot.bin
cat u-boot.bin >> temp
cat u-boot.bin >> temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
5\根据写入位置信息,将u-boot写入sd卡中
dd if=u-boot_256k.bin of=/dev/sdc seek= 7625166 bs=512
dd if=u-boot_256k.bin of=/dev/sdc seek=7625166 bs=512
sync
下面是参考的资料
前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析。上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问题:烧写文件时Uboot还是使用原串口0打印。这次我们就解决这个问题,制作自己的烧写Uboot。
S3C6410芯片SD卡启动流程可以参见《S3C6410_Internal_ROM_Booting.pdf》文档:
从图中可以看出,芯片上电后先执行BL0代码,这部分程序是写死在内部iROM中,出厂时厂家就烧写好了的。而设置SD卡启动后大致流程是先准备8K的引导代码在BL1(写在SD卡最后保留扇区中的那部分),它启动后用来初始化系统,时钟,串口,SDRAM等硬件,并且将SD卡中完整的Uboot(有效内容大小不能超过256K)拷贝到BL2上运行。
下面来分析拷贝的代码,在cpu/s3c64xx/start.S文件:
如果从NAND Flash启动,不需要拷贝,直接跳转到after_copy处;如果从SD启动,跳转到movi_bl2_copy实现Uboot拷贝到BL2的功能。这个函数在哪里了呢,这是一段C代码,在cpu/s3c64xx/movi.c文件中:
6410是有两个MMC通道的,OK6410使用的是通道0,如果板子使用其他通道的话,需要修改include/movi.h文件的HSMMC_CHANNEL宏:
计算偏移量和大小这里面涉及到的宏较多,重要的是MOVI_BL2_POS和BL2_BASE,都是在include/movi.h文件中定义的,BL2_BASE好分析,先来看它:
由于拷贝代码后才使能MMU单元,所以这个地址是映射前的物理地址,由TEXT_BASE决定。记得第一篇博文OK6410开发板Uboot学习总结----(一)Uboot启动分析 里面提到uboot1.1.6\board\samsung\smdk6410\u-boot.lds文件:
那么这个TEXT_BASE地址就是0x00000000吗,再看同目录下的Makefile文件:
在编译的时候包含了当前目录的config.mk文件,这里有对有TEXT_BASE的定义:
显示TEXT_BASE已经被更新为0x5FE00000了。再来看MOVI_BL2_POS宏定义:
可见MOVI_BL2_POS 是需要拷贝的数据位于SD的起始扇区位置,其计算需要依靠其他几个宏,也定义在movi.h文件:
这里定义SD卡扇区大小固定为512了,这也是为什么大容量的SD卡直接用于烧写是不行的(网上有说通过改写上位机SD卡制作程序才行,大扇区SD卡也得改为512来读写,以后有时间试试)。通过计算:
MOVI_LAST_BLKPOS = *((volatile unsigned int*)(TCM_BASE - 0x4))-((1 * 1024)/512)
MOVI_BL1_BLKCNT = (8*1024) / 512 = 16
MOVI_BL2_BLKCNT = (256 * 1024) / 512 = 512
MOVI_ENV_BLKCNT = 0x4000/512 = 32
1
2
3
4
MOVI_BL1_BLKCNT是BL1代码所占的大小(16x512=8K),MOVI_BL2_BLKCNT是BL2代码所占的大小(512x512=256K),这也解释了为什么Uboot代码不能超过256K了。目前只有MOVI_LAST_BLKPOS还没计算出来,大致看出了MOVI_BL2_POS的计算方式:
先得到这个SD的总扇区数TOTAL,再减去256K的BL2和8K的BL1所占的扇区数,最后减去0.5K 的eFuse和0.5K的保留区所占的扇区数。
看下图会更清楚,这也是为什么上位机制作烧写SD的工具需要操作最后的18个扇区:
程序中用到了寄存器地址TCM_BASE-4来获得SD卡的总容量的,具体怎么得到的呢?先看它在movi.h文件中定义:
TCM_BASE - 0x4就是0x0C003FFC,这块地址是干什么的呢,显然不是外设地址(外设是从0x70000000开始的),还是看手册吧:
手册里介绍这块属于内部SRAM地址范围,启动的时候该地址会被映射的,而其他的手册并没有介绍,还是看《S3C6410_Internal_ROM_Booting.pdf》文档:
终于找到这个既熟悉又陌生的地址了,它就代表SD卡的总容量块数,是芯片内部自动读取到的。这文档没有中文的啊,就乎看吧,要是有个英语好的妹子记得联系我啊,能助我一臂之力。唔,不说了,好害羞啊。。。
再回头去看movi_bl2_copy函数中CopyMovitoMem函数:
也是用这个地址+8,这个拷贝函数也是芯片自动实现的:
这个拷贝函数对于SDHC类型的卡有什么限制条件吗:
要求每块扇区大小是512字节,这就是为什么前面计算时扇区大小固定为512了,你要用大容量的SD卡,扇区不是512字节的就不行了,拷贝函数首先就不支持了。
分析完6410的SD卡启动流程,那么如何编译烧写用的mmc.bin文件呢,在uboot1.1.6/include/configs/smdk6410.h文件里有相关的宏定义:
可见是通过定义FORLINX_BOOT_NAND 和FORLINX_BOOT_SD来区分的,当定义FORLINX_BOOT_SD宏时,CONFIG_BOOT_MOVINAND宏也会被定义,而且CONFIG_BOOTCOMMAND就变为烧写u-boot.bin等一系列烧写命令了,这就是为什么SD卡启动的Uboot能自动实现烧写功能。
那么FORLINX_BOOT_NAND宏在哪里定义的呢?在uboot1.1.6/include/config.h文件中定义的:
注释上写得很清楚,这个是自动产生的,不需要我们自己编辑。编译前执行命令“make forlinx_nand_ram256_config”产生的这些宏定义,我们来看下Makefile文件:
下面的forlinx_sd_ram256_config标签就应该是配置SD卡启动的编译宏定义,二者区别只在于一个有“NAND”,一个有“SD”。分析一下这个命令,首先unconfig 命令是删除以前的配置文件,而后面的@$(MKCONFIG):
@表示不要echo这个命令到标准输出
$(MKCONFIG) 是个环境变量,对应脚本的名字是mkconfig
那么相当于执行“mkconfig smdk6410 arm s3c64xx…”命令,后面的内容以参数的形式传入了mkconfig脚本中,比如smdk6410对应的就是$1,依次推算,NAND或SD对应的是$7,那么看一下脚本文件:
如果是SD,就往config.h文件写入FORLINX_BOOT_SD宏,如果是NAND,就往config.h文件写入FORLINX_BOOT_NAND宏。由此可见,只要执行“make forlinx_sd_ram256_config”,就能完成支持SD卡启动Uboot的编译配置。但是编译完的u-boot.bin文件,大小并没有符合上面要求的256K+8K的条件,所以还得自己写个脚本:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
1
2
3
4
5
6
7
8
这个脚本负责把大小不足256K的u-boot.bin文件填充至256K,再在后面加上8K大小的BL1启动的Uboot程序。由于飞凌原来的mmc.bin文件大小就是280K(这可能与上位机烧写软件SD_Writer.exe写法有关),所以这里在256K的u-boot_256k.bin文件后面又添加了3个8K的u-boot_8k.bin,正好大小为280K。
把我们新生成的u-boot_mmc.bin文件用SD_Writer.exe程序写进SD卡中,烧写后,这下烧写用的Uboot调试串口也改为我们指定的串口3了,大功告成!!!
---------------------
作者:竹影云
来源:CSDN
原文:https://blog.csdn.net/xinxin_2011/article/details/85228961
版权声明:本文为博主原创文章,转载请附上博文链接!
记录Ok6410 sd 启动uboot的更多相关文章
- ok6410 nandflash 启动uboot 超过256k怎么办
1\在调试ok6410 nandflash启动uboot时,需要添加调试信息,导致uboot大于256k 2\需要修改下面几个地方 参考资料 在uboot中可以添加文字菜单,但是不够美观. 利用pho ...
- 记录在tiny6410平台上采用4GSD卡来启动uboot和烧写nand flash uboot
下面这种方法是从网上转的 没有验证 环境:ubuntu 13.04一.首先制作sd启动盘: 插入SD卡 sudo dd iflag=dsync oflag=dsync if=tiny210v2- ...
- qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统
qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和linux kernel,达到与开发板上一样的学习效果! 虽然已经买了2440开发板,但是在实际学习 ...
- S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)
一.介绍 九鼎的S5PV210开发板,在出厂前已经默认刷了Android4.0系统.如果需要刷其它的系统或者是由于系统问题无法启动时,就需要对板子刷机. 其实,刷机是对210开发板的一个基础学习,目的 ...
- qemu 模拟-arm-mini2440开发板-启动u-boot,kernel和nfs文件系统【转】
转自:http://www.cnblogs.com/riskyer/p/3366001.html qemu 本文介绍了如何编译u-boot.linux kernel,然后用qemu启动u-boot和l ...
- I.MX6 eMMC 中启动U-boot存放的首地址
/************************************************************************************ * I.MX6 eMMC 中 ...
- s5p6818 从SD卡启动程序(制作SD启动卡)
背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...
- 1、采用SD启动盘bootingLinux
一.准备条件 1.Arrow Sockit 开发板: 2.主机:可以是Linux系统,也可以是windows系统: 3.可以让主机识别的SD卡,不管是用读卡器还是用主机上的卡槽,内存4G以上 二.创建 ...
- 基于tiny4412原生uboot修改制作SD启动并烧写到emmc
最近入手tiny4412的标准板,底板SDK型号为1506.但是因为友善之臂提供的superboot不能进入boot菜单,此时我就不能通过tftp下载内核和通过nfs挂载根文件系统,于是想自己做个ub ...
随机推荐
- VS2013-2017 舒服的字体设置和背景色
使用字体:Fixedsys Excelsior 3.01 1.如果没有安装字体的话,首先下载字体:http://www.fixedsysexcelsior.com/ 2.安装字体:控制面板 -> ...
- C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题
最近在开发项目的时候,使用爬虫抓取网络数据的时候,当请求Web数据时,碰到了“请求被中止: 未能创建 SSL/TLS 安全通道”的问题,尝试过很多网上的方法,例如添加证书等都没有用.最后在GitHub ...
- 【转】最新版PyCharm(2018.2)破解
源链接 1.下载jar包 我突然发现这个包是通用的!IDEA,PyCharm都可以用 链接:http://idea.lanyus.com/ 上篇IDEA破解依旧是这个jar包 2.jar包放置位置将j ...
- centos7上修改lv逻辑卷的大小
author:headsen chen date: 2019-03-18 15:24:22 1,查看 [root@localhost mnt]# df -h Filesystem Size Used ...
- Nginx子域名配置
extends:http://blog.csdn.net/xiaoping0915/article/details/53899465 ,http://www.myhack58.com/Article/ ...
- pandas功能使用rename, reindex, set_index 详解
pandas rename 功能 在使用 pandas 的过程中经常会用到修改列名称的问题,会用到 rename 或者 reindex 等功能,每次都需要去查文档 当然经常也可以使用 df.colum ...
- [LeetCode] Majority Element 求大多数
Given an array of size n, find the majority element. The majority element is the element that appear ...
- rails 杂记 - render and layout
官方文档:http://guides.rubyonrails.org/layouts_and_rendering.html 渲染 view 渲染 html.rb 与相应的 action control ...
- Oracle 创建表 Create Table...
一.创建表 主键约束primary key 约束条件,唯一且非空,一个表中只能有一个主键:有多个字段联合作为主键时,合在一起唯一标识记录,叫做联合主键. 外键约束 foreign key 受另外一张表 ...
- oracle忘记密码用户名被锁定_解决方案
本方案参考http://www.cnblogs.com/iosundersunshine/p/5313174.html 解决方案(window): 进入cmd命令 按照图上五步,即可 1,输入 ech ...