嵌入式Linux在S3C2440上的移植

2022-09-11

嵌入式系统在各个领域中的应用越来越广泛, S3C2440是三星公司推出的一款基于ARM920T的嵌入式通用处理器。将Linux移植到基于S3C2440处理器的目标板上, 是进行驱动程序和应用程序开发的前提和基础。S3C2440为用户提供了数码相机接口 (camera接口) TFT&STN LCD显示器支持SD/MMC/SDIO, USB设备支持, 触摸屏接口等强大的硬件接口功能[1]。本文所采用的2 4 4 0开发板主要由以下几个部分组成S3C 2 4 4 0处理器芯片、存储器 (包括一片64MB的SDRAM以及2 MB、64MB的NOR Flash和Nand Flash各一片、以太网控制器CS8900、RS232接口、JTAG调试口以及电源复位、LCD接口等电路。

1 嵌入式交叉开发环境的建立

交叉编译工具链是为了在一个平台体系结构下 (如X86PC机) 能编译, 链接, 处理和调试另一个平台体系结构下 (如ARM) 的程序, 使得编译生成的程序能够在另一平台下运行。Linux常用的使用的工具链软件是:binutils, gcc, glibc, gdb。通常构建交叉工具链有3种方法:分步编译和安装交叉编译工具链所需要的库和源代码、通过Crosstool脚本工具实现一次编译生成交叉编译工具链或者直接下载已经制作好的交叉编译工具链。

Crosstool是一组脚本工具集, 可构建和测试不同版本的gcc和glibc。本文采用cross0.43在Red Hat9.0下制作了基于gcc4.1.1和glibc-2.3.2的工具链[2]。

2 U-boot的移植

Boot Loader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序, 我们可以初始化硬件设备、建立内存空间的映射图, 从而将系统的软硬件环境带到一个合适的状态, 以便为最终调用操作系统内核准备好正确的环境。

U-boot是最为常见的Bootloader, 它主要完成了系统环境的初始化, 将后期执行代码复制到SDRAM空间, 为Linux内核的运行准备好条件。在此, 选用的是U-boot1.3.2来做移植。

2.1 建立板级支持包

将u-boot-1.3.2.tar.bz2复制到工作目录下, 解压源码包。进入解压后的U-Boot目录, 在board目录下, 为我们的开发板建立一个目录, 名字叫做hgsm2440, 并创建相应的文件:

cp-arf smdk 2410/*hgsm 2 4 40/

上面我们是把smdk2410目录下的所有文件都拷贝到了我们的hgsm2440目录下, 因为2440开发板和smdk2410开发板的配置差不多。

在include/configs/中, 每个开发板都有一个自己的配置文件, 我们需要为我们的开发板建立自己的配置文件。可以直接从smdk2410开发板的配置文件中修改而来。因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:

#cp include/configs/smdk 2 4 1 0.hinclude/configs/up2 4 1 0.h

然后, 修改Makefile, 使得可以配置我们的开发板, 在Makefile中的2047行后添加下面两行:

这样, 我们自己的板级支持包就建好了。

2.2 添加代码, 支持从Nand Flash启动

由于S3C2410与S3C2440的中断定义以及时钟设置有所区别, 需要对位于cpu/arm920t/目录下的start.S文件按照S3C2440数据手册对中断禁止和时钟设置做简单的修改, 并增加增加针对S3C2440的宏定义CONFIG_S3C2440[3]。

而U-Boot默认不支持从Nand Flash启动, 所以需要我们自己添加代码来实现从Nand Flash启动。主要步骤如下:修改start.S文件。在start.S中添加copy_myself子程序, copy_myself子程序的功能就是把U-Boot自身的代码从Nand Flash拷贝到SDRAM中;添加board/hgsm2410/nand.c文件, 实现nand_read_whole子程序。在copymysel这段程序中, 我们调用了nand_read_whole子程序。这个程序是在启动时, 把U-Boot自身的代码从Nand Flash拷贝到SDRAM中执行的读取函数;修改hgsm 2 4 4 0.h文件。include/configs/hgsm 2 4 4 0.h是开发板的配置文件, 关于nand.c中用到的一些操作Nand Flash的宏, 都放进hgsm2440.h中;在include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入开发板Nand Flash的具体物理参数, 主要Nand Flash的页大小pagesize, 芯片大小chipsize, 块大小erasesize;在/include/s3c24x0.h中加入2440的NAND FLASH寄存器定义和CAMDIVN定义。

2.3 根据开发板资源, 修改其他文件

依照内存的配置情况, 修改board/hgsm2440/lowlevel_init.S文件;在相关文件中添加“CONFIG_S3C2440”, 使得原来S3C2410的代码可以编译进来;重新计算cp u/arm 92 0t/s3c 24 x0/se ria l.c中的波特率设置;修改/cpu/arm920t/s3c24x0/speed.c以匹配S3C2440。

2.4 开发板配置

hg sm 241 0.h是开发板的配置文件, 许多重要的内容都需要在这个文件中进行配置。通过修改该文件, 可以为开发板添加需要的命令, 修改环境变量, 修改U-Boot的命令提示符, 修改默认下载地址, 修改环境变量在Flash中的存储地址。

经过以上步骤, U-Boot的移植3基本完成, 使用下面命令编译生成uboot.bin映像文件。

#make hgsm2440_config#make

使用SJF2440.exe, 通过JT AG接口烧写uboot.bin到实验平台的Nand Flash上。重新启动系统, 出现相关检测信息, 进入到[Hgsm2440]#提示符下, U-Boot移植成功。

3 Linux的移植

本文所使用的Linux内核版本为2.624, 它对smdk2440的支持完全适用于我们的开发板。故我们对内核的移植也在smdk2440基础上展开。从网上下载linux-26.2 4.1.tar.bz2, 解压内核到linux 2.6.2 4目录下。

3.1 修改内核

修改内核目录树根下的的Makefile, 找到

由于我们使用的开发板的晶振频率是12MHz, 所以我们还需要修改平台输入时钟, 找到内核源码ar ch/arm/machs 3 c 2 4 4 0/mach-s mdk 2 4 4 0.c文件, 在函数staticvoid__init smdk2440_map_io (void) 中, 将s3c 2 4 xx_init_clocks (1 6 9 3 4 4 0 0) 修改为s3c2 4 xx_init_clocks (12000000) 。

3.2 Nand Flash驱动移植

进行Nand Flash的移植, 其实在linux里面已经做好了Nand Flash的驱动, 我们只需要进行修改就可以使用了。在/arch/arm/plat-s3c2 4 xx中static structmtd_partition smdk_default_nand_part[]结构体修改分区信息, 将它修改为和bootloader的分区一致。

然后修改common-smdk.c文件的的smdk_nand_info结构体内容以修改Nand F l a s h的读写匹配时间。然后还需要禁止内核ECC (差错校验) 校验。内核都是内核通过U-Boot写到Nand Flash, U-Boot通过的软件ECC算法产生ECC码, 这与内核校验的ECC码不一样, 内核中的ECC码是由Nand Flash控制器产生的.所以, 我们在这里选择禁止内核ECC校验。在/drivers/m t d/nand/s3c2 4 1 0.c文件中找到s3c2410_nand_init_chip () 函数, 在该函数体最后加上一条语句:c hi p->eccmode=NAND_ECC_NONE。

3.3 给内核打yaffs2文件系统的补丁

Linux内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统 (Root Filesystem) 。Yaffs (yet another flash file system) 是一种专门为Nand Flash设计的嵌入式文件系统, 通常将其作为根文件系统使用[4]。

我们将下载的yaffs2源码包解压后, 进入yaffs2目录后, 通过以下命令来给内核打yaffs2文件系统的补丁:#./patch-ker.shc/opt/linux-2.6.2 4.1/

3.4 配置内核

回到Linux-2.6.24内核主目录下, 复制arch/arm/configs目录下s3c2 4 1 0_defconfig为.config, 然后运行:#make menuconfig。

采用文本选单的配置方式配置内核, 开始根据需要配置内核。

3.5 编译内核

内核的配置完成后, 在内核源文件的根目录下运行如下命令编译内核:

#make zImage,

编译完毕后, 会在内核源码的“arch/arm/boot/”目录下面生成名为“zImage”的镜像, 使用mkimage工具可以对zImage进行处理, 生成uImage, 以供U-Boot启动。

把u Image放入主机的TFTP目录下, 启动开发板, 用U-Boot的tftp命令下载uImage到SDRAM。重启系统, U-boot启动后, 系统根据nand Flash和RAM的地址分配, 由Uboot加载Linux内核和根文件系统到内存中, 系统成功启动。

4 结语

本文针对S3C2440开发板提供了构建基本嵌入式Linux系统的过程与方法, 在移植过程中, 重点阐述了交叉编译环境的建立, U-boot的修改与移植, Linux内核的配

摘要:本文描述了将Linux移植到基于S3C2440处理器的目标板上的方法与过程。首先介绍了如何搭建嵌入式交叉编译环境, 然后着重讨论了在该开发板上bootloader的设计实现以及Linux内核的移植的方法。

关键词:交叉编译工具链,Bootloader,Linux内核,根文件系统

参考文献

[1] S3C2440A32bit CMOS Microcontroller USER’S MANUAL.Samsung Electronics[EB/OL].http://samsung.com, 2005, 7.

[2] 田家林, 陈利学, 寇向辉.LINUX嵌入式操作系统在ARM上的移植[J].微计算机信息, 2007 (23) :4~2.

[3] 韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社, 2008, 8.240~255.

[4] 刘文峰, 李程远, 李善平.嵌入式Linux操作系统的研究[J].浙江大学学报 (工学版) , 2004, 4.

上一篇:16MnR+0Cr18Ni9/28+3复合钢板焊接工艺下一篇:大数据时代公安机关快递数据管控的探索与思考