reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
阅读:8106回复:23

基于Marvell PXA310上的wince 6.0的开发交流贴

楼主#
更多 发布于:2008-04-22 14:30
基于Wince6.0的开发我估计在国内还不会有很多人接触过。而现今最先进的硬件平台莫过于Marvell的PXA310/PXA300硬件方案了。本人有幸在现阶段进行这方面的工作开展,所以专门立贴于此,供广大的Wince6.0开发者或者有兴趣的交流探讨,更希望能够吸引一些wince方面的专家来给予我们一些指导性意见,答疑解惑,当然也希望斑主多多支持,谢谢大家

最新喜欢:

yfang2yfang2
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-22 14:34
wince的开发有一点非常重要,那就是中断的处理,在此我贡献一点资料供大家参考学习,也算是抛砖引玉了:

中断是硬件与软件打交道的重要方法,因此,大多数驱动程序都涉及到对中断的处理,本文就驱动程序的开发人员以及BSP的开发人员的角度,来谈谈Windows CE中中断的处理过程。

如果一个驱动程序要处理一个中断,那么驱动程序需要首先建立一个事件,可以使用CreateEvent函数,然后调用InterruptInitialize将该事件与中断号绑定,这一步就会使能该中断,OAL中的OEMInerrupteEnable就会被调用,如果该函数不返回true的话,InterruptInitialize就会失败。然后驱动程序中的IST就可以使用WaitForSingleObject函数来等待中断的发生。

当一个硬件中断发生之后,操作系统陷入异常,中断向量指示进入CE的异常处理程序,该异常处理程序然后调用OAL的OEMInterruptHandler函数,该函数检测硬件之后,将硬件中断转换为软件的中断号,返回给系统。该中断号就是上面提到的InterruptInitialize中使用的那个中断号。系统得到该中断号之后,就会找到该中断号对应的事件,并唤醒等待相应事件的线程(IST),然后IST就可以在用户态进行中断处理。处理完成之后,IST需要调用InterruptDone来告诉操作系统中断处理结束,操作系统再次调用OAL中的OEMInterruptDone函数,最后完成中断的处理。

在上面的描述中,驱动程序需要使用的是InterruptInitialize,WaitForSingleObject和InterruptDone三个函数,而BSP开发者需要主要考虑的是OEMInerrupteEnable,OEMInterruptHandler,OEMInterruptDone三个函数。当然,这是上面提到的一些函数,实际上BSP开发者在中断部分还需要考虑Init以及Disable等等函数。

另外,WinCE的中断处理是三个映射关系:

ISQ --> Interrupt ID(逻辑中断号) --> Event对象。

当中断发生时,ISR(中断服务例程)返回该中断号对应的逻辑中断号,然后尽可能快地返回;随后CE就set该逻辑中断号对应的Event对象(如果有的话),以唤醒在该Event等待的IST(中断服务线程),大部分工作都是由IST来完成。一般来说IST是存在驱动程序里,单其实放在普通的应用程序里也可以,尤其是对应只有一个应用程序使用的特殊硬件更方便。因为对应CE来说其实驱动程序也只是一个普通的DLL,也是运行在用户空间。

为了简单起见我们就直接修改BSP包的ISR部分,IST也直接在应用程序里实现,步骤如下:

1、在BSP的oalintr.h里定义自定义中断的逻辑中断值,如:
      #define SYSINTR_MYINTR (SYSINTR_FIRMWARE + 10)

2、修改KERNEL\HAL\cfw.c中的以下三个函数,增加对自定义中断的启用禁用代码:
      OEMInterruptEnable(), OEMInterruptDisable(), OEMInterruptDone()

3、修改KERNEL\HAL\ARM\armint.c中的OEMInterruptHandler(),对irq返回逻辑中断号,如:
 else if (IntPendVal == INTSRC_EINT2) // EINT2
  return(SYSINTR_MYINTR);

4、在PlatformBuilder中重新生成nk.bin,下载运行。

现在,内核已经支持我们的自定义中断SYSINTR_MYINT了,我们在应用程序中就可以把这个SYSINTR_MYINT与一个Event对象关联起来,然后在一个线程里等待这个Event就ok了,这个线程就是IST。

