基于ARM和Linux的嵌入式平台的构建
摘要: 首先介绍了嵌入式系统的概念, 及相关硬件平台和软件版本。然后, 主要介绍了嵌入式Linux 的引导程序U-Boot 的移植, 以及开源、免费操作系统Linux2.6.32.2 的移植。最后, 构建了基于Nand Flash 存储器的Yaffs2 文件系统,利用BusyBox 创建根文件系统。基于ARM 和嵌入式Linux 的嵌入式系统平台搭建基本完成,可以在此平台上添加更多驱动,以便更好地开发应用程序。
进入后PC 时代以来, 伴随着设计和制造技术的发展, 集成电路从当初的晶体管集成发展到现在的IP 集成, 即SoC(System ON Chip ) 设计技术。促使嵌入式系统渗透到了当今社会中的各个行业, 并且发挥越来越重要的作用。嵌入式系统一般可定义为以应用为中心、以计算机技术为基础、软硬件可裁剪、适用于应用系统且对功能、成本、体积、功耗有严格要求的专用计算机系统,它的主要特点是嵌入、应用。
随着各种嵌入式设备功能越来越强大, 在设备中使用嵌入式操作系统也成为必然。Linux 操作系统具有开放源代码、易于移植、资源丰富、免费等特点, 在嵌入式领域的地位越来越重要。嵌入式Linux 和PC 上的Linux是同一套内核代码, 只是裁剪的程度不一样, 所以, 很多在PC 上开发的软件, 经过交叉编译后可以直接在嵌入式设备上运行。本文主要涉及到Bootloader 移植和Linux-2.6.32.2 内核的移植、根文件系统移植、在S3C2440平台上构建完整的嵌入式开发平台三个方面。
1 交叉开发环境的建立
在进行嵌入式软件开发之前, 必须要在PC 上建立ARM 的交叉编译环境。交叉编译就是在PC 平台上生成可以在ARM 平台上运行的代码。其中主要包括ARM 的交叉编译器arm-elf-gcc 和交叉连接器arm-elf-ld 。本文采用的交叉编译器的版本是gcc -3.4.5 -glibc -2.3.6 。
交叉编译流程如图1 所示。
图1 嵌入式系统交叉编译流程
2 BootLoader 引导加载程序
BootLoader 是一段在系统上电时开始执行的程序,用以初始化硬件设备, 准备好软件环境, 设置好启动参数, 最后引导操作系统, 与PC 上的BIOS 程序相似。当前开放源码的Linux 引导程序主要有x86 架构的LILO、GRUB, 对于ARM 架构的主要有Vivi 和U-Boot 。本文使用U-Boot 作为引导程序。U-Boot(Universal Boot Loader) ,即通用的BootLoader , 遵循GPL 条款开放源代码。U-Boot相对于Vivi 功能更加强大, 也更方便后续程序的调试。
BootLoader 的启动一般分为两个阶段, 第一阶段的代码主要是用汇编语言编写, 主要的功能是完成硬件设备的初始化, 为加载第二阶段的代码准备RAM 空间, 设置好堆栈; 第二阶段主要用C 语言编写, 检测内存映射, 将内核映像和根文件系统从Nand Flash 读到RAM中, 为内核启动设置参数, 引导内核。
U-Boot 的源代码可以从ftp://ftp.denx.de/pub/u-boot/进行下载, 本文使用的U-Boot 版本是U-Boot2009.08 。
移植U-Boot 的关键步骤如下:
(1) 首先, 将include/configs 目录下的smdk2410.h 复制并改名为MINI2440.h , 根据U-Boot 的说明可以知道,如果要使用开发板board/board_name > , 则先执行“make board_nAME > ”_config 命令进行配置, 然后执行“make all ” , 生成可执行文件。所以, 修改U-Boot 顶层的Makefile 文件, 添加下面一行mini2440_config : unconfig@ $ (MKCONFIG) $ (@:_config = ) arm arm920t mini2440frank s3c24x0 。这里有几个重要的参数,arm 指CPU 的架构,arm920t 指CPU 的类型,s3c24x0 指CPU 的型号。这样就可以使用make mini2440_config 这条命令进行配置。
(2)本文使用的U-Boot 是从Nand Flash 启动的, CPU可以直接访问Nand Flash 中前4 KB 代码, 利用这4 KB代码把U-Boot 中绝大部分代码拷贝到内存中[ 3]。其中下面的代码就是调用C 语言中的Nand Flash 的读写函数, 该函数主要把Nand Flash 中4 KB 以后的代码复制到RAM 中。在编写nand_read_ll 的函数时, 注意参考Nand Flash 的数据手册, 对大页和小页的Nand Flash , 其读写的命令和时序是不同的。
@copy U-Boot to RAM
ldr r0,=teXT_BASE
mov r1,#0x0
mov r2,#0x60000
bl nand_read_ll
tST r0,#0x0
beq ok_nand_read
由于在后面加载Linux 内核和根文件系统时, 使用的是tftp 方式, 所以必须添加DM9000EP 网卡的驱动。在mini2440.h 文件中, 其主要的配置如下:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_NET_MULTI 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_DATA (CONFIG_
- 基于FPGA的异构可重配置DSP平台(01-14)
- 基于DSP的宽带雷达多片流水分段脉压处理平台设计(08-02)
- 基于MCU+DSP的运动控制硬件平台设计(10-01)
- 嵌入式系统硬件平台的软件PLC实现方法(04-12)
- 革新2410D开发板试用手记(04-21)
- 基于DSP的通用型嵌入式语音平台的硬件设计(03-27)