阅读:8262回复:23
基于Marvell PXA310上的wince 6.0的开发交流贴
基于Wince6.0的开发我估计在国内还不会有很多人接触过。而现今最先进的硬件平台莫过于Marvell的PXA310/PXA300硬件方案了。本人有幸在现阶段进行这方面的工作开展,所以专门立贴于此,供广大的Wince6.0开发者或者有兴趣的交流探讨,更希望能够吸引一些wince方面的专家来给予我们一些指导性意见,答疑解惑,当然也希望斑主多多支持,谢谢大家
|
|
最新喜欢:yfang2 |
沙发#
发布于: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... } |
|
板凳#
发布于: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. 也希望大家把自己遇到的问题提上来讨论 |
|
地板#
发布于:2008-04-22 19:34
在确定硬件没问题的前提下,
首先,确认OAL里面是否Enalbe了这个WAKEUP源。 然后,PWRBUTTON Driver(或OEMBUTTON Driver)是否实现了对PM的支持。 接着,检查OEMPowerOff()函数。 |
|
|
地下室#
发布于: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(); 大致这样子,谢谢指点 |
|
5楼#
发布于:2008-04-24 12:21
要实现硬件唤醒要注意哪些问题?我已经没有思路了
通过按键中断能够让系统进入sleep状态,说明终端没有问题了阿 请大家帮忙了,谢谢 |
|
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还麻烦的。可以探讨探讨。
|
|
7楼#
发布于:2008-04-24 18:10
做个记号,回头可能会碰到
|
|
8楼#
发布于:2008-04-24 20:57
引用第4楼reanchear于2008-04-23 09:40发表的 : 你的Power Manager Wake-Up Enable Register (PWER)寄存器设置对了吗? 你的Wake-Up 源具体是什么? 对应的GPIO口是多少? 这些都是要在这个寄存器里面配置的,也就是通过设置相应的位来Enable Wake-Up 源。 这个是第一步,务必要正确。 第二步, 看看你的驱动是否都实现了对PM的支持。 第三步,打印当前Power State判断是否进入了“OFF”或“ON”,通过当前状态的显示来判断。 第四步,打印跟踪OEMPowerOff函数,看看是否进入了该函数。 总之,多打点调试消息吧,便于你调试分析。 |
|
|
9楼#
发布于:2008-05-14 13:59
板大你好
我现在也是在开发PXA310+WinCE6.0, 因为之前没有开发过OTG的相关部分, 想跟版大讨教一下有没有相关的资讯, 因为marvell的bsp虽然有含otg driver,但development board上却不能使用.... 现在完全没有头绪.... 不知道是否有相关的资料,或者能提供版大的驱动给我参考一下 另外WAKEUP的部份,MARVELL的BSP里面应该有相关的CODE可以参考 PXA310是OK的,PXA300就需要自己修改 |
|
10楼#
发布于:2008-06-14 16:26
各位大哥:
我想请教一个问题,我现在在用MARVELL PXA310+WM6.0,是用littleton的BSP,可是AcitveSync有时连接上了,但在PC端浏览的时候,内容为空,但Activesync4.5还是显示连接状态。很郁闷,不知道什么原因,请指教,谢谢! |
|
11楼#
发布于:2008-06-16 10:26
Mark
|
|
|
12楼#
发布于:2008-08-27 14:03
为什么我的系统(pxa310)从deep sleep中唤醒后windows的系统时钟被复位了(又回到12点了)?请高手指教.
|
|
13楼#
发布于:2008-08-30 14:44
您好,我刚参与相关项目。
请问,GPIO上电时,VirtualCopy函数的第二个参数lpvSrc 地址是什么啊,在BSP中那个头文件定义呢? 也就是类似2410中的IOP_BASE定义在s2410.h中:#define IOP_BASE 0xB1600000.那么PXA310在那里呢? 谢谢! |
|
14楼#
发布于:2008-09-16 15:52
up!!
|
|
15楼#
发布于:2008-11-17 19:45
reanchear和 hanson_csu ,不知你们分别在什么地方,我在深圳,从事Marvell PXA3XX方案设计,经常会有项目驱动外包需求,特别是WINCE5.0/6.0 ,如果感兴趣,请联系我:13246737190 MSN:mbj028@hotmail.com QQ:382339096 马生
|
|
16楼#
发布于:2008-11-20 21:49
引用第2楼reanchear于2008-04-22 14:40发表的 : 大侠 先谢谢了 我也在做 我的OTG host 现在可以用U盘;了 ,但是鼠标插上却不能用。能给点提示么 |
|
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 |
|
|
18楼#
发布于:2009-06-10 13:48
大家觉得开发pxa310+wince6难度大么?我是指支持比较全的接口,如果uart,bt,wifi,sensor,keypad,lcd irda,gps,gprs,audio,usim,sd/mmc等。
找了一圈开发板,也没找到完全合适的,看来只能自己动手画? |
|
19楼#
发布于:2009-06-16 19:54
我现在也在做PXA310+CE6的项目,大家多多交流!
|
|
上一页
下一页