我是靠谱客的博主 唠叨摩托,最近开发中收集的这篇文章主要介绍WinCE6.0 DEVICEEMULATOR BSP的CEDDK简析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

WinCE6.0 DEVICEEMULATOR BSP的CEDDK提供了地址转换函数,位于/SRC/DRIVERS/CEDDK/下,有2个目录DDK_BUS和DLL,前者生成ddk_bus.lib,后者生成ceddk.dll,这部分的CEDDK实现了4个函数,data.c中的HalGetBusDataByOffset和HalSetBusDataByOffset,trans.c中的HalTranslateBusAddress和HalTranslateSystemAddress.下面就来看看这个函数:
1. HalGetBusDataByOffset
HalGetBusDataByOffset从IO Bus地址或者Slot的起始偏移获得信息.该函数读取总线配置数据,将输入参数转换为新的格式给内核去调用执行后续的步骤.
(1) 该函数首先定义了OAL_DDK_PARAMS和PCI_SLOT_NUMBER结构变量.OAL_DDK_PARAMS原型如下,该结构保存了IOCTL_HAL_DDK_CALL需要的信息.

(2) 设置需要调用的IOCTL代码及返回代码

(3) 根据busDataType进行判断,如果是PCIConfiguration进行成员赋值,如设置总线类型(PCIBus),slotNumber,busNumber等.(这里只支持PCIConfiguration的总线类型)

(4) 配置offset,length,pBuffer信息

(5) 最后调用KernelIoControl调用IOCTL_HAL_DDK_CALL的IOCTL
 
2. HalSetBusDataByOffset
HalSetBusDataByOffset与HalGetBusDataByOffset相反,是写总线配置数据.代码也基本类型,仅仅params.function为IOCTL_OAL_WRITEBUSDATA:
params.function = IOCTL_OAL_WRITEBUSDATA;
具体代码如下:

特殊情况发生或者驱动要求调用时,驱动会调用HalSetBusDataByOffset或者HalSetBusData.比如驱动可能调用这个两个函数之一来清除PCI状态寄存器的某一位,如果设备发信号给目标停止初始化.通常硬件或启动代码会正确配置这些设置.
这两个函数在我们目前接触到的驱动还没有用到.应该是和PCI设备相关,而我们的平台上没有PCI总线及设备.

3. HalTranslateBusAddress
HalTranslateBusAddress用来将物理总线地址转换为物理系统地址.
和上面两个函数一样,首先声明了OAL_DDK_PARAMS的对象params,然后对其成员进行赋值.其中function代码设为IOCTL_OAL_TRANSBUSADDRESS.

然后调用IOCTL_HAL_DDK_CALL:

最后将params中转换的地址赋值给输出参数.


关于HalTranslateBusAddress更详细的阐述,在网上找到如下的说明:
HalTranslateBusAddress(Isa, 0, ioPhysicalBase, &inIoSpace, &ioPhysicalBase)函数将与总线相关的地址转换为系统地址,参数1为总线类型,参数2为总线号,参数3为要转换的地址(PHYSICAL_ADDRESS类型,实际是LARGE_INTEGER型),参数4指定寄存器地址属于IO地址空间还是物理地址空间,参数5返回转换后的物理地址。观察HalTranslateBusAddress的源码得知如果是在x86平台,这个函数除了把参数3赋给了参数5其余什么都没有做,而非x86平台将inIoSpace的值置为0,表示一定是物理地址。在调用HalTranslateBusAddress前要确定从注册表中得到的寄存器地址到底是属于哪个地址空间的

这个函数也就是在battery驱动中使用的,调用完HalTranslateBusAddress后在调用MmMapIoSpace将物理地址映射到虚拟地址空间的.
在Battery驱动中加入测试代码:

可以发现:

转换前后的地址是一样的.也就是上问所说的inIoSpace的值置为0,表示一定是物理地址.

4.HalTranslateSystemAddress
HalTranslateSystemAddress将系统物理地址转换为逻辑总线地址,可以传递给总线控制器,如DMA总线控制器.
代码和HalTranslateBusAddress基本类似,区别就是params.function = IOCTL_OAL_TRANSSYSADDRESS

以上就简单看了下CEDDK实现的几个函数,基本上都是针对OAL_DDK_PARAMS的结构进行操作处理,真正核心的操作还是在IOCTL_HAL_DDK_CALL的IOCTL调用.
在C:/WINCE600/PLATFORM/COMMON/SRC/INC/oal_ioctl_tab.h中可以看到IOCTL_HAL_DDK_CALL的定义:
{ IOCTL_HAL_DDK_CALL,                       0,  OALIoCtlHalDdkCall          },
但OALIoCtlHalDdkCall这个函数在我们的BSP中没有实现,关于这块具体的实现还需要进一步深入研究.

最后

以上就是唠叨摩托为你收集整理的WinCE6.0 DEVICEEMULATOR BSP的CEDDK简析的全部内容,希望文章能够帮你解决WinCE6.0 DEVICEEMULATOR BSP的CEDDK简析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部