GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法

发布者:疯狂小马最新更新时间:2015-10-14 来源: eefocus关键字:ARM汇编  u-boot  启动方法 手机看文章 扫描二维码
随时随地手机看文章
        在《GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读》中分析完u-boot-2012.07的makefile以及mkconfig脚本后,发现一个现象:在makefile中少了许多xxx_config之类的目标,而在目录下多了一个boards.cfg文件.仔细看下makefile和mkconfig就明白其实也没什么实质性的变化.也就是说,我们在make xxx_config的时候都用的是

%_config::unconfig
@$(MKCONFIG) -A $(@:_config=)

        奇怪的就是在下面一点点有:

#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config
smdk6400_config :unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;
else
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

        当时看到这个觉得奇怪,在新版本的uboot中其他板子的配置都用%_config的目标,你丫的smdk6400凭什么单独搞一个目标出来,好奇的去看下nand_spl目录,并且make smdk6400_config和make看了下配置的过程和编译的过程,当时初步搞清楚了这是个神马情况:

        在nand_spl目录下有个nand_boot.c,从这个文件名看上去倒是与从nand启动有关的,说到nand启动方式我要插一句:因为我是在装有ubuntu的破本子下进行GNU ARM汇编系列的学习的,因为是本子,所以没有并口,没有串口,只有搞个usb转串口来用,用不起jlink这样高级的玩意儿,因为是个破本子,win跑的不爽,干脆就跑linux了.所以我的板子里的nor flash我是一点都不敢动的,只能用nand flash,因此对nand flash启动的过程还是比较熟悉的.那为什么s3c2440从nand flash启动必须要用到内部那4K大小的sram,按照datasheet的解释是这样的:从nand启动时,一定要设置OM[0:1]这个拨码开关,将内部的4K大小的sram映射到0x00000000处,因为arm启动的时候都是从0x00000000开始的.而samsung的设计是在这种情况下nand中前4K大小的数据会由硬件load到sram中,这样依靠这4Ksram就可以从nand启动了.那为什么必须要这个4K的sram才可以做到nand启动了,根据一些前辈的说法和自己的理解,主要原因有二:第一nand flash的操作是需要控制器的,而soc在启动时,一条指令都没来的及执行,如何初始化控制器,控制器都没有初始化,那么又如何拿的到nand flash上面的指令;第二nand flash本身只能页读,cpu从nand无法取到一条32bit的指令,另外对于跳转指令,nand flash就傻眼了,nand flash没办法这样随机读.

        说是插一句话,不经意插了一段,另起一段:

        在nand_spl/board/samsung/smdk6400文件下有config.mk,Makefile和u-boot.lds三个文件,看看这三个文件再加上uboot根目录下的makefile文件就可以大概明白nand_spl这种方式是如何实现的了:

        在uboot根目录下的makefile中有:

$(obj)u-boot-nand.bin:nand_spl $(obj)u-boot.bin
cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

        是将两个bin档用这种方式合并成一个bin档!!!

        老实说,在做自己的bootloader的时候我也有这种想法,没想到在自己动手移植uboot的时候就发现新的uboot也采用了这种方式,有点小得意,^_^

        更具体点说,就是在nand_spl目录下的u-boot-spl.bin做了以下事情:

        1.设置cpu为svc模式

        2.关闭开门狗和中断

        3.初始化系统时钟

        4.禁用MMU和Cache

        5.初始化sdram控制器

        6.设置sp,跳到刚才提到的nand_boot.c里面的nand_boot函数,这个函数初始化nand的控制器,并将4K之后的u-boot.bin image从nand中load到sdram中,然后跳转到u-boot.bin image的开始处继续后续的工作

        为了实现这个u-boot-spl-16k.bin,可以照下列的步骤实施:

        1.在uboot根目录下的makefile中新增一个目标:

######################################################################
#TQ2440 by Baikal
######################################################################
TQ2440_config:  unconfig
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
#echo "RAM_TEXT = 0x33000000" > $(obj)board/samsung/TQ2400/config.tmp;
@$(MKCONFIG) TQ2440 arm arm920t - samsung s3c24x0
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk

        2.在nand_spl/board/samsung下新建文件夹TQ2440,可以将smdk6400目录下的三个文件复制过来再慢慢修改,最大的修改就是makefile的改动:

        start.S用的是arch/arm/cpu/arm920t/start.S

        lowlevel_init.S用的是board/samsung/smdk2410/lowlevel_init.S

        nand_boot.c用的是nand_spl/nand_boot.c

        s3c2440_nand.c用的是drivers/mtd/nand/s3c2440_nand.c

        3.移植s3c2440_nand的代码

        4.根据具体情况在start.S中将部分代码用#ifdef CONFIG_NAND_SPL或者#ifndef CONFIG_NAND_SPL包起来

        5.最后的编译链接过程是链接出一个u-boot-spl文件,从u-boot-spl文件中剥离出二进制数据文件u-boot-spl.bin,实际上这个bin档才1.2k左右,将其填充到4K大小

        

        如果对bootloader有一定理解,并且熟悉编译链接和makefile等脚本的话,单单这个工作量不大,忘记了还要熟悉nand flash的控制.

        最后,说一下我在这个过程中遇到一个耽误了我好久的一个问题,忘记在跳nand_boot.c也要设置sp.因为只能通过led来调试,看到的现象让我错误的以为是我的nand flash驱动没调对.最后才恍然明了.当时看那几个led也是看的烦躁了....

        just go on,戒躁

