基于ARM920T内核的RISC嵌入式CPU解析方案

来源:元器件交易网 作者:—— 时间:2012-03-26 13:57


  其中startup.s,OEMInitDebugSerial()可以与OAL共享使用,两函数的修改在OAL移植过程中叙述。

  Bootloader移植主要过程有:

  ⑴ 修改相应的dir,source文件,下面列出部分库路径:

  TARGETLIBS=

  $(_TARGETPLATROOT)lib$(_CPUINDPATH)csp_arm.lib 

  $(_COMMONOAKROOT)lib$(_CPUDEPPATH)eboot.lib 

  $(_COMMONOAKROOT)lib$(_CPUINDPATH)cs8900dbg.lib 

  其中csp_arm.lib这个库只存在于Windows CE 4.2的$(_PUBLICOAKROOT),是ARM体系结构链接库之一,在Windows CE 4.2系统下位于PUBLIC目录,而在Windows CE 5.0系统下存在于PLATFORM,导致编译系统找不到该库文件,因此,修改这个库的链接路径,使得Platform builder这个编译系统能够找到这个链接库。

  ⑵ 修改makefile.inc,因为该文件指定生成eboot.bin(Ethernet bootloader镜像)所需要的文件以及拷贝eboot.bin到releasedir目录,其中:

  romimage $(_TARGETPLATROOT)ebootoot.bib

  为生成生成eboot.bin所需要的配置文件,否则,系统通过编译却无法生成eboot.bin.

  ⑶ 修改boot.bib,使其不与config.bib中的内存分配造成冲突。

  ⑷ 改进eboot,因为eboot烧写NK.BIN(OS镜像)的时候会查找BINFS分区,然后把下载的image烧写到BINFS分区。如果没有找到现存的BINFS分区,eboot会低格NAND FLASH,并创建MBR(main boot record),在MBR中有分区表。目前最多支持4个分区,而BINFS分区的大小是以NK.BIN展开的大小按block对齐,所以会出现个问题,当修改过重新生成的NK.BIN比之前写进NAND FLASH的IMAGE大并且超出block对齐的时候,将会导致烧写新的NK.BIN失败,我们可以通过每次下载烧写NK.BIN前先低格NAND FLASH来解决这个问题,但显然这不是妥善的解决方法,增加用户使用复杂度,所以我们可以把BINFS分区的大小固定,而这个固定的大小可以参考生成 NK.BIN的config.bib中定义的ROMSIZE,这样无论NK怎么修改,BINFS一经创建无需更改,eboot把NK写进NAND FLASH之后,会把剩余的FREE空间创建一个FAT分区,如果我们要实现HIVE REGISTRY就可以把这个分区mounts成MountAsBootable。

  3.2 OAL移植

  OAL的移植过程中,OEM主要实现以下几个函数:Startup.s,调试串口函数,OEMInit函数,系统时钟函数,中断处理函数等。

  ⑴ 修改Startup.s,此函数为OS启动时第一个要调用的函数,也是OEM要实现的重要函数之一,主要完成的功能是:将CPU初试化到一种已知的状态;并调用内核初始化函数kernelstart。Startup.s需要修改,修改后的部分代码如下:

  ……

  ldr r0, = 0X4A000008

  ldr r1, = 0xffffffff ; 禁止所有中断

  str r1, [r0]

  ldr r0, = 0X4A00001C

  ldr r1, = 0x7ff ; 禁止所有子中断

  str r1, [r0]

  ……..

  add r0, pc, #g_oalAddressTable - (. + 8)

  bl KernelStart //跳转到KernelStart

  ⑵ 修改串口调试函数。执行完Startup.s,系统就跳转到Kernelstart函数,位于private目录,该函数第一个任务就是初始化串调试口,否则,就无法进行后面的调试工作。其中OEMReadDebugByte, OEMWriteDebugByte, OEMWriteDebugString不用做修改,需要注意的是OEMInitDebugSerial,选UART0,UART1的寄存器配置不一样,若选用UART0,使用配置:

  s2410IOP->rGPHCON &= ~((3 << 4) | (3 << 6));

  s2410IOP->rGPHCON |= ((2 << 4) | (2 << 6));

  而选择UART1,则使用配置的是:

  s2410IOP->rGPHCON &= ~((3 << 8) | (3 << 10));

  s2410IOP->rGPHCON |= ((2 << 8) | (2 <<10));

  ⑶ 实现OEMInit(),该函数将调用以下函数:OALCacheGlobalsInit(),OALIntrInit(),OALTimerInit(),OALKitlStart()来初始化Cache Global,中断,时钟,启动KITL,实现代码如下:

  void OEMInit()

  {

  OALCacheGlobalsInit();// 初试化cache globals

  if (!OALIntrInit()) {

  OALMSG(OAL_ERROR, (

  L"ERROR: OEMInit: failed to initialize interrupts "

  ));

  } // 初试化中断

  OALTimerInit(1, S3C2410X_PCLK/2000, 0); // 初始化时钟

  OALKitlStart();// 初始化KITL

  }

  ⑷ 实现OALTimerInit(),该函数用于初始化OS TIMER,设置每毫秒产生一个System tick,为系统计数,触发进程调度。由CPU的运行主频和硬件定时器资源来确定,执行过程有:初始化时钟状态全局变量,初始化高分辨率时钟函数指针,使能TIMER。

  ⑸ 实现中断处理处理函数:OALIntrInit(),该函数通常先初始化中断映射表,因为WINCE为了模块化,把平台相关物理中断号和系统中断号建立映射。然后清除外部中断,内部中断等。

  3.3 驱动移植

  以触摸屏为例,来探讨Windows CE 5.0系统驱动程序移植。这里以三星公司ARM9内核芯片S3C2410触摸屏接口为基础,通过外接4线电阻式触摸屏构成硬件基础,整个触摸屏由横向电阻线和纵向电阻线组成。触摸屏驱动的主要函数组成有:

  TSP_Poweron 该函数将执行触摸屏的一些初始化,主要是寄存器的配置。

  DdsiTouchPanelEnable:使能DDSI接口,使得硬件能将流数据提供给DDSI接口,就可以实现触摸的操作了。

  DdsiTouchPanelSetMode:模式设置函数,设置触摸屏是高采样率还是低采样率

  DdsiTouchPanelGetPoint :触摸屏进行采样函数

  TSP_CalibrationPointGet:坐标转换函数,该函数实现将从AD采样植转换成坐标。

  移植主要过程:

  ⑴ 修改source文件,要添加如下库文件:

  TARGETLIBS=$(_COMMONSDKROOT)lib$(_CPUINDPATH)coredll.lib

  SOURCELIBS= 

  $(_COMMONOAKROOT)lib$(_CPUINDPATH) ch_cal.lib 

  $(_COMMONOAKROOT)lib$(_CPUINDPATH) chmdd.lib 

  因为这个驱动在Windows CE 4.2下面是在Public目录,而这里将该触摸屏移到了Platform下面,在Windows CE4.2下面是没有以上三条链接库,但Platform,Public编译路径,先决条件都不同。因此引用的库不一样。

资讯排行榜

  • 每日排行
  • 每周排行
  • 每月排行

华强资讯微信号

关注方法:
· 使用微信扫一扫二维码
· 搜索微信号:华强微电子