goodtaste
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5792回复:11

请问在CE上如何读写寄存器?

楼主#
更多 发布于:2005-05-10 16:54
我不是作驱动开发的,让msdn搞晕了。
我希望使用 Intel cpu PXA 250 的watch dog功能。cpu的说明书告诉
我应该写0x40A0_0010等寄存器(都是32位寄存器),这个地址需要做map才能给WRITE_REGISTRE_ULONG使用吧?
具体应该怎么做呢?请给我一个例子吧?谢谢!
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-10 17:33
你先在BSP里面找OEMADDRESSTABLE,然后查这个表得到0x40A0_0010被映射成了什么地址。

1.如果你要在OAL代码中访问,可以直接使用刚才那张表映射后的虚拟地址,这个表是怎么映射的请查帮助。

2.如果你要在驱动中访问,需要使用VIRTUALALLOC和VIRTUALCOPY这两个函数将刚才那个虚拟地址在映射一次使用,具体使用查帮助。
根据地的兄弟们,团结就是力量
goodtaste
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-11 08:26
我不是想在驱动中写寄存器,我只是想在evc写的应用程序里写寄存器。
请问这应该怎么做呢?您刚才说得我都不懂。:)
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-11 15:00
应用中使用采用第二个方式,你就直接用物理地址吧,用VIRTUALALLOC和VIRTUALCOPY这两个函数来映射,查查帮助再试试吧,要说清楚好长喔:)))
根据地的兄弟们,团结就是力量
goodtaste
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-11 15:47
VIRTUALALLOC和VIRTUALCOPY对我有用吗?我只是想修改一个寄存器中某几位的数值。这个寄存器是CPU自己的watchdog用的。

{
    ULONG ulPort = 0x40A0000C;
    WRITE_PORT_ULONG((unsigned long*)ulPort,0xFFFF);
}

可以吗?
这个调用总是引起访问违例
帮帮我吧,谢谢!
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-11 16:08
应用程序要用虚拟地址访问底层硬件,使用物理地址是不行DI。

PVOID MyVirtualMap(PVOID phyMem, UINT32 size)
{
    PVOID pVirtualAddr;
    pVirtualAddr = (PVOID)VirtualAlloc(0,size,MEM_RESERVE,PAGE_NOACCESS);

    VirtualCopy(pVirtualAddr,phyMem/256,size,PAGE_READWRITE|PAGE_NACACHE));

}

这里phyMem给0x40A00000,从MyvirtualMap得到的值再加0x0c,就可以了,注意哈,不能直接用0x40A0000C哈

最后,虽然CE允许,但最好不要在应用里面这样,显得有点儿...那个:)))
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-11 16:11
应用程序要用虚拟地址访问底层硬件,使用物理地址是不行DI。

PVOID MyVirtualMap(PVOID phyMem, UINT32 size)
{
PVOID pVirtualAddr;
pVirtualAddr = (PVOID)VirtualAlloc(0,size,MEM_RESERVE,PAGE_NOACCESS);

VirtualCopy(pVirtualAddr,phyMem/256,size,PAGE_READWRITE|PAGE_NOCACHE));

}

这里phyMem给0x40A00000,从MyvirtualMap得到的值再加0x0c,就可以了,注意哈,不能直接用0x40A0000C哈

最后,虽然CE允许,但最好不要在应用里面这样,显得有点儿...那个:)))
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-11 16:12
照着第二个写哈,第一个写错了个字母
根据地的兄弟们,团结就是力量
goodtaste
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2005-05-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-11 16:34
嗬嗬,成功了.谢谢!

wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-11 17:05
HOHO,厉害!:))
根据地的兄弟们,团结就是力量
muyudejiu
驱动牛犊
驱动牛犊
  • 注册日期2005-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-07-18 14:05
新来的,真长见识
whpd123
驱动牛犊
驱动牛犊
  • 注册日期2008-05-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望43点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-11-26 10:39
刚好遇到和楼主一样的问题,想在EVC下读写WINCE的硬件寄存器,我的处理器是SH系列的,看了此贴很受益,不过还有一些地方没弄明白,想请教高手:
1. 文中提到的phyMem 不能直接用,那应该怎么拆分呢?比如楼主的0x40A0000C就拆分成0x40A00000和0x0c,那么如:0xa4050160,0xa4050140,0xa4c50004以及0xa4c50020等这样一些地址应该如何拆分?

2. 另外,VirtualAlloc()和VirtualCopy()这种用法和 MmMapIOspace()有何区别?


3. 最后一点,在读写8位,16位以及32位寄存器时,以上方法在参数上有何区别?
游客

返回顶部