资源描述
GPRS无线通信模块MC35i及其外围电路设计
作者: 时间:2009-03-17 来源:
随着信息技术的迅速发展,无线远程监控技术得到了越来越广泛的应用,采用先进的GPRS技术的无线监控管理系统,集计算机、通信、机电、自动控制等多种先进技术于一体,成功实现了对无线分布式系统的实时监控管理和灵活部署,解决了传统控制由于没有通讯功能,而无法实现集中监控的问题,以及没有或无法解决实时大数据量处理的问题。因此移动终端的设计也逐渐倍受关注,本文提及的MC35i模块属于无线通讯核心模块,是结合语音、数据传输、简讯服务及传真等功能的高科技产品。此模块功能强大,利用此无线模块的通讯产品便能够很好地在客户端进行系统整合的规划。目前该无线模块的应用领域比较广泛,主要包括:
(1)移动应用,如个人数字助理、智能型手机、上网板、及笔记型计算机;
(2)交通运输,如卫星定位系统、交通控制系统、车队管理系统、汽车保安系统等;
(3)工业用途,如无线公用电话、无线远程监控系统、远程仪器电表传讯等。
文中所述的设计结合单片机或者ARM嵌入式控制可以完成GPRS数据流传输短消息收发、语音传输、与Pc机进行数据传输等功能,已应用在基于GPRS数据传输的电力线监控系统中。
1 MC35i模块
MC35i是Siemens公司推出的新一代无线通信GPRS模块,可以快速安全可靠地实现系统方案中的数据、语音传输、短消息服务 (Short Message Service)和传真。模块的工作电压为3.3~4.8 V,可以工作在900 MHz和1800 MHz两个频段,所在频段功耗分别为2W(900 M)和1W(1800 M)。该模块包括了前期版本TC35的所有功能,同时新增加了快速的GPRS技术,采用GPRS分时复用的CLASS 8标准,具有始终在线的功能且理论上传输速率最高可达171.2 kb/s,通信传输时延较小,最长不超过3s。
模块有AT命令集接口,支持文本和PDU模式的短消息、第三组的二类传真、以及2.4k,4.8k,9.6k的非透明模式。此外,该模块还具有电话簿功能、多方通话,漫游检测功能,常用工作模式有省电模式、IDLE、TALK等模式。通过独特的40引脚的ZIF连接器,实现电源连接、指令、数据、语音信号、及控制信号的双向传输。通过ZIF连接器及50Ω天线连接器,可分别连接SIM卡支架和天线。
MC35i模块主要由GSM基带处理器、GSM射频模块、供电模块(ASIC)、闪存、ZIF连接器、天线接口六部分组成。作为MC35i的核心,基带处理器主要处理GSM终端内的语音、数据信号,并涵盖了蜂窝射频设备中的所有的模拟和数字功能。在不需要额外硬件电路的前提下,可支持FR、HR 和EFR语音信道编码。具体结构可参考图1。
图1 MC35i功能框图
2 外围应用电路
MC35i模块的正常运行需要相应的外围电路与其配合。MC35i共有40个引脚,通过ZIF连接器分别与电源电路、启动与关机电路、数据通信电路、语音通信电路、SIM卡电路、指示灯电路等连接。
(1)启动电路
启动电路由开漏极三极管和上电复位电路组成。模块上电10 ms后(电池电压须大于3 V),为使之正常工作,必须在15脚(/IGT)加时长至少为100ms的低电平信号,且该信号下降沿时间小于1 ms。启动后,15脚的信号应保持高电平。如2图所示,为启动电路产生的信号,从中可以看出10 m8的延时和100 ms的低电平。
图2 启动信号下降沿
根据上面的分析,设计启动部分的参考电路如下:
图3 启动电路
如图3所示,当Power ON脚电压由低变高时,电容C1被充电左负右正。电流方向为逆时针方向,此时电阻R1的电压上正下负(当UR1≥0.7 V时)使Q1的发射结正偏,晶体管处于导通状态,IGT脚处于低电平。当POWER ON脚电压由高变低时。电容C1开始放电,此时电阻R1的电压上负下正使Q1的发射结反偏,晶体管截止,IGT脚处于高电平。显然IGT脚在 POWERON脚电压由低变高时处于低电平,GPRS模块开机。根据引脚要求IGT脚电平在处于下降沿并保持低电平100 ms≤t≤1s后跳到高电平。所以这里对C1的容值,R1、R2、R3的阻值就有要求了,这时需要调整C1的电容值,R1、R2的阻值以满足开机条件。为了方便说明,模块开机电路电路图可以简化如下:如图4所示,开关由a投向b,并在t=0前开关与a端相连时间足够长达到稳态,即Uc(0-)=0。由于电容电压不能跳变,在开关投到b的瞬间,电容电压仍为零。即C(0+)=0。且t≥0时RC电路与电源相接,因此可以认为是求零状态响应的问题。
图4 启动电路简介图
当开关投向b后电容电压从零值开始充电,电压逐渐上升,最后应趋于稳态值 。稳态值是根据“电容相当于开路”而确定为Us的。根据这样的考虑,得出:
电容上的电压上升,而电阻上的电压逐渐下降,当R1上的电压降到0.7 V时,三极管将截止,因而要算出R1的电压降到0.7 V时的时间。
UR1=i(t)×R1 (2)
由式1,2得:0.7= 5/(200×103)e-1/200×200×103。解得:t=255 ms。其中:r=R总×C+;R总=R1+R2=200Ω ;r=R总×C+=200×103 ×106=200 ms。可知100 ms≤255 ms≤1s符合系统要求。
(2)数据通信电路
数据通信电路主要完成GPRS数据流传输、短消息收发、与PC机通信、软件流控制等功能。MC35i的数据接口采用串行异步收发,符合 ITU.T RS.232接口电路标准,工作在CMOS电平(2.65 V)。数据接口配置为8位数据位、1位停止位、无校验位,可以在300 bps-115 kbps的波特率下运行,支持的自动波特率为4.8 kbps—115 kbps(14.4 kbps和28.8 kbps除外)。MC35i模块还支持RTS0/CTS0的硬件握手和XON/XOFF的软件流控制。
数据通信电路以MAXIM公司的MAX3238芯片为核心,实现电平转换及串口通信功能。MAX3238芯片供电电压为3-5.5 V,符合TIA/EIA-232-F和ITUv.28标准。具有独特的±15 KV人体静电保护措施,兼容5 v逻辑输入,内含3路接收、5路发送串行通信接口,最大数据传输速率可达250 kbps。该芯片的最大特点是,在串行口无数据输入的情况下,可以灵活的进行电源管理,即当FORCEON为低电平、/FORCEOFF为高电平时,Auto-Powerdown Plus功能有效。在正常运行模式下,约30秒时间内若芯片在接收和发送引脚没有检测到有效信号,将自动进入Powerdown模式,此时耗电1uA。如果FORCEON和/FORCEOFF引脚均为高电平,那么Auto-Powerdown Plus功能失效。在Auto-Powerdown Plus功能有效的时,如果检测到接收或发送引脚有信号输入,该芯片自动被激活,转入正常工作状态。如果任一接收通道的输入电压高于2.7 V或小于-2.7 V,或者位于-0.3 V~0.3 V的时间小于30 us,则/INVALID(15脚)引脚为高电平(数据有效)。如果所有接收通道的输入电压位于-0.3 V~0.3 V的时间大于30 uS,则/INVALID(15脚)引脚为低电平(数据无效)。
该芯片的以上特性,满足了MC35i作为移动终端的3路接收、5路发送电路连接要求。在MAX3238与ZIF连接器相应引脚连接时,要注意发送、接收引脚连接正确。MAX3238还需要连接4个0.1uF的电容配合,才能完成电平转换功能。MC35i模块通过RS-232接口各引脚输出的信号有RXD、 CTS、DSR、DCD、RING,输入的信号为TXD、RTS、DTR。
由于MC35i的接口电路使用了9针串口的全部引脚,使MC35i可以获得DTR、DSR、DCD和RING控制信号。信号RING用来向蜂窝设备指示接收到Unsolicited Result Code(URC)。通过AT指令,可以设置MC35i的不同运行模式。
(3)语音通信电路
由于MC35i的GSM基带处理器内集成了音频滤波、ADC、DAC、语音合成等部分,所以模块语音接口的外围电路连接相对简单。MC35i有两个语音接口,每个接口均有模拟麦克输入和模拟耳机输出。为了适合不同的外设,模块共有6种语音模式,可通过指令AT^SNFS选择。第一个语音接口的默认配置为 Votronic HH-SI-30.3/V1.1/0手持话筒,语音模式为1(默认)、4、5,其中模式1参数固定。第二个语音接口为头戴式耳机和麦克设置,语音模式为 2、3、6。
为了防止从麦克风和耳机导线引入高频干扰,影响MC35i的正常运行。设计电路时,在麦克风、耳机、以及手持听筒的插孔处都接有电感。此外,考虑到静电保护的因素,所有语音信号输入端都通过电容与GND耦合。
(4)SIM卡电路
基带处理器集成了一个与ISO 7816-3 IC Card标准兼容的SIM接口。为了适合外部的SIM接口,该接口连接到主接口(ZIF连接器)。在GSM11.11为SIM卡预留5个引脚的基础上,MC35i在ZIF连接器上为SIM卡接口预留了6个引脚,所添加的CCIN引脚用来检测SIM卡支架中是否插有SIM卡。当插入SIM卡,该引脚置为高电平,系统方可进入正常工作状态。但是目前移动运营商所提供的SIM卡均无CCIN引脚,所以在设计电路时将引脚CCIN与CCVCC相连。
在设计中为SIM卡布线时,发现了一个值得引起注意问题:如果将SIM卡的第四脚CCGND直接与印刷电路板的GND相连,不作任何信号的隔离保护,则通话时音量很小。考虑到设计中的电磁兼容和静电保护等因素,为了达到最佳的通话效果,采用在SIM支架下,即印刷电路板的顶层敷设一层铜隔离网,该层敷铜与 SIM卡的CCGND引脚相连,CCGND和电路板的GND之间通过两个并联的电容和电感耦合。这样为SIM卡构成了一个隔离地,屏蔽了其他信号线对 SIM卡的干扰。再进行语音通话时,话音清晰。
3 结束语
由Siemens公司的GPRS模块MC35i及其外围电路构成的移动终端,可以很好的完成短消息收发、GPRS数据传输和语音通信。利用该移动终端结合三星的S3C44B0X ARM开发板进行控制很好地实现了对远程电力线的实时监控。
ARM开发板上uClinux内核移植
时间:2010-02-01 10:37:35 来源: 作者:
简述:针对“如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植”的一个总结,其内容包括对Bootloader的功能分析和uClinux2.4.24发行版内核基础上针对S3C44B0X开发板进行修改的重点内容的逐一列举。
2.Bootloader
2.1Bootloader概述
Boot Loader
就是在操作系统内核运行之前运行的一段程序。通过这段程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。因此,正确建立uClinux的移植的前提条件是具备一个与uClinux配套、易于使用的
Bootloader。
ARMSYS开发板提供了这样一个uClinux专用的Bootloader,该Bootloader程序烧录在系统的地址0x0处,每次上电即运行,能够正确完成硬件系统的初始化和uClinux的引导。
理论上,uClinux引导时并非一定需要一个独立于内核的Bootloader。然而,将Bootloader与内核分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现一些有用的辅助功能。
ARMSYS提供的Bootloader的主要任务可以概括如下:
1.硬件初始化;
2.从主机下载新的内核映像和文件系统映像;
3.烧写NorFlash和Nandflash;
4.加载uClinux 内核映像并启动运行;
5.提供串行超级终端上的人机操作界面。
2.2存储空间分布
Bootloader采用默认的存储空间分布地址来加载uClinux内核、文件系统,并按照正确引导uClinux的运行。在ARMSYS的Bootloader中,默认的存储空间分布如下表:
内容 起始地址
存储介质
Bootloader程序空间 0x00000000
Flash
压缩内核映像 0x00010000
Flash
ROM文件系统映像 0x000e0000
Flash
内核运行地址 0x0c008000
SDRAM
压缩内核解压地址 0x0c100000
SDRAM
文件系统加载 0x0c700000 SDRAM
这个存储空间的分配方式也不是固定不变的,可以通过修改Bootloader中的相关代码来改变。
2.3Bootloader的工作
完整的Bootloader引导流程可描述如下:
硬件初始化阶段一
◎ 硬件初始化
◎ 复制二级中断异常矢量表
◎ 初始化各种处理器模式
◎ 复制RO和RW,清零ZI
(跳转到C代码入口函数)
硬件初始化阶段二
◎ 初始化本阶段使用到的硬件设备;
◎ 建立人机界面
◎
实现映像文件的下载和烧录工具
◎ 实现映像文件的加载和运行工具
下面对上述各步骤进行逐一说明,并对与uClinux相关的内容详细加以说明。
2.3.1 硬件初始化
板子上电或复位后,程序从位于地址0x0的Reset Exception
Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b
ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,主要内容为:关Watchdog
Timer,关中断,初始化PLL和时钟,初始化存储器控制器。比较重要的是PLL的输出频率要计算正确,ARMSYS中把它设置为64MHz;这实际上就是处理器的工作主频,这个时间参数在第二阶段计算SDRAM的刷新计数值和UART的波特率等参数时还要用到。
2.3.2建立二级异常中断矢量表
异常中断矢量表(Exception Vector
Table)是Bootloader与uClinux内核发生联系关键的地方之一。即使uClinux内核已经得到处理器的控制权运行,一旦发生中断,处理器还是会自动跳转到从0x0地址开始的第一级异常中断矢量表中的某个表项(依据于中断类型)处读取指令运行。
在编写 Bootloader时,地址0x0处的一级异常中断矢量表只需简单地包含向二级异常中断矢量表的跳转指令就可以。这样,就能够正确地将发生的事件交给
uClinux的中断处理程序来处理。对于uClinux内核,它在RAM空间中基地址为0xc000000处建立了自己的二级异常中断矢量表,因此,
Bootloader的第一级异常中断矢量表如下所示:
b ResetHandler ;Reset Handler
ldr
pc,=0x0c000004 ;Undefined Instruction Handler
ldr pc,=0x0c000008 ;Software
Interrupt Handler
ldr pc,=0x0c00000c ;Prefetch Abort Handler
ldr
pc,=0x0c000010 ;Data Abort Handler
b .
ldr pc,=0x0c000018 ;IRQ
Handler
ldr pc,=0x0c00001c ;FIQ Handler
LTORG
如果在Bootloader执行的全过程中都不必响应中断,那么上面的设置已能满足要求。但在我们的
ARMSYS上提供了USB下载器,需要用到中断,那么Bootloader必须在同样的地址(0xc000000)处配置自己的二级异常中断矢量表,以便同uClinux兼容。这张表事先存放在
Flash Memory里,引导过程中由Bootloader将其复制到RAM地址0x0C000000:
存放矢量表:
;IRQ ==the program put this phrase to 0xc000000
ExceptionHanlderBegin
b .
ldr pc, MyHandleUndef ; HandlerUndef
ldr
pc, MyHandleSWI ; HandlerSWI
ldr pc, MyHandlePabort ; HandlerPabort
ldr
pc, MyHandleDabort ; HandlerDAbort
b . ; HandlerReserved
ldr pc,
MyHandleIRQ ; HandlerIRQ
ldr pc, MyHandleFIQ ; HandlerFIQ
MyHandleUndef DCD HandleUndef ;reserve a word(32bit)
MyHandleSWI DCD
HandleSWI
MyHandlePabort DCD HandlePabort
MyHandleDabort DCD
HandleDabort
MyHandleIRQ DCD HandleIRQ
MyHandleFIQ DCD HandleFIQ
ExceptionHanlderEnd
建立二级矢量表:
;****************************************************
;* Setup IRQ handler
*
;****************************************************
ldr
r0,=(_IRQ_BASEADDRESS + 0x100)
ldr r2,=_IRQ_BASEADDRESS
add r3,r0,
#0x100
0
CMP r0, r3
STRCC r2, [r0], #4;cc:Carry clear;save R2 to R0
address, R0 =R0+ 4。
BCC %B0
ldr r1,=_IRQ_BASEADDRESS
ldr r0,=ExceptionHanlderBegin ;if there isn't
'subs pc,lr,#4' at 0x18, 0x1c
ldr r3,=ExceptionHanlderEnd
0
CMP r0, r3
;put the vector table at _IRQ_BASEADDRESS(0xc000000)
LDRCC r2, [r0],
#4
STRCC r2, [r1], #4
BCC %B0
ldr r1,=DIsrIRQ;put the IRQ judge program at
_IRQ_BASEADDRESS+0x80(0xc000080)
ldr r0,=IsrIRQ ;if there isn't 'subs
pc,lr,#4' at 0x18, 0x1c
ldr r3,=IsrIRQEnd
0
CMP r0, r3
LDRCC r2,
[r0], #4
STRCC r2, [r1], #4
BCC %B0
ldr r1, =MyHandleIRQ ;MyHandleIRQ point to DIsrIRQ
ldr r0,
=ExceptionHanlderBegin
ldr r4, =_IRQ_BASEADDRESS;
sub r0, r1, r0
add
r0, r0,r4
ldr r1, =DIsrIRQ
str r1, [r0]
定义Handlexxx:
^ (_IRQ_BASEADDRESS)
HandleReset # 4
HandleUndef # 4
HandleSWI #
4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ #
4
HandleFIQ # 4
^ (_IRQ_BASEADDRESS+0x80)
DIsrIRQ # 4
;IntVectorTable
^
(_IRQ_BASEADDRESS+0x100)
HandleADC # 4
HandleRTC # 4
HandleUTXD1 #
4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 #
4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 #
4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 #
4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 #
4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 #
4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4
将异常中断矢量重构到SDRAM,这样的好处就是可以在其它的功能程序内对中断处理程序的地址任意赋值。为此,我们在44b.h文件中定义:
/* ISR */
#define pISR_RESET (*(unsigned
*)(_IRQ_BASEADDRESS+0x0))
#define pISR_UNDEF (*(unsigned
*)(_IRQ_BASEADDRESS+0x4))
#define pISR_SWI (*(unsigned
*)(_IRQ_BASEADDRESS+0x8))
#define pISR_PABORT (*(unsigned
*)(_IRQ_BASEADDRESS+0xc))
#define pISR_DABORT (*(unsigned
*)(_IRQ_BASEADDRESS+0x10))
#define pISR_RESERVED (*(unsigned
*)(_IRQ_BASEADDRESS+0x14))
#define pISR_IRQ (*(unsigned
*)(_IRQ_BASEADDRESS+0x18))
#define pISR_FIQ (*(unsigned
*)(_IRQ_BASEADDRESS+0x1c))
#define pISR_ADC (*(unsigned *)(_IRQ_BASEADDRESS+0x100))//0x20))
#define
pISR_RTC (*(unsigned *)(_IRQ_BASEADDRESS+0x104))//0x24))
#define pISR_UTXD1
(*(unsigned *)(_IRQ_BASEADDRESS+0x108))//0x28))
#define pISR_UTXD0
(*(unsigned *)(_IRQ_BASEADDRESS+0x10c))//0x2c))
#define pISR_SIO (*(unsigned
*)(_IRQ_BASEADDRESS+0x110))//0x30))
#define pISR_IIC (*(unsigned
*)(_IRQ_BASEADDRESS+0x114))//0x34))
#define pISR_URXD1 (*(unsigned
*)(_IRQ_BASEADDRESS+0x118))//0x38))
#define pISR_URXD0 (*(unsigned
*)(_IRQ_BASEADDRESS+0x11c))//0x3c))
#define pISR_TIMER5 (*(unsigned
*)(_IRQ_BASEADDRESS+0x120))//0x40))
#define pISR_TIMER4 (*(unsigned
*)(_IRQ_BASEADDRESS+0x124))//0x44))
#define pISR_TIMER3 (*(unsigned
*)(_IRQ_BASEADDRESS+0x128))//0x48))
#define pISR_TIMER2 (*(unsigned
*)(_IRQ_BASEADDRESS+0x12c))//0x4c))
#define pISR_TIMER1 (*(unsigned
*)(_IRQ_BASEADDRESS+0x130))//0x50))
#define pISR_TIMER0 (*(unsigned
*)(_IRQ_BASEADDRESS+0x134))//0x54))
#define pISR_UERR01 (*(unsigned
*)(_IRQ_BASEADDRESS+0x138))//0x58))
#define pISR_WDT (*(unsigned
*)(_IRQ_BASEADDRESS+0x13c))//0x5c))
#define pISR_BDMA1 (*(unsigned
*)(_IRQ_BASEADDRESS+0x140))//0x60))
#define pISR_BDMA0 (*(unsigned
*)(_IRQ_BASEADDRESS+0x144))//0x64))
#define pISR_ZDMA1 (*(unsigned
*)(_IRQ_BASEADDRESS+0x148))//0x68))
#define pISR_ZDMA0 (*(unsigned
*)(_IRQ_BASEADDRESS+0x14c))//0x6c))
#define pISR_TICK (*(unsigned
*)(_IRQ_BASEADDRESS+0x150))//0x70))
#define pISR_EINT4567 (*(unsigned
*)(_IRQ_BASEADDRESS+0x154))//0x74))
#define pISR_EINT3 (*(unsigned
*)(_IRQ_BASEADDRESS+0x158))//0x78))
#define pISR_EINT2 (*(unsigned
*)(_IRQ_BASEADDRESS+0x15c))//0x7c))
#define pISR_EINT1 (*(unsigned
*)(_IRQ_BASEADDRESS+0x160))//0x80))
#define pISR_EINT0 (*(unsigned
*)(_IRQ_BASEADDRESS+0x164))//0x84))
例如,我们要使用到Exint4567中断,定义好中断处理程序Meint4567Isr()后,仅需要一条语句:
pISR_EINT4567=(int)MEint4567Isr;
就能使中断发生后正确跳转到我们编写的处理程序上。
2.3.3 初始化各种处理器模式
ARM7TDMI支持7种Operation
Mode:User,FIQ,IRQ,Supervisor,Abort,System和Undefined。Bootloader需要依次切换到每种模式,初始化其程序状态寄存器(SPSR)和堆栈指针(SP)。
2.3.4 复制RO和RW,清零ZI
一个ARM由RO,RW和ZI三个段组成,其中RO为代码段,RW是已初始化的全局变量,ZI是未初始化的全局变量(对于GNU工具,对应的概念是
TEXT,DATA和BSS)。Bootloader要将RW段复制到RAM中,并将ZI段清零。编译器使用下列符号来记录各段的起始和结束地址:
|Image$$RO$$Base| :RO段起始地址
|Image$$RO$$Limit|
:RO段结束地址加1
|Image$$RW$$Base| :RW段起始地址
|Image$$RW$$Limit|
:ZI段结束地址加1
|Image$$ZI$$Base| :ZI段起始地址
|Image$$ZI$$Limit| :ZI段结束地址加1
需要注意的是,这些标号的值是根据链接器中设置的中ro-base和rw-base的设置来计算的,我们的Bootloader的对应设置是:ro-base =
0xc000000, rw-base = 0xc5f0000。
完成这个步骤后,第一阶段的硬件初始化就完成了。
BL Main
跳转到C语言程序,开始第二阶段的初始化和系统引导。
2.3.5 C语言中的硬件初始化
继续对硬件进行初始化,主要包括对以下设备的初始化:GPIO,Cache,Interrupt Controller,Watchdog
Timer和UARTs。S3C44B0X处理器内置data/instruction合一的8KB
Cache,且允许按地址范围设置两个Non-Cacheable区间。合理的配置是打开对RAM区间的Cache,关闭对其它地址区间(非存储器设备, I/O设备
)的Cache。所有硬件初始化完毕之后,开中断。
2.3.6 建立人机界面
引导过程的最后一步是在串行终端上建立人机界面,并等待用户输入命令。若接收到用户输入,则显示菜单模式或命令行模式的交互界面,等待用户进一步的命令。这里就不对此详细讨论了。
2.4加载uClinux内核
ARMSYS
提供的Bootloader支持两种uClinux启动运行方式:直接从SDRAM中的内核映像中运行;从flash将压缩格式的内核映像加载到
SDRAM,再从SDRAM运行。前者需要利用Bootloader提供的对映像文件下载的工具;后者则需要利用Bootloader提供的
flash烧录工具进行烧录,然后再加载运行。
压缩格式的uClinux内核映像文件都是由开头的一段自解压代码和后面的压缩数据部分组成。对于Kernel而言,由于是以压缩格式存放,因次只能以非XIP方式执行。自解压类型的uClinux
内核映像文件首先存放在Flash Memory中,由Bootloader加载到SDRAM中的0xc100000地址处,然后将控制权交给它。可执行的uClinux
Kernel将被解压到最终的执行空间,然后开始运行。压缩格式Image所占据的临时SDRAM空间可在随后由uClinux回收利用。
可以从flash拷贝到SDRAM解压运行,自然同样也可以直接下载到SDRAM运行。这对于调试内核都是非常方便的。对于压缩格式的内核映像文件(image.rom和image.ram)都可以直接下载到SDRAM的特定地址处,并从该地址开始运行(参考2.2节)。
2.5调用Kernel
Bootloader调用uClinux 内核的方法是直接跳转到Kernel的第一条指令处。
采用C语句:((void
(*)(void))ram_addr)();
2.6工具
ARMSYS
的Bootloader在人机界面上提供了8个功能项目,其中包括支持从主机通过USB口下载文件到目标板的SDRAM和Nandflash上;用
SDRAM中的数据烧写Flash
Memory。由于USB口下载速度快,利用这些功能项能够轻松地调试uClinux的内核(具体使用方法参考《uClinux移植包在ARMSYS上的使用说明》一文)。
对uClinux专用Bootloader的介绍到此,下面开始对uClinux的内核部分的移植进行说明。
3.uClinux2.4.24内核组成
◎arch:
arch目录下有多个子目录,它的每一个子目录都代表内核支持的一种CPU体系结构,每个子目录中又进一步分解为boot、mm、
kernel等子目录,分别包含与系统引导、内存管理、系统调用的进入和返回、终端处理以及其它内核中依赖于CPU和系统结构的底层代码。与ARM处理器(不带有MMU)相关的代码放在目录arch/armnommu下,与S3C44B0X相关的代码则放在目录arch/armnommu/match-
S3C44B0X。
◎ include:include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在
include/linux子目录下,与ARM处理器(不带MMU)相关的头文件在include/asm-armnommu子目录下,与
S3C44B0X相关的代码在include/asm-armnommu/arch-S3C44B0X目录下;
◎
init:这个目录包含核心的初始化代码(注意:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。
◎
kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;
◎
drivers: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。
◎
其他:例如mm ,这个目录包括所有独立于处理器体系结构的内存管理代码,如页式存储管理内存的分配和释放等;lib放置核心的库代码;net,核心与网络相关的代码;
ipc,这个目录包含核心的进程间通讯的代码;fs,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和
ext2;Scripts,此目录包含用于配置核心的脚本文件等。
Linux Kernel Tree List
一般在每个目录下,都有一个.depend 文件和一个 Makefile
文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme
文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解。
uClinux-dist-20040408发行包中的内核对S3C44B0X处理器的支持是不完整的,因此,我们不能够希望在make
config配置选项中选中44B0X目标板后,直接编译它来得到一个很好地支持44B0X开发板的内核映像,我们必须为内核打上补丁。针对ARMSYS
的补丁文件可以在
展开阅读全文