基于PXA255的ARM Linux操作系统移植

发布者:绿意盎然最新更新时间:2012-05-17 来源: 微计算机信息 关键字:PXA255  Linux  操作系统移植 手机看文章 扫描二维码
随时随地手机看文章
1. 引言

ARM处理器是当今应用最为广泛的处理器芯片,它功耗小、成本低、性能优越,在消费电子类产品中占据主导地位。Linux操作系统近年来在嵌入式领域中发展很快,由于其强大的性能和开源免费的特点,越来越受到嵌入式系统开发商的青睐,信息家电、网络设备、手持终端等都是嵌入式Linux应用的广大市场。

在嵌入式开发中,把操作系统移植到开发板是进行嵌入式应用开发的前提和基础。ARM Linux是针对ARM体系结构的嵌入式Linux操作系统。本文主要阐述了将ARM Linux系统移植到基于PXA255处理器的开发板CSB226上的方法和关键技术。

2.     软硬件平台环境
2.1.   硬件平台

(1)PXA255处理器

Intel PXA255是基于XScale微架构的一款嵌入式应用处理器,它在XScale结构的基础上集成了众多的外设接口,如:PCMCIA控制器、LCD控制器、多媒体通信口等,是专为高性能、低功耗的便携式手持设备而开发的。CSB226是基于PXA255处理器而设计的一款开发板,本文的移植工作就是在此开发板上进行的。CSB226还配置有许多外设,包括:64MB SDRAM内存、32MB Flash、CS8900A以太网控制器、CF接口等。CSB226开发板系统结构框图[2]如图1所示。

图1 CSB226开发板系统结构框图

(2)硬件环境搭建

嵌入式开发通常采用宿主机—目标机的主从开发模式[3]。宿主机指开发主机,由一台通用PC机或工作站构成;目标机即指嵌入式设备,在本文中是CSB226开发板。硬件的连线图如图2所示,开发板和宿主机之间通过串口、以太网或JTAG口等进行通信,采用“交叉”开发方式。本文采用硬件仿真工具BDI2000进行软件的调试,仿真器一端通过JTAG口与目标机相连,另一端用网线与宿主机相连。

图2 主机和目标机的连线图

2.2.   软件环境

本文开发主机采用RedHat9.0操作系统。首先需要对开发主机和目标机做一些设置,然后搭建交叉编译和调试环境,具体步骤如下:

在开发主机上需要做以下设置:(1)启动NFS服务,为目标机使用NFS文件系统做准备;(2)安装TFTP服务器,为目标机从主机上下载文件提供服务;(3)启动Telnet服务;(4)安装Minicom工具,它是Linux环境下的超级终端工具,用它与目标机进行串口通信。另外,目标机上需要设置IP地址,与开发主机设置在同一网段。

对于交叉编译环境,使用最广泛的ARM Linux交叉工具链为arm-linux-toolchain,由bin、include、lib三部分组成。调试环境的搭建使用GNU/GDB调试工具,安装后生成ARM平台的交叉调试工具arm-linux-gdb。[page]

3.基于PXA255的ARM Linux移植关键技术
3.1.内核定制

Linux内核和文件系统是嵌入式Linux的两个核心部分。首先进行内核的编译,在开发主机上配置编译ARM Linux内核,生成一个针对CSB226平台的Linux内核映像zImage。

本文使用2.4.19版本的标准内核,编译内核的步骤如下:(1)准备Linux内核源代码linux-2.4.19.tar和平台相关的系列补丁:patch-2.4.19-rmk7.gz、diff-2.4.19-rmk7-pxa2.gz、linux-2.4.19-rmk7-pxa2- ptx14.diff。(2)解压源码包并按顺序打上几个补丁,再对内核源码的配置文件作适当的修改,然后用make dep,make zImage命令进行编译,如果编译成功会在Linux源码arch/arm/boot目录下生成内核映像文件zImage。

