关于WinCE驱动编写时的IO地址映射

如何编写Windows CE的usb驱动程序 立即下载

一直在琢磨,WinCE中的虚拟地址和实际的物理地址是如何对应的。比如WinCE.Net4.2提高的源码:C:/WINCE420/PLATFORM/XSC1BD/DRIVERS/DISPLAY/SA_LCD/sa2video.cpp中,有如下代码:


BOOL MapVirtualAddress()
{

     v_pLcdRegs = (volatile SA2lcdregs *)VirtualAllocCopy(sizeof(SA2lcdregs),"DispDrvrInitialize : v_pLcdRegs",(PVOID)(LCD_BASE_U_VIRTUAL));
 if (!v_pLcdRegs)
 {
  Cleanup();
  return FALSE;
 }

     v_pClkRegs = (volatile CLKMAN_REGS *)VirtualAllocCopy(sizeof(CLKMAN_REGS),"DispDrvrInitialize : v_pClkRegs",(PVOID)(CLK_BASE_U_VIRTUAL));
 if (!v_pClkRegs)
 {
  Cleanup();
  return FALSE;
 }

 v_pGPIORegs = (volatile GPIO_REGS *)VirtualAllocCopy(sizeof(GPIO_REGS),"DispDrvrInitialize : v_pGPIORegs",(PVOID)(GPIO_BASE_U_VIRTUAL));
 if (!v_pGPIORegs)
 {
  Cleanup();
  return FALSE;
 }

...

}


这里的VirtualAllocCopy函数中GPIO_BASE_U_VIRTUAL是如何对应得来的呢?


这里的VirtualAllocCopy函数中GPIO_BASE_U_VIRTUAL是如何对应得来的呢?

1.先看看它的定义:

#define GPIO_BASE_PHYSICAL              (PERIF_BASE_PHYSICAL + GPIO_OFFSET)
#define GPIO_BASE_C_VIRTUAL             (PERIF_BASE_C_VIRTUAL + GPIO_OFFSET)
#define GPIO_BASE_U_VIRTUAL             (PERIF_BASE_U_VIRTUAL + GPIO_OFFSET)

//
// MEMORY-MAPPED REGISTERS (perifs)
//
#define PERIF_BASE_PHYSICAL   0x40000000
#define PERIF_BASE_C_VIRTUAL  0x86200000
#define PERIF_BASE_U_VIRTUAL  (PERIF_BASE_C_VIRTUAL+CACHED_TO_UNCACHED_OFFSET)

#define CACHED_TO_UNCACHED_OFFSET  0x20000000

#define GPIO_OFFSET                   0x00E00000      // GPIO 

这个CPIO的定义好像与芯片DataSheet中的物理映射虚地址对应:)

这个CPIO的定义好像与芯片DataSheet中的物理映射虚地址对应:)

2. 在google中搜索,发现了一位joyfly兄的回答非常有道理

具体链结地址:http://www.palmheart.net/index.php?name=PNphpBB2&file=viewtopic&p=23627

下面是他的解释:
OEMAddressTable里定义的映射关系是给ARM MMU用的,是在KernelStart(source code参考wince420/private/目录)时建立的,只要WINCE还在跑,就不会解除.
OEMAddressTable里的Virtual Addr和Physical Addr是对ARM来说的. 其实对于WINCE,就只能访问到它的Virtual address. 也就是说,OEMAddressTable里的Virtual address对WINCE 系统来说才是Physical Address.

经过OEMAddressTable映射后的系统的物理地址,在0x80000000~0x9fffffff之间.是caching and buffering的地址,这个地址加上0x20000000,就是它的cache & buffering disabled地址.所有的硬件寄存器的地址都在这个地址段上,受MMU保护的.

上面讲的系统的物理地址,从0x80000000~0xbfffffff,在Kernel Mode下都可以直接访问. ISR是在KERNEL里,也就可以直接访问这些系统的物理地址.无所谓"因为ISR只能访问静态映射的虚拟地址".