5、在IST里用InterruptInitialize()将自定义中断和Event关联起来,并WaitForSingleObject()。注意下面的代码是在一个线程里(即IST):
 hEvent = CreateEvent(NULL, FALSE, FALSE, NULL));
 InterruptInitialize(SYSINTR_MYINTR, hEvent, NULL, 0));   //若没有修改OEMInterruptEnable(),这个调用就会失败
 while ( TRUE )
 {
  WaitForSingleObject(hEvent, INFINITE);
  // do some process...
}
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-22 14:40
以上的介绍我觉得通俗易懂,非常明朗。另外稍微介绍一下我最近的开发近况:

我目前的开发工作完成了WINCE6.0的USB2.0 OTG host以及client端的开发.
基于windows usb camera开发的经验,wince camera的开发也基本完成。
目前正在着手解决pxa310的唤醒问题,我把现在的问题列出来,看看有没有同仁碰到这样类似的问题:

当将wince系统设为suspend状态的时候,我们的开发板可以正常进入,并且板上消耗电流能够达到10mA,后期调整应该可以更低。但是我们的wakeUp按键触发之后却不能够唤醒系统,根据此时的电流来看,似乎DA9034已经给系统供电了,因为系统的电流已经达到200mA.另外我们的wakeup信号是接到DA9034的EXTON_N脚上,也测试过接到ONKEY_N上,按键后,DA9034的EXT_WAKEUP信号也产生了,但是均没有办法唤醒系统。不知道cpu是怎么来处理这个唤醒中断的,麻烦您给我们一些指导性建议,谢谢

有关控制ext_wakeup的几个寄存器我也都配置了,如下:

pSPMReg->pwer |= 0x8000000F;

pSPMReg->pwsr |= 0x8000000F;

pSPMReg->pecr |= 0xF0000003;

pSPMReg->pcfr |= 0xFFFFFFFB;

尝试了很多的配置,
DA9034关于ONKEY的配置也打开了,相关的寄存器:EVENT_A, STATUS_A, MASK_A, SYS_CONTROL_B.

也希望大家把自己遇到的问题提上来讨论
hanson_csu
驱动牛犊
驱动牛犊
  • 注册日期2008-01-22
  • 最后登录2009-10-16
  • 粉丝0
  • 关注0
  • 积分571分
  • 威望59点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-22 19:34
在确定硬件没问题的前提下,
首先,确认OAL里面是否Enalbe了这个WAKEUP源。

然后,PWRBUTTON Driver(或OEMBUTTON Driver)是否实现了对PM的支持。

接着,检查OEMPowerOff()函数。
http://hanson.cnblogs.com/
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-23 09:40
非常感谢hanson的提示。
看到您的提示对这方面很熟悉。
目前我正在这几个地方打圈圈。逻辑顺序这样:

WAKEUP源是一个外部高电平触发信号,pSPMReg->pwer |= 0x8000000F;

pSPMReg->pwsr |= 0x8000000F;

pSPMReg->pecr |= 0xF0000003;

pSPMReg->pcfr |= 0xFFFFFFFB;
这几个寄存器是允许外部中断的配置。
您说的Enable是指InterruptInitialize函数调用引起的OEMInterruptEnable吗?
在PWRBUTTON Driver里面我用的是一个线程等待wakeup信号事件,这个事件是在PM Driver里面的线程监控设置的,然后设置他进入suspend:SetSystemPowerState(NULL, POWER_STATE_SUSPEND, 0);

现在是能够进入到suspend状态,但是不能够从suspend状态唤醒,是不是有些唤醒前的资源没有保存好,或者我的中断唤醒源没有enable?如果我那样处理enable源不对,请问应该是在什么代码里面enable这个源,谢谢!

下面是我的部分代码:
  m_ulPMICIrq = PXA_INTC_S_EXT1;//唤醒源

    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &m_ulPMICIrq, sizeof(UINT32), &(m_ulPMICSysIntr), sizeof(UINT32), NULL))
    {
        ERRORMSG(1, (TEXT("[PMIC]: PMIC::PMICInit Failed in KernelIoControl (GetLastError() = %d).\r\n"), GetLastError()));                    
        goto ERROR_EXIT;
    }

    if (!InterruptInitialize(m_ulPMICSysIntr, m_hISTEvent, 0, 0))
    {
        ERRORMSG(1, (TEXT("[PMIC]: PMIC::PMICInit Failed in InterruptInitialize (GetLastError() = %d).\r\n"), GetLastError()));                    
        goto ERROR_EXIT;
    }  

