uboot移植心得

合集下载

在家陪学生心得体会8篇

在家陪学生心得体会8篇

在家陪学生心得体会8篇(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如个人总结、工作计划、心得体会、演讲致辞、应急预案、规章制度、策划方案、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays for everyone, such as personal summaries, work plans, insights, speeches, emergency plans, rules and regulations, planning plans, teaching materials, complete essays, and other sample essays. If you want to learn about different sample formats and writing methods, please pay attention!在家陪学生心得体会8篇不少人在进行了心得体会的书写后会发现自己的表达能力有所提升,写心得体会的时候小伙伴们需要端正写作态度,将自己的观点做好深刻的表达,下面是本店铺为您分享的在家陪学生心得体会8篇,感谢您的参阅。

uboot移植与源码分析总结(6)-Nand驱动

uboot移植与源码分析总结(6)-Nand驱动

uboot移植与源码分析总结(6)-Nand驱动uboot移植与源码分析总结(6)-Nand驱动2013-06-29 11:32:17分享:有关nand flash的特性描述,可以见我之前写的这篇文章《NandFlash结构与分析》。

从功能上来说,nand flash与norflash 并无太大差异,主要区别在于操作接口和方式。

Nand基于非sram总线接口,使用nand接口,所以一般需要mcu具有nand控制器才可与其连接。

在读取时,以页为单位;擦除和写入时,以块为单位。

将nand视作一个MTD设备uboot将nand视作一个mtd设备,所以使用mtd机制对nand 设备进行管理。

单个nand设备用nand_info_t来描述。

而nand_info_t实际上就是mtd结构。

最多支持的nand设备数CONFIG_SYS_MAX_NAND_DEVICE可由开发者自行配置。

不过一般目标板上只有一块Nand设备,所以取值通常为1。

但是仅使用mtd结构来描述不够,因为MTD只是一个通用的存储描述结构,而Nand设备特定的某些属性,如ECC布局等不能简单的添加到mtd结构中。

所以,uboot定义了nand_chip结构。

int (*verify_buf)(struct mtd_info *mtd, const uint8_t *buf, int len);void (*select_chip)(struct mtd_info *mtd, int chip);int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip);int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);int (*init_size)(struct mtd_info *mtd, struct nand_chip *this, u8 *id_data);int (*dev_ready)(struct mtd_info *mtd);void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column,int page_addr);int(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this);void (*erase_cmd)(struct mtd_info *mtd, int page);int (*scan_bbt)(struct mtd_info *mtd);int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state,int status, int page);int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,const uint8_t *buf, int page, int cached, int raw);int chip_delay;unsigned int options;int page_shift;int phys_erase_shift;int bbt_erase_shift;int chip_shift;int numchips;uint64_t chipsize;然后,分配了CONFIG_SYS_MAX_NAND_DEVICE个nand_chip 结构。

P1010rdb新单板u-boot移植过程总结

P1010rdb新单板u-boot移植过程总结

新单板P1010rdb的u-boot移植讲解一、yocto project的建立1.搭建linux环境,ubuntu 12.042.QorIQ SDK 1.7 Documentation(1)SDK 简介参考freescale的网站/infocenter/index.jsp?topic=%2FQORIQSDK%2F2880375.ht ml(2)安装SDK1.Mount the ISO on your machine:$ sudo mount -o loop QorIQ-SDK-<version>-<target>-<yyyymmdd>-yocto.iso /mnt/cdrom2.As a non-root user, install Yocto Project:$ /mnt/cdrom/install3.When you are prompted to input the install path, ensure that the current user has thecorrect permission for the install path.(3)配置sdk的环境1、$ cd <yocto_install_path>2、$ ./scripts/host-prepare.sh3、安装python-2.7.6, export PATH=/opt/python-2.7.6/bin:$PATH4、建立p1010rdb的开发环境:$ source ./fsl-setup-poky -m p1010rdb将生产build_p1010rdb_release的目录,用于p1010rdb相关的开发,包括u-boot, kernel,rootfs等(4)编译工具链1、$ cd <yocto_install_path>/build_p1010rdb_release/、$ bitbake fsl-toolchain(5)编译u-boot1、获取u-boot源码$ bitbake -c patch u-boot2、修改u-boot代码,u-boot代码放在<S>路径下,<S>获取的方法$ bitbake -e <package-name> | grep ^S= to get value of <S>.3、修改编译u-boot的配置文件meta-fsl-ppc/conf/machine/p1010rdb.conf主要是UBOOT_MACHINES = "P1023RDB"的宏变量,这个变量的值决定了编译出来的u-boot的值。

嵌入式学习心得体会(精选8篇)

嵌入式学习心得体会(精选8篇)

嵌入式学习心得体会(精选8篇)嵌入式学习心得体会篇1(4622字)从实习到现在搞嵌入式开发快一年了,蓦然回首好像一年过得挺快,挺顺利的。

细细品味,发现这一年还是有很多值得回忆和总结的东西。

