blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1402回复:7

物理内存的访问

楼主#
更多 发布于:2002-11-22 23:25
WINCE 下如何访问一段物理内存?
但不是 DMA 方式?
我硬件用的是内存映射方式的。

最新喜欢:

yellowdogyellow...
努力!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-25 21:21
为什么没有人理我?
100分向送!
努力!
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-26 08:55
WDM中的方法,不知道对你有没有参考意义:
typedef struct _DEVICE_EXTENSION {
  ...
  PUCHAR membase;
  ULONG nbytes;
  ...
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

PHYSICAL_ADDRESS membase;     // base address of range
...
for (ULONG i = 0; i < nres; ++i, ++resource)
{
  switch (resource->Type)
  {
  case CmResourceTypeMemory:
  membase = resource->u.Memory.Start; <--1
    pdx->nbytes = resource->u.Memory.Length;
    break;
  ...
  }
...
pdx->membase = (PUCHAR) MmMapIoSpace(membase, pdx->nbytes, MmNonCached); <--2
if (!pdx->membase)
  return STATUS_NO_MEMORY;
 

在资源描述符中,u.Memory含有内存资源信息。u.Memory.Start是一个内存范围的起始地址,u.Memory.Length是该范围的字节长度。起始地址是一个64位的PHYSICAL_ADDRESS值。u.Port和u.Memory子结构完全相同,这是故意的,并非偶然,如果你需要你可以依靠这个事实。
你必须调用MmMapIoSpace函数获得一个内核模式虚拟地址,这样内存范围才能被访问。


简单的可以这样用:
PHYSICAL_ADDRESS paddr;
paddr.QuadPart = (__int64)Entry;
tmpentry = (ULONG *)MmMapIoSpace (paddr,32,MmNonCached);


 
生命驱动,活力无限!
Davisfront
驱动牛犊
驱动牛犊
  • 注册日期2002-11-04
  • 最后登录2003-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-26 09:12
看看这个贴子哪http://www.driverdevelop.com/forum/html_27032.html?1038273358

[编辑 -  11/26/02 by  Davisfront]
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-27 10:03
楼上的两位老兄,先谢谢了.
分 我已先给了一部分,ydyuse 的在 另外一个地方 ABC  给的.

但我感觉在 CE 下 好象和这还有一些不一样的.
在把我的问题说详细一点吧:
  我在PCM3350上用的一块双口RAM,使用的是内存映射方式.
地址为D0000到DFFFF共4k.要在应用程序中使用这一块内存,先要在驱动中将这块物理内存映射为系统内存,然后再进行操作.另外好象还要在CONFIG.BIB中进行一些什么配置之类的.CONFIG.BIB配置的地址是怎么得到的呢?
  不知谁能再告诉我一下.
   谢谢!!!
努力!
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-30 13:31
大家帮帮忙呀?
努力!
xmFu
驱动牛犊
驱动牛犊
  • 注册日期2001-06-08
  • 最后登录2003-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-02 21:13
用VirtualAlloc  and  Virtualcopy 映射
FANS
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-03 17:33
我现在又遇到了中断的问题
中断服务程序怎么和中断号关联起来呀?
需要在注册表里配置还是用程序写?
努力!
游客

返回顶部