然后创建了两个事件表示长按短按:
m_PWBPressEvent=CreateEvent(NULL, FALSE, FALSE, L"PWBPressEvent");
    if(m_PWBPressEvent == NULL)
    {
        RETAILMSG(PMIC_DEBUG,(_T("Create PWBPressEvent error")));
        return ERROR_INVALID_DATA;
    }
    m_PWBLongPressEvent=CreateEvent(NULL, FALSE, FALSE, L"PWBLongPressEvent");
    if(m_PWBLongPressEvent == NULL)
    {
        RETAILMSG(PMIC_DEBUG,(_T("Create PWBLongPressEvent error")));
        return ERROR_INVALID_DATA;
    }
    /*Enable interrupt*/
    m_pSPMReg->pecr |= PECR_E0IE;//对应的唤醒允许寄存器配置
    
    /* Launch IST Thread */
    ThreadStart();      

大致这样子,谢谢指点
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-24 12:21
要实现硬件唤醒要注意哪些问题?我已经没有思路了
通过按键中断能够让系统进入sleep状态,说明终端没有问题了阿
请大家帮忙了,谢谢
xianxiangwy
驱动牛犊
驱动牛犊
  • 注册日期2007-12-06
  • 最后登录2016-01-09
  • 粉丝3
  • 关注0
  • 积分6分
  • 威望15点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-04-24 16:21
不清楚310是否和270一样。可以先检查pwr_en,在sleep状态时肯定是低电平,如果寄存器配置正确,cpu被唤醒后,pwr_en就会变成高电平使能相关电源。这是纯硬件方面的唤醒,你可以用万用表查查,如果这个没问题就请检查软件吧,保存与恢复的是否有问题。对270的VCC_BATT该如何供电,包括上电时序,如何进入sleep、deep sleep(BATT FAULT),如何在deep sleep时通过超级电容保持RTC,如何唤醒,最近狂研究,总算差不多搞明白了,没有比xscale还麻烦的。可以探讨探讨。
fengtao0797
驱动牛犊
驱动牛犊
  • 注册日期2005-10-21
  • 最后登录2011-04-25
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望39点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-04-24 18:10
做个记号,回头可能会碰到
hanson_csu
驱动牛犊
驱动牛犊
  • 注册日期2008-01-22
  • 最后登录2009-10-16
  • 粉丝0
  • 关注0
  • 积分571分
  • 威望59点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-04-24 20:57
引用第4楼reanchear于2008-04-23 09:40发表的  :
非常感谢hanson的提示。
看到您的提示对这方面很熟悉。
目前我正在这几个地方打圈圈。逻辑顺序这样:

WAKEUP源是一个外部高电平触发信号,pSPMReg->pwer |= 0x8000000F;

pSPMReg->pwsr |= 0x8000000F;

pSPMReg->pecr |= 0xF0000003;

pSPMReg->pcfr |= 0xFFFFFFFB;
这几个寄存器是允许外部中断的配置。



你的Power Manager Wake-Up Enable Register (PWER)寄存器设置对了吗?
你的Wake-Up 源具体是什么? 对应的GPIO口是多少?  这些都是要在这个寄存器里面配置的,也就是通过设置相应的位来Enable Wake-Up 源。

这个是第一步,务必要正确。

第二步, 看看你的驱动是否都实现了对PM的支持。

第三步,打印当前Power State判断是否进入了“OFF”或“ON”,通过当前状态的显示来判断。

第四步,打印跟踪OEMPowerOff函数,看看是否进入了该函数。


总之,多打点调试消息吧,便于你调试分析。
http://hanson.cnblogs.com/
inse
驱动牛犊
驱动牛犊
  • 注册日期2005-12-29
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-05-14 13:59
板大你好

我现在也是在开发PXA310+WinCE6.0,
因为之前没有开发过OTG的相关部分,
想跟版大讨教一下有没有相关的资讯,

因为marvell的bsp虽然有含otg driver,但development board上却不能使用....
现在完全没有头绪....

不知道是否有相关的资料,或者能提供版大的驱动给我参考一下

