UBoot移植详解
Tiny6410_Uboot移植步骤详解
#include <config.h> #include <asm/arch/s3c6400.h>
.globl mem_ctrl_asm_init mem_ctrl_asm_init:
/* DMC1 base address 0x7e001000 */ ldr r0, =ELFIN_DMC1_BASE
#tar xzvf u-boot-gxb.tar.gz
二:在顶层的目录下找到 Makefile 文件,并用 gedit
打开
在 Makefile 中找到下面代码进行修改
########################################################################
else
\
echo
"RAM_TEXT
=
0xc7e00000"
$(obj)board/samsung/tiny6410/config.tmp;\
fi
@$(MKCONFIG) tiny6410 arm arm1176 tiny6410 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
ldr r1, =DMC_DDR_t_RFC ldr r2, =DMC_DDR_schedule_RFC orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RFC]
ldr r1, =DMC_DDR_t_RP ldr r2, =DMC_DDR_schedule_RP orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RP]
移植笔记从Norflash启动的uboot
移植笔记从Norflash启动的uboot uboot移植记录之一uboot整个移植过程我们可以分为三个阶段:一,移植可以从Nor flash启动的uboot这个阶段是移植一个最简单的uboot,可以烧在Nor flash内运行.二,移植支持Nand flash驱动的uboot加入Nand flash驱动的支持,可以在uboot命令行下操作Nand flash.但还未能从Nand flash启动,只能在Nor flash内运行.三,移植可以从Nor flash启动的uboot可以烧录在Nand flash,并设置从Nand flash启动运行uboot.分三个阶段进行移植,可以对整个uboot的移植过程及原理更加清晰明了,同时降低了发现问题时解决问题的困难度和解决范围.首先介绍移植可以从Nor flash启动的uboot. 这个阶段相对简单一点,是移植一个最简单的uboot,可以烧在Nor flash内运行.不需要修改太多的东西。
步骤如下: 测试一下默认的smdk2410_config配置能否在你的板子上正常运行 1.编译uboot1.1.4#make smdk2410_config#make ARCH=arm注:编译针对arm的平台时,uboot默认使用arm-linux-gcc编译,若交叉编译器名字不一样,需要自行在Makefile里修改。
会出现两个错误.错误信息一:cc1: Invalid option `abi=apcs-gnu'make[1]: *** [hello_world.o] Error 1make[1]: Leaving directory `/root/u-boot-1.1.4/examples'make: *** [examples] Error 2解决办法:出错的文件是/cpu/arm920t/下的config.mk:将PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) 改成: PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu,))错误信息二:make[1]: *** No rule to make target `hello_world.srec', needed by`all'. Stop. make[1]: Leaving directory `/work/src/u-boot-1.1.4/examples' 解决方法:打开 examples/Makefile把example文件夹下的Makefile中的第126行%.srec: % 改成 %.srec: %.o第129行的%.bin: % 改成 %.bin: %.o2.若编译成功,则会在uboot源码下产生u-boot.bin文件。
u_boot移植(五)之分析uboot源码中nand flash操作
u_boot移植(五)之分析uboot源码中nand flash操作一、OneNand 和Nand Flash我们已经能从Nand Flash启动了,启动之后,大家会看到如下效果:可以看出,我们的uboot默认使用的是OneNand。
需要注意的是我们的FSC100上面是没有OneNand的,有的是K9F2G08U0B型号的NAND FLASH。
前面我们了解过Nor Flash 和Nand Flash,那OneNand Flash又是什么呢?二、uboot 源码中Nand Flash部分代码分析我们从Nand Flash初始化看起,打开lib_arm/board.c文件,为了紧抓主线,以下代码只列举出了主线代码。
可以看出,我们可以通过CONFIG_CMD_NAND和CONFIG_CMD_ONENAND两个宏来选择NAND FLASH初始化还是 ONENAND FLASH初始化。
uboot 中默认定义了宏CONFIG_CMD_ONENAND,所以选择的是ONENAND FLASH初始化。
我们的FSC100上面使用的是NAND FLASH,所以我们要定义CONFIG_CMD_NAND宏,取消CONFIG_CMD_ONENAND宏的定义。
嗯!先做个记录:修改include/configs/fsc100.h,定义宏CONFIG_CMD_NAND,取消宏CONFIG_CMD_ONENAND。
好了,接下我们看看nand_init()函数时如何实现的。
看以看出,这段代码调用根据CONFIG_SYS_MAX_NAND_DEVICE宏[默认没有定义]的值来决定系统中Nand Flash设备的个数。
接着调用nand_init_chip()函数完成Nand Flash初始化,然后计算出每块Nand Flash的大小。
最终会输出Nand Flash总的容量。
嗯!做个记录:修改include/configs/fsc100.h,定义宏CONFIG_SYS_MAX_NAND_DEVICE,值为1没有看明白的地方是给nand_init_chip()函数传递的参数,接下来我们来看看他们是如何定义的。
uboot——官网下载直接移植(一)
uboot——官⽹下载直接移植(⼀)1:uboot下载地址:ftp://ftp.denx.de/pub/u-boot/我们下载的版本是:u-boot-2013.10.tar.bz2;2:下载好以后,删除⾥⾯的相关⽂件因为三星是的s5pv1XX这个cpu做了很多个板⼦,我们在移植的时候虽然与三星的开发板不同但是⽤的cpu是相同的,所以我们再选择cpu相关⽂件的时候,要确定好哪个cpu与我们⽤的cpu是相同的,u-boot-2013.10\arch\arm\cpu\armv7\s5pc1xx 在⽬录下有s5pc1xx相关的配置⽂件;这就是我们要选⽤的cpu⽂件;3:相较与我们直接移植三星移植好的uboot,新版的uboot编译配置时有所不同;把主Makefile与board有关的配置信息⽂件分开了;我们可以根据board.cfg⽂件中的配置信息来确定我们⽤的是哪个开发板;打开board.cfg⽂件搜索s5pc1xx我们可以看到两个相关的开发板,goni、smdk100,我们先⽤goni开发板来进⾏移植;⾸先删除其它的⽆关⽂件:arch⽬录下:只保留arm⽂件夹;arm/cpu⽬录下的出armv7⽂件夹以外其他删除;arm/cpu/armv7⽬录下保留s5pc1xx 以及s5p_common这两个⽂件夹,其他的删除;board⽬录下:board⽬录下只保留samsung⽂件夹samsung⽬录下只保留goni、common⽂件夹之后⽤sourceinsight创建项⽬4:对主Makefile进⾏分析,之前我们make的时候⾸先要进⾏配置:make x210_sd_config,⽽在新uboot中的配置依赖于下⾯这个规则:我们进⾏配置的时候make s5p_goni_config 然后执⾏下⾯这段脚本相当于执⾏ ./mkcofig -A s5p_goniMKCONFIG变量还是mkconfig脚本,下⾯我们看⼀下mkconfig脚本如何⼯作:下⾯这段代码的作⽤:1if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then2 # Automatic mode3 line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' boards.cfg`4if [ -z "$line" ] ; then5 echo "make: *** No rule to make target \`$2_config'. Stop." >&26 exit 17 fi89set ${line}10 # add default board name if needed11 [ $# = 3 ] && set ${line} ${1}12 fi判断传参是否两个且第⼀个参数为 -A,如果是则对line赋值,line的值是通过在boards.cfg⽂件中查找第⼆个参数$2,并把这⼀⾏赋值给line,从前⾯内容我们可以看出line = Active arm armv7 s5pc1xx samsung goni s5p_goni -并且把这些由空格分开的字符赋值给$1-$8所以这段代码执⾏完以后的结果是:$1 = Active$2 = arm$3 = armv7$4 = s5pv1xx$5 = samsung$6 = goni$7 = s5p_goni$8 = -继续分析下⾯代码:这段代码实际中没有起到什么作⽤可忽略1while [ $# -gt 0 ] ; do2case"$1"in3 --) shift ; break ;;4 -a) shift ; APPEND=yes ;;5 -n) shift ; BOARD_NAME="${7%_config}" ; shift ;;6 -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;7 *) break ;;8 esac9 done1011 [ $# -lt 7 ] && exit 112 [ $# -gt 8 ] && exit 1下⾯代码:CONFIG_NAME="${7%_config}"[ "${BOARD_NAME}" ] || BOARD_NAME="${7%_config}"arch="$2"cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`if [ "$6" = "-" ] ; thenboard=${BOARD_NAME}elseboard="$6"fi[ "$5" != "-" ] && vendor="$5"[ "$4" != "-" ] && soc="$4"[ $# -gt 7 ] && [ "$8" != "-" ] && {# check if we have a board config name in the options field# the options field mave have a board config name and a list# of options, both separated by a colon (':'); the options are# separated by commas (',').## Check for board nametmp="${8%:*}"if [ "$tmp" ] ; thenCONFIG_NAME="$tmp"fi# Check if we only have a colon...if [ "${tmp}" != "$8" ] ; thenoptions=${8#*:}TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"fi}config_name = s5p_goni_configBOARD_NAME = s5p_goni_configarch = armcpu = armv7spl_cpu = " "board = gonivendor = samsungsoc = s5pc1xx看下⾯信息:在这⾥第⼀打印出信息:Configuring for s5p_goni_config board...if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; thenecho "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}"1>&2exit 1fiif [ "$options" ] ; thenecho "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}" elseecho "Configuring for ${BOARD_NAME} board..."fi创建头⽂件的符号连接:if [ "$SRCTREE" != "$OBJTREE" ] ; thenmkdir -p ${OBJTREE}/includemkdir -p ${OBJTREE}/include2cd ${OBJTREE}/include2rm -f asmln -s ${SRCTREE}/arch/${arch}/include/asm asmLNPREFIX=${SRCTREE}/arch/${arch}/include/asm/cd ../includemkdir -p asmelsecd ./includerm -f asmln -s ../arch/${arch}/include/asm asmfirm -f asm/archif [ -z "${soc}" ] ; thenln -s ${LNPREFIX}arch-${cpu} asm/archelseln -s ${LNPREFIX}arch-${soc} asm/archfiif [ "${arch}" = "arm" ] ; thenrm -f asm/procln -s ${LNPREFIX}proc-armv asm/procfi符号连接1:/include/asm 连接到 /arch/arm/include/asm符号连接2: /include/asm/arch链接到 /arch/arm/include/asm/arch-s5pc1xx 符号链接3: /include/asm/proc链接到/arch/arm/include/asm/proc-armv看⼀下下⾯的代码:## Create include file for Make#( echo "ARCH = ${arch}"if [ ! -z "$spl_cpu" ] ; thenecho 'ifeq ($(CONFIG_SPL_BUILD),y)'echo "CPU = ${spl_cpu}"echo "else"echo "CPU = ${cpu}"echo "endif"elseecho "CPU = ${cpu}"fiecho "BOARD = ${board}"[ "${vendor}" ] && echo "VENDOR = ${vendor}"[ "${soc}" ] && echo "SOC = ${soc}"exit 0 ) > config.mk这段代码的作⽤是把ARCH = armCPU = armv7BOARD = gonivendor = samsungsoc = s5pc1xx 输出config.mk⽂件中看下⾯代码:# Assign board directory to BOARDIR variableif [ -z "${vendor}" ] ; thenBOARDDIR=${board}elseBOARDDIR=${vendor}/${board}fiBOARDDIR = samsung/goni再看最后⼀段代码:# Create board specific header file#if [ "$APPEND" = "yes" ] # Append to existing config file thenecho >> config.helse> config.h # Create new config filefiecho "/* Automatically generated - do not edit */" >>config.hfor i in ${TARGETS} ; doi="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"echo "#define CONFIG_${i}" >>config.h ;doneecho "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.hecho "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.hecho "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h [ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h [ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.hcat << EOF >> config.h#define CONFIG_BOARDDIR board/$BOARDDIR#include <config_cmd_defaults.h>#include <config_defaults.h>#include <configs/${CONFIG_NAME}.h>#include <asm/config.h>#include <config_fallbacks.h>#include <config_uncmd_spl.h>EOFexit 0上⾯这段代码的作⽤就是添加⼀些宏定义到config.h⽂件中:/* Automatically generated - do not edit */TARGETS为空所以不执⾏#define CONFIG_SYS_ARCH arm#define CONFIG_SYS_CPU armv7#define CONFIG_SYS_BOARD goni#define CONFIG_SYS_SOC s5pc1xxcat << EOF >> config.h 这句代码的作⽤是把下⾯内容写⼊config.h中,直到EOF;。
uboot中NANDflash的MTD驱动移植
u-boot中NAND flash的MTD驱动移植u-boot中移植了linux中的MTD驱动源码来支持NAND flash擦除、烧写及读的驱动。
MTD(memory technology device内存技术设备)是用于访问flash设备的Linux的子系统。
MTD的主要目的是为了使新的存储设备的驱动更加简单并有通用接口函数可用。
MTD驱动可支持CFI接口的norflash驱动、NAND flash驱动。
我们知道NAND flash 的访问接口并没有像norflash一样提供了一个标准的CFI访问接口,但是NAND flash生产厂家之间在各品牌、各型号NAND falsh芯片的访问接口方面做了一些约定俗成规定,如命令字、地址序列、命令序列、坏块标记位置、oob区格式等。
值得注意的是:在工艺制程方面分NAND flash有两种类型:MLC和SLC。
MLC和SLC属于两种不同类型的NAND FLASH存储器。
SLC全称是Single-Level Cell,即单层单元闪存,而MLC全称则是Multi-Level Cell,即为多层单元闪存。
它们之间的区别,在于SLC每一个单元,只能存储一位数据,MLC每一个单元可以存储两位数据,MLC的数据密度要比SLC 大一倍。
在页面容量方面分NAND也有两种类型:大页面NAND flash(如:HY27UF082G2B)和小页面NAND flash(如:K9F1G08U0A)。
这两种类型在页面容量,命令序列、地址序列、页内访问、坏块标识方面都有很大的不同,并遵循不同的约定所以在移植驱动时要特别注意。
下面以大页面的NAND flash:现代HY27UF082G2B为例介绍一下NAND flash一些基本情况,再来介绍MTD驱动的基本结构及流程分析,最后介绍u-boot中MTD驱动移植的详细步骤:3.4.1)NAND flash一些基本情况fl2400开发板上的nandflash芯片型号为:现代HY27UF082G2B,下面先介绍一下nandflash,及norflash与nandflash之间的区别:NOR和NAND是现在市场上两种主要的非易失闪存技术。
Uboot_for_mini6410_移植步骤详解
这是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。
但是这个足够开发的方便使用。
今后会陆续添加原先我为mini2440添加的所有功能。
但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at >完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096])即可。
DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。
一:/batch.viewlink.php?itemid=1694ftp://ftp.denx.de/pub/u-boot/去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。
现在我将下载u-boot-2010-09,这个也就是最新的版本啦。
下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:1:进入arch这个文件夹,把出arm外的前部文件夹删掉2:进入board这个文件夹,把除samsung外前部文件夹删掉3:进入include/configs,把除smdk6400.h外的所有文件删除。
4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。
5:进入nand_spl/board,把除samsung外全部文件删除掉。
6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。
uboot2012-10移植s5pv210
s5pv210 uboot-2012-10的移植s5pv210 uboot-2012-10移植(一) 之分析Alex Ling的linaro-2011.10 for mini210好久好久前就买了s5pv210的开发板,一直都是东搞搞西搞搞,一点收获也没有,这次下决心来移植最新的uboot到u-boot-2012.10上,并通过这个博客记录下来以防时间长给忘了,我的开发板是QT210的。
s5pv210的启动分为BL0,BL1,BL2,BL0是出厂的时候就固化在IROM里的,所以我们的uboot就要实现BL1和BL2,BL1在uboot里叫做u-boot-spl.bin,BL2就是我们很熟悉的u-boot.bin了。
在移植之前,我们先看下Alex Ling 的linaro-2011.10 for mini210的UBOOT是怎么实现的。
这里主要还是分析SPL部分,u-boot.bin是如何生成的现在资料很多,也很复杂,我这个菜鸟也是一知半解的,所以就不分析了。
1.顶层的Makefile,从中可以知道,我们要想生成u-boot-spl.bin就必须配置COFNIG_SPL,那么u-boot-spl.bin依赖什么呢,我们继续[plain]view plaincopy1.ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin2.3.all: $(ALL-y)搜索发现,是进入到uboot顶层目录的spl目录下执行Makefile的[plain]view plaincopy1.$(obj)spl/u-boot-spl.bin: depend2. $(MAKE) -C spl all2.打开spl/Makefile分析,一开始就给我们导出CONFIG_SPL_BUILD[plain]view plaincopy1.CONFIG_SPL_BUILD := y2.export CONFIG_SPL_BUILD然后分析目标,因为我们的平台是三星的,所以,会有两个目标,一个是不带头信息的u-boot-spl.bin,一个是$(obj)$(BOARD)-spl.bin。
uuboot 移植流程
uuboot 移植流程U-Boot 移植流程介绍U-Boot是一个开源的引导加载程序,常用于嵌入式系统中。
移植U-Boot可以将其适配到不同的硬件平台上,以满足特定需求。
本文将详细说明U-Boot移植的流程。
准备工作1.硬件选型:根据项目需求,选择适合的硬件平台。
2.获取源代码:从U-Boot官方网站或仓库下载最新版本的源代码。
3.安装交叉编译工具链:根据目标硬件平台的指令集架构,选择合适的交叉编译工具链,并进行安装。
4.了解目标硬件平台:熟悉目标硬件平台的架构、引导方式、存储器布局等相关信息。
移植流程1.配置编译环境:设置交叉编译工具链的环境变量,以确保正确编译U-Boot源代码。
2.配置U-Boot:修改U-Boot源代码中的配置文件,根据目标硬件平台的特性和需求进行相应配置。
–配置目标硬件平台的处理器类型、存储器布局等基本信息。
–配置启动方式,如通过网络(TFTP)或存储介质(SD卡、NAND Flash)等进行启动。
–配置启动流程,如引导加载程序的加载顺序、启动脚本等。
3.添加适配代码:根据目标硬件平台的需求,编写适配代码,包括引导加载程序和设备驱动等。
–引导加载程序:为目标硬件平台选择合适的程序入口点,配置启动参数,加载适配的设备驱动等。
–设备驱动:根据目标硬件平台的外设,编写相应的设备驱动代码,以支持外设的初始化和操作。
4.编译U-Boot:使用交叉编译工具链,编译修改后的U-Boot源代码。
–执行make clean清除之前的编译结果。
–执行make命令编译U-Boot源代码。
5.烧录和运行:将编译生成的U-Boot镜像烧录到目标硬件平台,并进行测试。
–根据目标硬件平台的烧录方式(串口、JTAG等),将U-Boot镜像烧录到目标设备。
–启动目标设备,观察U-Boot的启动信息是否正常输出,检查设备驱动是否正常加载。
6.调试和优化:根据实际情况,进行U-Boot的调试和性能优化。
–使用调试工具进行调试,如调试器、串口打印信息等。
在ubuntu8[1].0.4上移植uboot
在ubuntu8.04上UBOOT移植笔记一、 与windows共享最好的做法是通过SAMBA与Windows建立共享,但是在ubuntu8.04上配置SAMBA服务器是一件非常痛苦的事,特别是对于没有经验的新手来说更是如此。
变通的做法是在UBUNTU8.04上安装SAMBA客户端,用Windows的共享来实现文件交换。
先在windows上建立一个共享文件夹,例如“SWAP”,共享权限是可读可写。
然后搜索Ubuntu的安装光盘,找到“smbclient_3.0.28a-lubuntu4_i386.deb”,双击安装。
安装完成后,在Ubuntu桌面上依次选择“位置”-“网络”,找到Windows共享主机,双击即可看到共享文件夹。
连接成功后,会在Ubuntu的桌面上产生一个映射,以后再次双击该映射图标即可。
二、 安装开发工具链1、arm-linux-gccz首先在你的用户目录下建立tools文件夹:mkdir tools (推荐使用终端操作,也可以在图形用户界面下进行)z然后从以下地址下载arm-linux-gcc-3.3.2.tar.bz2到windows的共享文件夹“/developers/linux/files/tools/arm-linux-gcc-3.3.2.tar.bz2”z将arm-linux-gcc-3.3.2.tar.bz2从共享文件夹拖到刚才建立的 tools文件夹z进入tools文件夹:cd toolsz然后解压缩:tar xvf arm-linux-gcc-3.3.2.tar.bz2,在 tools文件夹形成/usr/local/arm/3.3.2/文件夹z进入刚才形成的local文件夹:cd usr/local/z将arm文件夹拷贝到/usr/local/文件夹:sudo cp -rv arm /usr/local/z将编译器路径添加到系统环境变量export PATH=/usr/local/arm/3.3.2/bin:$PATHz检查环境变量是否添加成功:echo $PATH,在输出的信息中如果含有/usr/local/arm/3.3.2/bin,则表示添加成功。
UBoot移植详解
u-boot 移植步骤详解1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。
其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。
从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。
当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
最新Uboot移植步骤 6:NandFlash读操作
最新Uboot移植步骤6:NandFlash读操作前面在调试时把NAND相关的宏CONFIG_CMD_NAND注释掉了一些,现在去重新打开:编译,看看会出什么错误:先看第一个error:72行显示一个不完整的类型看这个nand的定义:发现nand是2410_nand的结构体,但我们未定义CONFIG_S3C2410这个宏,我们现在要使用2440,正好下面有,我们直接使用2440的结构体好了:这个文件都是给2410用的,我们直接拷贝一份,改名为2440,SI文件添加一下:修改宏定义:修改Makefile:先看看nand是如何操作的,着nand相关函数:看nand_init函数:可见这里就可以识别nand并输出nand的大小了,先看运行哪个函数:可见CONFIG_SYS_NAND_SELF_INIT宏未定义,所以运行nand_init_chip函数:看单板初始化函数:把2410修改为2440:发现s3c2440_get_base_nand函数未定义,我们先搜下2410的定义,改为2440的定义:修改发现S3C2440_NAND_BASE未定义,那我们找到2410定义的地方自己仿照定义2440下:修改初始化时序:看这个函数,我们把2410都改成2440:修改这里:看到nfcont,我们还要设置下这个:现在board_nand_init函数修改完了,开始修改nand_scan函数:观察之后,发现要修改如下(具体为何这样修改,参考NAND驱动开发视频,现在我还没看,无法详述):编译,下载:有错误:搜索nand_wait_ready,发现再我们自己的init.c函数里也定义了,把我们的改一下:再编译下载:发现NAND已经可以识别!把uboot从nor拷贝到nand:验证:数据都相同,现在重启开发板从nand启动:这时从NAND启动,Nor无法识别,所以显示0KB!成功!。
Uboot启动流程分析和移植介绍
基于MPC83xx 的U-boot 启动流程分析和移植董 闯北京邮电大学信息与通信工程学院,北京(100876)E-mail :donix.dong@摘 要:本文首先引入Bootloader 的概念,接着介绍U-boot 这种引导程序,并以Freescale 32位微处理器MPC83xx 为例,结合代码详细分析了U-boot 的启动的各个阶段及最终引导Linux 内核的过程,最后,建立交叉编译环境,针对TC8313E 目标板,给出U-boot 移植与编译的基本步骤。
关键词:U-boot;MPC83xx;交叉编译;移植;嵌入式系统中图分类号:TP393.051.引言引导程序(Bootloader)是系统加电后运行的第一段软件代码,类似于PC 机中的引导加载程序BIOS 。
虽然引导程序仅在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的组成部分。
通过这段小程序,初始化必要的硬件设备,创建内核需要的一些信息并将这些信息传递给内核,从而将系统的软、硬件环境配置到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。
2. U-boot 介绍目前,嵌入式领域里出现了很多种类的Bootloader ,如Armboot 、Blob 、Redboot 、vivi 和U-boot 等,其中U-boot 是使用最广泛,功能最完善的。
U-boot (Universal Boot Loader)是从PPCBOOT 发展演化而来[1],其源码目录、编译形式与Linux 内核很相似,事实上,不少U-boot 源码就是相应的Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从U-boot 源码的注释中就能体现。
U-boot 中Universal 有两层含义,一是U-boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器;另外一层含义则是U-boot 不仅仅支持嵌入式Linux 操作系统的引导,还支持OpenBSD, NetBSD, FreeBSD, SVR4, Solaris, VxWorks, LynxOS, pSOS, lrix, RTEMS, QNX, ARTOS 等操作系统的引导。
UBOOT移植(NANDFLASH的支持)——初步移植(一)
UBOOT移植(NANDFLASH的支持)——初步移植(一)这里就仿造《TQ2440的学习—UBOOT移植(NAND FLASH的支持)——初步分析》中展示的S3C2410的NAND FLASH驱动实现S3C2440的NAND FLASH驱动。
还是一步步的来,先实现基本的读写系统。
至于硬件ECC校验就先不实现。
在UBOOT下编写设备支持程序,还是遵循先配置头文件再修改的相关初始化代码的思路来进行。
配置头文件(include/configs/fzb2440.h)关于NAND FLASH的宏配置,有一部分是通用的,一部分是只存在于特定驱动中的。
通用配置CONFIG_CMD_NAND ——开启NAND FLASH支持主要就是支持相关的操作命令,这个可以说是总开关(默认已经包含在config_cmd_default.h中)。
CONFIG_MTD_DEVICE——在使用MTD驱动的规范的时候必须要定义这个宏。
CONFIG_SYS_MAX_NAND_DEVICE——描述有几个NAND FLASH设备。
S3C2440上只有一个接口,所以就只有一个设备。
CONFIG_SYS_NAND_MAX_CHIPS——描述这个NAND FLASH 设备上有几个NAND FLASH芯片。
TQ2440上只使用了一个NAND FLASH芯片,所以就只有一个芯片。
CONFIG_SYS_NAND_BASE——描述NAND操作模块的基地址,S3C2440上是0x4e000000起始的。
CONFIG_SYS_NAND_PAGE_SIZE——描述所使用的NAND FLASH的页大小,TQ2440使用的2K页的芯片(如果不指定,MTD 驱动也会自动尝试获取相关的信息,这里只是为开启硬件校验而定义,最好将其归类于硬件校验支持所需要的宏)。
CONFIG_SYS_NAND_ECCSIZE——这个是表明ECC校验的数据区的大小尺寸(软件校验默认256字节,硬件校验由于S3C2440的这部分功能是针对一个页实现的,所以既然使用2K页的NAND FLASH 所以这部分也就和CONFIG_SYS_NAND_PAGE_SIZE相等)。
u-boot移植详细文档
u‐boot移植详细文档作者:Tekkaman Ninja作者博客:整理:Coolbor Xie一、Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。
有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。
而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。
2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:1. CPU 寄存器的设置: R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach‐types); R2=内核启动参数在 RAM 中起始基地址;2. CPU 模式: 必须禁止中断(IRQs和FIQs); CPU 必须 SVC 模式;3. Cache 和 MMU 的设置: MMU 必须关闭;指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。
一步步教你移植uboot(超精华版)
#make gec2440_config #make 编译完成时最后两句如下:
arm-linux-objcopy -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin 表示编译成功。
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff //0x3ff,根据 2410 芯片手册,INTSUBMSK 有 11 位可用,vivi 也是 0x7ff, u-boot 则是 0x3ff,不过芯片复位后所有中断都被屏蔽,故这无影响
ldr r0, =INTSUBMSK
>> 2
广州广嵌电子科技有限公司
u-boot移植要点 我们可以总结出bootloader的两大功能:
1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。 2 是对flash芯片的读写功能。 u-boot对S3C2440已经有了很好的支持,在移植过程中主要是完善u-boot对nand flash 的读写功能。 u-boot移植前的准备工作 1.下载源码 Uboot的源码可以从以下网址下载: /u-boot/u-boot-2009.11.tar.bz2?modtime=1134 752480&big_mirror=0 我们这里下载的是u-boot-2009.11.tar.bz2 工具链使用cross-4.1.2
samsung: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。 板子起名叫gec2440,可以依自己的喜好修改
UBOOT移植操作
UBOOT移植操作1. 确定目标平台和硬件:首先需要了解目标平台的硬件架构、处理器类型、存储设备(如 Flash 或者 SD 卡)等重要信息。
同时需要获取目标平台的硬件参考手册或者相关文档。
2.设置交叉编译工具链:UBOOT是使用C和汇编语言编写的,因此需要使用交叉编译工具链来生成可在目标平台上运行的二进制可执行文件。
交叉编译工具链包括交叉编译器、链接器和调试器等工具,这些工具需要针对目标平台进行配置。
4. 配置 UBOOT 环境:进入 UBOOT 源代码目录,运行 `make menuconfig` 命令来配置 UBOOT 的环境。
这个命令会打开一个图形界面,可以在其中选择需要的功能、驱动程序和选项。
根据目标平台的硬件特性和需求,选择适当的选项。
5. 修改配置文件:UBOOT 需要一个配置文件(通常是`include/configs/<target.h>`),在这个文件中需要将目标平台的硬件配置信息填入。
这些信息包括芯片型号、Flash 存储器地址等。
还需要设置启动参数,如内核地址、根文件系统地址等。
6. 编译 UBOOT:运行 `make` 命令来编译 UBOOT。
根据配置和硬件平台的不同,可能需要选择不同的编译选项。
编译过程会生成一个 UBOOT 头文件(u-boot.bin)和其他必要的文件。
7.将UBOOT烧录到目标平台:使用烧录工具(如JTAG烧录器、USB烧录器或者SD卡等)将编译好的UBOOT烧录到目标平台的存储设备中。
具体的烧录方法和工具依赖于目标平台的配置。
8.测试和调试:将烧录好的UBOOT安装到目标平台后,通过串口或者网络连接到目标平台,使用终端工具进行测试和调试。
可以通过串口输出来查看启动过程中的日志和错误信息,或者使用调试工具来分析程序执行的问题。
9.优化和定制:根据需求对UBOOT进行优化和定制。
可以修改配置文件、增加功能模块或者修改代码,以达到更好的性能和适应特定需求的目的。
UBOOT移植操作
[0]目录结构◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds 等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU 为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。
其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆ doc:文档。
◆drivers:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
◆fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。
◆net:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
◆ lib_arm:与ARM体系结构相关的代码。
◆ tools:创建S-Record格式文件和U-BOOT images的工具。
==================================================== ======================================[1]u-boot.1.1.2目录下有Makefile1)设置编译器可以看到这一项:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-也就是说这里所用的交叉编译器是arm-linux-gcc,u-boot默认是用这个的,也有用arm-elf-gcc的,arm-elf-tools-20030314.sh,用它来编译,没有问题。
UBoot移植详细教程
u-boot 移植步骤详解(必会)1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。
其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。
从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。
当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
uboot内核移植和裁剪详细步骤
uboot内核移植和裁剪详细步骤-U-boot内核移植步骤:Linux 3.3.5系统移植1. 将arch/arm/mach-s3c6410/下的,mach-smdk6410.c cp为mach-my6410.c;2. 打开arch/arm/mach-s3c6410/下的Kconfig,仿照MACH_SMDK6410做一个菜单项:config MACH_MY6410bool "MY6410"select CPU_S3C6410select SAMSUNG_DEV_ADCselect S3C_DEV_HSMMCselect S3C_DEV_HSMMC1select S3C_DEV_I2C1select SAMSUNG_DEV_IDEselect S3C_DEV_FBselect S3C_DEV_RTCselect SAMSUNG_DEV_TSselect S3C_DEV_USB_HOSTselect S3C_DEV_USB_HSOTGselect S3C_DEV_WDTselect SAMSUNG_DEV_BACKLIGHTselect SAMSUNG_DEV_KEYPADselect SAMSUNG_DEV_PWMselect HAVE_S3C2410_WATCHDOG if WATCHDOGselect S3C64XX_SETUP_SDHCIselect S3C64XX_SETUP_I2C1select S3C64XX_SETUP_IDEselect S3C64XX_SETUP_FB_24BPPselect S3C64XX_SETUP_KEYPADhelpMachine support for the Pillar MY64103. 打开arch/arm/tools/mach-types文件,这里面存的是机器ID必须要和uboot里面的ID保持一致,将其283行复制添加在后面并修改为: smdk6410MACH_SMDK6410 SMDK6410 1626 xx6410 MACH_XX6410 XX6410 1626 这个机器ID和UBOOT里的机器ID相同时才能启动内核;1. 修改BSP文件mach-my6410.c,内容如下:将mach-mach-my6410.c文件中的所有smdk6410改成my6410(不要改大写SMDK6410的)MACHINE_START(MY6410, "MY6410")//这个要和Kconfig里的MACH-MY6410匹配 2. 在当前目录的Makefile最后一行加上 obj-$(CONFIG_MACH_MY6410) += mach-my6410.o3. 修改顶层的Makefile:ARCH ?= armCROSS_COMPILE ?= /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- 4. 复制arch/arm/configs/下的s3c6400-defconfig文件,然后将其保存为.config,配置内核支持EABI,再选中XX6410 board这一项,保存退出;5. 执行make menuconfig对内核进行配置:执行make编译执行make zImage生成zImage将uboot根目录下的mkimage拷贝到/user/bin目录下执行make uImage生成uImage通过以上几步linux内核移植完了,剩下就移植驱动了。
u_boot 移植(一)之uboot配置编译
u_boot 移植(一)之uboot配置编译一 、开发环境PC OS : Ubuntu 14.04SOC : 基于ARM Cortex-a8 核的S5PC100开发板 : FSC100u_boot : u-boot-2010.03编译器 : arm-cortex_a8-linux-gnueabi-gcc version 4.4.6二、目标1.Uboot 能从FSC100的 Nand Flash 正常启动2.Uboot 支持DM9000 网卡3.Uboot 支持Nand Flash 读、写、擦除4.Uboot 支持Linux 内核引动好了,接下来就进行移植uboot到FSC100开发板吧 。
三、建立自己的平台1、 下载源码我们可以在下面这个网站上下载最新的和以前任一版本的 ubootftp://ftp.denx.de/pub/u-boot/2、 解压 uboot 源码并进入目录tar zxvf u-boot-2010.03.tar.gzcd u-boot-2010.03u-boot-2010.3 源码中已经支持了SMDKC100了(SMDKC100是三星公司基于SOC : S5PC100设计的一块开发板)。
我们的FSC100使用的SOC也是S5PC100,所以我们只需要稍加修改Uboot支持的SMDC100代码,就可以编译出支持我们的FSC100开发板的uboot了。
1.修改 u-boot 顶层目录下的 Makefile,指定交叉工具链在ifeq ($(HOSTARCH, $(ARCH))CROSS_COMPILE ?=endif下添加:ifeq (arm, $(ARCH))CROSS_COMPILE ?= arm-cortex_a8-linux-gnueabiendif2.在 u-boot 顶层目录下的 Makefile 中添加 fsc100 配置信息在smdkc100_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 smdkc100 samsung s5pc1xx下添加:fsc100_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 fsc100 samsung s5pc1xx3. 添加 fsc100 平台信息(1)进入board/samsung目录(2)拷贝smdkc100 为 fsc100(3)进入fsc100目录下修改smdkc100.c 为fsc100.c修改Makefile中的smkc100.o 为fsc100.o(4)进入include/configs目录,拷贝smdkc100.h为fsc100.hinclude/configs目录下的.h文件为对应开发板的配置文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
u-boot 移植步骤详解1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。
其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。
从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。
当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
选择U-Boot的理由:①开放源码;②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;④较高的可靠性和稳定性;④较高的可靠性和稳定性;⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;⑦较为丰富的开发调试文档与强大的网络技术支持;2 U-Boot主要目录结构- board 目标板相关文件,主要包含SDRAM、FLASH驱动;- common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;- cpu 与处理器相关的文件。
如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;- driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)- doc U-Boot的说明文档;- examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;- include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;- lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM 体系结构相关的文件;- net 与网络功能相关的文件目录,如bootp,nfs,tftp;- post 上电自检文件目录。
尚有待于进一步完善;- rtc RTC驱动程序;- tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;3 U-Boot支持的主要功能U-Boot可支持的主要功能列表系统引导支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好;设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;上电自检功能SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号;特殊功能XIP内核引导;4 移植前的准备(1)、首先读读uboot自带的readme文件,了解了一个大概。
(2)、看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。
再看看flash.h,这个文件里面定义了flash_info_t为一个struct。
包含了flash的一些属性定义。
并且定义了所有的flash的属性,其中,AMD的有:AMD_ID_LV320B,定义为“#define AMD_ID_LV320B 0x22F922F9”。
(3)、对于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:“void flash_identification(flash_info_t *info)”这个函数的目的是确认flash的型号。
注意的是,这个函数里面有一些宏定义,直接读写了flash。
并获得ID号。
(4)、修改:”./board/at91rm9200dk/config.mk”为TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修改,和一级boot的定义的一致即可)。
(5)、再修改”./include/configs/at91rm9200dk.h”为修改flash和SDRAM的大小。
(6)、另外一个要修改的文件是:./borad/at91rm9200dk/flash.c。
这个文件修改的部分比较的多。
a.首先是OrgDef的定义,加上目前的flash。
b.接下来,修改”#define FLASH_BANK_SIZE 0x200000”为自己flash的容量c.在修改函数flash_identification(flash_info_t * info)里面的打印信息,这部分将在u-boot启动的时候显示。
d.然后修改函数flash_init(void)里面对一些变量的赋值。
e.最后修改的是函数flash_print_info(flash_info_t * info)里面实际打印的函数信息。
f.还有一个函数需要修改,就是:“flash_erase”,这个函数要检测先前知道的flash类型是否匹配,否则,直接就返回了。
把这里给注释掉。
(7)、接下来看看SDRAM的修改。
这个里面对于“SIZE”的定义都是基于字节计算的。
只要修改”./include/configs/at91rm9200dk.h”里面的“#define PHYS_SDRAM_SIZE 0X200000”就可以了。
注意,SIZE是以字节为单位的。
(8)、还有一个地方要注意就是按照目前的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 -> 21F16B10,这恰好是SDRAM的高端部分。
另外,BSS为21F1AE34。
(9)、编译后,可以写入flash了。
a.压缩这个u-boot.bin“gzip –c u-boot.bin > u-boot.gz”压缩后的文件大小为:43Kbytesb.接着把boot.bin和u-boot.gz烧到flash里面去。
Boot.bin大约11kBytes,在flash的0x1000 0000 ~ 0x1000 3fff5 U-Boot移植过程①获得发布的最新版本U-Boot源码,与Linux内核源码类似,也是bzip2的压缩格式。
可从U-Boot的官方网站/projects/U-Boot上获得;②阅读相关文档,主要是U-Boot源码根目录下的README文档和U-Boot官方网站的DULG(The DENX U-Boot and Linux Guide)文档http://www.denx.de/twiki/bin/view/DULG/Manual。
尤其是DULG文档,从如何安装建立交叉开发环境和解决U-Boot移植中常见问题都一一给出详尽的说明;③订阅U-Boot用户邮件列表/lists/listinfo/u-boot-users。
在移植U-Boot过程中遇有问题,在参考相关文档和搜索U-Boot-User邮件档案库/mailarchive/forum.php?forum_id=12898仍不能解决的情况下,第一时间提交所遇到的这些问题,众多热心的U-Boot开发人员会乐于迅速排查问题,而且很有可能,W.D本人会直接参与指导;④在建立的开发环境下进行移植工作。
绝大多数的开发环境是交叉开发环境。
在这方面,DENX 和MontaVista均提供了完整的开发工具集;⑤在目标板与开发主机间接入硬件调试器。
这是进行U-Boot移植应当具备且非常关键的调试工具。
因为在整个U-Boot的移植工作中,尤其是初始阶段,硬件调试器是我们了解目标板真实运行状态的唯一途径。
在这方面,W.D本人和众多嵌入式开发人员倾向于使用BDI2000。
一方面,其价格不如ICE调试器昂贵,同时其可靠性高,功能强大,完全能胜任移植和调试U-Boot。
另外,网上也有不少关于BDI2000调试方面的参考文档。
⑥如果在参考开发板上移植U-Boot,可能需要移除目标板上已有的BOOT LOADER。
可以根据板上BOOT LOADER的说明文档,先着手解决在移除当前BOOT LOADER的情况下,如何进行恢复。
以便今后在需要场合能重新装入原先的BOOT LOADER。
6. U-Boot移植方法当前,对于U-Boot的移植方法,大致分为两种。
一种是先用BDI2000创建目标板初始运行环境,将U- Boot镜像文件u-boot.bin下载到目标板RAM中的指定位置,然后,用BDI2000进行跟踪调试。
其好处是不用将U-Boot镜像文件烧写到FLASH中去。
但弊端在于对移植开发人员的移植调试技能要求较高,BDI2000的配置文件较为复杂。
另外一种方法是用BDI2000先将U-Boot 镜像文件烧写到FLASH中去,然后利用GDB和BDI2000进行调试。