Windows CE5.0 BSP移植(转)

 

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,使用配置:(2410)
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/r/n"
        ));
    } // 初试化中断
     OALTimerInit(1, S3C2410X_PCLK/2000, 0); // 初始化时钟
     OALKitlStart();// 初始化KITL
  }
⑷ 实现OALTimerInit(),该函数用于初始化OS TIMER,设置每毫秒产生一个System tick,为系统计数,触发进程调度。由CPU的运行主频和硬件定时器资源来确定,执行过程有:初始化时钟状态全局变量,初始化高分辨率时钟函数指针,使能TIMER。
⑸ 实现中断处理处理函数:OALIntrInit(),该函数通常先初始化中断映射表,因为WINCE为了模块化,把平台相关物理中断号和系统中断号建立映射。然后清除外部中断,内部中断等。

驱动移植
     以触摸屏为例,来探讨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)/tch_cal.lib /
                         $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/tchmdd.lib  /
 因为这个驱动在Windows CE 4.2下面是在Public目录,而这里将该触摸屏移到了PlATform下面,在Windows CE4.2下面是没有以上三条链接库,但PlATform,Public编译路径,先决条件都不同。因此引用的库不一样。
⑵ 删除如下库文件:
           $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/drvlib.lib
该库在Windows CE 4.2系统下为触摸屏与音频共用库,但在Windows CE5.0系统下,这个库已经不是必要的并且已经不存在了,所以删除掉,否则系统会出编译错误。
⑶修改plATform.bib,将我们移植过来的驱动dll包含到nk.bin中
⑷修改plATform.reg,其中CalibrATionDATa是触摸屏的一个参数:
[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]
 "MaxCalError"=dword:7
 portrait
"CalibrATionDATa"="517,610 897,934 142,936 129,290 891,285 "
其他驱动的过程与触摸屏类似。

移植小结
此次移植是升级BSP,而硬件上基本没有变化,因此很多代码不需做修改即可使用,通过以上移植,不难发现此类移植BSP过程中所要做的工作主要在以下几个方面:
⑴  修改dir文件,在dir文件中指定了当前目录哪些文件夹被系统编译,编译器根据dir层层搜索,而移植BSP不可避免的带来了目录的变化,通过修改dir来指定新的编译路径。
⑵  修改sources文件,在sources文件中,指定了编译类型有PLATFORM,OAK;编译的时候引用的库sourcelib,targetlib不一样,移植的时候一定得注意。目标文件类型有Library,Dynlink,program;include字段包含的则是编译时候所需要的头文件目录。有个比较特殊的sources是位于PlATform(例如smdk2410)下的sources.cmn,它包含了该平台的通用库,头文件路径,这个文件在移植过程中需要修改的,否则,编译出错。
⑶ 修改plATform.bib,plATform.reg等文件,因为这两个文件决定了镜像中包含哪些模块(dll)以及注册表相关信息,驱动移植的过程中,每个模块的改动都需要修改这两个配置文件。
⑷ 驱动源文件中的头文件的修改以及函数,变量修改等,这些依据编译时候出现的错误来确定。
除此之外,各部分的移植还需特别注意的地方有:
Bootloader部分:因为bootloader下载,烧写,启动镜像过程会涉及到内存地址的问题,各种入口地址不能出错误,以及内存超出范围,冲突都需要特别小心。尤其是g_oalAddressTable这个表,这个表定义了物理地址虚拟地址之间的转换以及内存的大小,如果设置不正确,将出现校验错误,下载失败或者镜像无法启动等错误。
OAL部分:startup.s以及OEMInitDebugSerial两函数需要特别注意,这两个主要是初始化硬件及串口,这是系统运行及驱动调试的基础,如果硬件配置以及调试串口有改变,则需要适当的修改。此次BSP移植,因硬件平台没有变化,因此OAL部分很多代码无须修改即可使用。
驱动部分:Windows CE4.2与Windows CE5.0的结构,库有了很大的改变,因此需要修改引用库路径,以及头文件的引用路径,大部分驱动都将会遇到这样的问题。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值