收藏 分享(赏)

第8章 处理器核心电路设计和底层软件移植.ppt

上传人:tkhy51908 文档编号:6909730 上传时间:2019-04-26 格式:PPT 页数:78 大小:488KB
下载 相关 举报
第8章 处理器核心电路设计和底层软件移植.ppt_第1页
第1页 / 共78页
第8章 处理器核心电路设计和底层软件移植.ppt_第2页
第2页 / 共78页
第8章 处理器核心电路设计和底层软件移植.ppt_第3页
第3页 / 共78页
第8章 处理器核心电路设计和底层软件移植.ppt_第4页
第4页 / 共78页
第8章 处理器核心电路设计和底层软件移植.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

1、第八章 处理器核心电路设计和 底层软件移植,本章要点处理器与Flash、SDRAM等构成的最小硬件系统电路 Uboot移植 利用Uboot调试硬件 移植Linux26内核,8.1 最小硬件系统设计,嵌入式系统的具体硬件设计会随着设计应用系统的不同而有所差别。一般情况下,用户可以根据自己的要求,选用合适的微处理器类型,根据相应的接口电路,搭配不同类型的外设,构成不同用途、不同规模的应用系统。下面以PXA255处理器为例,说明由处理器与Flash和SDRAM等外围电路构成的最小硬件系统的设计原理。此最小硬件系统中的各个器件的连接关系参见图8-1。此外,为了便于开发调试,也可以增加网卡和串口部分的电

2、路。,嵌入式系统课件,3,图8-1 最小系统原理框图,嵌入式系统课件,4,PXA2XX系列处理器的存储器接口支持各种存储器芯片,包括SDRAM、F1ash、SMROM、ROM、SRAM及与SRAM类似的可变延迟I0等。下面以PXA255处理器为例,说明嵌入式系统中最常用的SDRAM和Flash存储器与处理器的接口设计。如图8-2所示,PXA255处理器的存储器接口将其支持的存储器类型分为动态存储器和静态存储器两类。其中动态存储器分为4个块,静态存储器分为6个块。每块都有64MB的寻址空间,它的物理地址由片选信号(chip Select)控制。PXA255处理器的数据总线和地址总线通过缓冲区,分

3、别和外部存储器的地址线、数据线相连。,8.1.1 系统存储器接口,图8-2 PXA255存储器控制接口框图,嵌入式系统课件,6, MD31:0是PXA255的数据总线; nS-DCSx是PXA255的动态存储器片选信号; nCSx是PXA255的静态存储器片选信号。,嵌入式系统课件,7,PXA2XX处理器往往使用大容量的片外存储器作为程序或数据存储器,例如采用外部Flash和SDRAM存储器。外部存储器有16位宽度的,也有32位宽度的,而PXA2XX的总线宽度是32位的,所以对于16位的外部存储器,必须进行“位扩展”,即通过并联两块16位的外部存储器构成一个32位的存储系统。本书的开发板使用的

4、Flash存储器和SDRAM存储器;采用这种“位扩展”的方法,使得系统数据总线工作在32位的模式下。 下面就以异步静态存储器(Flash)和同步动态存储器(SDRAM)为例,说明PXA2XX系统的存储器扩展原理。,嵌入式系统课件,8,1异步静态存储器接口设计原理 如图8-3所示,采用两片Intel的E28F128J3A-150 Flash芯片,构成了32 MB的F1ash存储器。这里的Flash芯片是16位的,故采用两块并联的方法为处理器提供32位的数据总线支持。,图8-3 Flash电路原理框图,由于处理器从Flash读出的数据是32位的,所以在对其寻址时,地址以4字节为单位递增,并且一次性

