uboot移植步骤介绍
- 格式:doc
- 大小:76.00 KB
- 文档页数:12
移植u-boot-2011.03到S3C2440(utu2440)方法与步骤###1. 配置和初步编译摘要:在2011年的时候,本人把u-boot-2011.03成功移植到了S3C2440(utu2440开发板)上。
通过这次移植使自己对u-boot有了较深刻的理解并掌握了u-boot 的移植。
对于未移植过u-boot的人来说,可能觉得很神秘,甚至觉得很难。
实际上,从整个移植过程来看,并未想像中那么难。
如果你接触过嵌入式linux的开发,我觉得移植u-boot并不是难事,至少没想象中的难。
reille博客作为技术分享、技术交流的个人博客,把自己移植u-boot-2011.03的过程、遇到的问题及解决方法作为一个系列专题分享出来。
希望对正在移植u-boot的人有用。
本节主要介绍u-boot-2011.03的配置和初步编译。
开发环境:主机:Window XP SP2;linux:VMware7.01+ubuntu9.10;目标板:扬创utu2440-F开发板交叉编译器:arm-linux-gcc4.3.2(一开始用的是编译内核的版本arm-linux-gcc3.4.1,但出现了软浮点问题,于是换成了现在用的版本,当然本人编译内核的时候还是用3.4.1版本)。
1. 下载uboot源码:u-boot-2011.03本来想移植最新版本u-boot-2011.06,但见其还在修改中,故改为移植u-boot-2011.03,其源码可从如下地址中下载:ftp://ftp.denx.de/pub/u-boot/ 2. 裁减和配置2.1 裁减:1). 删除u-boot-2011.03/arch目录下除arm目录外的所有目录;2). 删除u-boot-2011.03/arch/arm/cpu目录下除arm920tmulu外的所有目录;3). 删除u-boot-2011.03/arch/arch/arm/cpu/arm920t目录下除s3c24x0目录外的所有目录,注:文件不要删;4). 删除u-boot-2011.03/arch/arm/include/asm目录下除arch-s3c24x0目录外的所有arch-xxxx目录,注:文件不要删;5). 删除u-boot-2011.03/board目录下除samsung目录外的所有目录;6). 删除u-boot-2011.03/board/samsung目录下除smdk2410目录外的所有目录;7). 删除u-boot-2011.03/include/configs目录下除smdk2410.h文件外的所有头文件。
路由器编程器固件ubnt的uboot提取和嫁接的方法路由器的第三方固件有很多种,其中有一种是ubnt固件。
在编程器使用过程中,很多固件的uboot的大小是128kb,(比如openwrt)但是ubnt的是256kb.256换算成字节是1024*256=262144.所以要截取ubnt的uboot就要截取ubnt固件的前262144字节,换算成16进制是40000.注意了,如果你截取40000就错了,应该是截取262143,换算成16进制是3ffff.具体方法如图,打开winhex然后点编辑,再点定义段,这里填写3ffff,意思是选择3ffff之前所有的内容。
点确定,被选的uboot部分就被涂上深色。
然后再点编辑,点复制快,点到新文件,就保存好了。
同样,如果想把提取的uboot嫁接到另一个固件上,也可以用winhex。
首先,将一个有uboot的固件的uboot删除,方法是在定义块以后,点击编辑,再点移除。
这样uboot就没有了。
此时不要关闭这个没有uboot的固件。
同时打开你提取的uboot文件,点击编辑,再点击全选,再点击复制块,再点击正常。
下一步,点开没有uboot的固件,确保光标停留在第一个字节,也就是文件的开始位置。
点击编辑,点击剪贴板数据,点击黏贴。
这样就将uboot嫁接到了另一个固件上。
很多cfe或者其他路由器里在dd或tt下备份的cfe都直接刷. ...基本都是直接刷.2.全直接刷.[还没见过jtag备份cfe,jtag的备份的固件不能刷,但好像没见有单独放的cfe]ttl或网页,编程器(编程器一般备份的是全固件的)都能直接刷3.编程器先清空flash 然后查空,如果查空提示非全空的话要么芯片坏了要么没焊接好.全空的话就读入cfe或固件然后编程.编程后半段会自动校验数据是否正确,如果没校验自己手动点校验;校验正常就可以焊接到路由了.一般编程器备份固件是整个flash芯片备份的,也就是cfe带固件一起的.。
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;。
u-bootUBIFS移植及文件系统烧写imx515 uboot UBIFS移植及android UBIFS文件系统烧写作者:longfeey1.1 Uboot UBI的移植关于uboot的UBI的移植几乎没有说明介绍,移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI。
刚开始的时候我也没有什么头绪,只能够从uboot的readme开始查找一些蛛丝马迹。
- MTD Support (mtdparts command, UBI support)CONFIG_MTD_DEVICEAdds the MTD device infrastructure from the Linux kernel.Needed for mtdparts command support.CONFIG_MTD_PARTITIONSAdds the MTD partitioning infrastructure from the Linuxkernel. Needed for UBI support.因此,要UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。
要移植UBI还要添加:#define CONFIG_CMD_UBIFS#define CONFIG_CMD_UBI总的关于UBI的部分是以下几个宏:#define CONFIG_CMD_UBI#define CONFIG_CMD_UBIFS#define CONFIG_CMD_MTDPARTS#define CONFIG_MTD_DEVICE#define CONFIG_MTD_PARTITIONS#define CONFIG_RBTREE#define CONFIG_LZO同时要给NAND建立个默认的分区,方便以后操作。
分区如下:#define MTDIDS_DEFAULT "nand0=nand0"#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootf s),-(reserved)"#define MTD_ACTIVE_PART "nand0,2"以上的配置都在uboot_imx/include/configs/mx51_vdphone.h 文件中进行配置。
这是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外其他文件夹删除掉。
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.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,则表示添加成功。
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读操作前面在调试时把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!成功!。
基于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 等操作系统的引导。
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移植操作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进行优化和定制。
可以修改配置文件、增加功能模块或者修改代码,以达到更好的性能和适应特定需求的目的。
[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,用它来编译,没有问题。
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内核移植和裁剪详细步骤-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配置编译一 、开发环境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文件为对应开发板的配置文件。
uboot移植过程1.修改Makefile首先给要建立的S3C2410开发板取名为TE2410, 移植uboot时以smdk2410为模板,修改Makefile#tar xvjf u-boot-1.1.3.tar.bz2#cd u-boot-1.1.3#vi Makefilescb9328_config : unconfig@./mkconfig $(@:_config=) arm arm920t scb9328 NULL imxsmdk2400_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk2400 NULL s3c24x0smdk2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0SX1_config : unconfig@./mkconfig $(@:_config=) arm arm925t sx1te2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0蓝色字体是添加的内容。
其中,te2410_config : unconfig意思是为TE2410建立一个编译项,@./mkconfig $(@:_config=) arm arm920t te2410 NULL s3c24x0中的arm表示CPU的架构是基于ARM体系结构的;arm920t表示CPU类型是arm920t;te2410是开发板的型号;NULL表示开发商或经销商的名称为空;s3c24x0表示是基于s3c24x0的片上系统。
2.在uboot的board目录下建立te2410开发板子目录#cp –fr board/smdk2410 /board/te2410#cd board/te2410#mv smdk2410.c te2410.c还要修改board/te2410/Makefile文件,OBJS := smdk2410.o flash.o -------- OBJS := te2410.o flash.o3.在include/configs目录下建立te2410.h头文件#cd include/configs#cp –fr smdk2410.h te2410.h4.指定交叉编译器的路径选择支持softfloatpoint的交叉编译器,在etc/bashrc文件中添加一行exportPATH=/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linu x-gnu/bin:$PATH其中,/home/newdisk/toolchain/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu /bin是交叉编译器路径修改Makefile中的交叉编译器ifeq ($(ARCH),arm)CROSS_COMPILE = arm-softfloat-linux-gnu-Endif5.测试编译#cd u-boot-1.1.3#make te2410_config#make如果编译正确,将会在u-boot-1.1.3目录下生成u-boot、u-boot.bin、u-boot.srec 三个文件,其中u-boot是ELF格式二进制的image文件,u-boot.bin是原始的二进制image文件,u-boot.srec是Motorola S-Record格式的image文件。
接下来的工作就是根据开发板的硬件配置来修改。
6.修改start.S文件首先在ldr pc, _start_armboot一行之前添加如下代码,将程序从Flash复制到DRAM中运行#ifdef CONFIG_S3C2410_NAND_BOOTbl copy_myself@jump to ramldr r1, =on_the_ramadd pc, r1, #0nopnop1:b 1b @infinite loopon_the_ram:#endif然后在_start_armboot: .word start_armboot一行之后添加下面内容#ifdef CONFIG_S3C2410_NAND_BOOTcopy_myself:mov r10, lr@reset NANDmov r1, #NAND_CTL_BASEldr r2, =0xF830 @initial valuestr r2, [r1, #oNFCONF]ldr r2, [r1, #oNFCONF]bic r2, r2, #0x800 @enable chipstr r2, [r1, #oNFCONF]mov r2, #0xFF @reset commandstrb r2, [r1, #oNFCMD]mov r3, #0 @wait1:add r3, r3, #0x1cmp r3, #0xablt 1b2:ldr r2, [r1,#oNFSTAT] @wait readytst r2, #0x01beq 2bldr r2, [r1, #oNFCONF]orr r2, r2, #0x800 @disable chipstr r2, [r1, #oNFCONF]@get ready to call C functions(for nand_read())ldr sp, DW_STACK_START @setup stack pointermov fp, #0 @no previous frame,so fp=0@copy uboot to ramldr r0, =UBOOT_RAM_BASEmov r1, #0mov r2, #0x30000bl nand_read_lltst r0, #0x0beq ok_nand_read#ifdef CONFIG_DEBUG_LLbad_nand_read:ldr r0, STR_FAILldr r1, SerBasebl PrintWord1:b 1b @infinite loop#endifok_nand_read:#ifdef CONFIG_DEBUG_LLldr r0, STR_OKldr r1, SerBasebl PrintWord#endif@verifym ov r0, #0l dr r1, =UBOOT_RAM_BASEm ov r2, #0x400go_next:l dr r3, [r0], #4l dr r4, [r1], #4t eq r3, r4b ne notmatchs ubs r2, r2, #4b eq done_nand_readb ne go_nextnotmatch:#ifdef CONFIG_DEBUG_LL ldr r0, STR_FAILldr r1, SerBasebl PrintWord#endif1: b 1bdone_nand_read:#ifdef CONFIG_DEBUG_LL ldr r0, STR_OKldr r1, SerBasebl PrintWord#endifm ov pc, r10@ clear memory@ r0:start address@ r1:lengthmem_clear:mov r2, #0mov r3, r2mov r4, r2mov r5, r2mov r6, r2mov r7, r2mov r8, r2mov r9, r2clear_loop:stmia r0!,{r2-r9}subs r1, r1, #(8*4)bne clear_loopmov pc, lr#endif /*CONFIG_S3C2410_NAND_BOOT*/在start.S文件最后添加下面几行的内容,用于定义栈地址变量#ifdef CONFIG_S3C2410_NAND_BOOT.align 2DW_STACK_START:.word STACK_BASE+STACK_SIZE-4#endif7.添加nand_read.c和nandflash.h源文件在start.S中调用了nand_read_ll函数,该函数用于NAND Flash读操作,在board/te2410目录下新建nand_read.c源文件,文件内容如下:#include<config.h>#define __REGb(x) (*(volatile unsigned char *)(x))#define __REGi(x) (*(volatile unsigned int *)(x))#define NF_BASE 0x4e000000#define NFCONF __REGi(NF_BASE+0x0)#define NFCMD __REGb(NF_BASE+0x4)#define NFADDR __REGb(NF_BASE+0x8)#define NFDATA __REGb(NF_BASE+0xc)#define NFSTAT __REGb(NF_BASE+0x10)#define BUSY 1inline void wait_idle(void){int i;while(!(NFSTAT & BUSY))for(i=0;i<10;i++);}#define NAND_SECTOR_SIZE 512#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE-1)/*low level nand read function*/int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) {int i,j;if ((start_addr & NAND_BLOCK_MASK)||(size & NAND_BLOCK_MASK)){return -1; /*invalid alignment*/}/*chip enable*/NFCONF &= ~0x800;for(i=0; i<10; i++);for(i=start_addr; i<(start_addr+size);){/*Read0*/NFCMD = 0;/*Write Address*/NFADDR = i& 0xFF;NFADDR = (i>>9) & 0xFF;NFADDR = (i>>17) & 0xFF;NFADDR = (i>>25) & 0xFF;wait_idle();for(j=0; j<NAND_SECTOR_SIZE; j++, i++){*buf = (NFDATA & 0xFF);buf++;}}/*chip disable*/NFCONF |= 0x800;return 0;}修改board/te2410目录下的Makefile文件OBJS := te2410.o flash.o 改为 OBJS := te2410.o flash.o nand_read.o 在board/te2410目录下添加nandflash.h文件,该文件主要定义了NAND Flash的一些芯片配置函数,代码如下:#include<s3c2410.h>#if (CONFIG_COMMANDS & CFG_CMD_NAND)typedef enum{NFCE_LOW,NFCE_HIGH}NFCE_STATE;static inline void NF_Conf(u16 conf ){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCONF = conf;}static inline void NF_Cmd(u8 cmd){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCMD = cmd;}static inline void NF_CmdW(u8 cmd){NF_Cmd(cmd);udelay(1);}static inline void NF_Addr(u8 addr){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFADDR = addr;}static inline void NF_SetCE(NFCE_STATE s){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();switch(s){case NFCE_LOW:nand->NFCONF &= ~(1<<11);break;case NFCE_HIGH:nand->NFCONF |= (1<<11);break;}}static inline void NF_WaitRB(void){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();while( !(nand->NFSTAT & (1<<0)) );}static inline void NF_Write(u8 data){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFDATA = data;}static inline u8 NF_Read(void){S3C2410_NAND *const nand = S3C2410_GetBase_NAND();return (nand->NFDATA);}static inline void NF_Init_ECC(void){S3C2410_NAND * const nand = S3C2410_GetBase_NAND();nand->NFCONF |= (1<<12);}static inline u32 NF_Read_ECC(void){S3C2410_NAND *const nand = S3C2410_GetBase_NAND();return (nand->NFECC);}#endif8.修改te2410文件修改这个文件的目的有两个,一是初始化CPU相关的寄存器来支持USB主从设备,二是初始化NAND Flash设备。