热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使uboot支持S3C6410的SD启动

文章标题:使uboot支持S3C6410的SD启动。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  这里使用的uboot并非uboot官方发布的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-1.1.6,其代码作者就包括了三星的程序员与denx的员工。这个版本支持SD启动,不过默认是nand启动,使它支持uboot需要做以下事情:

  1、  虽然支持uboot启动,但是uboot代码里不叫SD启动方式,而是叫movinand启动方式,在incluede/configs/smdk6410.h中就有这个选项,所以在这个文件里关闭nand启动,打开movinand启动就可以了:

  //#define CONFIG_BOOT_NOR

  //#define CONFIG_BOOT_NAND       注释nand启动

  #define CONFIG_BOOT_MOVINAND   打开movinand启动

  //#define CONFIG_BOOT_ONENAND

  //#define CONFIG_BOOT_ONENAND_IROM

  #define     CONFIG_NAND

  //#define CONFIG_ONENAND

  #define CONFIG_MOVINAND         打开movinand选项,使uboot支持movinand的操作

  2、如果单纯是做上面的改动,还是不够的,在运行的时候会发现到了一定的时候uboot就死掉了,其实这是因为uboot中假设SMDK6410在使用SD方式的时候是从CH0启动的,但是手上的这个板子是通过CH1启动,那么在运行被复制到SRAM中的8K代码时候没办法在CH0检测到SD,更没办法将SD 里的代码复制到SDRAM中。修改办法是在incluede/

  movi.h中HSMMC_CHANNEL修改为1。

  3、然后如果将上述修改后编译出来的u-boot.bin通过IROM_Fusing_tools直接烧写到SD中也是没办法启动的,需要运行以下的命令进行处理:

  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

  经过这些处理,实际上是将u-boot.bin内容重复一次后(为了保证达到256K,如果这个bin更小,那么可能需要重复3次、4次,直到超过256K 为止),将前256K制成u-boot_256k.bin,再将前8K制成u-boot_8k.bin,最后将u-boot_256k.bin +u-boot_8k.bin合并成一个256K+8K大小的文件u-boot_mmc.bin,这个文件前256K就是u-boot_256k.bin 而后8K就是u-boot_8k.bin。把这个u-boot_mmc.bin通过IROM_Fusing_tools烧写到SD卡就可以成功启动系统了。

  为什么要做这样的处理这个bin文件呢?下面通过分析IROM_Fusing_tools、uboot的源码来揭示其中的由来。

  从网上可以下载到IROM_Fusing_tools的源码,在按下这个软件的start控件后,先是读取这个SD卡的第一个扇区,也就是这个磁盘的MBR 扇区,判断是不是FAT32格式的磁盘(这也是为什么用来做启动的SD必须格式化为FAT32格式),接着获取总的扇区数目TOTAl_SECOTR,并将所要烧写的bin文件烧写到磁盘的这个扇区:TOTAL_SECTOR ? 2 - SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是这个磁盘总的扇区数目;SIZE_OF_IMAGE/512是这个bin文件将要占据的扇区数(这里是以512为扇区大小的,因此对于扇区更大的SD卡也就没办法使用了,而现在的大容量SD都可能使用了2K甚至4K的扇区,除非修改这个程序,并同步地在uboot中修改程序);至于2则是保留的2个扇区,至于为什么要保留这2个扇区,需要分析uboot的源码情况,下面将做进一步的阐述。

  在SD启动方式下,S3C6410内部的IROM程序BL0首先运行,并将SD中的最后18个扇区开始的16个扇区内容复制到片内的8K SRAM,也就是SteppingStone,接着跳转到这块SRAM的开始地址开始运行,这8K的代码实际上就是上面u-boot_mmc.bin这个文件的最后8K,也是u-boot.bin的最开始8K代码,这段代码也叫BL1。从BL0跳转到BL1的时候uboot也就接管了CPU。

  Uboot的入口在start.S这个文件,cpu/s3c64x0/start.S中有这样一段代码:

  #ifdef CONFIG_BOOT_MOVINAND

  ldr   sp, _TEXT_PHY_BASE

  bl     movi_bl2_copy

  b     after_copy

  #endif

  这段代码是实现SD启动的关键。到了这里后就执行movi_bl2_copy,这个函数负责将SD内的uboot完整地复制到SDRAM,这时候完整的uboot也叫BL2,而这个函数实际上是调用了以下函数:

  CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);

  HSMMC_CHANNEL这是SD/MMC通道号,手上板子使用的是CH1,而默认是CH0,所以需要对这个进行修改。

  MOVI_BL2_POS 是需要拷贝的数据位于SD的起始扇区,其计算办法是这样的,先得到这个SD的总扇区数TOTAL,再减去256K的BL2和8K的BL1所占的扇区数,最后减去0.5K 的eFuse和0.5K的保留区所占的扇区数,而这里还定义SD的扇区为512B。从这里可以看到和IROM_Fusing_tools对SD卡的处理是完全对应的。这里还有一个问题,总扇区数TOTAL是如何得到的?从程序来看是从(TCM_BASE - 0x4)这个地址读取到的,至于TOTAL是如何被放到这里的就只能从BL0的代码找答案了。

  MOVI_BL2_BLKCNT是需要复制的扇区数目,这里就是定义为256K,这也是为什么必须把u-boot.bin转换成256K的文件。

  BL2_BASE是目的地址,也就是SDRAM中的地址。这里定义为0x57E00000,就是128M 的SDRAM的最后2M,因为到这里为止MMU尚未打开,因此这里使用的是物理地址。

  MOVI_INIT_REQUIRED这个参数的意义是什么暂时没有任何资料说明。

  而CopyMovitoMem这个函数的定义是这样的:

  #define CopyMovitoMem(a,b,c,d,e)     (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e))

  这个定义实际上是调用了位于TCM_BASE + 0x8这个地址的函数指针,其中TCM_BASE的值为0x0C004000,至于这个地址放的是什么,也没资料说明。

  当复制完BL2后便会跳转到BL2的start_armboot这个C语言函数中运行了,此后的运行过程就不需要再分析了。


推荐阅读
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 字符常量与变量的定义及使用方法
    本文介绍了字符常量与变量的定义及使用方法,包括字符常量的定义、值和转义字符的表示方法;字符串常量的定义和结束标志;字符型数据与整型数据的区别;字符型变量的定义和内存占用;字符串变量的运算方法。同时提醒注意字符串常量不可赋值给字符型变量,需使用数组或指针进行存取。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
author-avatar
卢嘉怡i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有