5、从数据总线上得到4字节的数据。例如,对Ox00000000进行寻址,将从数据总线上获得x000000000x00000003总共4字节的数据。因此,PXA255的地址线上的SA-A0和SA-A1不与芯片连接。对于这样的Flash外围电路,对FLASH的0x00000001;(Ox00000002、0x00000003)进行寻址,也能获得对地址0x00000000进行寻址相同的效果。,对于每片芯片来说,数据的输出是以16位为单位,即2字节。所以每片芯片地址按字对齐,地址线的A0引脚应连接到地。 处理器启动时,从Ox00000000地址开始执行代码。为了从Flash引导系统,它必须接到静态存储器的

6、块0(Bank0),所以它使用处理器的nCS0作为片选信号。F1ash的其他控制脚由处理器内部集成的Static Memory控制器进行控制。,嵌入式系统课件,12,2SDRAM存储器接口设计原理 下面采用两片Samsung的K4S281632C,构成了64MB的SDRAM存储器。如图8-4所示,由于SDRAM数据宽度为16位,采用两片并联的方法与PXA255处理器连接,提供32位的支持。,图8-4 SDRAM 电路原理框图,嵌入式系统课件,14,K4S281632C是4M16位4Bank的SDRAM存储器,总共有32MB的存储空间。处理器地址线的SA-A22和SA-A23引脚连接到SDRAM

7、芯片的BA1:0引脚,决定4个片内Bank的选择;处理器地址线的SA-A10SA-A21和SA-A24则分别连接到SDRAM的A0A11、A12引脚。SDRAM连接到处理器动态存储器的第0块,故选用处理器的nSDCS0作为片选信号。SDRAM的其余引脚则由处理器内部集成的Dynamic Memory控制器进行控制。,嵌入式系统课件,15,8.1.2 串口电路原理串行通信只有两条信号线,所以电路比较简单。PXA255处理器有3个UART接口,此处选用全功能UART(FFUART)作为最小系统的调试串口。 FFUART须使用GP34和GP39引脚的第二功能。它的连接电路很简单,只要通过一个RS23

8、2的收发器,完成TTLCMOS电平到RS232电平的转换即可(图85)。,图8-5 串口电路原理,FF_TXD/ GP39,PXA255,FF_RXD/ GP34,RS232 Transceiver,8.2 最小硬件系统的配置,8.2.1 处理器的配置,系统上电之后,软件引导代码首先要根据硬件设计初始化PXA255处理器。所以,对处理器的配置是否正确直接决定系统软件能否正常工作。对PXA255处理器的配置将使用到三个非常重要寄存器,分别是CCCR、CKEN和ICMR寄存器。它们的定义和作用如表4-1所列。,表8-1 CCCR、CKEN和ICMR的定义和作用,嵌入式系统课件,19,CCCR(Co

9、re Clock Configuration Register)寄存器控制着内存、LCD、DMA控制器所使用的时钟。这些时钟都是由处理器的3.6864MHz钟振倍频上去的,控制倍频比例的参数有三个,见表4-2。,1. CCCR寄存器,表8-2 CCCR控制倍频比例的参数,嵌入式系统课件,20,本书使用的开发板是1.3V电源供电,系统时钟全部由CPU提供,最快可以达到100MHz的内存时钟,400MHz的运行时钟和400MHz的Turbo模式时钟。,L=27,M=4,N=1,Reserved CCCR31:10 =0 N=1 CCCR9:7 =010 (未用) M=4 CCCR6:5 =11 L

10、=27 CCCR4:0 =00001 最终的CCCR寄存器的值应当配置为0x00000161,注:CCCR中N、M、L的位定义对应其取值序号,嵌入式系统课件,21,CKEN(Clock Enable Register)寄存器是一个控制外部设备时钟使能的寄存器。它对嵌入式系统的电量消耗有着决定性的作用;对于那些没有用到的外设,应当关闭其时钟供应。CKEN的O16位控制着13种外设的时钟使能(其中有4位保留)。它们的对应关系如下:,2. CKEN寄存器,LCD设备 CKEN16=1 FICP设备 CKENl5=1 I2C设备 CKEN14=1 MMC设备 CKEN12=1 USB设备 CKEN1l

11、=1 NSSP设备 CKEN10=1 I2s设备 CKEN8 =1 BTUART、FFUIART、STUART、HWUART CKEN7:5=111 SSP设备 CKEN4 =1 AC97、SSP设备 CKEN3:2=11 其余=0,实际上,最小硬件系统只需要调试串口,故只需要为FFUART提供时钟。CKEN只需要被设置成0x00000040。实际使用中应根据具体需要,开启某种外设的时钟。,嵌入式系统课件,23,ICMR(Interrupt Controller Mask Register)寄存器是中断使能寄存器。1代表使能,0代表屏蔽。一般来说,PXA255处理器在Bootloader启动阶

12、段必须屏蔽所有中断,所以ICMR寄器应当设置为0x00000000。,3. ICMR寄存器,嵌入式系统课件,24,搭建嵌入式系统时,存储器的配置是最重要的,也是最基础的。上电之后,PXA255处理器就开始从物理的0x00000000读第一条指令,这第一条指令就是存储在Flash里的。如果Flash没有配置正确,CPU将取不到正确的指令。同样,Bootloader启动时一般会将自身复制到SDRAM,然后在SDRAM里运行。因此, 只有SDRAM配置正确,Bootloader的启动流程才能顺利执行。 Flash和SDRAM的配置同属于存储器配置,考虑的对象和涉及的寄存器比较相近。存储器的配置涉及两

13、个比较重要的寄存器,见表4-3,8.2.2 FlashSDRAM的配置,表8-3 与存储器配置相关的寄存器,嵌入式系统课件,26,MSCx(Asynchronous Static Memory Control Registers)寄存器是存储器控制功能中极其重要的寄存器,它记录了存储器的性质、位宽和操作的实际参数。MSCx一般用来控制外部静态的存储器,在本书所用的开发板上,它用于控制Flash和网卡。MSCx寄存器总共有三个,它们分别是MSCO、MSCl和MSC2。每个寄存器最多可以控制两个外部静态存储器块,这三个寄存器总共可以控制多达6个外部静态存储器块nCS0:1、nCS2:3、nCS4:

14、5。只有MSCx寄存器配置正确,其对应的片选信号才可以使能相应的静态存储器访问。MSCx十分重要,因为它记录了有关于存储器的几个重要参数,见P197表8-4所列。,1MSCx寄存器,嵌入式系统课件,27,Flash连接到nCS0,如P198图8-6所示,网卡采用nCSl(即SA一(2SI#)片选信号。可以使用P198表8-5的配置清单设置MCS0,以正确访问Flash存储器和网卡的I0地址空间。,嵌入式系统课件,28,MDCNFG(SDRAM MDCNFG Register)寄存器控制PXA255处理器的同步动态随机存储器的操作参数,如果这些配置不正确,SDRAM将不能被初始化,软件启动将无法

15、完成。MDCNFG有很多配置项,主要如P199表8-6中所列。,2. MDCNFG寄存器,嵌入式系统课件,29,PXA255处理器有84个通用(General-Purpose)IO口。每一个GPIO引脚既可以当做普通的IO用,也可以把它们配置成具有第二功能的引脚。GPIO的配置与PXA255处理器所接的外部设备有关。例如,本书所用的开发板的串口和网卡用到一些相关的GPIO寄存器,因此,在系统启动时应对它们进行正确配置。GPIO的配置主要由几个寄存器完成,见表-。,4.2.3 GPIO和串口的配置,表- 完成GPIO配置的相关寄存器,由P200图8-7可以看出,GPl5的引脚应当配置成nCSl,

16、方向为输出。由P201图8-8可以看出,GP34和GP39作为FF-Rx和FF-TX连接到RS232传输芯片SP3223ECY,它们应当使用FFUART功能,并且分别设置成输入和输出。具体设置如下:GPDR015=1GPDR17 =1GAFR1_L5:4 =01GAFR1_L15:14 =10其他各引脚的配置均为0。,8.3 最小硬件系统与Bootloader,Bootloader是系统加电后运行的第一段软件代码,Bootloader的最终目标就是正确地调用内核来执行。因此,Bootloader只需要初始化CPU、Flash、SDRAM,让Linux内核得以运行即可。本节介绍的Bootload

17、er的任务框架就是针对PXA255的最小硬件系统来进行初始化的。其他设备的初始化,完全可以交由内核完成。,在嵌入式系统中,内核映像、根文件系统映像都存储在ROM或Flash中,直接在固态存储设备中运行程序的速度很慢。因此,Bootloader的工作之一就是将内核映像与根文件系统映像加载到RAM中,然后使之运行。由于Bootloader的实现依赖于CPU的体系结构,因此,大多数Bootloader的执行都可分为阶段1和阶段2两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在阶段1执行,而且通常都用汇编语言来实现,以达到短小精悍的目的。而阶段2的代码则通常用C语言来实现,这样可

18、以实现复杂的功能,而且代码会具有更好的可读性和可移植性。,Bootloader的阶段1执行通常包括以下步骤(以执行的先后顺序):硬件设备初始化;为加载Bootloader的阶段2代码准备 RAM空间;复制Bootloader的阶段2代码到RAM空间中;设置好堆栈;跳转到阶段2代码的C入口点。,Bootloader的阶段2执行通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备;检测系统内存映射(Memor_y map);将内核映像和根文件系统映像从Flash上读到RAM空间中;为内核设置启动参数;启动内核。,嵌入式系统课件,36,对于PXA系列处理器,U-boot的阶段1代码在

19、U-boot源代码的cpupxastart.S文件里,这是一个汇编代码文件。,8.3.1 U-boot启动阶段1的处理过程,嵌入式系统课件,37,这是Bootloader一开始就执行的操作,其目的是为阶段2的执行以及随后的内核的执行准备好一些基本的硬件环境。通常包括以下步骤(以执行的先后顺序):屏蔽所有的中断。在Bootloader中通常不使用中断,因此在Bootloader的执行全过程中可以屏蔽中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。设置CPU的速度和时钟频率。RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存

20、器等。初始化LED。典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板上没有LED,那么也可以通过初始化UART向串口打印Bootloader 的Logo字符信息来完成这一点。关闭CPU内部指令数据Cache。,1. 基本的硬件初始化,各个步骤具体实现代码如下:(a)配置中断。 P202(b)配置复位控制器。P202-203(c)配置系统时钟。 P203(d)配置时钟管理寄存器。 P203(e)配置RS232串口。 P203(f)CPU初始化。 P203-204(h)RAM初始化。 P203-204,嵌入式系统课件,39,为了获得更快的执行速度,通常把阶段2代

21、码加载到RAM空间中来执行,因此必须为加载Bootloader的阶段2代码准备好一段可用的RAM空间范围。通常,阶段2代码执行需要使用堆栈,因此在考虑空间大小时,除了阶段2代码可执行映像的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是内存页面大小(通常是4KB)的倍数。,2. 为加载阶段2代码准备RAM空间,一般而言,512 KB的RAM空问已经足够了。具体的地址范围可以任意安排,比如U-boot就将它的阶段2可执行映像安排到从系统RAM的顶端地址开始的512 KB空间内执 行,即RAM末尾-512KB至RAM末尾。,嵌入式系统课件,41,复制时要确定两点:Bootloader可执行

22、映像在固态存储设备的存放起始地址和终止地址。通常由于阶段1所占空间较小,许多Bootloader程序直接将整个Bootloader代码复制到内存空间。复制的目标地址。本书所移植的U-boot的复制目标地址为Oxa3f80000,用TEXT_BASE表示。U-boot用以下代码来确定这两个重要信息, 见P205。,3. 复制阶段2代码到内存中,嵌入式系统课件,42,复制时要确定两点:Bootloader可执行映像在固态存储设备的存放起始地址和终止地址。通常由于阶段1所占空间较小,许多Bootloader程序直接将整个Bootloader代码复制到内存空间。复制的目标地址。本书所移植的U-boot

23、的复制目标地址为Oxa3f80000,用TEXT_BASE表示。U-boot用以下代码来确定这两个重要信息, 见P205。,4. 复制阶段2代码到内存中,嵌入式系统课件,43,堆栈指针的设置是为了执行C语言代码作好准备。经过上述这些执行步骤后,系统的物理内存布局如P206图8-9所示。其中,_TEXT_BASE即Bootloader代码在内存空间的起始地址,_bss_start即堆栈的起始地址。堆栈指针设置代码如P206:,4. 设置堆栈指针,FLASH地址空间,RAM 地址空间,_TEXT_BASE,_bss_start,Bootlooder代码在内存空间的起始地址,堆栈的起始地址,图8-9

24、,嵌入式系统课件,45,在上述一切就绪后,就可以跳转到Boot-loader的阶段2去执行了。比如,在ARM系统中,这可以通过修改PC寄存器为合适的地址来实现。因为此时,在RAM中已经有了Boot-loader的一份完全一样的复制。跳转的实现代码如P207:,5. 跳转到阶段2代码的C入口点,嵌入式系统课件,46,阶段2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。在U-bootl.1.2中,从阶段1到阶段2的跳转是通过“ldr pc,_start_armboot”命令直接跳转的。Start_armboot函数用C语言编写,位于lib_armboard.c中

25、。,8.3.2 U-boot启动阶段2的处理过程,嵌入式系统课件,47,本阶段要使用到的硬件设备通常包括: 初始化至少一个串口,以便和终端用 户进行IO输出信息。 初始化FrameBuffer、Flash、网卡、计时器等。在初始化这些设备之前,也可以重新把LED灯点亮,以表明U-boot已经进入main()函数执行。设备初始化完成后,可以输出一些打印信息,如程序名称字符串、版本号等。,1. 初始化本阶段要使用到的硬件设备,嵌入式系统课件,48,完成初始化阶段2用到的硬件之后,就要初始化命令控制台了。初始化命令控制台主要由main_loop()函数完成。 I 以下是跳转至main_loop的语句

26、,它其实是start_armboot()函数的最后一句。for(;)main_loop();,2. 初始化命令控制台,main_loop()这是一个永远不能返回的函数。如果返回,就意味着重新启动。它位于commonmainc文件中。mainloop()函数主要任务是:处理命令控制台,包括初始化命令控制台、接收命令输入、自动延时等待或自动执行boot,cmd命令等。请注意,main_loop()函数里会调用run_command(p,0)函数,该函数将用户输入的命令控制台指令交由U-boot执行。Main_loop()函数和run_command()函数都位于commonmainc文件中。,嵌入

27、式系统课件,50,如果用户在环境变量里设置了bootcmd的值,则Uboot会自动调用bootm启动内核。bootm的源代码中,最关键的函数是thekernel()。thekernel()函数是用来调用内核的。P208源程序摘自lib_armarmlinux.c:注意,theKernel()函数调用是永远不返回的。如果这个调用返回,则说明出错。,3. 调用内核,嵌入式系统课件,51,U-boot的功能强大,它能够提供对许多外设的支持,如IDE硬盘、实时时钟、开机画面等。但是,其最基本的任务是为内核执行做好准备,并启动内核。不论用户使用U-boot的目的有多大的不同,都必须先配置好PXA255、

28、Flash、内存、串口还有其他GPIO引脚。配置好这些后Bootloader才可以正常运行。 下面针对最小硬件系统,介绍如何配置PXA255、Flash、内存、串口及通用输入输出引脚,并编写U-boot代码。此外,由于U-boot支持网络功能,简单介绍如何配置网卡。,8.3.3 U-boot移植原理,嵌入式系统课件,52,表8-8 U-boot目录结构,1. U-boot的目录树结构,嵌入式系统课件,53,为一个新的平台移植U-boot,首先要做的工作就是在board目录下增加一个新的开发板的目录,例如,可以为所用的PXA255开发板建立一个名为xmu255的目录。 I xmu255目录需要有

29、以下几个文件:config.mk、flash.c、Makefile、memsetup.s、u-boot.1ds及 xmu255.c。其中,config.mk是用来记录U-boot复制到内存的基址,flash.c用来配置F1ash,memsetup.S用来初始化配置内存,u-boot.1ds是内核链接器的脚本文件。Xmu255.c用于开发板的初始化。除了新建一个开发板的目录并编写该目录下的相关文件外,还需要在include/configs目录下增加一个新平台的配置文件。该配置文件和硬件系统配置息息相关,它需记录新平台的所有配置参数。以PXA255最小硬件系统为例,详细介绍相关的配置细节。,嵌入式

30、系统课件,55,根据8.2.1小节对CCCR核心时钟配置寄存器的分析,该寄存器可配置为:#define CFG_CCCR_VAL 0x00000161/* 100 MHz memory,400 MHz CPU, 400 Turbo */由于CKEN外设时钟使能寄存器赋值时,必须为FFUART设备打开时钟,所以CKEN=Ox00000040。故有: #define CFG_CKEN_VAL 0x00000040/* FFUART and STUART enabled */由于Bootloader在启动的第一阶段还没有初始化内存,不支持堆栈。所以要屏蔽所有的中断。中断使能寄存器全部位写0。#def

31、ine CFG_ICMR_VAL 0x00000000,2. U-boot中的处理器相关配置,嵌入式系统课件,56,根据8.2.1小节对Flash、SDRAM和网卡的分析,对MSCO赋值如下: #define CFG_MSC0_VAL 0x7ff87ff0/* 配置异步静态存储配置寄存器 */对MDCNFG外寄存器赋值如下:#define CFG_MDCNFG_VAL 0x000019C9/*配置同步动态随机存储器 */,3. U-boot中的处理器存储器控制器配置,嵌入式系统课件,57,见P210,. U-boot中的处理器GPI和串口配置,嵌入式系统课件,58,在Bootloader启动成

32、功之后,以往,开发者只能通过串口下载数据,U-Boot是一款支持网络功能的Bootloader,如果能够利用网络下载数据,开发者的开发速度将大大地提高。从图8-6可以看到,网卡的片选信号是nCSl,nCSl的静态片选信号被映射到地址Ox0400 0000,而本书使用的的网卡,其I/O base address初始值是Ox300h。所以基址就是:0x0400 0300-Ox0400 0000+Ox0000 0300,即:#define CS8900_BASE 0x04000300这块网卡是16位的数据带宽,于是有:#define CS8900_BUS16 1,5. U-boot的网卡参数配置,嵌

33、入式系统课件,59,为了让U-boot支持更多的命令,可以在宏定义中,让U-boot编译更多的实用命令。见P211,6. 声明控制台程序,嵌入式系统课件,60,生成U-boot映像之前,必须在相应的文件中加入编译选项,它们是MAKEALL和Makefile。修改MAKEALL。在XScale处申明XMU255板使用的是XScale的CPU。见P213,增加命令:xsengine xmu255修改Makefile。增加xmu255_cofig的编译说明。见P213,增加命令:xmu255_config: unconfig./mkconfig $(:_config=) arm pxa xmu255

34、 运行三个命令(P213)可以得到映像文件。生成的映像文件的文件名是U-boot.bin,它位于U-boot-1.1.2根目录内。,7. 生成U-boot映像,嵌入式系统课件,61,U-boot的命令十分强大,在 U-boot移植完后,可以利用 U-boot的强大功能进行处理器外围设备的硬件调试。本节介绍如何使用U-boot调试硬件(U-boot命令的详细介绍参见第6章)。,8.3.4 基于U-boot的硬件调试,嵌入式系统课件,62,PXA255的片内集成了一个实时时钟,物理地址是Ox40900000。处理器上电时,该实时时钟就开始以秒计时。接下来,就使用U-boot命令读该实时时钟寄存器。

35、读取实时时钟用到的主要命令是md(读取内存命令)。= md.1 40900000 1,1. 读片内实时时钟,嵌入式系统课件,63,CS8900网卡芯片在复位之后,需向OxOa和0xOb两个地址交替写入任意数据,以完成网卡的初始化。在初始化之后,在0xOc和0xOd两个地址可以读出该网卡的ID:630E。接下来,使用U-boot试着读出该网卡的ID,看看是否为630E。由于网卡在本书使用的开发板上由nCSl片选信号控制,所以对应着的物理地址就是ox04000000,而CS8900A网卡的片内寄存器地址的偏移量是Ox300,所以网卡ID所对应的地址应当是Ox0400 030c和0x0400 030

36、d。读取ID用到的命令是mm(修改内存命令),其具体操作如下:= mm.b 0400030a,2. 调试网卡,嵌入式系统课件,64,在调试外设或内核的时候,有时会需要修改GPIO的设置,U-boot的命令提供了一个简单快捷的方法去修改这些配置。首先查看当前GPIO寄存器的配置。其值就是在移植U-boot时设置的,命令如下:= md 40e00000 1c比如,希望把GPIPO从输人类型改成输出类型。那么就需要修改其方向寄存器(01),它对应GPDR0的最低位。GPDRO的物理地址是Ox40e0000c,因此,需要把GPDR0从0x00008000改为Ox00008001,通过运行以下命令来实现

37、: = mm.1 40e0000c40e0000c:00008000? 00008001,3. 调试GPIO寄存器的配置,嵌入式系统课件,65,需要注意的是,GPIO的修改必须很慎重。因为其中的某些寄存器控制着重要外部设备,例如串口和SDRAM。一次错误的配置,将会导致整个系统的崩溃。不过,这里所做的修改都是一次性的修改。即如果重新启动系统,则所有的配置都会恢复原样。例如,本节对GPDR0所作的的配置,在重启之后,会恢复成0x00008000。,8.4 最小硬件系统与Linux 2.6内核移植,Linux 2.6.10的内核在/arch/arm/mach-pxa目录中已有XScale CPU的

38、支持,因此,对于一块新的XScale开发板的移植只须做板级的移植开发就可以。XScale开发板的板级内核移植比较简单,它的主要工作就是在/arch/arm/mach-pxa目录下为新的开发板建立对应的平台文件,编写此平台硬件的include文件,修改相关内核配置选项以及新的硬件驱动的编写等。内核源码包目录下arch/arm文件夹所包含文件、文件夹的相关信息见P216。,嵌入式系统课件,67,每个硬件平台都需要一个描述机器的 struct machine_desc结构变量。通常,在内核移植时,可使用一些宏定义填写machine_desc结构体的内容。这些宏定义以MACHINE_START宏开始,

39、以MACHINE_END宏结束。对于前述最小系统设计的宏描述如下:MACHINE_START(XMU255,”XMU XScale Development Platform”)BOOT_MEM(0xa00000000,0x40000000,0xfc000000)BOOT_PARAMS(0xa00000100)MAPIO(xmu255_map_io)INITIRQ(xmu255_init_irq).timer =&pxa_ timerINIT_MACHINE(xmu255_init)MACHINE_END,8.4.1 建立开发板平台描述文件,1. struct machine_desc结构,嵌入

40、式系统课件,68,MACHINE_START定义了平台的类型和名字,因此上面的语句定义了一个类型为MU255,名字为“XMU XScale Development Platform”的硬件平台。要注意的是,这里使用的平台类型XMU255必须在arch/arm/tools/mach-type中定义。宏定义BOOT_MEM(_pram,_pio,_vio)的三个参数分别是内存物理地址、I/O物理地址和对应的I/O虚地址,vio在宏展开后设置到io_Pg_offst(io页表项的页内偏移)。因而BOOT_MEM(Oxa0000000,0x40000000,Oxfc000000)的意思就是此平台的:内

41、存物理地址为0xa0000000;I/O物理地址从Ox40000000开始;对应的I/0虚地址为Oxfc000000。,嵌入式系统课件,69,BOOTPARAMS定义了启动参数存放地址,这需要根据Bootloader的设置来定义。-Boot传给内核的启动参数存放在0xa0000100,因而在使用-boot做为Bootloader时,也需做同样的设置。MAPI()定义了平台的I/O地址映射初始化函数名。INITIRQ定义了中断初始化函数名。INIT_MACHINE定义了板级初始化函数名。,嵌入式系统课件,70,在平台文件中需要使用一个struct map_desc:类型的结构数组描述平台的IO地

42、址空间映射。struct map_descunsigned long virtual;unsigned long physical;unsigned long length;unsigned long type;,2. struct map_desc结构,嵌入式系统课件,71,这个结构共有四个域:virtul表示虚拟地址,physical表示物理地址,length表示地址空间的长度,type描述地址空间的类型。它的取值可以是MT_DEVICE、MT_CACHECLEAN、MT_MINICLEAN、MT_LOW_VECToRS、MT_HIGH_VECTORS、MTMEMORY和MT_ROM中的一

43、种。例如,最小系统设计的Flash起始地址为Ox00000000,大小为32MB(0x02000000),因此在I/O内存映射表中可以描述为:static struct map_desc xmu255_io_desc_initdata=0xe8000000,0x00000000,0x02000000,MT_DEVICE,;,嵌入式系统课件,72,平台的I/O地址映射初始化函数的任务就是初始化CPU以及平台相关外设I/O的映射,这些内容主要是根据硬件的设计编写。该函数中有一个重要的工作,就是将前面定义的外设的I/O地址映射初始化。它可以通过调用iotable_init()函数实现。 void_i

44、nit iotable_init(struct map_desc * io_desc,int nr) 这个函数的参数io_desc是一个数组指针,在使用时传入的就是前面定义的struct map_desc结构体数组,参数nr指的是传入的io_desc数组的大小,这通常可以使用ARRAY_SIZE宏定义取得。,3. I/O地址映射初始化函数,嵌入式系统课件,73,中断初始化函数的主要工作就是根据具体的硬件外设的设计编写。这个函数的编写较简单。 略,4. 中断初始化函数,嵌入式系统课件,74,硬件include文件的主要作用就是定义一些常用的宏,以便于使用。它可以根据硬件的实际情况和编程的需要修改

45、。,8.4.2 编写硬件include文件,嵌入式系统课件,75,做完硬件平台的移植,接下来就的工作就是修改内核相关的配置文件,以进行内核编译。1根Makefile的修改在这个文件里主要是修改ARCH和CROSS_COMPILE定义。ARCH默认情况下是X86,由于XScale是ARM体系结构的处理器,所以需将它改成ARCH=arm。CROSS_COMPILE定义改为CROSS_COMPILE=arm-linux,这样就可以使用XScale的交叉编译器arm-linux-gcc进行内核编译。要注意的是,2.6内核需要使用GCC3.2以上版本才能编译。,8.4.3 修改内核配置文件,嵌入式系统课

46、件,76,由于在内核中增加了一个新的硬件平台,因此需更新相关的Kconfig以体现这种更新。在此,最重要的修改就是arch/arm/maeh-pxa/Kconfig文件,需要在这个文件中为本书所使用的平台增加一项说明,以便内核配置时增加与新的硬件平台相关的选项。下面就是一个平台说明的例子。config ARCH_XMU255bool “XMU XScale Development Platform”select PXA255x,2. Kconfig的修改,嵌入式系统课件,77,这个文件的修改比较简单,只是将新移植的硬件平台加入编译。例如对于前述的最小硬件系统,在Kconfig中定义了它的类型ARCH_XMU255,因此可用如下的语句在Makefile文件中加入平台文件xmu255.c的编译项:obj-$(CONFIG_ARCH_XMU255)+=xmu255.o,3. arch/arm/mach-pxa/Makefile的修改,嵌入式系统课件,78,OVER !,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 行业软件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报