一个嵌入式系统从软件角度来看分为三个层次:
- 引导加载程序:包括固化在固件(firmware)中的boot程序(可选)和Bootloader两大部分.
- Linux内核:特定的嵌入式平台的定制内核.
- 文件系统:包括了系统命令和应用程序.
一个同时装有Bootloader内核的启动参数,内核映像和根文件系统映像的固态存储设备:
Bootloader:操作系统运行之前的一段小程序.
移植:
- 不同的CPU体系结构都有不同的BOOTLOADER.
- 即使基于同一种CPU而构建的,但如果它们的硬件资源或配置不一样的,也不可取.(板级配置不同)
流程:Bootloader的启动可分为单阶段和多阶段.(大多采用两阶段)
两阶段:stage1:完成初始化硬件.(CPU,寄存器 and so on)
Uboot:一种bootlader.
- 支持多种嵌入式CPU.(MIPS,X86,ARM,XScale)
- 支持多种体统.(Linux,Vxworks,QNX)
目录结构:Board:和开发板有关的文件.
Uboot编译:
- 执行:make smdk2410_config
(例子) - 进行编译生成u-boot.bin:make CROSS_COMPILE=arm-linux-...
(arm-linux-....:路径)
常用命令:(Uboot 提供丰富的命令集,不同单板支持不一样)
1.help:可用于查看当前单板所支持命令.
2.printenv:查看环境变量.
3.setenv:添加,修改,删除环境变量.
4.saveenv:保存环境变量.
文件下载:tftp,串口下载.
下载例子:
tftp下载:
串口下载:
内存操作:
5.md:显示内存区的内容.
6.mm:修改内存,地址自动递增.
(如果想结束输入,则输入空格,然后回车)
7.flinfo :查看flash扇区信息.
8.protect :Flash写保护.
9.erase:擦除flash扇区.
(使用cp命令想Nor型flash写入数据之前必须先使用erase命令擦出flash,要为nor flash按字节写入时,无法写入1,所以必须通过擦出来写入1)
例子:erase
10.数据拷贝.
cp[ .b , .w , .l ]
例子:cp.b
将内存地址0x31000000处的数据(长度为0xd0000)拷贝到地址0x50000处.
执行程序:
11.go:执行内存中的二进制代码.
用法:go
12.bootm:执行内存中的二进制代码.
用法:bootm[addr[arg...]]
区别:
开发板信息:
13.bdinfo:显示开发板信息. (内存地址和大小,时钟频率,MAC地址 and so on)
自动启动:(小技巧)
设置自动启动:setenv bootcmd tftp 31000000 uImage \; bootm 31000000
U-boot
板级设备的配置文件位于:include/configs/<board_name>.h
(<board_name> 用相应的BOARD定义代替) 例子:smdk2410.h
移植的方法:分析U-boot已经支持的开发板,选择出硬件配置最接近的开发板.
步骤:
1. 在顶层Makefile的开发板添加新的配置选项.
smdk2410_config :
参考上面两行:添加:
mini2440_config :
arm:CPU架构.
arm920t :CPU类型, (对应cpu/arm920t目录)
mini2440 :开发板型号,(对应board/mini2440目录)
NULL :开发者.
s3c24x0 :片上系统.
2. 在board目录创建一个属于新开发板的目录.
mkdir -p board/mini2440
cp -rf board/smdk2410/*
3.未开发版添加新的配置文件,然后在修改(重点,主要)
cp include/configs/smdk2410.h
4.配置开发板.
make mini2440_config
5.编译U-Boot
make CROSS_COMPILE=arm-linux-....
6.烧写U-Boot.