另外WAKEUP的部份,MARVELL的BSP里面应该有相关的CODE可以参考
PXA310是OK的,PXA300就需要自己修改
feixiang83
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2013-05-10
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望36点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-06-14 16:26
各位大哥:
    我想请教一个问题,我现在在用MARVELL PXA310+WM6.0,是用littleton的BSP,可是AcitveSync有时连接上了,但在PC端浏览的时候,内容为空,但Activesync4.5还是显示连接状态。很郁闷,不知道什么原因,请指教,谢谢!
chrislois
驱动牛犊
驱动牛犊
  • 注册日期2003-02-06
  • 最后登录2008-09-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-06-16 10:26
Mark
求知若渴
jidazhuo1
驱动牛犊
驱动牛犊
  • 注册日期2008-01-07
  • 最后登录2010-10-09
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-08-27 14:03
为什么我的系统(pxa310)从deep sleep中唤醒后windows的系统时钟被复位了(又回到12点了)?请高手指教.
utopiadf
驱动牛犊
驱动牛犊
  • 注册日期2008-08-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-08-30 14:44
您好,我刚参与相关项目。
请问,GPIO上电时,VirtualCopy函数的第二个参数lpvSrc 地址是什么啊,在BSP中那个头文件定义呢?
也就是类似2410中的IOP_BASE定义在s2410.h中:#define IOP_BASE  0xB1600000.那么PXA310在那里呢?
谢谢!
zhsh_email
驱动牛犊
驱动牛犊
  • 注册日期2008-07-02
  • 最后登录2010-07-30
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-09-16 15:52
up!!
mbj028
驱动牛犊
驱动牛犊
  • 注册日期2008-11-17
  • 最后登录2008-12-28
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-11-17 19:45
reanchear和 hanson_csu ,不知你们分别在什么地方,我在深圳,从事Marvell PXA3XX方案设计,经常会有项目驱动外包需求,特别是WINCE5.0/6.0 ,如果感兴趣,请联系我:13246737190    MSN:mbj028@hotmail.com     QQ:382339096   马生
jpwang1208
驱动牛犊
驱动牛犊
  • 注册日期2008-10-21
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2008-11-20 21:49
引用第2楼reanchear于2008-04-22 14:40发表的  :
以上的介绍我觉得通俗易懂,非常明朗。另外稍微介绍一下我最近的开发近况:

我目前的开发工作完成了WINCE6.0的USB2.0 OTG host以及client端的开发.
基于windows usb camera开发的经验,wince camera的开发也基本完成。
目前正在着手解决pxa310的唤醒问题,我把现在的问题列出来,看看有没有同仁碰到这样类似的问题:
.......



大侠 先谢谢了  我也在做 我的OTG host 现在可以用U盘;了 ,但是鼠标插上却不能用。能给点提示么
CuiCuiYH
驱动牛犊
驱动牛犊
  • 注册日期2007-09-03
  • 最后登录2009-06-26
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望115点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-12-01 10:20
请大家帮我看看我遇到的问题,谢谢
请教大家,我的PDA 第一次按power button进入suspend模式之后再唤醒(power button 或者plug usb)后会立刻进入到systemidle,此时若唤醒源为usb则,usb不能连接成功,之后再使系统进入suspend再唤醒不会立刻进入systemidle模式,
硬件环境:
CPU:    Marvell PXA300 XScale Processor 624MHz
System Memory/RAM:    Mobile DDR/16Bit 64Mbyte
NAND FLASH:    NAND Flash/16Bit 128MByte
Power Management with Touch Screen controller chip:    Dialog DA9034
SYSTEM: WINCE 5


详细的内容贴在这里:
PXA300+WINCE5 第一次supend->wake 后立刻进入systemidle问题
http://bbs.driverdevelop.com/htm_data/48/0812/114750.html
学无止境
kdeveloper
驱动牛犊
驱动牛犊
  • 注册日期2004-09-06
  • 最后登录2009-06-10
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望103点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2009-06-10 13:48
大家觉得开发pxa310+wince6难度大么?我是指支持比较全的接口,如果uart,bt,wifi,sensor,keypad,lcd irda,gps,gprs,audio,usim,sd/mmc等。
找了一圈开发板,也没找到完全合适的,看来只能自己动手画?
lweiqi
驱动牛犊
驱动牛犊
  • 注册日期2007-07-10
  • 最后登录2009-07-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2009-06-16 19:54
我现在也在做PXA310+CE6的项目,大家多多交流!
上一页
游客

返回顶部