在内核成功编译之前,关键是对内核源码做适当的修改,以适应特定的开发平台。本文中对源码的修改有如下几点:(1)将 Makefile文件中的编译器改为交叉编译器arm-linux-gcc,体系结构改为ARM。(2)本文中使用NFS方式挂载文件系统,因此,需要在 CSB226的默认配制文件linux/arch/arm/def-configs/csb226中设置配置命令行的属性:CONFIG_CMDLINE ="root=/dev/nfs rw nfsroot=10.0.0.1:/home/busybox ip=10.0.0.2 mem=64M console=tty0 console=ttyS0,38400",其中“root=/dev/nfs”指定设备文件,“10.0.0.1:/home/busybox”是文件系统所在开发主机的IP地址和目录位置,10.0.0.2是目标机的IP地址。主机端和目标机的串口通信波特率要一致,本项目中是38400。(3)在源码linux/arch/arm/tools/目录下的mach-types文件中添加CSB226的宏定义和机器号,CSB226的机器号是216,这个整数是唯一的,在启动初始化的时候会把它赋给微处理器的R1寄存器。(4)用make menuconfig命令对默认配置做一些调整,比如添加外设、网络协议和文件格式等选项。

成功生成映像文件zImage后,就可以下载到目标机运行了,但只有这个内核还无法与系统交互,还需要一个文件系统。

3.2.   文件系统

(1)嵌入式文件系统制作

本文采用Busybox工具包组建嵌入式文件系统。直接配置编译Busybox就可以创建/bin、/sbin、/usr等目录,其中包含了大部分常用的命令,但Busybox并不提供与登录相关的命令如:login、getty、passwd等,这需要用Tinylogin软件包生成。/lib目录的动态库文件可以用Glibc生成。/dev目录下是系统所用的设备节点,只需要根据当前平台对外设的支持情况逐个地添加即可。/etc目录是系统配置文件和子目录,比如启动配置、网络配置等,需要针对特定应用启动相应的服务和进程。

(2)文件系统的挂载

创建好文件系统的目录结构后,还需要将目录制作成某种格式的文件系统,挂载到Linux内核下使用。常用的挂载方式有Ramdisk、JFFS2、 NFS,其中NFS(Network File System)是网络文件系统,它的优点是可以从主机上直接修改文件系统,方便开发。本文使用NFS的挂载方式,将根文件系统是放在开发主机上,开发主机提供网络共享服务,目标机在启动时通过NFS方式挂载根文件系统。

3.3. 设备驱动移植

将Linux内核移植到CSB226开发板上后,还需要移植常用外设的驱动程序,如:LCD液晶屏、鼠标、键盘、CF卡等。下面重点阐述LCD液晶屏和CF卡的移植过程。

(1)LCD液晶屏的驱动移植

Linux中的Framebuffer帧缓冲驱动分为三层[4],中间层及上层是设备无关的软件层,底层是与硬件相关的帧缓冲驱动,因此,LCD驱动移植主要是驱动帧缓冲硬件设备,在本文中对应于CSB226平台上的LCD控制器和其外接的TFT LCD显示器。

基于PXA255微处理器的不同平台的差异主要在于外接的LCD显示屏硬件的差异,因此对于不同平台的帧缓冲驱动程序的差别主要是在LCD控制寄存器中显示屏规格参数的设置上有不同。LCD寄存器中的初始规格参数是在头文件drivers/video/pxafb.h的宏定义中设置的,因此对于不同的硬件平台只要更改硬件的规格参数即可。这些参数是在初始化函数pxafb_init()中进行配置的。[page]

(2)CF卡的驱动移植

CF(Compact Flash)接口是一种标准的扩展接口,主要用于扩展存储空间,如本文使用的128M CF存储卡,也可以外接其他设备,如CF接口的modem、无线网卡等。

在Linux系统下,由于CF卡与PCMCIA设备控制器兼容,通常把CF卡当作PC Card设备进行驱动和管理。PCMCIA的插槽驱动和PC卡驱动与硬件直接相关,是驱动移植中需要重新实现的部分。CF存储卡的驱动可以直接使用标准的 ATA/IDE设备驱动ide-cs模块,因此在CSB226平台上驱动CF存储卡,只需要编写PCMCIA控制器的驱动。

PXA225片上的PCMCIA控制器驱动的初始化函数为pxa_pcmcia_driver_init(),它调用底层PCMCIA接口函数初始化具体平台上的插槽接口设备。这些底层函数是板级驱动与插槽驱动之间的标准接口,定义在结构体struct pcmcia_low_level中。CF卡驱动移植的主要工作就是实现pcmcia_low_level结构体中底层平台相关的5个接口函数。 pcmcia_low_level数据结构如下:

