移植嵌入式Linux到ARM处理器

2019-07-12 18:26发布



引言

  ARMAdvanced RISC Machines(高级精简指令系统处理器)的缩写,是ARM公司提供的一种微处理器知识产权(IP)核。

  ARM的应用已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。基于ARM 技术的微处理器应用约占据了32RISC 微处理器75%以上的市场份额。揭开你的手机、MP3 PDA,嘿嘿,里面多半藏着一个基于ARM的微处理器!

  ARM内核的数个系列(ARM7ARM9ARM9EARM10ESecurCoreXscaleStrongARM),各自满足不同应用领域的需求,无孔不入的渗入嵌入式系统各个角落的应用。这是一个ARM的时代!  有人的地方就有江湖(《武林外传》),有嵌入式系统的地方就有ARM

  构建一个复杂的嵌入式系统,仅有硬件是不够的,我们还需要进行操作系统的移植。我们通常在ARM平台上构建Windows CELinuxPalm OS等操作系统,其中Linux具有开放源代码的优点。

  下图显示了基于ARM嵌入式系统中软件与硬件的关系:


  日前,笔者作为某嵌入式ARM(硬件)/Linux(软件)系统的项目负责人,带领项目组成员进行了下述工作:

  (1)基于ARM920T内核S3C2410A 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)同时LoadStore多条指令,以增加数据吞吐量;

  (4)所有指令都条件执行,以增大执行吞吐量。

  ARM体系结构的字长为32位,它们都支持Byte(8)Halfword(16)Word(32)3种数据类型。

  ARM处理器支持7种处理器模式,如下表:


  大部分应用程序都在User模式下运行。当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,也不能改变模式,否则就会导致一次异常。对系统资源的使用由操作系统来控制。

   User模式之外的其它几种模式也称为特权模式,它们可以完全访问系统资源,可以自由地改变模式。其中的FIQIRQsupervisor Abortundefined 5种模式也被称为异常模式。在处理特定的异常时,系统进入这几种模式。这5种异常模式都有各自的额外的寄存器,用于避免在发生异常的时候与用户模式下的程 序发生冲突。

  还有一种模式是system模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User模式下基本相同。它是一种特权模式,用于有访问系统资源请求而又需要避免使用额外的寄存器的操作系统任务。

  程序员可见的ARM寄存器共有37个:31个通用寄存器以及6个针对ARM处理器的不同工作模式所设立的专用状态寄存器,如下图:

  ARM9采用5级流水线操作:指令预取、译码、执行、数据缓冲、写回。ARM9设置了16个字的数据缓冲和4个字的地址缓冲。这5级流水已被很多的RISC处理器所采用,被看作RISC结构的"经典" 3.硬件设计

  3.1 S3C2410A微控制器

  电路板上的ARM微控制器 S3C2410A采用了ARM920T核,它由ARM9TDMI、存储管理单元MMU和高速缓存三部分组成。其中,MMU可以管理虚拟内存,高速缓存由独 立的16KB地址和16KB数据高速Cache组成。ARM920T有两个内部协处理器:CP14CP15CP14用于调试控制,CP15用于存储系 统控制以及测试控制。

   S3C2410A集成了大量的内部电路和外围接口:

   ·LCD控制器(支持STNTFT带有触摸屏的液晶显示屏)

   ·SDRAM控制器

   ·3个通道的UART

   ·4个通道的DMA

   ·4个具有PWM功能的计时器和一个内部时钟

   ·8通道的10ADC

   ·触摸屏接口

   ·I2C总线接口

   ·12S总线接口

   ·两个USB主机接口

   ·一个USB设备接口

   ·两个SPI接口

   ·SD接口

   ·MMC卡接口

   S3C2410A集成了一个具有日历功能的RTC和具有PLL(MPLLUPLL)的芯片时钟发生器。MPLL产生主时钟,能够使处理器工作频率最高 达到203MHz。这个工作频率能够使处理器轻松运行WinCELinux等操作系统以及进行较为复杂的信息处理。UPLL则产生实现USB模块的时 钟。

  下图显示了S3C2410A的集成资源和外围接口:

   我们需要对上图中的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,用于较低性能外设的简单连接,一般是接在AHBASB系统总线上的第二级总线。

  典型的AMBA总线系统如下图:

   S3C2410A将系统的存储空间分成8bank,每个bank的大小是128M字节,共1G字节。Bank0bank5的开始地址是固定的,用于 ROMSRAMbank6bank7可用于ROMSRAMSDRAM。所有内存块的访问周期都可编程,外部Wait也能扩展访问周期。下图给出 了S3C2410A的内存组织:
  下图给出了S3C2410A的数据总线、地址总线和片选电路:
  SDRAM控制信号、集成USB接口电路:
  内核与存储单元供电电路(S3C2410A对于片内的各个部件采用了独立的电源供给,内核采用1.8V供电,存储单元采用3.3V独立供电):
  JTAG标准通过边界扫描技术提供了对电路板上每一元件的功能、互联及相互间影响进行测试的方法,极大地方便了系统电路的调试。

  测试接入端口TAP的管脚定义如下:

  ·TCK:专用的逻辑测试时钟,时钟上升沿按串行方式对测试指令、数据及控制信号进行移位操作,下降沿用于对输出信号移位操作;

  ·TMS:测试模式选择,在TCK上升沿有效的逻辑测试控制信号;

  ·TDI:测试数据输入,用于接收测试数据与测试指令;

  ·TDO:测试数据输出,用于测试数据的输出。

  S3C2410A调试用JTAG接口电路:
