ARM的嵌入式Linux移植体验.docx
- 文档编号:27282118
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:85
- 大小:58.92KB
ARM的嵌入式Linux移植体验.docx
《ARM的嵌入式Linux移植体验.docx》由会员分享,可在线阅读,更多相关《ARM的嵌入式Linux移植体验.docx(85页珍藏版)》请在冰豆网上搜索。
ARM的嵌入式Linux移植体验
ARM的嵌入式Linux移植体验之基本概念
2006-08-1513:
50作者:
宋宝华出处:
天极开发责任编辑:
方舟
重点推荐:
Linux操作系统应用专区
引言
ARM是AdvancedRISCMachines(高级精简指令系统处理器)的缩写,是ARM公司提供的一种微处理器知识产权(IP)核。
ARM的应用已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。
基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额。
揭开你的手机、MP3、PDA,嘿嘿,里面多半藏着一个基于ARM的微处理器!
ARM内核的数个系列(ARM7、ARM9、ARM9E、ARM10E、SecurCore、Xscale、StrongARM),各自满足不同应用领域的需求,无孔不入的渗入嵌入式系统各个角落的应用。
这是一个ARM的时代!
下面的图片显示了ARM的随处可见:
有人的地方就有江湖(《武林外传》),有嵌入式系统的地方就有ARM。
构建一个复杂的嵌入式系统,仅有硬件是不够的,我们还需要进行操作系统的移植。
我们通常在ARM平台上构建WindowsCE、Linux、PalmOS等操作系统,其中Linux具有开放源代码的优点。
下图显示了基于ARM嵌入式系统中软件与硬件的关系:
日前,笔者作为某嵌入式ARM(硬件)/Linux(软件)系统的项目负责人,带领项目组成员进行了下述工作:
(1)基于ARM920T内核S3C2410ACPU的电路板设计;
(2)ARM处理下底层软件平台搭建:
a.Bootloader的移植;
b.嵌入式Linux操作系统内核的移植;
c.嵌入式Linux操作系统根文件系统的创建;
d.电路板上外设Linux驱动程序的编写。
本文将真实地再现本项目开发过程中作者的心得,以便与广大读者共勉。
第一章将简单地介绍本ARM开发板的硬件设计,第二章分析Bootloader的移植方法,第三章叙述嵌入式miziLinux的移植及文件系统的构建方法,第四章讲解外设的驱动程序设计,第五章给出一个已构建好的软硬件平台上应用开发的实例。
如果您有嵌入式系统的开发基础,您将非常容易领会本文讲解地内容。
即便是您从来没有嵌入式系统的开发经历,本文读起来也不会生涩。
您可以通过如下email与作者联系:
。
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和undefined5种模式也被称为异常模式。
在处理特定的异常时,系统进入这几种模式。
这5种异常模式都有各自的额外的寄存器,用于避免在发生异常的时候与用户模式下的程序发生冲突。
还有一种模式是system模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User模式下基本相同。
它是一种特权模式,用于有访问系统资源请求而又需要避免使用额外的寄存器的操作系统任务。
程序员可见的ARM寄存器共有37个:
31个通用寄存器以及6个针对ARM处理器的不同工作模式所设立的专用状态寄存器,如下图:
ARM9采用5级流水线操作:
指令预取、译码、执行、数据缓冲、写回。
ARM9设置了16个字的数据缓冲和4个字的地址缓冲。
这5级流水已被很多的RISC处理器所采用,被看作RISC结构的"经典"。
3.硬件设计
3.1S3C2410A微控制器
电路板上的ARM微控制器S3C2410A采用了ARM920T核,它由ARM9TDMI、存储管理单元MMU和高速缓存三部分组成。
其中,MMU可以管理虚拟内存,高速缓存由独立的16KB地址和16KB数据高速Cache组成。
ARM920T有两个内部协处理器:
CP14和CP15。
CP14用于调试控制,CP15用于存储系统控制以及测试控制。
S3C2410A集成了大量的内部电路和外围接口:
·LCD控制器(支持STN和TFT带有触摸屏的液晶显示屏)
·SDRAM控制器
·3个通道的UART
·4个通道的DMA
·4个具有PWM功能的计时器和一个内部时钟
·8通道的10位ADC
·触摸屏接口
·I2C总线接口
·12S总线接口
·两个USB主机接口
·一个USB设备接口
·两个SPI接口
·SD接口
·MMC卡接口
S3C2410A集成了一个具有日历功能的RTC和具有PLL(MPLL和UPLL)的芯片时钟发生器。
MPLL产生主时钟,能够使处理器工作频率最高达到203MHz。
这个工作频率能够使处理器轻松运行WinCE、Linux等操作系统以及进行较为复杂的信息处理。
UPLL则产生实现USB模块的时钟。
下图显示了S3C2410A的集成资源和外围接口:
我们需要对上图中的AHB总线和APB总线的概念进行一番解释。
ARM核开发的目的,是使其作为复杂片上系统的一个处理单元来应用的,所以还必须提供一个ARM与其它片上宏单元通信的接口。
为了减少不必要的设计资源的浪费,ARM公司定义了AMBA(AdvancedMicrocontrollerBusArchitecture)总线规范,它是一组针对基于ARM核的、片上系统之间通信而设计的、标准的、开放协议。
在AMBA总线规范中,定义了3种总线:
(l)AHB-AdvancedHighPerformaceBus,用于高性能系统模块的连接,支持突发模式数据传输和事务分割;
(2)ASB-AdvancedSystemBus,也用于高性能系统模块的连接,支持突发模式数据传输,这是较老的系统总线格式,后来由AHB总线替代;
(3)APB-AdvancedPeriPheralBus,用于较低性能外设的简单连接,一般是接在AHB或ASB系统总线上的第二级总线。
典型的AMBA总线系统如下图:
S3C2410A将系统的存储空间分成8个bank,每个bank的大小是128M字节,共1G字节。
Bank0到bank5的开始地址是固定的,用于ROM或SRAM。
bank6和bank7可用于ROM、SRAM或SDRAM。
所有内存块的访问周期都可编程,外部Wait也能扩展访问周期。
下图给出了S3C2410A的内存组织:
下图给出了S3C2410A的数据总线、地址总线和片选电路:
SDRAM控制信号、集成USB接口电路:
内核与存储单元供电电路(S3C2410A对于片内的各个部件采用了独立的电源供给,内核采用1.8V供电,存储单元采用3.3V独立供电):
JTAG标准通过边界扫描技术提供了对电路板上每一元件的功能、互联及相互间影响进行测试的方法,极大地方便了系统电路的调试。
测试接入端口TAP的管脚定义如下:
·TCK:
专用的逻辑测试时钟,时钟上升沿按串行方式对测试指令、数据及控制信号进行移位操作,下降沿用于对输出信号移位操作;
·TMS:
测试模式选择,在TCK上升沿有效的逻辑测试控制信号;
·TDI:
测试数据输入,用于接收测试数据与测试指令;
·TDO:
测试数据输出,用于测试数据的输出。
S3C2410A调试用JTAG接口电路:
3.2SDRAM存储器
SDRAM被用来存放操作系统(从FLASH解压缩拷入)以及存放各类动态数据,采用SAMSUNG公司的K4S561632,它是4Mxl6bitx4bank的同步DRAM,容量为32MB。
用2片K4S561632实现位扩展,使数据总线宽度达到32bit,总容量达到64MB,将其地址空间映射在S3C2410A的bank6。
SDRAM所有的输入和输出都与系统时钟CLK上升沿同步,由输入信号RAS、CAS、WE组合产生SDRAM控制命令,其基本的控制命令如下:
SDRAM在具体操作之前首先必须通过MRS命令设置模式寄存器,以便确定SDRAM的列地址延迟、突发类型、突发长度等工作模式;再通过ACT命令激活对应地址的组,同时输入行地址;然后通过RD或WR命令输入列地址,将相应数据读出或写入对应的地址;操作完成后用PCH命令或BT命令中止读或写操作。
在没有操作的时候,每隔一段时间必须用ARF命令刷新数据,防止数据丢失。
下图给出了SDRAM的连接电路:
3.3FLASH存储器
NOR和NAND是现在市场上两种主要的非易失闪存技术。
NOR的特点是芯片内执行(XIP,ExecuteInPlace),即应用程序可直接在Flash闪存内运行,不必把代码读到系统RAM中。
NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
应用NAND的困难在于Flash的管理和需要特殊的系统接口,S3C2410A内嵌了NANDFLASH控制器。
S3C2410A支持从GCS0上的NORFLASH启动(16位或32位)或从NANDFLASH启动,需要通过OM0和OM1上电时的上下拉来设置:
在系统中分别采用了一片NORFLASH(28F640)和NANDFLASH(K9S1208),电路如下图:
3.4串口
S3C2410内部集成了UART控制器,实现了并串转换。
外部还需提供CMOS/TTL电平与RS232之间的转换:
3.5以太网
以太网控制芯片采用CIRRUSLOGIC公司生产的CS8900A,其突出特点是使用灵活,其物理层接口、数据传输模式和工作模式等都能根据需要而动态调整,通过内部寄存器的设置来适应不同的应用环境。
它符合IEEE803.3以太网标准,带有传送、接收低通滤波的10Base-T连接端口,支持10Base2,10Base5和10Base-F的AUI接口,并能自动生成报头,自动进行CRC检验,在冲突后自动重发。
CS8900A支持的传输模式有I/O和Memory模式。
当CS8900A有硬件复位或软件复位时,它将默认成为8位工作模式。
因此,要使CS8900A工作于16位模式,系统必须在访问之前提供给总线高位使能管脚(/SBHE)一个由高到低、再由低到高变化的电平。
3.6USB接口
USB系统由USB主机(USBHost)、USB集线器(USBHub)和USB设备(USBDevice)组成。
USB和主机系统的接口称作主机控制器(HostController),它是由硬件和软件结合实现的。
根集线器是综合于主机系统内部的,用以提供USB的连接点。
USB的设备包括集线器(Hub)和功能器件(Function)。
S3C2410A集成了USBhost和USBdevice,外部连接电路如下图:
3.7电源
LDO(LowDropout)属于DC/DC变换器中的降压变换器,它具有低成本、低噪声、低功耗等突出优点,另外它所需要的外围器件也很少,通常只有1~2个旁路电容。
在电路板上我们分别用两个LDO来实现5V向3.3V(存储接口电平)和1.8V(ARM内核电平)的转换。
up监控电路采用MAX708芯片,提供上电、掉电以及降压情况下的复位输出及低电平有效的人工复位输出:
3.8其它
SN74LVTH62245A提供总线驱动和缓冲能力:
S3C2410A集成LCD液晶显示器控制电路,外部引出接口:
触摸屏有电阻式、电容式等,其本质是一种将手指在屏幕上的触点位置转化为电信号的传感器。
手指触到屏幕,引起触点位置电阻或电容的变化,再通过检测这一电性变化,从而获得手指的坐标位置。
通过S3C2410A集成的AD功能,完成电信号向屏幕坐标的转化,触摸屏接口如下:
键盘则直接利用CPU的可编程I/O口,若连接mxn键盘,则需要m+n个可编程I/O口,由软件实现键盘扫描,识别按键:
3.9整体架构
下图呈现了ARM处理器及外围电路的整体设计框架:
4.小结
本章讲解了基于S3C2410AARM处理器电路板硬件设计的基本组成,为后续各章提供了总体性的准备工作。
ARM的嵌入式Linux移植体验之BootLoader
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。
通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。
因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。
尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。
BootLoader的stage1通常包括以下步骤:
·硬件设备初始化;
·为加载BootLoader的stage2准备RAM空间;
·拷贝BootLoader的stage2到RAM空间中;
·设置好堆栈;
·跳转到stage2的C入口点。
BootLoader的stage2通常包括以下步骤:
·初始化本阶段要使用到的硬件设备;
·检测系统内存映射(memorymap);
·将kernel映像和根文件系统映像从flash上读到RAM空间中;
·为内核设置启动参数;
·调用内核。
本系统中的BootLoader参照韩国mizi公司的vivi进行修改。
1.开发环境
我们购买了武汉创维特信息技术有限公司开发的具有自主知识产权的应用于嵌入式软件开发的集成软、硬件开发平台ADT(ARMDevelopmentTools)它为基于ARM核的嵌入式应用提供了一整套完备的开发方案,包括程序编辑、工程管理和设置、程序编译、程序调试等。
ADT嵌入式开发环境由ADTEmulatorforARM和ADTIDEforARM组成。
ADTEmulatorforARM通过JTAG实现主机和目标机之间的调试支持功能。
它无需目标存储器,不占用目标系统的任何端口资源。
目标程序直接在目标板上运行,通过ARM芯片的JTAG边界扫描口进行调试,属于完全非插入式调试,其仿真效果接近真实系统。
ADTIDEforARM为用户提供高效明晰的图形化嵌入式应用软件开发环境,包括一整套完备的面向嵌入式系统的开发和调试工具:
源码编辑器、工程管理器、工程编译器(编译器、汇编器和连接器)、集成调试环境、ADTEmulatorforARM调试接口等。
其界面同MicrosoftVisualStudio环境相似,用户可以在ADTIDEforARM集成开发环境中创建工程、打开工程,建立、打开和编辑文件,编译、连接、设置、运行、调试嵌入式应用程序。
ADT嵌入式软件开发环境采用主机-目标机交叉开发模型。
ADTIDEforARM运行于主机端,而ADTEmulatorforARM实现ADTIDEforARM与目标机之间的连接。
开发时,首先由ADTIDEforARM编译连接生成目标代码,然后建立与ADTEmulatorforARM之间的调试通道,调试通道建立成功后,就可以在ADTIDEforARM中通过ADTEmulatorforARM控制目标板实现目标程序的调试,包括将目标代码下载到目标机中,控制程序运行,调试信息观察等等。
2.ARM汇编
ARM本身属于RISC指令系统,指令条数就很少,而其编程又以C等高级语言为主,我们仅需要在Bootloader的第一阶段用到少量汇编指令:
(1)+-运算
ADDr0,r1,r2
――r0:
=r1+r2
SUBr0,r1,r2
――r0:
=r1-r2
其中的第二个操作数可以是一个立即数:
ADDr3,r3,#1
――r3:
=r3+1
第二个操作数还可以是位移操作后的结果:
ADDr3,r2,r1,LSL#3
――r3:
=r2+8.r1
(2)位运算
ANDr0,r1,r2
――r0:
=r1andr2
ORRr0,r1,r2
――r0:
=r1orr2
EORr0,r1,r2
――r0:
=r1xorr2
BICr0,r1,r2
――r0:
=r1andnotr2
(3)寄存器搬移
MOVr0,r2
――r0:
=r2
MVNr0,r2
――r0:
=notr2
(4)比较
CMPr1,r2
――setcconr1-r2
CMNr1,r2
――setcconr1+r2
TSTr1,r2
――setcconr1andr2
TEQr1,r2
――setcconr1orr2
这些指令影响CPSR寄存器中的(N,Z,C,V)位
(5)内存操作
LDRr0,[r1]
――r0:
=mem[r1]
STRr0,[r1]
――mem[r1]:
=r0
LDRr0,[r1,#4]
――r0:
=mem[r1+4]
LDRr0,[r1,#4]!
――r0:
=mem[r1+4]r1:
=r1+4
LDRr0,[r1],#4
――r0:
=mem[r1]r1:
=r1+4
LDRBr0,[r1]
――r0:
=mem8[r1]
LDMIAr1,{r0,r2,r5}
――r0:
=mem[r1]r2:
=mem[r1+4]r5:
=mem[r1+8]
{..}可以包括r0~r15中的所有寄存器,若包括r15(PC)将导致程序的跳转。
(6)控制流
例1:
MOVr0,#0;initializecounter
LOOP:
ADDr0,r0,#1;incrementcounter
CMPr0,#10;comparewithlimit
BNELOOP;repeatifnotequal
例2:
CMPr0,#5
ADDNEr1,r1,r0
SUBNEr1,r1,r2
――
if(r0!
=5){
r1:
=r1+r0-r2
}
3.BootLoader第一阶段
3.1硬件设备初始化
基本的硬件初始化工作包括:
·屏蔽所有的中断;
·设置CPU的速度和时钟频率;
·RAM初始化;
·初始化LED
ARM的中断向量表设置在0地址开始的8个字空间中,如下表:
每当其中的某个异常发生后即将PC值置到相应的中断向量处,每个中断向量处放置一个跳转指令到相应的中断服务程序去进行处理,中断向量表的程序如下:
@0x00:
Reset
bReset
@0x04:
Undefinedinstructionexception
UndefEntryPoint:
bHandleUndef
@0x08:
Softwareinterruptexception
SWIEntryPoint:
bHandleSWI
@0x0c:
PrefetchAbort(InstructionFetchMemoryAbort)
PrefetchAbortEnteryPoint:
bHandlePrefetchAbort
@0x10:
DataAccessMemoryAbort
DataAbortEntryPoint:
bHandleDataAbort
@0x14:
Notused
NotUsedEntryPoint:
bHandleNotUsed
@0x18:
IRQ(InterruptRequest)exception
IRQEntryPoint:
bHandleIRQ
@0x1c:
FIQ(FastInterruptRequest)exception
FIQEntryPoint:
bHandleFIQ
复位时关闭看门狗定时器、屏蔽所有中断:
Reset:
@disablewatchdogtimer
movr1,#0x
movr2,#0x0
strr2,[r1]
@disableallinterrupts
movr1,#INT_CTL_BASE
movr2,#0xffffffff
strr2,[r1,#oINTMSK]
ldrr2,=0x7ff
strr2,[r1,#oINTSUBMSK]
设置系统时钟:
@initclk
@1:
2:
4
movr1,#CLK_CTL_BASE
movr2,#0x3
strr2,[r1,#oCLKDIVN]
mrcp15,0,r1,c1,c0,0@readctrlregister
orrr1,r1,#0xc0000000@Asynchronous
mcrp15,0,r1,c1,c0,0@writectrlregister
@now,CPUclockis200Mhz
movr1,#CLK_CTL_BASE
ldrr2,mpll_200mhz
strr2,[r1,#oMPLLCON]
点亮所有的用户LED:
@AllLEDon
movr1,#GPIO_CTL_BASE
addr1,r1,#oGPIO_F
ldrr2,=0x55aa
strr2,[r1,#oGPIO_CON]
movr2,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 嵌入式 Linux 移植 体验