pxa270 在wince5.0下的应用程序直接访问物理地址的问题

mn14174   2010-4-3 11:42 楼主
小弟想在wince5.0下直接用应用程序访问物理地址,直接用VirtualAlloc函数分配800 0000对应的虚拟地址,同时也在应用程序下把gpio78配置成了ncs2,但是不管怎样,总是读不到数据,且连ncs2都打不到波形啊!不知道有没有谁做过类似的改装,给点建议吧,谢谢了!

回复评论 (6)

没弄过,帮顶下。

MARK.
点赞  2010-4-3 14:56
单单用VirtualAlloc函数还不行,还必须使用VirtualCopy才可以
点赞  2010-4-3 21:51
VirtualAlloc+VirtualCopy,同时查一下地址的合法性,确认是可以访问的地址
点赞  2010-4-3 22:12
引用: 引用 3 楼 hiproz 的回复:
VirtualAlloc+VirtualCopy,同时查一下地址的合法性,确认是可以访问的地址


配置ncs2的代码如下
void ConfgnCS2()
{
BOOL   RetValue = TRUE;
IOPreg * v_pIOPregs;
        v_pIOPregs = (IOPreg *)VirtualAlloc(0, sizeof (IOPreg), MEM_RESERVE, PAGE_NOACCESS);
        if (v_pIOPregs == NULL)
        {
                ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                v_pIOPregs = (IOPreg *)0xA4500064;//IOP_BASE;//0xB1600000;
        }
        if (!RetValue)
        {
                if (v_pIOPregs)
                {
                        VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                }

                v_pIOPregs = NULL;
        }       
       

    //Congfig GPIO78 as nCS2
        v_pIOPregs->GAFR2  &= ~(3 << 28);  
        v_pIOPregs->GAFR2 |= 3 << 28;
}



