WinCE开发GPIO驱动,需要了解寄存器知识吗?

flmyueyang   2009-3-11 16:11 楼主
才接触WinCE,嵌入式开发,网上看文章说:通过GPIO控制设备,是通过虚拟寄存器来实现的
“GPIO是ARM芯片最基本的输入输出通道,在ADS下操作就是一个单片机工作,
直接读写其寄存器.在ARM9平台上,Windows CE系统将GPIO的实地址(例如2410的
GPIO的基地址为0x56000000)映射到虚拟地址空间(GPIO对应为0xB1600000),
这样,通过对这段虚拟地址空间的操作,就能够完成对GPIO或者其他片内资源的
控制、输入、输出工作.”
以前一直做应用系统开发,也做过linux下ARM的简单字符设备驱动,但都没有涉及到
寄存器的相关知识,请问大侠们:我现在要通过GPIO读取一些传感器的状态数据,做这个驱动,
需要了解寄存器的知识不?如果需要,需要了解哪些知识?
请高手指点,非常感谢!!!

回复评论 (10)

不需要什么,上拉,下拉,配置成输入,输出,读写等即可。
点赞  2009-3-11 16:18
这个简单,写个流驱动,地址映射问题不用管,直接virtualalloc和virtualcopy就行,配置一下IO口,把它配成输入输出的就行,这个看一下datasheet就知道,然后就可以操作IO口了,
点赞  2009-3-12 14:50
在驱动也就是对GPIO进行输入,输出操作。关键是要把物理地址映射成虚拟地址。调用virtualalloc 和virtualcopy即可 。虚拟过来后,对寄存器的操作和没操作系统下是一样的!
点赞  2009-3-11 17:02
下面这个结构,每一行都表示什么呀?
网上找了好久,都没有找到解释,麻烦高人们解释一下嘛:每一行定义代表什么?
不胜感激!!

// Registers : I/O port
#define IOP_BASE      0xB1600000   //0x56000000
typedef struct  {
    unsigned int  rGPACON;   //00
    unsigned int  rGPADAT;
    unsigned int  rPAD1[2];

    unsigned int  rGPBCON;   //10
    unsigned int  rGPBDAT;
    unsigned int  rGPBUP;
    unsigned int  rPAD2;

    unsigned int  rGPCCON;   //20
    unsigned int  rGPCDAT;
    unsigned int  rGPCUP;
    unsigned int  rPAD3;

    unsigned int  rGPDCON;   //30
    unsigned int  rGPDDAT;
    unsigned int  rGPDUP;
    unsigned int  rPAD4;

    unsigned int  rGPECON;   //40
    unsigned int  rGPEDAT;
    unsigned int  rGPEUP;
    unsigned int  rPAD5;

    unsigned int  rGPFCON;   //50
    unsigned int  rGPFDAT;
    unsigned int  rGPFUP;
    unsigned int  rPAD6;

    unsigned int  rGPGCON;   //60
    unsigned int  rGPGDAT;
    unsigned int  rGPGUP;
    unsigned int  rPAD7;

    unsigned int  rGPHCON;   //70
    unsigned int  rGPHDAT;
    unsigned int  rGPHUP;
    unsigned int  rPAD8;

    unsigned int  rMISCCR;   //80
    unsigned int  rDCKCON;
    unsigned int  rEXTINT0;
    unsigned int  rEXTINT1;
    unsigned int  rEXTINT2;   //90

    unsigned int  rEINTFLT0;
    unsigned int  rEINTFLT1;
    unsigned int  rEINTFLT2;
    unsigned int  rEINTFLT3;  //A0
    unsigned int  rEINTMASK;
    unsigned int  rEINTPEND;
    unsigned int  rGSTATUS0;  //AC
    unsigned int  rGSTATUS1;  //B0
    unsigned int  rGSTATUS2;  //B4
    unsigned int  rGSTATUS3;  //B8
    unsigned int  rGSTATUS4;  //BC
}IOPreg;
点赞  2009-3-12 19:42
了解一下,你用的是哪一个GPIO口,找到对应用控制寄存器器对应位,就可以了,比如说 GPK6,你就找GPKCON ,GPKDAT
点赞  2009-3-11 18:18
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-3-12 21:41
这只是用来操作CPU寄存器的一个结构体而已,没有什么特别的意义
里面的结构成员可以理解成对应的CPU寄存器

要做GPIO驱动开发,先去研读一下CPU SPEC中关于GPIO的一章节,然后找一个有用到GPIO控制的驱动代码看一下
模仿着就可以开始做了,没有什么复杂的
点赞  2009-3-12 22:45
只是一个结构体而已,你看成是一个定义就可以了,我觉得没有什么讲的   呵呵   
点赞  2009-3-14 13:00
这个东西我回答了好多次啊。楼主发问没有搜索吗?

这是利用结构体特性来的

首先是定一个结构体指针,指向uncache的IO虚拟地址

这个IO的每个寄存器地址刚好相差4
结构体存储各个成员之间的地址也刚好相差4

所以这样就整好访问到寄存器了。
点赞  2009-3-14 13:38
呵呵,当然需要操作寄存器了。驱动就是跟硬件打交道的。
点赞  2009-3-18 11:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复