上面说过,对于ARM来说,有虚拟地址和物理地址之分,对于WINCE来说,也有虚拟地址和物理地址之分. 可以这么说,ARM的虚拟地址就是WINCE系统的物理地址.
32位的OS总共有4G的虚拟地址空间,WINCE也不例外. 其中,0x00000000~0x80000000是Application Space; 0x80000000~0xffffffff是System Reserved. 系统的物理地址就在System Reserved的这段,只能在KERNEL MODE访问. 那么,当APPLICATION和DRIVER(都是运行在USER MODE)要访问这些在System Reserved地址段的硬件寄存器或MEMORY怎么办呢? 只好再建立一层映射关系,在Application Space里分配一段空间,把它映射到System Reserved里的地址上,这就是VirtualAlloc/Copy和MmMapIoSpace干的事情.


3.其它参考

(1) Windows CE .NET Advanced Memory Management 链结:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncenet/html/advmemmgmt.asp

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》 本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/ 阅读详情

相关推荐

HTPA 32x32d热成像传感器实战指南:从替代MLX90640到精准测温

本文为HTPA 32x32d热成像传感器提供了从硬件连接到精准测温的完整实战指南。针对MLX90640替代需求,详细解析了HTPA传感器的核心优势、IIC通信要点、EEPROM校准数据读取与解析、独特的块数据读取模式,并逐步拆解了五大温度补偿计算流程,旨在帮助开发者克服高开发门槛,实现稳定可靠的非接触式测温应用。

weixin_29279101的博客 317

WINCE 流驱动的xx_IOControl

 前言       刚刚完成一个WINCE 下的I2C的流驱动,由于在读I2C 时要进行参数的传入和传出,所以其中的xx_IOControl必须要完成,像一些简单的传递单向数据的驱动,要xx_Read或xx_Write就可以实现.       之前没有写过xx_IOControl,所以参考了网上的代码又结合自己的软硬件环境,我现有的BSP 里已经实现了I2C 读写的基本函数,所以只

AlicePeter的专栏 4624

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1468

WinCE流设备驱动简介及GPIO驱动的实

转载——WinCE流设备驱动简介及GPIO驱动的实现 http://blog.youkuaiyun.com/nanjianhui/archive/2008/07/18/2674753.aspx作者:ARM-WinCE流设备驱动实际上就是导出标准的流接口函数的驱动,这是文档上面的定义。在WinCE中,所有的流设备都导出流设备接口,这样WinCE中的Device Manager可以加载和管理这些流设备驱动。流设备驱动的架构如图:首先我声明一下,这个图是我抄的,呵呵。在WinCE启动的时候,OAL(OAL.exe)首先加载k

embed2010的专栏 945

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件

本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。

weixin_29313239的博客 457

自动驾驶小车DIY:树莓派+激光雷达实现DWA路径规划(从仿真到实车)

本文详细介绍了如何基于树莓派与激光雷达,从零搭建一套完整的自动驾驶小车系统,并实现DWA局部路径规划算法。内容涵盖硬件选型、ROS环境部署、DWA算法原理与仿真,以及关键的实车调试与性能优化技巧,为创客和竞赛爱好者提供了一套低成本、高可行性的自主导航解决方案。

kiwi8的博客 530

WinCE流设备驱动简介及GPIO驱动的实现

转载:WinCE流设备驱动简介及GPIO驱动的实现流设备驱动实际上就是导出标准的流接口函数的驱动,这是文档上面的定义。在WinCE中,所有的流设备都导出流设备接口,这样WinCE中的Device Manager可以加载和管理这些流设备驱动。流设备驱动的架构如图:  首先我声明一下,这个图是我抄的,呵呵。在WinCE启动的时候,OAL(OAL.exe)首先加载kernel.dll,然

dengxin123的专栏 719

Vivado FFT IP核配置与实战:FPGA信号处理硬件加速指南

快速傅里叶变换(FFT)是数字信号处理(DSP)中的核心算法,用于将时域信号转换到频域进行分析。其原理基于离散傅里叶变换(DFT),通过蝶形运算的分解与复用,大幅降低了计算复杂度。在工程实践中,软件实现的FFT难以满足高速实时处理的需求,因此硬件加速方案至关重要。FPGA凭借其并行架构和可定制性,成为实现高性能FFT的理想平台。通过集成专用的FFT IP核,如Vivado中的Pipelined Streaming I/O架构,可以构建流水线化的计算引擎,实现极低延迟和高吞吐量的连续数据流处理。这种硬件方案特

weixin_42536863的博客 649

WinCE驱动编写 小结

1、基础知识:1)系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件细节,在应用程序看来硬件只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动是内核的一部分。2)驱动程序完成以下功能:——对设备初始化和释放;——把数据从内核传送到硬件和从硬件读取数据;——读取应用程序传送给设备文

@塘外人 4332

工业级AI智能体落地:OpenClaw+ONNX Runtime全栈部署,端到端延迟压至12ms

OpenClaw+ONNX的组合为工业AI智能体的落地提供了一套完整、高效、安全的解决方案。它解决了传统云端智能体在工业场景中面临的延迟、安全和稳定性问题,实现了本地数据闭环和毫秒级响应。未来,随着边缘计算和轻量级大模型技术的发展,工业AI智能体将变得更加智能和强大。我们可以预见,在不久的将来,工厂里的每一台设备都将拥有自己的AI智能体,它们能够自主感知、自主决策、自主执行,真正实现工业生产的全自动化和智能化。👉 点击我的头像进入主页,关注专栏第一时间收到更新提醒,有问题评论区交流,看到都会回。

2601_94871597的博客 736

黑猫带你学eMMC协议第9篇:eMMC初始化过程(initial)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是emmc的初始化 对于小白来说,可能不太明白什么是emmc初始化。举个栗子:当你拿到一个电脑,接上电源,是不是就立马可以用了呢?并不是吧,你还需要去开机,等待电脑启动,配置完各种参数,等出现了电脑桌面,你才能用。那么同样,对于emmc芯片来说,也不是提供电源就能用了,需要输入各种命令后,让其进入到tran state后,才能正.

黑猫奥利奥的博客 6742

210板wince键盘驱动分析和移植

主要是bsp包里面的3个cpp文件的分析。 首先是pddlist.cpp文件 这个文件介绍了3种键盘的wince的api入口函数名前面加winapi),本文只关心第二种矩阵键盘。 然后在kbd.cpp文件中可以找到这个入口函数Matrix_Entry。 这里值得注意的是,本驱动是全键盘驱动,里面涉及到一些shift键和fn键的处理,即组合键的处理,这里先不分析,因为暂时没有用到。 分析这

学习是为了探索这个世界的本质 919

2025MCM美赛 数学建模 问题 C:奥运奖牌榜模型 思路+matlab代码+python代码

目录问题一详细思路步骤1. 数据准备与预处理2. 特征选择与构建3. 模型选择4. 模型训练与评估5. 预测与不确定性分析6. 分析与结果解释步骤详细代码实现python代码代码解析matlab代码问题二详细思路解决方案步骤1. 构建生产模型:2. 优化决策:3. 代码实现:代码解析matlab代码问题三的详细思路解决思路:代码实现1. 数据准备2. 代码实现matlab代码在这个问题中,我们的目标是根据历史奥运会的数据,建立一个模型来预测2028年洛杉矶奥运会各国的奖牌数。具体要求是:首先,整理并加载奥运

斌擎科技 2144

WinCE CEDDK之IO访问函数

