×
研发技术 > 嵌入式 > 详情

在AT91RM9200上进行Linux移植的方法

发布时间:2024-05-11 发布时间:
|

  作者:徐山峰 马立玲 王军政, 夏宇

  1.  引言

  目前,在嵌入式系统里基于ARM微核的嵌入式处理器以其功耗低,功能强大的优点已经成为市场的主流。与此同时,在网络上发展起来的Linux操作系统,以其功能强大,开放源代码,支持硬件种类众多的特点,越来越受到人们的青睐。然而如何把Linux操作系统移植到ARM平台上却成了一个重点,也是一个难点问题。

  嵌入式Linux系统包括引导程序(Bootloader),内核(kernel)和根文件系统三个部分,其开发流程如图1所示:嵌入式Linux 移植到特定的硬件平台上,一般需要以下五个步骤:(1)前期准备包括从网站上下载嵌入式Linux的源码包, 搭建交叉编译开发环境,配置主机的开发环境等(2)配置Bootloader,并将其烧写到目标平台的Flash上,使其能正常的启动内核;(3)配置和编译Linux内核,首先要对源码进行一定的修改, 并将其移植到目标平台上,然后再根据自己的硬件资源进行裁减,使内核达到最优;(4)制作RAMDISK来挂接Linux的根文件系统,并在 RAMDISK上添加自己的应用程序;(5)部署Linux系统使目标板脱离交叉开发环境,直接在目标机上本地启动运行。本文就将根据实际项目开发中一个 ARM构架的嵌入式系统为例,阐述如何移植Linux到AT91RM9200的ARM平台上。

  2.建立交叉编译环境

  一般而言,直接在移植的目标硬件平台上编写和调试Linux比较困难,目前一般采用的办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。

  移植前需要在宿主机上建立如图2所示的ARM的交叉编译环境,建立ARM的交叉编译环境主要用到的开发工具有: binutils、gcc、glibc,其中 binutils是二进制文件的处理工具; gcc是编译工具, 用来编译内核代码的工具; glibc 是链接和运行库。社区的开发者和一些芯片厂商已经编译出了常用体系结构的工具链,使用这些工具链,可以大大减少工作量。交叉编译工具的安装步骤如下: (1)从官方站点下载cross-2.95.3.tar.bz2;

  (2)在usr/local/arm下解压:#tar -jxvf cross-2.95.3.tar.bz2;

  (3)在/etc/bashrc文件中修改PATH环境变量,加入export PATH=/usr/local/arm/2.95.3/bin:$PATH。

  3. ARM Linux系统的开发

  3.1 Linux启动代码Bootloader的移植

  Bootloader是在操作系统内核运行之前运行的一段小程序。这段程序完成硬件的初始化和建立内存空间的映射图等重要工作,为内核的启动创建正确的环境,并最终启动内核,Bootloader在Linux嵌入式系统中所处的层次位置如图3所示。Bootloader的实现依赖于CPU的体系结构,大多数的Bootloader都分为stage 1和stage 2两大部分,图4为两阶段Bootloader的结构框图。依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage 1,而且用汇编语言实现。而stage 2则通常用C语言实现,这样可以实现复杂功能,而且有更好的可读性和移植性。

图3  Bootloader所处的层次位置

图4  硬件环境的状态

  目前基于嵌入式系统的Bootloader版本很多,如Blob、Redboot、Vivi和U-Boot等,下面就以现在最流行的U-Boot为例,详细介绍如何将它移植到自己的目标板上。U-boot移植主要步骤如下:

  首先基于自己的目标板的硬件资源,修改或添加U-Boot源代码的board/at91rm9200目录中如下源码文件:(1)重写FLASH的设备控制程序flash.c , U-Boot读、写和删除Flash设备的源代码文件。由于在不同目标板中FLASH存储器种类各不相同,参照自己flash的datasheet重写 flash的设备控制程序flash.c,该程序完成的功能包括Flash初始化、打印Flash信息、Flash擦除和Flash写入等操作。(2)添加memsetup.s。该汇编源码文件初始化时钟、SMC控制器和SDRAM控制器。(3)添加网卡芯片DM9161E的设备控制程序dm9161.c 和dm9161.h,程序。(4)修改Makefile文件。对上述修改或添加的源代码文件编译后,在Makefile里面主要做如下修改: OBJS :=at91rm9200dk.c at45.o dm9161.o flash.o  SOBJS:=memsetup.o(5) U-Boot.lds ,设置U-boot中各个目标文件的连接地址,基本不做修改。(6)config.mk。根据目标板的一级boot来修改,修改后TEXT BASE=0x21f00000。

  其次,修改目录include/configs的头文件at91rm9200dk.h,根据目标板的资源配置,修改内容包括CPU ,系统时钟、RAM 、Flash等配里信息以及内存映射相关参数。该头文件还定义了U-Boot的一些环境变量和内核启动参数.可在U-Boot启动后通过setenv和 saveenv命令修改。U-Boot-1.1.2版本对at91rm9200处理器提供良好的支持,因此对于目录CPU at91rm9200中的源码基本不做修改。在U-Boot-1.1.2的Makefile中加入如下代码:

  at91rm9200dk_config: unconfig@/mkconfig $(@: _config=) arm at91rm9200 at91rm9200dk

  其中“arm”是CPU的种类,at91rm9200是ARM CPU对应的代码目录,at91rm9200dk是目标板对应的目录。由于交叉编译器安装在目录/usr/local/arm,应把环境变量 CROSS_COMPILE设置成相应路径:CROSS_COMPILE=/usr/local/arm/2.95.3 /bin/arm-linux-

  最后,调试U-Boot源代码,直到U-Boot在开发板上能正常启动,调试成功后,烧写U-Boot到FLASH,烧写完成后,复位目标板,串口终端就显示U-Boot的启动信息。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
初次接触单片机.你会选择哪款?