3.2 SDRAM存储器

  SDRAM被用来存放操作系统(从FLASH解压缩拷入)以及存放各类动态数据,采用SAMSUNG公司 的K4S561632,它是4Mxl6bitx4bank的同步DRAM,容量为32MB。用2K4S561632实现位扩展,使数据总线宽度达到 32bit,总容量达到64MB,将其地址空间映射在S3C2410Abank6

  SDRAM 所有的输入和输出都与系统时钟CL K上升沿同步,由输入信号RA SCA SWE组合产生SDRAM 控制命令,其基本的控制命令如下:

   SDRAM 在具体操作之前首先必须通过MRS命令设置模式寄存器,以便确定SDRAM 的列地址延迟、突发类型、突发长度等工作模式;再通过ACT命令激活对应地址的组,同时输入行地址;然后通过RD WR 命令输入列地址,将相应数据读出或写入对应的地址;操作完成后用PCH 命令或BT 命令中止读或写操作。在没有操作的时候,每隔一段时间必须用ARF命令刷新数据,防止数据丢失。

  下图给出了SDRAM的连接电路:

  3.3 FLASH存储器

  NORNAND是现在市场上两种主要的非易失闪存技术。

  NOR的特点是芯片内执行(XIPExecute In Place),即应用程序可直接在Flash闪存内运行,不必把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。

  NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理和需要特殊的系统接口,S3C2410A内嵌了NAND FLASH控制器。

  S3C2410A支持从GCS0上的NOR FLASH启动(16位或32位)或从NAND FLASH启动,需要通过OM0OM1上电时的上下拉来设置:

  在系统中分别采用了一片NOR FLASH(28F640)NAND FLASH(K9S1208),电路如下图: 作者:宋宝华   更新日期:2006-11-21
来源:dev.yesky.com   浏览次数:
3.4串口

  S3C2410内部集成了UART控制器,实现了并串转换。外部还需提供CMOS/TTL电平与RS232之间的转换:

  3.5以太网

   以太网控制芯片采用CIRRUS LOGIC公司生产的CS8900A,其突出特点是使用灵活,其物理层接口、数据传输模式和工作模式等都能根据需要而动态调整,通过内部寄存器的设置来适 应不同的应用环境。它符合IEEE803.3以太网标准,带有传送、接收低通滤波的10Base-T连接端口,支持10Base210Base5 10Base-FAUI接口,并能自动生成报头,自动进行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)。

  S3C2410A集成了USB hostUSB device,外部连接电路如下图:
作者:宋宝华   更新日期:2006-11-21
来源:dev.yesky.com   浏览次数:
3.7电源

  LDO(Low Dropout)属于DC/DC变换器中的降压变换器,它具有低成本、低噪声、低功耗等突出优点,另外它所需要的外围器件也很少,通常只有 1~2 个旁路电容。

  在电路板上我们分别用两个LDO来实现5V3.3V(存储接口电平)和1.8VARM内核电平)的转换。


  up监控电路采用MAX708芯片,提供上电、掉电以及降压情况下的复位输出及低电平有效的人工复位输出:
  3.8其它

  SN74LVTH62245A提供总线驱动和缓冲能力:
SN74LVTH62245A
  S3C2410A集成LCD液晶显示器控制电路,外部引出接口:
   触摸屏有电阻式、电容式等,其本质是一种将手指在屏幕上的触点位置转化为电信号的传感器。手指触到屏幕,引起触点位置电阻或电容的变化,再通过检测这一 电性变化,从而获得手指的坐标位置。通过S3C2410A集成的AD功能,完成电信号向屏幕坐标的转化,触摸屏接口如下:
  键盘则直接利用CPU的可编程I/O口,若连接 mxn键盘,则需要m+n个可编程I/O口,由软件实现键盘扫描,识别按键:
  3.9整体架构

  下图呈现了ARM处理器及外围电路的整体设计框架:

  4.小结

  本章讲解了基于S3C2410A 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 Loaderstage2准备 RAM 空间;

  ·拷贝Boot Loaderstage2 RAM空间中;

  ·设置好堆栈;

  ·跳转到 stage2 C 入口点。

  Boot Loaderstage2通常包括以下步骤:

  ·初始化本阶段要使用到的硬件设备;

  ·检测系统内存映射(memory map)

  ·kernel 映像和根文件系统映像从flash上读到 RAM 空间中;

  ·为内核设置启动参数;

  ·调用内核。

  本系统中的BootLoader参照韩国mizi公司的vivi进行修改。

  1.开发环境

   我们购买了武汉创维特信息技术有限公司开发的具有自主知识产权的应用于嵌入式软件开发的集成软、硬件开发平台ADTARM 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 控制目标板实现目标程序的调试,包括将目标代码下载到目标机中,控制程序运行,调试信息观察等等。
ADT IDE
  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
}
作者:宋宝华   更新日期