您的位置 首页 电源

GNU ARM汇编–(十八)u-boot-选用nand_spl办法的发动办法

在《GNUARM汇编–(十七)u-boot的makefile和mkconfig解读》中分析完u-boot-201207的makefile以及mkconfig脚本后,发现一个现象:在

在《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,戒躁

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/258031.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部