作者:ARM-WinCE CEDDK就是CE的DDK,其中封装了一些驱动开发会用到的函数。有时在开发驱动的时候用CEDDK中的函数会比较方便,使用的时候需要连接ceddk.dll,源代码为于WinCE的/PUBLIC/Common/Oak/Drivers/CEDDK下面找到,其中大致可以分为几类,如下:    IO访问函数(ddk_io.c)    DMA操作函数(ddk_dma.

唐勉的ARM/Linux/WinCE专栏 4346

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

wince下的地址映射知识点滴

1.如果是在bootloader中访问设备寄存器,可以直接操作物理地址。 2.wince启动后,硬件上ARM和X86体系的处理器启动了MMU,操作系统只能访问到虚拟地址,不能直接操作物理内存了。但是如果是X86的CPU,由于它的外设I/O端口和存储器空间分开编址,可以直接嵌入汇编或者使用read_port_xxx,write_port_xxx来读写设备寄存器的物理地址。 3.wince

森林之音的专栏 555

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【转载】WinCE CEDDK之IO访问函数

转载自:http://blog.youkuaiyun.com/nanjianhui/article/details/3574899 CEDDK就是CE的DDK,其中封装了一些驱动开发会用到的函数。有时在开发驱动的时候用CEDDK中的函数会比较方便,使用的时候需要连接ceddk.dll,源代码为于WinCE的/PUBLIC/Common/Oak/Drivers/CEDDK下面找到,其中大致可以分为几类,...

weixin_33709364的博客 103

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

wince6.0 s5pv210 iic驱动 报错

在读iic时经常会报如下错误 Exception 'Data Abort' (4): Thread-Id=0909001a(pth=8c61a834), Proc-Id=00400002(pprc=824f9308) 'NK.EXE', VM-active=0567014e(pprc=8ccaaedc) 'edm.exe' PC=c0bc75a0(i2c.dll+0x000075a0) RA=

zmq5411的专栏 1434

WINCE下I/O操作基础

对外设进行 I/O 操作实际上也就是读写外设的寄存器,而我们通常使用的X86或者ARM处理器在硬件上决定了wince系统启动后,无法直接访问物理地址,因此需要做一些工作来实现I/O操作.   首先要理解 windows CE 下的地址映射机制。 wince有两种地址:物理地址和虚拟地址.不同架构的 CPU 硬件上的区别导致地址映射也不同。MIPS和SH x 处理器,不采用MMU,直接在CPU

学习是为了探索这个世界的本质 757

wince与linux的比较(摘录)

1) WinCE与Linux有何区别?(商业模式,学习和开发难度,对硬件的支持,稳定性,对工程师未来发展的帮助,对研发中心未来发展的帮助)  嵌入式Linux OS与Windows CE相比的优点:  第一:Linux是开放源代码,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;Windows CE目前6.0内核全部开放,GUI不开放。第二:Linux的内核小、效率高;Wi

WHJ的嵌入式生活 7747

【WinCE】技术文档汇总----更新至20121214

为了方便查找相关文档,在此链接了转载的和原创的技术帖子! 【转载】在WinCE5.0和WinCE6.0下,编译选项介绍 【转载】WinCE EBOOT中的BootPart分析 【转载】WinCE Eboot中的OEM Flash函数 【转载】WinCE Eboot中的BLCOMMON 【转载】WinCE EBOOT中的Boot Args与Driver Globals 【转载】Win...

weixin_34341117的博客 94

wince驱动开发-----------概念介绍(二)

4.驱动程序的资源:               驱动程序资源管理师编写驱动程序的一个核心,由以下基本分构成:                      (1)资源管理器:在wince中,系统资源(包括IRQ 和I/O 空间)是由系统注册表配置和定义的,资源管理器跟踪可利用的系统资源,并管理驱动程序加载时资源的请求与分配。通常OAL和注册表会预先分配一些总线驱动请求的IRQ和io空间。当dev

ghjk014的专栏 485

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.

shevsten的专栏 3108
上一篇: PXA255的嵌入开发计划总算有点眉目了
下一篇: 如何编写Linux的LCD驱动
仰泳的鱼儿
博客等级 码龄24年 42粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值