11628|8

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教linux下读写 gpio端口控制寄存器的方法 [复制链接]

我用的是s3c2410的开发板,linux操作系统,我知道在arm下读写io要用/dev/port,但是 相应io的控制寄存器如何读写,是否也是用port文件,同样的方法?

下面直接读取的方法应该不行吧:
    先用gpio(1-5)试试,这其中对应的引脚是GPG0、GPG1、GPG8、GPG9和GPG10,我是在linux下做开关量的采集。
    控制寄存器 设置为: GPGCON &=(0xFFC0FFF0);0、1、8、9、10都设为输入状态
    GPGUP也要设置 GPGUP=0x0;
    这样设置就可以直接从 GPGDAT读数据。
    在linux下设置的话,我直接在函数里写:
    unsigned int *GPGCON=0x56000060; //0x56000060是GPGCON的地址
    unsigned int *GPGUP=0x56000068;  //0x56000068是GPGUP的地址
    &GPGCON &=(0xFFC0FFF0);
    &GPGUP =0x0;

是不是在linux下的物理地址都是映射为虚拟地址,是不是要读相应的虚拟地址,那是如何映射的?

希望得到指点,谢谢!
此帖出自Linux开发论坛

最新回复

学习学习。  详情 回复 发表于 2010-5-11 09:31
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在linux下,所有的物理地址都会被映射成虚拟地址,包括GPIO对应的各个寄存器。如果想了解MMU映射的细节,可以找些相关的资料或者书看看,很有意思的。

在实际项目中,不建议去追根问底,只要知道某个寄存器被映射到哪个虚拟地址就行。

操作时,也不是直接去操作虚拟地址的,而是一般有个结构体
struct _GPIO_REGS_
{
    GPA;
    GPB;
    ......
    GPxx;
}gpio_regs, *p_gpio_regs

然后在初始化时,会定义一个这个struct的实例,并将其首地址指向GPIO寄存器的起始地址(虚拟地址),当操作内部的一些具体寄存器时,实际上是根据该寄存器对初始入口的偏移量来定位的,一个寄存器就是32bit,也就是一个int型数据。

寄存器读写,就直接向该变量赋值或者读取该变量即可。
portA = GPA;
GPB = portB;
GPC = 0x4321;
GPD &= ~(1<<5);
GPF |= (1<<10);

这些完全可行。当然实际驱动中会有相应的一些函数供你调用,不用这么具体。
GPIO_set_controller(...)//配置GPIO方向,功能
GPIO_set_value(...)//配置某个GPIO的高低电平
GPIO_get_level(...)//读取某个GPIO的引脚电平
。。。。诸如此类。

具体的实现需要看该平台下的bsp如何提供的函数接口,一般在需要用到的地方#include "gpio.h"(此头文件名可能不一样),再直接调用即可。
此帖出自Linux开发论坛
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
首先非常感谢!
我前面写错了,是s3c2410x,和s3c2410在这个上区别不大吧。
有个s3c2410.h文件里定义了很多宏,应该可以用的吧,好像可以直接调用,不过我的电脑上的linux里没有这个文件,是不是要s3c2410的补丁什么的,哪里有啊
此帖出自Linux开发论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个没有区别,即使换了2440都一样,只是可能具体的寄存器的物理地址极其映射的虚拟地址可能稍有不同。

s3c2410.h看起来应该是一个总的头文件,在一个bsp里,应该另有专门的头文件进行各个设备接口的定义,比如iic.h spi.h uart.h(seial.h) usb.h之类的,因为只用一个s3c2410.h虽然可以实现所有的需求定义,但是太过庞大及冗长了,不适合现在的模块化设计。

linux下本身是不会带这些文件的,因为linux可不知道你将来会将linux移植到哪个cpu平台上去。

所以,新平台的相关文件需要你自己添加进里linux里面,至于添加的位置,一般都是有个默认规则的,比如asm/arm里面就有所有arm体系的cpu的相关定义。你的2410也是属于这个体系的。

开发板应该有bsp的,难道你是全新的移植?
此帖出自Linux开发论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
开发板上移植应该有的,再问个,如果开发板上有,可是主机上没有,做交叉编译的时候,是在主机上编译的,应该不行吧,我用了另外个版本的linux2.6的里面找到了mach-s3c2410这个文件夹,可以里面没有什么头文件,只有Kconfig 和 Makefile 2个文件,这是怎么回事啊?
我现在想算了,不用定义好的宏了,想用ioremap 函数做个映射,读写这些寄存器不会很麻烦吧,第一次涉及这些,有点头疼,请赐教,谢谢!
此帖出自Linux开发论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
ioremap可用。

bsp就是在主机(PC)上编译的,不过要求编译环境是linux环境。编好的boot及系统镜像下载到开发板上运行的。

mach-s3c2410下没有更多的文件,说明这个版本不是用在该平台上的,需要另外添加。
此帖出自Linux开发论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
我想就用ioremap 自己做映射吧,希望不要太繁琐了,非常感谢了,以后有什么问题,再向你请教!:)
此帖出自Linux开发论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
此帖出自Linux开发论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
学习学习。
此帖出自Linux开发论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表