3201|6

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

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

最新回复

问题自己解决,现贴出关键代码 .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 GAFR2_L |= 2   详情 回复 发表于 2010-4-5 20:00
点赞 关注
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没弄过,帮顶下。

MARK.
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
单单用VirtualAlloc函数还不行,还必须使用VirtualCopy才可以
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
VirtualAlloc+VirtualCopy,同时查一下地址的合法性,确认是可以访问的地址
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 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就没反应呢?
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

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


大哥还要用手virtucopy函数才行
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
问题自己解决,现贴出关键代码

.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文件
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表