移植嵌入式Linux到ARM处理器
2019-07-12 18:26 发布
生成海报
引言 ARM 是 Advanced RISC Machines (高级精简指令系统处理器)的缩写,是 ARM 公司提供的一种微处理器知识产权( IP )核。 ARM 的应用已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75 %以上的市场份额。揭开你的手机、 MP3 、 PDA ,嘿嘿,里面多半藏着一个基于 ARM 的微处理器! ARM 内核的数个系列( ARM7 、 ARM9 、 ARM9E 、 ARM10E 、 SecurCore 、 Xscale 、 StrongARM ),各自满足不同应用领域的需求,无孔不入的渗入嵌入式系统各个角落的应用。这是一个 ARM 的时代! 有人的地方就有江湖(《武林外传》),有嵌入式系统的地方就有ARM 。 构建一个复杂的嵌入式系统,仅有硬件是不够的,我们还需要进行操作系统的移植。我们通常在ARM 平台上构建Windows CE 、Linux 、Palm OS 等操作系统,其中Linux 具有开放源代码的优点。 下图显示了基于ARM 嵌入式系统中软件与硬件的关系: 日前,笔者作为某嵌入式ARM (硬件)/Linux (软件)系统的项目负责人,带领项目组成员进行了下述工作: (1) 基于ARM920T 内核S3C 2410A CPU 的电路板设计; (2)ARM 处理下底层软件平台搭建: a.Bootloader 的移植; b. 嵌入式Linux 操作系统内核的移植; c. 嵌入式Linux 操作系统根文件系统的创建; d. 电路板上外设Linux 驱动程序的编写。 本文将真实地再现本项目开发过程中作者的心得,以便与广大读者共勉。第一章将简单地介绍本ARM 开发板的硬件设计,第二章分析Bootloader 的移 植方法,第三章叙述嵌入式mizi Linux 的移植及文件系统的构建方法,第四章讲解外设的驱动程序设计,第五章给出一个已构建好的软硬件平台上应用开发的实例。 如果您有嵌入式系统的开发基础,您将非常容易领会本文讲解地内容。即便是您从来没有嵌入式系统的开发经历,本文读起来也不会生涩。您可以通过如下email 与作者联系:21cnbao@21cn.com 。 2.ARM 体系结构 作为一种RISC 体系结构的微处理器,ARM 微处理器具有RISC 体系结构的典型特征。还具有如下增强特点: (l) 在每条数据处理指令当中,都控制算术逻辑单元(ALU) 和移位器,以使ALU 和移位器获得最大的利用率; (2) 自动递增和自动递减的寻址模式,以优化程序中的循环; (3) 同时Load 和Store 多条指令,以增加数据吞吐量; (4) 所有指令都条件执行,以增大执行吞吐量。 ARM 体系结构的字长为32 位,它们都支持Byte(8 位) 、Halfword(16 位) 和Word(32 位)3 种数据类型。 ARM 处理器支持7 种处理器模式,如下表: 大部分应用程序都在User 模式下运行。当处理器处于User 模式下时,执行的程序无法访问一些被保护的系统资源,也不能改变模式,否则就会导致一次异常。对系统资源的使用由操作系统来控制。 User 模式之外的其它几种模式也称为特权模式,它们可以完全访问系统资源,可以自由地改变模式。其中的FIQ 、IRQ 、supervisor 、 Abort 和undefined 5 种模式也被称为异常模式。在处理特定的异常时,系统进入这几种模式。这5 种异常模式都有各自的额外的寄存器,用于避免在发生异常的时候与用户模式下的程 序发生冲突。 还有一种模式是system 模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User 模式下基本相同。它是一种特权模式,用于有访问系统资源请求而又需要避免使用额外的寄存器的操作系统任务。 程序员可见的ARM 寄存器共有37 个:31 个通用寄存器以及6 个针对ARM 处理器的不同工作模式所设立的专用状态寄存器,如下图: ARM9 采用5 级流水线操作:指令预取、译码、执行、数据缓冲、写回。ARM9 设置了16 个字的数据缓冲和4 个字的地址缓冲。这5 级流水已被很多的RISC 处理器所采用,被看作RISC 结构的" 经典" 。 3. 硬件设计 3.1 S3C 2410A 微控制器 电路板上的ARM 微控制器 S3C 2410A 采用了ARM920T 核,它由ARM9TDMI 、存储管理单元MMU 和高速缓存三部分组成。其中,MMU 可以管理虚拟内存,高速缓存由独 立的16KB 地址和16KB 数据高速Cache 组成。ARM920T 有两个内部协处理器:CP14 和CP15 。CP14 用于调试控制,CP15 用于存储系 统控制以及测试控制。 S3C 2410A 集成了大量的内部电路和外围接口: ·LCD 控制器( 支持STN 和TFT 带有触摸屏的液晶显示屏) ·SDRAM 控制器 ·3 个通道的UART ·4 个通道的DMA ·4 个具有PWM 功能的计时器和一个内部时钟 ·8 通道的10 位ADC · 触摸屏接口 ·I2C 总线接口 ·12S 总线接口 · 两个USB 主机接口 · 一个USB 设备接口 · 两个SPI 接口 ·SD 接口 ·MMC 卡接口 S3C 2410A 集成了一个具有日历功能的RTC 和具有PLL(MPLL 和UPLL) 的芯片时钟发生器。MPLL 产生主时钟,能够使处理器工作频率最高 达到203MHz 。这个工作频率能够使处理器轻松运行WinCE 、Linux 等操作系统以及进行较为复杂的信息处理。UPLL 则产生实现USB 模块的时 钟。 下图显示了S3C 2410A 的集成资源和外围接口: 我们需要对上图中的AHB 总线和APB 总线的概念进行一番解释。ARM 核开发的目的,是使其作为复杂片上系统的一个处理单元来应用的,所以还必须提供一 个ARM 与其它片上宏单元通信的接口。为了减少不必要的设计资源的浪费,ARM 公司定义了AMBA(Advanced Microcontroller Bus Architecture) 总线规范,它是一组针对基于ARM 核的、片上系统之间通信而设计的、标准的、开放协议。 在AMBA 总线规范中,定义了3 种总线: (l)AHB-Advanced High Performace Bus ,用于高性能系统模块的连接,支持突发模式数据传输和事务分割; (2)ASB-Advanced System Bus ,也用于高性能系统模块的连接,支持突发模式数据传输,这是较老的系统总线格式,后来由AHB 总线替代; (3)APB-Advanced PeriPheral Bus ,用于较低性能外设的简单连接,一般是接在AHB 或ASB 系统总线上的第二级总线。 典型的AMBA 总线系统如下图: S3C 2410A 将系统的存储空间分成8 个bank ,每个bank 的大小是128M 字节,共1G 字节。Bank0 到bank5 的开始地址是固定的,用于 ROM 或SRAM 。bank6 和bank7 可用于ROM 、SRAM 或SDRAM 。所有内存块的访问周期都可编程,外部Wait 也能扩展访问周期。下图给出 了S3C 2410A 的内存组织: 下图给出了S3C 2410A 的数据总线、地址总线和片选电路: SDRAM 控制信号、集成USB 接口电路: 内核与存储单元供电电路(S3C 2410A 对于片内的各个部件采用了独立的电源供给,内核采用1.8V 供电,存储单元采用3.3V 独立供电): JTAG 标准通过边界扫描技术提供了对电路板上每一元件的功能、互联及相互间影响进行测试的方法,极大地方便了系统电路的调试。 测试接入端口TAP 的管脚定义如下: ·TCK :专用的逻辑测试时钟,时钟上升沿按串行方式对测试指令、数据及控制信号进行移位操作,下降沿用于对输出信号移位操作; ·TMS :测试模式选择,在TCK 上升沿有效的逻辑测试控制信号; ·TDI :测试数据输入,用于接收测试数据与测试指令; ·TDO :测试数据输出,用于测试数据的输出。 S3C 2410A 调试用JTAG 接口电路: 3.2 SDRAM 存储器 SDRAM 被用来存放操作系统(从FLASH 解压缩拷入)以及存放各类动态数据,采用SAMSUNG 公司 的K4S561632 ,它是4Mxl6bitx4bank 的同步DRAM ,容量为32MB 。用2 片K4S561632 实现位扩展,使数据总线宽度达到 32bit ,总容量达到64MB ,将其地址空间映射在S3C 2410A 的bank6 。 SDRAM 所有的输入和输出都与系统时钟CL K 上升沿同步,由输入信号RA S 、CA S 、WE 组合产生SDRAM 控制命令,其基本的控制命令如下: SDRAM 在具体操作之前首先必须通过MRS 命令设置模式寄存器,以便确定SDRAM 的列地址延迟、突发类型、突发长度等工作模式;再通过ACT 命令激活对应地址的组,同时输入行地址;然后通过RD 或WR 命令输入列地址,将相应数据读出或写入对应的地址;操作完成后用PCH 命令或BT 命令中止读或写操作。在没有操作的时候,每隔一段时间必须用ARF 命令刷新数据,防止数据丢失。 下图给出了SDRAM 的连接电路: 3.3 FLASH 存储器 NOR 和NAND 是现在市场上两种主要的非易失闪存技术。 NOR 的特点是芯片内执行(XIP ,Execute In Place) ,即应用程序可直接在Flash 闪存内运行,不必把代码读到系统RAM 中。NOR 的传输效率很高,在1~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 NAND 结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND 的困难在于Flash 的管理和需要特殊的系统接口,S3C 2410A 内嵌了NAND FLASH 控制器。 S3C 2410A 支持从GCS0 上的NOR FLASH 启动(16 位或32 位)或从NAND FLASH 启动,需要通过OM0 和OM1 上电时的上下拉来设置: 在系统中分别采用了一片NOR FLASH(28F 640) 和NAND FLASH(K9S1208) ,电路如下图: 作者: 宋宝华 更新日期:2006-11-21 来源:dev.yesky.com 浏览次数: 3.4 串口 S3C 2410 内部集成了UART 控制器,实现了并串转换。外部还需提供CMOS/TTL 电平与RS232 之间的转换: 3.5 以太网 以太网控制芯片采用CIRRUS LOGIC 公司生产的CS8900A ,其突出特点是使用灵活,其物理层接口、数据传输模式和工作模式等都能根据需要而动态调整,通过内部寄存器的设置来适 应不同的应用环境。它符合IEEE803.3 以太网标准,带有传送、接收低通滤波的10Base-T 连接端口,支持10Base2 ,10Base5 和 10Base-F 的AUI 接口,并能自动生成报头,自动进行CRC 检验,在冲突后自动重发。 CS8900A 支持的传输模式有I/O 和 Memory 模式。当CS8900A 有硬件复位或软件复位时, 它将默认成为8 位工作模式。因此,要使CS8900A 工作于16 位模式,系统必须在访问之前 提供给总线高位使能管脚(/SBHE) 一个由高到低、再由低到高变化的电平。 3.6 USB 接口 USB 系统由USB 主机(USB Host )、USB 集线器(USB Hub )和USB 设备(USB Device )组成。USB 和主机系统的接口称作主机控制器(Host Controller ),它是由硬件和软件结合实现的。根集线器是综合于主机系统内部的,用以提供USB 的连接点。USB 的设备包括集线器(Hub )和功 能器件(Function )。 S3C 2410A 集成了USB host 和USB device ,外部连接电路如下图: 作者: 宋宝华 更新日期:2006-11-21 来源:dev.yesky.com 浏览次数: 3.7 电源 LDO(Low Dropout) 属于DC/DC 变换器中的降压变换器,它具有低成本、低噪声、低功耗等突出优点,另外它所需要的外围器件也很少,通常只有 1~2 个旁路电容。 在电路板上我们分别用两个LDO 来实现5V 向3.3V (存储接口电平)和1.8V (ARM 内核电平)的转换。 up 监控电路采用MAX708 芯片,提供上电、掉电以及降压情况下的复位输出及低电平有效的人工复位输出: 3.8 其它 SN74LVTH62245A 提供总线驱动和缓冲能力: S3C 2410A 集成LCD 液晶显示器控制电路,外部引出接口: 触摸屏有电阻式、电容式等,其本质是一种将手指在屏幕上的触点位置转化为电信号的传感器。手指触到屏幕,引起触点位置电阻或电容的变化,再通过检测这一 电性变化,从而获得手指的坐标位置。通过S3C 2410A 集成的AD 功能,完成电信号向屏幕坐标的转化,触摸屏接口如下: 键盘则直接利用CPU 的可编程I/O 口,若连接 mxn 键盘,则需要m+n 个可编程I/O 口,由软件实现键盘扫描,识别按键: 3.9 整体架构 下图呈现了ARM 处理器及外围电路的整体设计框架: 4. 小结 本章讲解了基于S3C 2410A ARM 处理器电路板硬件设计的基本组成,为后续各章提供了总体性的准备工作。 作者: 宋宝华 更新日期:2006-11-21 来源:dev.yesky.com 浏览次数: BootLoader 指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader ,我们可以初始化硬件设备、建立内存空间的映 射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader 是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对BootLoader 归纳出一些通用的概念来,以指导用户特定的BootLoader 设计与实现。 BootLoader 的实现依赖于CPU 的体系结构,因此大多数 BootLoader 都分为stage1 和stage2 两大部分。依赖于CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2 则通常用C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 BootLoader 的 stage1 通常包括以下步骤: · 硬件设备初始化; · 为加载Boot Loader 的stage2 准备 RAM 空间; · 拷贝Boot Loader 的stage2 到RAM 空间中; · 设置好堆栈; · 跳转到 stage2 的 C 入口点。 Boot Loader 的stage2 通常包括以下步骤: · 初始化本阶段要使用到的硬件设备; · 检测系统内存映射(memory map) ; · 将kernel 映像和根文件系统映像从flash 上读到 RAM 空间中; · 为内核设置启动参数; · 调用内核。 本系统中的BootLoader 参照韩国mizi 公司的vivi 进行修改。 1. 开发环境 我们购买了武汉创维特信息技术有限公司开发的具有自主知识产权的应用于嵌入式软件开发的集成软、硬件开发平台ADT (ARM Development Tools )它为基于ARM 核的嵌入式应用提供了一整套完备的开发方案,包括程序编辑、工程管理和设置、程序编译、程序调试等。 ADT 嵌入式开发环境由ADT Emulator for ARM 和ADT IDE for ARM 组成。ADT Emulator for ARM 通过JTAG 实现主机和目标机之间的调试支持功能。它无需目标存储器,不占用目标系统的任何端口资源。目标程序直接在目标板上运行,通过ARM 芯片的JTAG 边界扫描口进行调试,属于完全非插入式调试,其仿真效果接近真实系统。 ADT IDE for ARM 为用户提供高效明晰的图形化嵌入式应用软件开发环境,包括一整套完备的面向嵌入式系统的开发和调试工具:源码编辑器、工程管理器、工程编译器(编译器、汇 编器和连接器)、集成调试环境、ADT Emulator for ARM 调试接口等。其界面同Microsoft Visual Studio 环境相似,用户可以在ADT IDE for ARM 集成开发环境中创建工程、打开工程,建立、打开和编辑文件,编译、连接、设置、运行、调试嵌入式应用程序。 ADT 嵌入式软件开发环境 采用主机-目标机交叉开发模型。ADT IDE for ARM 运行于主机端,而ADT Emulator for ARM 实现ADT IDE for ARM 与目标机之间的连接。开发时,首先由ADT IDE for ARM 编译连接生成目标代码,然后建立与ADT Emulator for ARM 之间的调试通道,调试通道建立成功后,就可以在ADT IDE for ARM 中通过ADT Emulator for ARM 控制目标板实现目标程序的调试,包括将目标代码下载到目标机中,控制程序运行,调试信息观察等等。 2.ARM 汇编 ARM 本身属于RISC 指令系统,指令条数就很少,而其编程又以C 等高级语言为主,我们仅需要在Bootloader 的第一阶段用到少量汇编指令: (1 )+- 运算 ADD r0, r1, r2 ―― r0 := r1 + r2 SUB r0, r1, r2 ―― r0 := r1 - r2 其中的第二个操作数可以是一个立即数: ADD r3, r3, #1 ―― r3 := r3 + 1 第二个操作数还可以是位移操作后的结果: ADD r3, r2, r1, LSL #3 ―― r3 := r2 + 8.r1 (2 )位运算 AND r0, r1, r2 ―― r0 := r1 and r2 ORR r0, r1, r2 ―― r0 := r1 or r2 EOR r0, r1, r2 ―― r0 := r1 xor r2 BIC r0, r1, r2 ―― r0 := r1 and not r2 (3 )寄存器搬移 MOV r0, r2 ―― r0 := r2 MVN r0, r2 ―― r0 := not r2 (4 )比较 CMP r1, r2 ―― set cc on r1 - r2 CMN r1, r2 ―― set cc on r1 + r2 TST r1, r2 ―― set cc on r1 and r2 TEQ r1, r2 ―― set cc on r1 or r2 这些指令影响CPSR 寄存器中的 (N, Z, C, V) 位 (5 )内存操作 LDR r0, [r1] ―― r0 := mem [r1] STR r0, [r1] ―― mem [r1] := r0 LDR r0, [r1, #4] ―― r0 := mem [r1+4] LDR r0, [r1, #4] ! ―― r0 := mem [r1+4] r1 := r1 + 4 LDR r0, [r1], #4 ―― r0 := mem [r1] r1 := r1 +4 LDRB r0 , [r1] ―― r0 := mem8 [r1] LDMIA r1, {r0, r2, r5} ―― r0 := mem [r1] r2 := mem [r1+4] r5 := mem [r1+8] {..} 可以包括r0~r15 中的所有寄存器,若包括r15 (PC) 将导致程序的跳转。 (6 )控制流 例1: MOV r0, #0 ; initialize counter LOOP : ADD r0, r0, #1 ; increment counter CMP r0, #10 ; compare with limit BNE LOOP ; repeat if not equal 例2: CMP r0, #5 ADDNE r1, r1, r0 SUBNE r1, r1, r2 ―― if (r0 != 5) { r1 := r1 + r0 - r2 } 作者: 宋宝华 更新日期
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