struct pcmcia_low_level {

  int (*init)(struct pcmcia_init *);

  int (*shutdown)(void);

  int (*socket_state)(struct pcmcia_state_array *);

  int (*get_irq_info)(struct pcmcia_irq_info *);

  int (*configure_socket)(unsigned int, socket_state_t *);

};

l       init函数,主要完成三个工作:执行平台相关的初始化任务;设置所需要中断信号的方向和边缘触发方式;注册设备发现中断与对应的中断处理函数。

l       shutdown函数,在卸载驱动时使用,用来释放所申请的资源。

l       socket_state函数,设置插槽的初始化状态信息,完成对输入参数所包含的数据结构struct pcmcia_state赋值,需要根据实际插槽的状态信息正确设置此数据结构。

l       get_irq_info函数,用来获得每个插槽接口设备上的Ready中断信号。

l       configure_socket函数,由上层驱动调用,用来动态改变插槽的状态,比如工作电压VCC、可编程电压VPP等。

将PCMCIA驱动程序成功编译进内核后,还需要使用卡管理工具cardmgr监测CF卡设备,当CF存储卡插入到CSB226开发板的插槽时,cardmgr会发现该设备并完成设备的加载。

4. 应用实例

在CSB226开发板上成功移植了ARM Linux后,可以进行多种应用开发,如:电子地图查询系统,娱乐游戏机等。本文在CSB226开发板上插入一块基于Prism2芯片组的CF接口的无线网卡,由于已经成功驱动了CF接口,所以只需要将无线接入点程序Host AP编译到ARM Linux内核中,再使用网桥工具将CSB226开发板自身的10MBit以太网和无线网络桥接起来,这个开发板就可以作为一台无线接入点工作了。

5. 结论

Linux操作系统在嵌入式设备中应用越来越广泛。本文针对基于PXA255处理器的开发板进行了系统移植,阐述了移植中的关键技术,如:内核的修改、文件系统建立、设备驱动的移植,最后在开发板上实现了无线接入点。本文的移植过程对于其他类型微处理器上Linux的移植也具有参考价值。

本文作者创新点:基于CSB226开发板进行了ARM Linux操作系统的移植,对LCD和CF卡设备驱动的平台相关部分进行了重写。最后在开发板上实现了无线接入点的应用。

参考文献:

[1] 毛德操, 胡希明. 嵌入式系统采用公开源代码和StrongARM/XScale处理器[M]. 杭州: 浙江大学出版社, 2003. p. 61-63.

[2] CSB226 Block Diagram. http://www.cogcomp.com/datasheets/Visio-CSB226_disti. pdf, 2004.

[3] 许先斌, 熊慧君, 李渊, 杨芬. 基于ARM9的嵌入式Linux开发流程的研究[J]. 微计算机信息. 2006,11:87-90.

[4] Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini. Linux Device Driver[M]. 第三版.O'Reilly Media,Inc. 2005.

关键字:PXA255  Linux  操作系统移植 引用地址:基于PXA255的ARM Linux操作系统移植

上一篇:基于Intel PXA270的Windows CE5.0下Boot Loader实现
下一篇:μC/OS-Ⅱ在MC9S12A64上的移植及应用

推荐阅读最新更新时间:2024-05-02 22:04

