发表于:2010/6/1 14:54:49
#0楼
Bootloader是高端嵌入式系统开发不可或缺的部分。它是在操作系统内核启动之前运行的一段小程序。通过这段小程序,我们可以初始
化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。现在
主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正
。
首先说一下什么是Uboot:
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内核引导;
好,基础知识了解了,就可以进行Uboot下载了。
主机环境:虚拟机V6.5/ redhat9.0
移植平台:飞凌ARM9 FL2440开发板
Uboot 版本:1.3.4
交叉编译器:arm-linux-gcc-3.3.2
烧录工具: H-JTAG
1:烧写uboot.bin
a:开发板链接好串口线,以及jtag 线。打开h-jtag 软件,检测cpu:
图1
图2
点击check,检测flash
图3
B:点击program,当显示successful 即烧写成功
C:开发板重新上电会有如下输出:
图4
此时可以使用一些uboot 常用命令,如setenv、printenv、tftp setenv、nand read/write 等。
注:第一下次启动的时候会出现警告关于bad crc,只要保存了环境变量就不会处警告了
d:配置虚拟机的tftp
一般默认情况是没有安装tftp 的,安装包位于安装包中,一般在第三张
光盘中“tftp-0.32-4.i386.rpm”、”tftp-server-0.32-4.i386.rpm”将这两个包拷贝到虚拟机上,安装命令如下:
#rpm -ivh tftp-server-0.32-4.i386.rpm
#rpm -ivh tftp-0.32-4.i386.rpm (这个包是客户端登陆tftp 服务器所需要的)
安装完毕之后进入/etc 下,打开tftp 服务的配置文件并进行修改:
#emacs xinedt.d/tftp
将该文件修改成如下:
service tftp
{ socket_type =dgram
protocol =udp
wait=yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/work/tftpboot –c //可以换成
其他路径
disable =no
per_source =11
cps =100 2
flags =IPv4
}保存退出
然后重新开启tftp 服务
#service xinetd restart //这样,tftp-server 就启动了。
你可以用查询命令看tftp 服务是否开启
#netstat -a | grep tftp
显示结果为
udp 0 0 *:tftp *:*
表明服务已经开启
你可以登陆本机测试以下,命令如下:
#tftp your-ip-address
tftp>get
tftp>put
tftp>q
这样你就在linux 下建立了tftp 服务器,u-boot 可以直接登录到你的主机
上了,不用再切换到windows 下用tftpd32.exe 来建立服务器了。
e:下载linux 内核
首先要将linux 的内核zImage 转换成uboot 可以引导的格式。
将zImage 拷贝到xx/uboot-1.3.4/tools 下运行如下命令
#mkimage -n ‘linux-2.6.12′ -A arm -O linux -T kernel -C none -a 30008
000 -e 30008000 -d zImage zImage.img
然后将生成的zImage.img 拷贝到tftp 所指定的路径下
#cp zImage.img /home/work/tftpboot
修改uboot ip 信息
#setenv ipaddr 192.168.0.235 (开发板uboot IP)
# setenv serverip 192.168.0.245 (虚拟机IP)
#saveenv (保存环境变量)
在uboot 命令行上输入如下命令:
#tftp 0x30200000 zImage.img 该命令将内核从虚拟机下载到开发板内
存,0x30200000 起始为起始地址。
图5
图6
图7
此时用bootm 就可以测试一下引导内核
图8
f:文件系统
Yaffs 文件系统没有做到很好的支持,现在只能起网络文件系统
首先将光盘上的文件系统qte_yaffs.tar.bz2 解压到虚拟机
/home/work/tftpboot 文件夹下,作为开发板linux 的根目录。
开发板上设置启动网络文件系统的环境变量
#setenv bootargs init=/linuxrc root=/dev/nfs
nfsroot=192.168.0.245:/home/work/tftpboot/qte_yaffs
ip=192.168.0.235:192.168.0.245:192.168.0.201:255.255.255.0
console=ttySAC0 115200 display=sam320 (上面不是回车,是段落对齐引起的)
图9
设置从自启动linux 命令:
#setenv bootcmd nand read 0x30200000 0x500000 0x300000\;bootm
0x30200000
#saveenv (保存环境变量)
开发板断电重启,如下图:
图10
至此linux 系统就已经启动了
备注
1.将/u-boot-1.3.4/board/fl2440/config.mk文件的最后一行TEXT_BASE = 0x33f80000,修改为TEXT_BASE = 0x33f8000
2.本文部分内容来自百度百科及飞凌嵌入式技术专区:www.witech.com.cn。
化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。现在
主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正
。
首先说一下什么是Uboot:
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内核引导;
好,基础知识了解了,就可以进行Uboot下载了。
主机环境:虚拟机V6.5/ redhat9.0
移植平台:飞凌ARM9 FL2440开发板
Uboot 版本:1.3.4
交叉编译器:arm-linux-gcc-3.3.2
烧录工具: H-JTAG
1:烧写uboot.bin
a:开发板链接好串口线,以及jtag 线。打开h-jtag 软件,检测cpu:
图1
图2
点击check,检测flash
图3
B:点击program,当显示successful 即烧写成功
C:开发板重新上电会有如下输出:
图4
此时可以使用一些uboot 常用命令,如setenv、printenv、tftp setenv、nand read/write 等。
注:第一下次启动的时候会出现警告关于bad crc,只要保存了环境变量就不会处警告了
d:配置虚拟机的tftp
一般默认情况是没有安装tftp 的,安装包位于安装包中,一般在第三张
光盘中“tftp-0.32-4.i386.rpm”、”tftp-server-0.32-4.i386.rpm”将这两个包拷贝到虚拟机上,安装命令如下:
#rpm -ivh tftp-server-0.32-4.i386.rpm
#rpm -ivh tftp-0.32-4.i386.rpm (这个包是客户端登陆tftp 服务器所需要的)
安装完毕之后进入/etc 下,打开tftp 服务的配置文件并进行修改:
#emacs xinedt.d/tftp
将该文件修改成如下:
service tftp
{ socket_type =dgram
protocol =udp
wait=yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/work/tftpboot –c //可以换成
其他路径
disable =no
per_source =11
cps =100 2
flags =IPv4
}保存退出
然后重新开启tftp 服务
#service xinetd restart //这样,tftp-server 就启动了。
你可以用查询命令看tftp 服务是否开启
#netstat -a | grep tftp
显示结果为
udp 0 0 *:tftp *:*
表明服务已经开启
你可以登陆本机测试以下,命令如下:
#tftp your-ip-address
tftp>get
tftp>put
tftp>q
这样你就在linux 下建立了tftp 服务器,u-boot 可以直接登录到你的主机
上了,不用再切换到windows 下用tftpd32.exe 来建立服务器了。
e:下载linux 内核
首先要将linux 的内核zImage 转换成uboot 可以引导的格式。
将zImage 拷贝到xx/uboot-1.3.4/tools 下运行如下命令
#mkimage -n ‘linux-2.6.12′ -A arm -O linux -T kernel -C none -a 30008
000 -e 30008000 -d zImage zImage.img
然后将生成的zImage.img 拷贝到tftp 所指定的路径下
#cp zImage.img /home/work/tftpboot
修改uboot ip 信息
#setenv ipaddr 192.168.0.235 (开发板uboot IP)
# setenv serverip 192.168.0.245 (虚拟机IP)
#saveenv (保存环境变量)
在uboot 命令行上输入如下命令:
#tftp 0x30200000 zImage.img 该命令将内核从虚拟机下载到开发板内
存,0x30200000 起始为起始地址。
图5
图6
图7
此时用bootm 就可以测试一下引导内核
图8
f:文件系统
Yaffs 文件系统没有做到很好的支持,现在只能起网络文件系统
首先将光盘上的文件系统qte_yaffs.tar.bz2 解压到虚拟机
/home/work/tftpboot 文件夹下,作为开发板linux 的根目录。
开发板上设置启动网络文件系统的环境变量
#setenv bootargs init=/linuxrc root=/dev/nfs
nfsroot=192.168.0.245:/home/work/tftpboot/qte_yaffs
ip=192.168.0.235:192.168.0.245:192.168.0.201:255.255.255.0
console=ttySAC0 115200 display=sam320 (上面不是回车,是段落对齐引起的)
图9
设置从自启动linux 命令:
#setenv bootcmd nand read 0x30200000 0x500000 0x300000\;bootm
0x30200000
#saveenv (保存环境变量)
开发板断电重启,如下图:
图10
至此linux 系统就已经启动了
备注
1.将/u-boot-1.3.4/board/fl2440/config.mk文件的最后一行TEXT_BASE = 0x33f80000,修改为TEXT_BASE = 0x33f8000
2.本文部分内容来自百度百科及飞凌嵌入式技术专区:www.witech.com.cn。
企业精神
※ 注重信誉、敬业、务实、高质、高效
※ 以一流的技术,提供专业的服务
※ 为中国嵌入式技术的传播和发展作出贡献
※ 注重信誉、敬业、务实、高质、高效
※ 以一流的技术,提供专业的服务
※ 为中国嵌入式技术的传播和发展作出贡献