至少这一年看书挺多,大概二十几本,当然和那些一年看一百多本书的人没法比,但是我已经超越了自己。

这是我大学毕业的第一年,初次走上社会,很想一展身手,可是.....其实也不用可是了,和很多朋友一样碰了很多钉子,现在我和老板的关系就挺一般的,只是我性格还不错。

呵呵~~,做优秀员工看来还得慢慢学。

今年最大的收获就是做了一个半项目,是在uClinux下面跑的。

半个是SNMP-Agent的实现,因为我去的时候snmpd已经跑起来了,我只是实现部分管理功能;一个是基于Web的管理系统,使公司的主打产品微波通信设备上网。

这个项目是我一手策划,一手实现(界面设计是一位女同事,很优秀的程序员),从中学到的东西也最多,感情不可谓不深。

SNMP即简单网络管理协议,其实一点都不简单。

在我所知的网络协议里面,它仅仅比OSI的CMIP简单一点,而CMIP直到现在还没得到广泛应用。

我们能够实现SNMP-Agent不能不感谢CarnegieMellon大学免费发布的ucd-snmp软件包。

它使得开发人员专注于实现对特定设备的管理功能。

我在项目中的工作主要是扩展MIB,实现相应的管理功能以及网络功能的扩展。

我们公司的MIB库比较庞大,但是程序运行还是挺快的。

因为ucd-snmp软件包中大量使用回调函数,而且它将MIB树以二叉树形式表示,但是每个结点不是单个的MIB结点,而是一个表,包括了多个结点。

回调函数和两层表示法的使用是操作快速的主要因素。

基于Web的管理系统我原本是打算在设备外实现SNMP-Manager 的功能,因为设备中已经嵌入了Agent。

这样管理人员可以在世界各地通过WWW登录公司的管理平台,实现对所有设备的管理。

但是老板想在设备中嵌入一个管理系统,可以通过www管理单个设备就行。

uboot——官网下载直接移植(一)

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;。

嵌入式实验心得体会

嵌入式实验心得体会

嵌入式实验心得体会学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,很多的概念都比较模糊,等到学期完毕开始做嵌入式课程设计时,真是茫然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字“急”。

最后实在没有方法,逼着自己去学习,查资料,总算对嵌入式有了浅层理解。

嵌入式系统本身是一个相对模糊的定义,一个手持的MP3和一个PC104的微型工业控制计算机都可以认为是嵌入式系统。

总体来说,嵌入式系统是“用于控制,监视或者辅助操作机器和设备的装备”。

一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。

内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进展会话。

内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。

应用程序依靠驱动内核来完成特定的任务。

在了解了根底知识之后,我开始进展上机操作,当然,其中遇到很多的难题,很多东西都是第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。

其中的困难可想而知。

然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。

可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。

它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。

”没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的缺乏,继而去排除解决问题,这就是一个自我学习的过程。

当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。

当然,在这其中,我也发现自己的许多缺乏之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。

u-bootUBIFS移植及文件系统烧写

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 文件中进行配置。

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。

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移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。

参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。

U-BOOT的两个阶段启动过程:(2010.06经典版来说)第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。

主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码1、关闭开门狗,屏蔽所有中断2、设置分频比3、bl cpu_init_crit() 关MMU,初始化内存bl lowlevel_init() 配置内存,修改内存刷新率参数等4、relocate判断当前代码是在NORFLASH还是RAMcopy_loop循环将FLASH代码复制至RAM中5、stack_setup栈设置clear_bss_bss_start到_bss_end之间的数据清06、ldr pc , start_armboot 跳转到第二阶段//=====================================================================第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。

主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数二阶段start_armboot分为board_init_f 和 board_init_r两部分先执行的board_init_f部分:1、为gd数据结构分配地址,并清零2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下board_early_init_f ,timer_init ,env_init init_baudrate serial_initconsole_init_f display_banner dram_init3、A、分配SDRAM高64KB为TLB,用于U-BOOTB、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段(这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量)C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)后执行的board_init_r部分:1、对gd , bd 数据结构赋值初始化2、各种外设初始化:初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH初始化环境变量初始化PCI设置IP地址初始化各类外设:IIC、LCD、键盘、USB初始化控制台建立IRQ中断堆栈初始化以太网初始化跳转表(定义了U-Boot中基本的常用函数库)。

这不算外设3、一个死循环执行 main_loop()函数/**********************************两个版本的U-BOOT启动对比:************************************/其实在总体上都差不多,只不过相对于经典版(2010.06版),新版之后都变恶心了主要有这样的区别:1、原版本第一阶段的第5步栈设置被放到第4步relorate前(这个没什么)2、原版第二阶段的board_init_f被放到第一阶段第4步relorate前,就是说执行完stack_setup栈设置后变进入了第二阶段的部分初始化,然后通过4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)又返回来第一阶段。

感觉新版改后很乱,很没条理(开源的每年改,就是烦呀,哈哈)//=================================================以下列出两个阶段可能要用到的函数的路径,方便以后找:(按2011.06版本)一阶段:lowlevel_init函数,它是在board/samsung/smdk2410目录下的lowlevel_init.s文件中定义二阶段:gd是一个保存在ARM的r8寄存器中的gd_t结构体的指针,它是在/include/asm目录下的global_data.h文件内被定义的bd结构体的数据原型为bd_t数据结构,它表示的是“板级信息”结构体,它是在/include/asm目录下的u-boot.h文件中定义的。

init_fnc_ptr函数指针数组中的各个初始化函数:board_early_init_f函数在board/samsung/smdk2410目录下的smdk2410.c文件内timer_init函数在arch/arm/cpu/arm920t/s3c24x0目录下的timer.c文件内env_init函数在common目录下的env_flash.c文件内init_baudrate函数在arch/arm/lib目录下的board.c文件内serial_init函数在drivers/serial目录下的serial_s3c24x0.c文件内,在include/configs/smdk2410.h中定义了CONFIG_S3C24X0_SERIALconsole_init_f函数在common目录下的console.c文件内display_banner函数在arch/arm/lib目录下的board.c文件内dram_init函数在board/samsung/smdk2410目录下的smdk2410.c文件内各种外设的初始化:flash_init函数是在drivers/mtd目录下的cfi_flash.c文件内(因为include/configs/smdk2410.h中定义了CONFIG_FLASH_CFI_DRIVER)nand_init函数是在divers/mtd/nand目录下的nand.c文件内定义的env_relocate函数是在common目录下的env_common.c文件中定义的stdio_init ()在common目录下的stdio.c文件中定义的jumptable_init ()在common目录下的exports.c文件中定义的console_init_r ()是在common目录下的console.c文件中定义的interrupt_init ()enable_interrupts ()都是在arch/arm/lib目录下的interrupts.c 文件中定义eth_initialize()函数是在net目录下的eth.c文件的第209行至第298行定义的main_loop()在common目录下的main.c文件内定义的//===================================================================天嵌与自己移植的U-BOOT的差别分析和领悟先列出天嵌公司里研发人员写的和我们自己移植(小移植)的最大不同:对比了一下,发现最大的不同在于common/main.c文件中,即在两阶段启动过程基本一样不同点:(行数按天嵌版本的)abortboot()函数(在main_loop()中被调用)Ln239: printf ( “ Press Space key to Download Mode ! ” ) ;Ln303 :在检测是否 a key press 时,加入了显示LOGO程序:embedsky_tq_logo(); main_loop()函数Ln 381: LCD初始化程序Ln481 :分支选择下载OR 加载模式:if ( BootFrmNORFLASH())run_command (“menu”,0 );else{Printf (“ Booting Linux \n ”);run_command (“boot_zImage”,0 );}解析一下:前面几点都是关于LCD和LOGO显示的不多说(因为自己移植是没弄到LCD的移植)说一下main_loop()函数中Ln481 :分支选择下载OR 加载模式首先,run_command 这个是执行命令函数,一看名字就知道,也是在/common/main.c中定义的说说最重要的“menu”和“boot_zImage”吧1、 If从NORFLASH进行启动,则为下载模式,则执行menu()这个函数,在/common/cmd_menu.c中定义打开cmd_menu.c文件会发现,里面都是一些串口选项列表,我们打开2440电源发现的下载列表都是从main_menu_usage()函数中打印出来的,而选择的项又通过menu_shell()通过控制台执行各种我们的选项,每个选项的如何执行过程都列得很清楚,感觉就像跑裸机时,自己按照fzb的串口控制台弄出来一样2、Else 从NANDFLASH进行启动,则为加载模式,进行LINUX系统的配置和启动。

在lib_arm /boot_zImage.c 文件:里的boot_zImage( )函数函数执行的内容大概如下:1、copy kernel image2、setup linux parameters3、get machine type4、GO -> call-linux对比后的一些感悟:虽说自己也跟着移植过U-BOOT,也能建立自己的板级支持包,能实现基本的串口控制台,NAND OR NOR FLASH,DM9000网络,JFFS2文件系统等基本功能,但比起天嵌这个,能下载和加载模式,还是有很多不足所以说,自己移植只是感觉其中的方法,领悟之后还是在天嵌的基础上再加进一步移植吧,感觉没必要从头到尾都自己搞一遍,方法懂了,框架熟悉了就好//===================================================================移植过程的一个简单举例:因为移植很多都是基于smdk2410来改的,首先要对2410和2440的区别有一定了解,再者就是自己在裸机上是编写过改外设的驱动的,这样移植起来就比较舒服,不会说什么都跟着做,感觉很虚,学不到东西。

就举让U-BOOT支持NANDFLASH的读写1、先是在总的宏定义头文件中加上你外设所需的宏定义总的宏定义路径为/include /configs / XX.h/ (最后这个.h文件一般是以板的名称命名)添加宏定义,如:#define CONFIG_NAND_BASE 0。

相关文档
最新文档