s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息。当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样。 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define dprintk(msg...) 3 do { 4 if (debug) 5 printk(msg);
[单片机]
s3c2440液晶屏驱动 (内核自带) <font color='red'>linux</font>-4.1.24
Linux 4.0低调大改版,核心更新从此免重开机
    从4.0版核心之后,未来任何Linux核心的安全更新,或是程式更新,都不需要重新开机。4.0版还强化了对PS 3的支援,也能支援Intel进军穿戴装置市场的Quark单芯片 Linus Torvalds在Linux Kernel信件中表示,将如期推出Linux 4.0。4.0有项受到高度关注的新功能是核心更新免重开机,未来任何Linux核心的安全更新,或是程式更新,都不需要重新开机就能完成。重开机对于一般使用者也许不痛不痒,但是对于24小时提供服务的伺服器就会是大问题。过去得使用第三方厂商提供的解决方案才能实现,如Oracle的Ksplice、SUSE的kGraft及Red Hat的Kpatch。除此之外,4.0版也
[手机便携]
linux中LCD设备驱动(3)——基于s3c6410平台
上一篇在说LCD设备驱动对应的probe函数时,没有说完,这一篇接着继续说probe函数。 s3cfb_pre_init();上一次说到了这个函数,而且还讲到了一个结构体s3cfb_fimd_info_t,并说了它的大致作用。 s3cfb_set_backlight_power(1);看名字就只到它的大致作用,与背光灯有关,源码如下: static void s3cfb_set_backlight_power(int to) { s3cfb_fimd.backlight_power = to; if (s3cfb_fimd.set_backlight_power) (s3cfb_fimd.set_backlight_
[单片机]
Linux下s3c6410的GPIO操作(1)
1、arch/arm/plat-s3c64xx/gpiolib.c文件中有如下: arch_initcall(s3c64xx_gpiolib_init);这个应该实在系统初始化时调用。 static __init int s3c64xx_gpiolib_init(void) { s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), s3c64xx_gpiolib_add_4bit); s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), s3c64xx_gpiolib_add_4bit2);
[单片机]
<font color='red'>Linux</font>下s3c6410的GPIO<font color='red'>操作</font>(1)
S3C2410的linux 下DMA驱动程序开发
网上介绍LINUX下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期zhaoyang因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接手时无资料借鉴的茫然,故写点介绍,期待能给有DMA开发任务的网友们一点帮助。 本文将包括如下内容: DMA驱动主要函数功能 驱动中关键技术分析 具体的DMA实例分析 申明:本DMA驱动开发介绍仅适合S3C2410处理器类型,分析源码为韩国MIZI研究中心维护的dma驱动代码: linux/arch/arm/mach-s3c2410/dma.h,linux/arch/arm/mach-s3c2410/dma.c,
[单片机]
基于Linux的嵌入式GUI研究与应用
1.引言 嵌入式GUI指在嵌入式系统中为特定的硬件设备或者环境而设计的图形用户界面系统。它极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便地操作。在实际应用中,嵌入式GUI应满足轻型、占用资源少、高性能、高可靠性、可配置等基本要求。 Linux作为一种可裁减的操作系统,兼容多种主流CPU且支持所有的文件系统和网络服务,并具备源代码公开、易于定制、稳定、功能强大和易开发等优点,是发展未来嵌入式设备的绝佳资源。 2.Linux在嵌入式系统上的实现 2.1系统引导 系统上电或者复位后,将对系统硬件设备进行自检,无错误则将硬盘0磁道的第一个扇区,即MBR中的BootLoader调至内存0x07
[单片机]
Linux基金会发表EdgeX开源项目 看好物联网边缘运算平台
 2017年初,Linux基金会在德国汉诺威工业展(Hannover Messe)发表最新开源项目EdgeX Foundry,试图为边缘运算建立共同开源框架,进而简化并改良工业物联网(IIoT)计划。下面就随网络通信小编一起来了解一下相关内容吧。 EdgeX试图为边缘运算建立一个共同开源框架。 根据IoT Evolution报导,Linux基金会是全球开源社群的领头羊,宣布成立开源物联网项目EdgeX Foundry,以戴尔(Dell)为首数十家业者共襄盛举,戴尔预计贡献物联网堆栈软件FUSE,这是戴尔建立物联网网关和相关软件的重要成果。 FUSE项目始于2015年7月,试图建立高延展性的平台,方便客户设计物联网边缘运算方
[网络通信]
如何在Linux下为STM32 MCU构建代码
步骤1:安装必需的软件 首先,安装必需的软件。 为ARM安装gcc编译器: gcc编译器包含用于编译,链接和构建MCU的构建代码的工具。安装以下三个软件包: gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi 安装STM32CubeMX STM32CubeMX是用于生成C项目的基于Java的工具。借助此工具可以配置使用过的MCU的所有部分,例如USART,I2C,SPI,GPIO,
[单片机]
如何在<font color='red'>Linux</font>下为STM32 MCU构建代码
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved