ARM作业文档格式.docx
《ARM作业文档格式.docx》由会员分享,可在线阅读,更多相关《ARM作业文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
3.硬件模块设计
3.1硬件平台功能模块的规划
对于—彻能完备的PDA,至少应该包含以下功能:
(1)基本功能
CPU,RAM和外部存储器构成的—个基本的嵌入式计算机系统。
CPU应该具备优良的运算能力,具有进行较为复杂事务处理的能力,还应该有较低的功耗。
大容量和快速访问的RAM是执行复杂处理的基本保证。
较大容量外部存储器能够保证操作系统和用户软件的保存,还能为用户预留较大的存储空间来储存私人资料。
(2)人机接口
PDA硬件平台的人机接口是使用者和PDA进行互动时非常重要的部件,基于PDA的特点本文采用TFTLCD和触摸屏作为输出部件和输入部件。
TFT液晶显示屏具有亮度好,对比度高,层次感强,颜色鲜艳的优点,基于用户界面良好的要求,TFTLCD是不错的选择。
(3)外部扩展
本设计主要以S3C2419基础上扩展USB接口,SD接口和GPS模块。
S3C2410微处理器内含—个ARM920T内核和LCD控制器、触摸屏接口、SDRAM控制器、USB主机接口、SD接口和MMC卡接口、3个通道的UART、MMU等片内外围功能部件。
对比以上的PDA功能规划,S3C2410从芯片级提供了支持,而且MMU的存在保证了嵌入式操作系统的良好运行,应该是不错的选择。
此外,系统还应该具有存储系统模块和支持电路等。
PDA硬件总体结构图
3.2硬件平台的构建
3.2.1微处理器的选择
目前,在移动终端领域,获得广泛应用的主要是ARM公司所推出的ARM系列微处理器。
这是一套具有高性能、低费用、高效率的RISC处理器,并且经过特殊优化以适应于鼠入式系统的开发环境。
本系统采用MC2410E(采用S3C2410处理器)开发板。
S3C2410是韩国三星电子公司推出的—款为手持设备设计的低功耗、高度集成的微处理器,采用272脚FBGA封装,内含—个ARM920T内核和如下片内外围功能部件:
(1)1个LCD控制器(支持STN和唧带有触摸屏的液晶显示器);
(2)SDRAM控制器;
(3)3们厦道的I7ART;
(4)4个通道的DMA;
(5)4个具有PWM功能的计时器和1个内部时钟;
(6)8通道的lO位ADC;
(7)触摸屏接口;
(8)IIC总线接口;
(9)1个USB主机接口,1个USB设备接口;
(10)2个SPI接口;
(11)SD接口和MMC卡接口;
S3C2410结构图
3.2.2人机接口
PDA硬件平台的人机接口是使用者和PDA进行互动时非常重要的部件,基于PDA的特点设计了采用TFTLCD的输出部件和触摸屏的输入部件。
(1)TFTLCD
—块LCD屏显示图像,不但需要LCD驱动器,还需要有相应的LCD控制器。
通常LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则有外部电路来实现。
而S3C2410内部已经集成了LCD控制器,因此可以很方便地去控制各种类型的LCD屏,例如:
STN和TFT屏。
由于TFT屏将是今后应用的主流,因此在PDA中选用了TFT屏。
对于控制TFT屏来说,除了要给它送视频资料(VD[23:
0】)以外,还有以下一些信号是必不可少的,分别是:
·
VSYNC(VFRAME):
帧同步信号;
HSYNC(VLD屺):
行同步信号;
VCLK:
像素时钟信号;
VDEN(ⅥⅥ):
数据有效标志信号。
REGBANK是LCD控制器的寄存器组,用来对LCD控制器的各项参数进行设置。
而LCDCDMA则是LCD控制器专用的DMA信道,负责将视频资料从系统总线(SystemBus)上取来。
3.2.3USB
USB是UniversalSerialBus的简称。
它是一种可以同时处理计算机与具有USB接口的多种外设之间通信的电缆总线。
这些连接到计算机上的外设共同分享USB19的带宽。
USB的分时处理机制真正在硬件的意Y._tz实现了计算机外设的即插即用。
USB主机系统不仅包含了用于和USB外设进行通信的USB主机控制器及用于连接的USB接口(Sm),而且还是USB系统软件和USB客户软件的载体。
USB主机软件系统可以分为三个部分:
●客户软件部分(CSW),在逻辑上和外设的功能部件部分进行资料的交换。
USB系统软件部分(即HCD),在逻辑和实际中作为HCD和USBD之间的接口。
USB主机控制器软件部分(即HCD和USBD),用于对外设和主机的所有USB有关部分的控制管理,包括外设的SIE部分、USB资料发送接收器(Transreceiver)部分及外设的协议层等。
(2)S3C2410内置USBl.1Host控制器
S3C2410内置的USBHost控制器具有以下特性:
完全兼容USBl.1协议:
支持全速(FullSpeed)设备;
支持Control、Interrupt和Bulk传输模式;
●5个具备FIFO的通讯端点;
Bulk端点支持DMA操作方式;
接收和发送均有64Byte的FIFO;
4.软件模块设计
完成硬件电路设计并调试通过后主要针对以下3方面的软件编程功能实现:
对硬件电路中存储系统部分的初始化NAND_FLASH驱动程序和LCD驱动程序及USB接口程序的编写及实现。
4.1 NAND_FLASH驱动程序
NAND_FLASH的驱动[主要包括芯片的复位,ID的正确读取,块的擦除,和页的写入和读取几个操作。
此外NAND_FLASH允许要2%的坏块,在编写驱动时要做好NANDFLASH的坏块的统计与管理,坏块的识别主要是读取块中第一页的第6字节的1个WORD是否为FF来判断块的好坏。
坏块管理流程如图5所示。
NAND_FLASH驱动主要步骤:
(1)向指令寄存器写入0xFF使芯片复位;
(2)调用Unsignedintcheck_Flash_Id(void)函
数读取芯片ID:
For(i=0;
i<
10;
i++);
id=Nand_IO<
<
8;
id+=Nand_
IO;
//读出2个字节即芯片ID
(3)调用NAND_manage()函数做坏块管理;
(4)调用UnsignedintErase_Block(unsignedintblock)实现块的擦除;
(5)调用intWrite_page()和intRead_page()写入和读出页数据。
4.2 LCD驱动程序设计
在系统中LCD驱动程序主要是对屏幕显示的初始化包括字符显示高度和宽度、行字符显示数、显示频率的设置以及显示点位移设置、显示合成设置、休眠模式设置、光标形状设置、光标指针设置等操作。
LCD驱动LCD_Initialize(void)主要步骤:
(1)调用LCD_WriteCommand(SYSTEM_SET);
用于系统初始化。
(2)调用LCD_WriteCommand(SCROLL);
用于显示域设置。
(3)调用LCD_WriteCommand(HDOT_SCR);
用于光标点位移设置。
(4)调用LCD_WriteCommand(OVLAY);
用于显示合成设置。
(5)调用LCD_WriteCommand(CSRFORM);
LCD_WriteData(0x07);
LCD_WriteData(0x87);
用于初始化光标形状。
设计好驱动后利用ADS1.2编译器将程序烧至RAM进行调试,可根据屏幕显示字符尺寸大小及适宜程度再做修改驱动程序直至满意。
4.3USB设备驱动实现
USB的设备驱动利用分层实现,底层模块和硬件互交,而上层模块实现具体的功能和协议。
这样可以把各部分功能分离,方便添加和修改功能。
无论何种功能,硬件的互交是不变的,比如数据发送的开始和停止,数据的同步,读写FIFO中的数据等等都是相同的,所以把实现这些功能的函数放在底层实现,上层不同模块都可以调用这些函数来实现不同功能。
除了和硬件互交以外,底层模块还要和操作系统紧密相连,即向系统注册USB的设备驱动。
其采用如下的结构体并在内核中注册。
struetdevicedriverude—driver={
n卸[Ile:
‘'
zylonite-udc"
bus:
&
platform_bus_type,
probe:
zylonite_ude._probe,
i,ulfflove’zylonite_udc_remove
);
其中name项是本驱动的名称,根据bus项提供的接口与内核中的设备相匹配。
probe和remove分别是设备插上和移除时所进行的操作。
在probe函数中除了一些硬件和软件的初始化外,还注册了一个中断用来在收到数据和发送完毕数据时通知系统:
request_ira(IRQ..USB,zylonite_udc_irq,SA_INTERRUPT,driver_name,dev);
其中zylonite便是中断处理函数,此几乎所有的发送和接受.ude.irq据。
当有数据接收到时,中断函数负责把接收到的数据送给上层模块。
当FIFO中的数据发送完毕时,中断函数检查是否还有数据未发送,如果有则把数据填入发送FIFO,否则通知上层模块数据发送完毕。
底层模块提供了—个通用的接口给上层模块,并可以方便的注册,卸载。
每个上层模块使用usb_gadget_driver数据结构表示。
其中包含了上层模块函数指针,这些函数分别实现E层模块注册,.卸载时的—些操作。
最后上层模块使用下层模央提供的函数:
intusb_gadget_mgistcr_driver(stmctusb_gadget_ddver幸driver);
来完成—个功能模块在下层模块中的注册。
上层模块的usb__gadget_driver结构如下:
stmctusb_gadget_driverfsg_driver={
speed:
USB_SPEED_FULL,
bind:
fsg_bind,
unbind:
fsgunbind,
};
其中speed表示该设备使用USB的何种速度,此处使用USB全速即12M每秒。
该内核线程平时处于休眠状态,每当有数据要发送或者接受时被唤醒,然后首先调用get_next_commandO函数