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
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/eastgeneral/p/10704129.html

记录Ok6410 sd 启动uboot相关推荐

  1. OK6410开发板Uboot学习总结----(三)从SD卡启动分析

    前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...

  2. uboot支持S3C6410的SD启动

    2019独角兽企业重金招聘Python工程师标准>>> 这里使用的uboot并非uboot官方发布的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-1.1.6 ...

  3. 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT

    [TINY4412]U-BOOT移植笔记:(9)SD卡启动U-BOOT 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板 ...

  4. 制作U-Boot的SD启动卡

    硬件平台:GEC210(128MB*4 RAM,256MB NandFlash) U-Boot版本:u-boot-samsung-dev(android_uboot_smdkv210.tar.bz2) ...

  5. linux内核加载卡主,请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题

    请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题 cpu:mcimx6u5dvm10AB 硬件上,我把wp和cd都直接接地了,这次新加工的核心板,以及重新设计一个新项目的 ...

  6. uboot启动 -- uboot基本启动流程

    本文以Board JZ2440(SMDK2410)的启动过程进行说明,u-boot选用u-boot-2015 1 概述 1.1 概述 CPU初始刚上电的状态.需要小心的设置好很多状态,包括cpu状态. ...

  7. 【Xlinx】【ZynqMP】使用xsdb工具,通过仿真器启动uboot教程

    1,背景 1,新板子,不用SD卡接口,只有仿真器连接,需要启动u-boot,对emmc,或者qspi flash进行分区,装载启动固件等操作. 2,vivado和petalinux的版本都是2020. ...

  8. PYNQ-Z1开发板通过QSPI FALSH启动UBOOT

    PYNQ-Z1开发板通过QSPI FALSH启动UBOOT 前期准备工作 安装虚拟机和ubuntu 安装petalinux 安装vivado和SDK 下载PYNQ-Z1的board file文件 方法 ...

  9. S5PV210开发板刷机(SD卡uboot、fastboot刷机方法介绍)

    一.什么是刷机? "刷机"这个词在日常生活中经常听到,例如有些人说"我手机很卡,需要重新去刷一下机","我手机这个功能不支持,可以去刷下机么" ...

最新文章

  1. Ubuntu 16.04 安装 Wireshark分析tcpdump的pcap包——sudo apt install wireshark-qt
  2. git恢复到上次提交
  3. VC++6中的一些快捷键(陆续补充中。。。)
  4. python beautifulsoup抓取网页内容_利用Python和Beautiful Soup抓取网页内容
  5. isp 图像算法(二)之dead pixel correction坏点矫正
  6. MyEclipse解决Launching xx on MyEclipse Tomcat has encountered a problem
  7. linux webapi测试,Webapi管理和性能测试工具WebBenchmark
  8. windows C++ 通过WMI获取底层信息
  9. Android 编程下的四大组件之服务(Service)
  10. Mac OSX下的nano编辑器下载设置
  11. 解决 sublime text 3 there are no packages available for installation 错误
  12. 图像 - 灰度化、灰度反转、二值化
  13. 北风网66jquery
  14. 前端实习一个多月总结
  15. Vue2.X 计算属性
  16. 5G工业无线网关在物联网的应用优势
  17. 解决POI导出Excel单元格内容换行问题
  18. 关于结构方程模型SEM评价指标
  19. 24.双边滤波和中值滤波器(自定义中值滤波器去除椒盐噪声、exp含义)-- OpenCV从零开始到图像(人脸 + 物体)识别系列
  20. 单元节点和积分点有什么区别

热门文章

  1. python requests详解
  2. 备份Ubuntu 并制作成iso安装文件
  3. 使用 CSS Color-Mix() 简化你的调色板
  4. Jquery——将页面定位到某个具体位置
  5. 2022山东老博会,山东养老展,中国国际养老服务业展9月举办
  6. wpf打开默认浏览器网址
  7. x86架构和arm架构的cpu简图
  8. 发那科机器人GI分配_发那科机器人应用-运动指令入门(1)
  9. 【低代码】云端组态集成与设备管理配置
  10. 无人机遥感技术在房产测绘应用中有哪些优势?