关键字:ARM汇编  u-boot  启动方法 引用地址:GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法

上一篇:GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读
下一篇:GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析

推荐阅读最新更新时间:2024-03-16 14:35

OK6410A 开发板 (三) 12 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析1
url : git@github.com:lisider/u-boot.git branch : ok6410a commit id : e63a4077ad3aea53107495b0b68b95e720fe6033 config : ok6410a_mini_defconfig // 涉及的 .S .s .c 文件 有 223个 reset arch/arm/cpu/arm1176/start.S 39 lowlevel_init(108) board/samsung/ok6410a/lowlevel_init.S 72 _main(110) arch/arm/lib/crt0.S 91 board
[单片机]
u-boot支持LCD显示(基于TQ2440)
平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB NandFlash:256MB) 作者:彭东林 邮箱: pengdonglin137@163.com 摘要 这个版本的u-boot支持LCD很容易,期间,参考了tq2440官方u-boot中的LCD驱动。我们只需要在配置文件中配置相应的宏,实现LCD的初始化和使能函数即可。 代码我已经上传到CSDN上了, git@code.csdn.net:pengdonglin137/u-boot.git 其中一共有两个分支,一个是master分支,用于跟踪u-boot的最近分支,另一个是u-boot-2015
[单片机]
<font color='red'>u-boot</font>支持LCD显示(基于TQ2440)
u-boot-2016.09移植(8)-合并tq210-spl.bin与u-boot.bin
为了方便烧录,我们直接将u-boot.bin追加到tq210-spl.bin后面,组成一个文件。 修改Makefile,定义合并规则: combine: u-boot.bin spl/u-boot-spl.bin FORCE cp $(objtree)/spl/tq210-spl.bin $(objtree)/tmp.bin truncate $(objtree)/tmp.bin -c -s 16K cat $(objtree)/u-boot.bin $(objtree)/tmp.bin cp $(objtree)/tmp.bin $(objtree)/ky-uboot.bin chmod 777 k
[单片机]
u-boot-2016.09移植(8)-合并tq210-spl.bin与u-boot.bin
新手入门ARM汇编 没你想象的那么难
笔者对C已经有10多年的经验,汇编用的很少。后来因为项目需要转到了ARM。一开始对ARM什么都不懂,看了本《ARM体系结构与编程》也是云里雾里的。但是也许是因为无知者无畏吧,直接就在mdk中建立一个工程,添加了自带的启动文件,然后做了个main函数,里面一个死循环没有操作任何硬件,居然跑起来了。然后以此为基础,慢慢的开始控制GPIO和串口通信。 其实,开发ARM还是很简单的,特别是使用mdk的话,会C语言也就能做一些简单的开发了。不要被那些稀奇古怪的东西给搞糊涂了。边开发边学习,项目做深了,那些东西自然就懂了。 罗嗦这么久,说几点建议吧: 1、ARM的汇编没必要去精通的,能够大概看懂就行了。如果一个速度要求苛刻到需要使
[单片机]
ARM汇编指令ARM寻址方式、汇编指令、伪指令
1、寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法。 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的。 只要取出指令也就是取得了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址。 例如: △:ADD R0,R0,#1 ;R0 -R0+1 △:ADD R0,R0,#0X3F ;R0 -R0+0X3F 2)寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常使用的一种方式, 也是一种执行效率较高的寻址方式。 例程: ADD R0,R1,R2 ;R0 -R1+
[单片机]
<font color='red'>ARM汇编</font>指令ARM寻址方式、汇编指令、伪指令
ARM汇编指令集之九——协处理器指令
1、CDP指令 CDP指令的格式为: CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。 CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。 指令示例: CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化 2、LDC指令 LDC指令的格式为: LDC{条件}{L} 协处理器编码,目的寄存器, LDC指令用于将源寄存器所指向的存
[单片机]
OK6410A 开发板 (三) 7 u-boot-2021.01 boot 解析 u-boot 与linux配置部分
U-boot配置 make O=output ok6410a_mini_defconfig // 在配置的时候 不需要指定 ARCH(因为defconfig有写) 与 CROSS_COMPILE(因为现在并不需要,build的时候才需要) // 如果写了CROSS_COMPILE,会去检查CROSS_COMPILE , 然后build的时候还是需要写 // 第一次用arm-gcc 的时刻, 编译时 的 CC lib/asm-offsets.s make : Entering directory '/home/suws/ok6410/system-new/u-boot/output' HOSTCC scri
[单片机]
U-Boot 在44B0X 开发板上的移植以及代码分析
1. u-boot 介绍 u-boot 是一个open source 的bootloader,目前版本是1.1.2。u-boot 是在ppcboot 以及armboot 的基础上发展而来,相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。 为什么我们需要u-boot?显然可以将uClinux 直接烧入flash,从而不需要额外的引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。同时,u-boot 移植的过程也是一
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved