wince6.0物理地址映射虚拟地址错误

xingjutongxin   2010-3-23 14:10 楼主
地址映射错误。报错如下:
ERROR: C:\WINCE600\PLATFORM\SBC8100\SRC\DRIVERS\TOUCH\.\touchscreen.cpp line 182
: For PRCMregs: VirtualAlloc failed!

物理地址映射虚拟地址程序如下:为什么其他的没有问题,就v_pPRCMregs寄存器映射出错?
  1. TSP_RegAlloc(PVOID addr, INT sz)
  2. {
  3.         PVOID reg;

  4.         reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);

  5.         if (reg)
  6.         {
  7.                 if (!VirtualCopy(reg, (PVOID)((UINT32)addr >> 8), sz, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE ))
  8.                 {
  9.                         VirtualFree(reg, 0, MEM_RELEASE);
  10.                         reg = NULL;
  11.                 }
  12.         }

  13.         return reg;
  14. }

  15. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. v_pIOPregs = (volatile OMAP_GPIO_REGS *)TSP_RegAlloc((PVOID)OMAP_GPIO6_REGS_PA, sizeof(OMAP_GPIO_REGS));////2
  17.                 if (v_pIOPregs == NULL)
  18.                 {
  19.                         ERRORMSG(1,(TEXT("For IOPreg: VirtualAlloc failed!\r\n")));
  20.                         break;
  21.                 }
  22.        
  23.                 v_pIICPregs = (volatile OMAP_I2C_REGS *)TSP_RegAlloc((PVOID)OMAP_I2C3_REGS_PA, sizeof(OMAP_I2C_REGS));        /////////2
  24.                 if (v_pIICPregs == NULL)
  25.                 {
  26.                     ERRORMSG(1,(TEXT("For IICregs: VirtualAlloc failed!\r\n")));
  27.                     break;
  28.                 }

  29.                 v_pINTregs = (volatile OMAP_INTC_MPU_REGS *)TSP_RegAlloc((PVOID)OMAP_INTC_MPU_REGS_PA, sizeof(OMAP_INTC_MPU_REGS));
  30.                 if (v_pADCregs == NULL)
  31.                 {
  32.                     ERRORMSG(1,(TEXT("For INTregs: VirtualAlloc failed!\r\n")));
  33.                     break;
  34.                 }

  35.                 v_pPRCMregs = (volatile OMAP_PRCM_CORE_CM_REGS *)TSP_RegAlloc((PVOID)OMAP_PRCM_CORE_CM_REGS_PA, sizeof(OMAP_PRCM_CORE_CM_REGS));/////////2
  36.                 if (v_pPRCMregs == NULL)
  37.                 {
  38.                     ERRORMSG(1,(TEXT("For PRCMregs: VirtualAlloc failed!\r\n")));
  39.                     break;
  40.                 }


OMAP_PRCM_CORE_CM_REGS结构为:

  1. typedef volatile struct {

  2.     unsigned int CM_FCLKEN1_CORE;            // offset 0x0000
  3.     unsigned int zzzReserved00[1];           // offset 0x0004
  4.     unsigned int CM_FCLKEN3_CORE;            // offset 0x0008
  5.     unsigned int zzzReserved01[1];

  6.     unsigned int CM_ICLKEN1_CORE;            // offset 0x0010
  7.     unsigned int CM_ICLKEN2_CORE;            // offset 0x0014
  8.     unsigned int CM_ICLKEN3_CORE;            // offset 0x0018
  9.     unsigned int zzzReserved02[1];

  10.     unsigned int CM_IDLEST1_CORE;            // offset 0x0020
  11.     unsigned int CM_IDLEST2_CORE;            // offset 0x0024
  12.     unsigned int CM_IDLEST3_CORE;            // offset 0x0028
  13.     unsigned int zzzReserved03[1];

  14.     unsigned int CM_AUTOIDLE1_CORE;          // offset 0x0030
  15.     unsigned int CM_AUTOIDLE2_CORE;          // offset 0x0034
  16.     unsigned int CM_AUTOIDLE3_CORE;          // offset 0x0038
  17.     unsigned int zzzReserved04[1];

  18.     unsigned int CM_CLKSEL_CORE;             // offset 0x0040
  19.     unsigned int zzzReserved05[1];           // offset 0x0044
  20.     unsigned int CM_CLKSTCTRL_CORE;          // offset 0x0048
  21.     unsigned int CM_CLKSTST_CORE;            // offset 0x004C

  22. } OMAP_PRCM_CORE_CM_REGS;

回复评论 (11)

映射表中有关于OMAP_PRCM_CORE_CM_REGS的物理地址和虚拟地址吗?
点赞  2010-3-23 15:12
看不出啥猫腻,找个类似成功的例子对比一下。
点赞  2010-3-23 16:00
是编译时出的错,还是执行时呢?
点赞  2010-3-23 18:31
楼主GetlastError看看error code是多少?

看上去貌似没有问题啊
点赞  2010-3-23 22:57
upupupup
点赞  2010-3-24 08:14
引用: 引用 1 楼 veabol 的回复:

映射表中有关于OMAP_PRCM_CORE_CM_REGS的物理地址和虚拟地址吗?

我是楼主。你所说的映射表是指?map?
点赞  2010-3-24 20:32
引用: 引用 3 楼 sunrain_hjb 的回复:

是编译时出的错,还是执行时呢?


我是楼主。是执行的时候报错。编译链接都通过。
点赞  2010-3-24 20:33
引用: 引用 1 楼 veabol 的回复:

映射表中有关于OMAP_PRCM_CORE_CM_REGS的物理地址和虚拟地址吗?

VirtualAlloc不是动态分配吗,需要在映射表中设置吗.Veabol大侠能不能
说得详细点.

这个问题不错, 关注中.......
点赞  2010-3-24 23:44
呵呵,学习了MARK
点赞  2010-3-25 08:26
很可能是OMAP_PRCM_CORE_CM_REGS_PA的问题,
请楼主确认一下该值。
点赞  2010-3-25 09:10
引用: 引用 10 楼 sunrain_hjb 的回复:

很可能是OMAP_PRCM_CORE_CM_REGS_PA的问题,
请楼主确认一下该值。

我是楼主。

base_reg_h文件中:


  1. #define OMAP_PRCM_CORE_CM_REGS_PA               0x48004A00
  2. #define OMAP_PRCM_CORE_CM_REGS_SIZE             0x00000100


datasheet中定义如下:
点赞  2010-3-25 11:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复