智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

WinCE BSP中OAL层中的OEMIoControl介绍
[WinCE WM] 2009-05-02
在WinCE的BSP中的OAL部分,会有一个ioctl.c或者oemioctl.c文件,里面主要定义了一个叫OEMIoControl(..)的函数。可以说OEMIoControl是一个很有用的WinCE内核输入/输出函数。

  在WinCE5.0中,应用程序和驱动程序可以通过调用KernelIoControl(..)函数来访问WinCE内核,导致调用OEMIoControl函数,这样应用程序和驱动程序就可以访问到OAL中的资源了。但在WinCE6.0中,提供了更好的安全性,应用程序能够访问OEMIoControl中的case受到了限制,只有下面的这些case是可以让应用程序访问的:

IOCTL_HAL_GET_CACHE_INFO
IOCTL_HAL_GET_DEVICE_INFO
IOCTL_HAL_GET_DEVICEID
IOCTL_HAL_GET_UUID
IOCTL_PROCESSOR_INFORMATION

  如果用户在应用程序中试图访问其他的case,肯定会返回失败的。在WinCE6.0中,驱动程序还像以前一样,可以访问OEMIoControl中的任何case。也许有人会问,那么我们如何让应用程序也访问到一些case呢??

  办法还是有的,可以看一下WINCE600publiccommonoakoalioctloalioctl.c,这个文件中定义了应用程序可以访问的case,把你的应用程序要访问的case加到这个文件中的IOControl(..)函数中就可以了。当然,你需要重新编译public目录。

  在WinCE5.0中,OEMIoControl函数被定义在BSP中的OAL部分,上面已经提到,应该是ioctl.c或者oemioctl.c,但是在WinCE6.0中,这个函数的定义被移到了WINCE600platformcommonsrccommonioctlioctl.c中了,这里面的OEMIoControl函数和以前也有了变化,该函数会查一个表:g_oalIoCtlTable[]。该表实际上是一个结构数组,定义了OEMIoControl中所有的case,已经针对这个case的处理函数,还包括一个针对每个case的flag,该flag表示是否使用临界区保护。具体定义如下:

typedef struct {
 UINT32 code;
 UINT32 flags;
 BOOL (*pfnHandler) (UINT32, VOID*, UINT32, VOID*, UINT32, UINT32*);
} OAL_IOCTL_HANDLER, *POAL_IOCTL_HANDLER;

  所以,在WinCE6.0的BSP中,我们只需要实现g_oalIoCtlTable[]就可以了。例如:

  
const OAL_IOCTL_HANDLER g_oalIoCtlTable[]={
{ IOCTL_HAL_POSTINIT,                        0, OALIoCtlHalPostInit     },
{ IOCTL_HAL_GET_HIVE_CLEAN_FLAG,         0, OALIoCtlHalGetHiveCleanFlag },
{ IOCTL_HAL_GET_HWENTROPY,               0, OALIoCtlHalGetHWEntropy   },
{ IOCTL_HAL_GET_IMAGE_SIGNED_STATE,     0, OALIoCtlHalGetImageSignedState },
{ IOCTL_HAL_QUERY_FORMAT_PARTITION,     0, OALIoCtlHalQueryFormatPartition },
{ 0,                                           0, NULL}
};

  在OEMIoControl函数中,我们不光要实现OEMIoControl中的case,有一些全局的OAL变量我们也需要定义:

  

g_oalIoCtlClockSpeed This global variable contains information about the processor clock speed.
g_oalIoCtlInstructionSet This global variable contains the processor instruction set identifier.
g_oalIoCtlPlatformOEM This global variable contains information about the hardware platform OEM.
g_oalIoCtlPlatformType This global variable contains information about the hardware platform type.
g_oalIoCtlProcessorCore This global variable contains information about the processor core.
g_oalIoCtlProcessorName This global variable contains information about the processor name.
g_oalIoCtlProcessorVendor This global variable contains information about the processor vendor.

  其实都是一些硬件及平台的相关信息,定义一下就可以了。

  有时根据具体需要,我们还希望在OEMIoControl函数中添加自己定义的case,这个比较简单,只要定义个case,然后在这个case下写你的实现代码就可以了,驱动程序通过KernelIoControl调用同样的case就可以调用到你在OEMIoControl中定义的case了。关于case值得定义,一般都在2048到4096之间会比较安全,我记得在WinCE6.0下,看微软的代码好像256以上就可以了,具体没有试过,要是保险的话,还是用2048以上的值吧。

[WinCE WM添加评论 | 评论/阅读(0/361)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1