分配内存的代码如下:
void InitMem()
{
        BOOL   RetValue = TRUE;
        v_pMEMreg = (MEMreg *)VirtualAlloc(0, sizeof (MEMreg), MEM_COMMIT, PAGE_READWRITE);
        if (v_pMEMreg == NULL)
        {
                ERRORMSG(1,(TEXT("For MEMregs : VirtualAlloc failed!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                v_pMEMreg = (MEMreg *)(MEMCS2_BASE+CACHED_TO_UNCACHED_OFFSET);//0x96B00000;
        }
        if (!RetValue)
        {
                if (v_pMEMreg)
                {
                        VirtualFree((PVOID) v_pMEMreg, 0, MEM_RELEASE);
                }

                v_pMEMreg = NULL;
        }       
}

小弟以前做2440的时候,就是这样把GPIO配置成功的啊,怎么270就没反应呢?
点赞  2010-4-4 09:26
引用: 引用楼主 swaiwwb 的回复:
小弟想在wince5.0下直接用应用程序访问物理地址,直接用VirtualAlloc函数分配800 0000对应的虚拟地址,同时也在应用程序下把gpio78配置成了ncs2,但是不管怎样,总是读不到数据,且连ncs2都打不到波形啊!不知道有没有谁做过类似的改装,给点建议吧,谢谢了!


大哥还要用手virtucopy函数才行
点赞  2010-4-4 12:55
问题自己解决,现贴出关键代码

.h文件定义GPIO的结构体
/**
  GPIO Register Definitions
**/
typedef struct
{
    XLLP_VUINT32_T GPLR0;             /* Level Detect Reg. Bank 0 */
    XLLP_VUINT32_T GPLR1;             /* Level Detect Reg. Bank 1 */
    XLLP_VUINT32_T GPLR2;             /* Level Detect Reg. Bank 2 */
    XLLP_VUINT32_T GPDR0;            /* Data Direction Reg. Bank 0 */
    XLLP_VUINT32_T GPDR1;            /* Data Direction Reg. Bank 1 */
    XLLP_VUINT32_T GPDR2;            /* Data Direction Reg. Bank 2 */
    XLLP_VUINT32_T GPSR0;            /* Pin Output Set Reg. Bank 0 */
    XLLP_VUINT32_T GPSR1;            /* Pin Output Set Reg. Bank 1 */
    XLLP_VUINT32_T GPSR2;            /* Pin Output Set Reg. Bank 2 */
    XLLP_VUINT32_T GPCR0;            /* Pin Output Clr Reg. Bank 0 */
    XLLP_VUINT32_T GPCR1;            /* Pin Output Clr Reg. Bank 1 */
    XLLP_VUINT32_T GPCR2;            /* Pin Output Clr Reg. Bank 2 */
    XLLP_VUINT32_T GRER0;   /* Ris. Edge Detect Enable Reg. Bank 0 */
    XLLP_VUINT32_T GRER1;   /* Ris. Edge Detect Enable Reg. Bank 1 */
    XLLP_VUINT32_T GRER2;   /* Ris. Edge Detect Enable Reg. Bank 2 */
    XLLP_VUINT32_T GFER0;   /* Fal. Edge Detect Enable Reg. Bank 0 */
    XLLP_VUINT32_T GFER1;   /* Fal. Edge Detect Enable Reg. Bank 1 */
    XLLP_VUINT32_T GFER2;   /* Fal. Edge Detect Enable Reg. Bank 2 */
    XLLP_VUINT32_T GEDR0;       /* Edge Detect Status Reg. Bank 0 */
    XLLP_VUINT32_T GEDR1;       /* Edge Detect Status Reg. Bank 1 */
    XLLP_VUINT32_T GEDR2;       /* Edge Detect Status Reg. Bank 2 */
    XLLP_VUINT32_T GAFR0_L;  /* Alt. Function Select Reg.[  0:15 ] */
    XLLP_VUINT32_T GAFR0_U;  /* Alt. Function Select Reg.[ 16:31 ] */
    XLLP_VUINT32_T GAFR1_L;  /* Alt. Function Select Reg.[ 32:47 ] */
    XLLP_VUINT32_T GAFR1_U;  /* Alt. Function Select Reg.[ 48:63 ] */
    XLLP_VUINT32_T GAFR2_L;  /* Alt. Function Select Reg.[ 64:79 ] */
    XLLP_VUINT32_T GAFR2_U;  /* Alt. Function Select Reg.[ 80:95 ] */
    XLLP_VUINT32_T GAFR3_L;  /* Alt. Function Select Reg.[ 96:111] */
    XLLP_VUINT32_T GAFR3_U;  /* Alt. Function Select Reg.[112:120] */
    XLLP_VUINT32_T  RESERVED1[35];    /* addr. offset 0x074-0x0fc */
    XLLP_VUINT32_T GPLR3;             /* Level Detect Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED2[2];      /* addr. offset 0x104-0x108 */
    XLLP_VUINT32_T GPDR3;            /* Data Direction Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED3[2];      /* addr. offset 0x110-0x114 */
    XLLP_VUINT32_T GPSR3;            /* Pin Output Set Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED4[2];      /* addr. offset 0x11c-0x120 */
    XLLP_VUINT32_T GPCR3;            /* Pin Output Clr Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED5[2];      /* addr. offset 0x128-0x12c */
    XLLP_VUINT32_T GRER3;   /* Ris. Edge Detect Enable Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED6[2];      /* addr. offset 0x134-0x138 */
    XLLP_VUINT32_T GFER3;   /* Fal. Edge Detect Enable Reg. Bank 3 */
    XLLP_VUINT32_T  RESERVED7[2];      /* addr. offset 0x140-0x144 */
    XLLP_VUINT32_T GEDR3;       /* Edge Detect Status Reg. Bank 3 */

} XLLP_GPIO_T, *P_XLLP_GPIO_T;

.cpp文件中设置GPIO的代码:
        address.QuadPart = 0x40E00000 ;
        v_pGPIORegs=(volatile XLLP_GPIO_T *)MmMapIoSpace(address,sizeof(XLLP_GPIO_T),FALSE) ;

    //Congfig GPIO78 as nCS2
        v_pGPIORegs->GAFR2_L  &= ~(3 << 28);  
        v_pGPIORegs->GAFR2_L |= 2 << 28;
注意,这里address.QuadPart 后面只需要给出ARM中CPIO的物理地址即可。要访问其它地址均可这样做,从应用程序访问时ncs2也能够出波形。注意要加ceddk.lib文件
点赞  2010-4-5 20:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复