Linux头文件中s3c2410 GPIO的宏

发布者:平章大人最新更新时间:2016-08-06 来源: eefocus关键字:Linux头文件  s3c2410  GPIO 手机看文章 扫描二维码
随时随地手机看文章
一、GPIO寄存器定义

1.#define GPCON(x)   __REG2(0x56000000, (x) * 0x10)

这句是定义2410的GPIO的控制寄存器,注意:__REG2的参数是寄存器的物理地址,这个物理地址经_REG2宏转换为虚拟地址,对照2410的手册可以得到一下对应关系:

GPCON(1) ------ PORT A  0x56000000
GPCON(2) ------ PORT B  0x56000010
GPCON(3) ------ PORT C  0x56000020
……
GPCON(8) ------ PORT H  0x56000070

2.#define GPDAT(x)   __REG2(0x56000004, (x) * 0x10)

这句是定义2410的GPIO的数据寄存器,定义方法同GPCON宏。

GPDAT(1) ------ PORT A  0x56000004
GPDAT(2) ------ PORT B  0x56000014
GPDAT(3) ------ PORT C  0x56000024
……
GPDAT(8) ------ PORT H  0x56000074

3.#define GPUP(x)      __REG2(0x56000008, (x) * 0x10)

这句是定义2410的GPIO的上拉电阻屏蔽/激活寄存器,定义方法同GPCON宏。
GPUP(1) ------ PORT A  0x56000008
GPUP(2) ------ PORT B  0x56000018
GPUP(3) ------ PORT C  0x56000028 
……
GPUP(8) ------ PORT H  0x56000078

二、GPIO端口号定义
以GPIO_G12来说明在内核头文件$(KERNEL_INCLUDE)/asm-arm/arch/s3c2410.h中是如何来定义IO port的端口号的。定义GPIO端口主要涉及到以下几个宏:

#define MAKE_GPIO_NUM(p, o)         ( (p << GPIO_PORT_SHIFTT) |  (o << GPIO_OFS_SHIFT))
#define GPIO_G12               MAKE_GPIO_NUM(PORTG_OFS, 12)

GPIO_PORT_SHIFTT值为8,代表GPIO组号在整个GPIO端口号(如GPIO_G12)字段中的位移
GPIO_OFS_SHIFT值为0,代表GPIO组内偏移号在整个GPIO端口号(如GPIO_G12)字段中的位移

   s3c2410有117个多功能input/output port pins。分为以下八组:

— Port A (GPA): 23-output port                    #define PORTA_OFS                 0
— Port B (GPB): 11-input/output port         #define PORTB_OFS                 1
— Port C (GPC): 16-input/output port        #define PORTC_OFS                 2
— Port D (GPD): 16-input/output port        #define PORTD_OFS                 3
— Port E (GPE): 16-input/output port         #define PORTE_OFS                 4
— Port F (GPF): 8-input/output port            #define PORTF_OFS                 5
— Port G (GPG): 16-input/output port         #define PORTG_OFS                6
— Port H (GPH): 11-input/output port         #define PORTH_OFS                7 

GPG12属于G组,组内偏移为12,从上述两个宏定义中,我们可以很清楚地看出GPIO_G12结构:
 
图1  GPIO端口号结构图
    端口一共有8组,从上面的宏定义可以看出,端口组号p的范围:0~7。而组内偏移各组不尽相同,Port A有23个输出口,因此它的组内偏移o为0~22,Port G有16个IO口,它的组内偏移o为0~15,其他组的GPIO以此类推。

三、write_gpio_bit(x,v)宏分析
    write_gpio_bit宏传入两个参数,第一个为GPIO端口号,如GPIO_G12;第二个参数为1或0,为相应IO口设置高电平或低电平输出。具体宏展开如下:

代码
  1. #define write_gpio_bit(x, v)    
  2.                              ({      
  3. GPDAT(GRAB_PORT((x))) &= ~(0x1 << GRAB_OFS((x)));    
  4. GPDAT(GRAB_PORT((x))) |= ((v) << GRAB_OFS((x)));    
  5. })  


GRAB_PORT宏的参数是GPIO端口号,功能是从GPIO端口号中解析出组号,具体定义如下:

#define GRAB_PORT(x)              (((x) & GPIO_PORT_MASK) >> GPIO_PORT_SHIFTT)

其中GPIO_PORT_MASK是组号的掩码,值为0x0000ff00,从图1中也可看出。

GRAB_OFS宏和GRAB_PORT类似,它的功能是从GPIO端口号中解析出组内偏移:

#define GRAB_OFS(x)            (((x) & GPIO_OFS_MASK) >> GPIO_OFS_SHIFT)

其中偏移值掩码GPIO_OFS_MASK=0x000000ff。

现在我们结合上述说明来分析write_gpio_bit(GPIO_G12,1)这条语句:由GPIO_G12的宏定义可计算出其值为0x0000060C,GRAB_PORT(GPIO_G12)解析得到所操作的IO属于G组,组号为6;GRAB_OFS(GPIO_G12)解析得到此IO口为G组的第12个引脚(从0开始算起),为GPG12,表达式值为12。则write_gpio_bit(GPIO_G12,1)等价于下面两条语句:

GPDAT(6) &= ~(0x1<<12);  //GPGDAT寄存器第12位清零
GPDAT(6) | = 1<<12;       // 向GPGDAT寄存器第12位写入‘1’

到此,我们知道了write_gpio_bit(GPIO_G12,1)这条语句是将GPG12这个引脚拉成高电平。

四、set_gpio_ctrl(x)宏分析完成了对write_gpio_bit宏的分析,现在来看set_gpio_ctrl就很简单了!在它的宏展开中只多了GRAB_MODE(x)和 GRAB_PULLUP(x)分别表示从参数x中解析出IO口的模式和使能/屏蔽此端口的上拉电阻。值得注意的是set_gpio_ctrl的参数x不仅仅表示GPIO端口号,其高16位还带有模式状态和上拉电阻控制信息,参数x的结构如下图:
 
图2 set_gpio_ctrl的参数字段结构图
    低16位即为前面所述的GPIO的端口号,高16位中的R字段用来屏蔽/使能IO口的上拉电阻功能。R=0,上拉电阻使能;R=1,上拉电阻失效。M字段用来设置IO口的工作模式,M=0,IO口为输入端口;M=1,IO口为输出端口;M=2,可选功能1;M=3,可选功能2。

set_gpio_ctrl宏就是通过写相应GPIO所在组的GPXCON(X为A~H)的相应位来设置IO口模式(GPACON每一个位控制一个IO口,而GPBCON~GPHCON都是两个位控制一个IO口的模式),通过写GPXUP(X为A~H)来决定是否启用上拉电阻。典型的set_gpio_ctrl调用方式如下:

set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_G12);

代码
  1. #define set_gpio_ctrl(x)    
  2.        ({ GPCON(GRAB_PORT((x))) &= ~(0x3 << (GRAB_OFS((x))*2));    
  3.           GPCON(GRAB_PORT(x)) |= (GRAB_MODE(x) << (GRAB_OFS((x))*2));    
  4.           GPUP(GRAB_PORT((x))) &= ~(1 << GRAB_OFS((x)));    
  5.           GPUP(GRAB_PORT((x))) |= (GRAB_PULLUP((x)) << GRAB_OFS((x))); })  

 

这条语句是将GPG12设置成输出模式,并且不使用端口的上拉电阻。

五、结束
    以上主要结合《S3C2410X 32-BIT RISC MICROPROCESSOR USER'S MANUAL》分析了$(LINUX_KERNEL_INCLUDE)/asm-arm/arch/s3c2410.h中所定义的对2410GPIO进行操作的几个宏,除了文中提及的几个宏,除此还有read_gpio_bit(x)、read_gpio_reg(x) 、write_gpio_reg(x, v)等,实现方法和上述类似,在此不再一一赘述!

关键字:Linux头文件  s3c2410  GPIO 引用地址:Linux头文件中s3c2410 GPIO的宏

上一篇:ARM优化之结构体的定义
下一篇:S3C44B0的UART波特率计算公式---分频设置

推荐阅读最新更新时间:2024-03-16 15:03

按键实验(GPIO的输入模式)
@按键实验(GPIO的输入模式) #引言 在之前的实验中,小罗同学使用的都只是GPIO的输出模式,这次的按键实验虽然比较简单,但也是我第一次接触GPIO的输入,所以还是想写点东西记录一下。 #按键模块电路图 我手中的开发板除去复位按键后还有其余四个按键,电路结构图如下: 以上四个按键所对应的管脚编号分别为:PA0、PE4、PE3、PE2。由图可知,KEY_UP为高电平有效,其他三个均为低电平有效。 #按键配置 大家都知道,在使用引脚之前首先要进行相应的配置来初始化,相关代码如下: void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; //先对挂接在
[单片机]
按键实验(<font color='red'>GPIO</font>的输入模式)
许家印、孙斌过去一年财富缩百亿
  地产富豪身家出现不同程度缩水,但许家印还是蝉联地产首富。   来源:界面新闻孙梅欣   去年重登国内地产界首富宝座的许家印,在日前公布的《2018胡润房地产企业家榜》中再次登顶,以2150亿元身家蝉联地产首富。   在早前的《2018年胡润百富榜》中,许家印则以2500亿元身家位居百富榜中第二位,仅次于马云家族的2700亿元身家。   由于《房地产企业家榜》仅计算企业家在房地产领域的财富,因此和百富榜中含其他领域投资在内的总财富数额有所差异。尽管许家印再次蝉联,但和去年相比,两项榜单中的财富数据都出现不同程度的缩水。其2150亿元的地产身家较去年缩水17%,总身家也比去年减少14%。   和去年地产界富豪身家普遍暴涨不同,“
[手机便携]
基于S3C2410和CH7004的嵌入式系统VGA接口设计
  1 引言   嵌入式系统在各种领域应用极为广泛,其中一种很常见的应用是嵌入式Linux智能终端设备,针对工控领域的应用特点,这种类型的设备往往集控制单元、显示键盘单元、数据采集单元、GPIO单元以及通讯单元(以太网、GPRS、串口等)等于一体,可进行实时数据处理和控制。   嵌入式系统的终端显示倾向选择LCD显示器。但在大屏幕显示情况下,大型工业级LCD液品显示器造价高。选择性少。而为嵌入式系统增加标准VGA接口可很好地解决该问题。支持VGA接口的显示设备众多且价格相对较低,而且显示设备的更换不会对嵌入式系统产生影响。ARM9器件S3C2410在嵌入式系统中应用广泛。这里主要针对该处理器介绍基于CH7004的嵌入式系统VGA接
[单片机]
基于<font color='red'>S3C2410</font>和CH7004的嵌入式系统VGA接口设计
S3C2410实现三导联远程心电监护系统
1 引 言 随着人们生活水平的提高、生活节奏的加快,心血管疾病的发病率迅速上升,已成为威胁人类身体健康的主要因素之一。而心电图则是治疗此类疾病的主要依据,具有诊断可靠,方法简便,对病人无损害的优点,在现代医学中,变得越来越重要。常规心电图是病人在静卧情况下由心电图仪记录的心电活动,历时仅为几s~1 m,只能获取少量有关心脏状态的信息,所以在有限时间内即使发生心率失常,被发现的概率也是很低的。因此有必要通过相应的监护装置对患者进行长时间的实时监护,记录患者的心电数据。又由于心脏病的发生具有突发性的特点,患者不可能长时间地静卧在医院,但又需实时得到医护人员的监护,所以研发相应的便携式无线心电监护产品就显得更加重要。 目前虽说国
[单片机]
用<font color='red'>S3C2410</font>实现三导联远程心电监护系统
华虹力2016年势头强劲 一举斩获多项大奖
集微网消息,(中国,上海—2017年3月24日)3月23日至24日,“2017中国半导体市场年会暨第六届中国集成电路产业创新大会”(IC Market China 2017)以“智慧引领未来、资本助力发展”为主题在南京召开。基于2016年的亮眼表现,全球领先的200mm纯晶圆代工厂──华虹半导体有限公司(股份代号:1347.HK)之全资子公司上海华虹宏力半导体制造有限公司(“华虹宏力”)成功斩获“2016年中国半导体制造十大企业”及“2016-2017中国功率器件市场年度成功企业”两项大奖,并凭借其“600V-1200V场截止型IGBT芯片制造工艺技术”摘得“第十一届(2016年度)中国半导体创新产品和技术”奖。 华虹宏力作为全球
[手机便携]
嵌入式s3c2410A UART部分中文解释
异步串口通信 概述 S3C2410的UART提供3个独立的异步串行通信端口,每个端口可以基于中断或者DMA进行操作。换句话说,UART控制器可以在CPU和UART之间产生一个中断或者DMA请求来传输数据。UART在系统时钟下运行可支持高达230.4K的波特率,如果使用外部设备提供的UEXTCLK,UART的速度还可以更高。每个UART通道各含有两个16位的接收和发送FIFO。 S3C2410的UART包括可编程的波特率,红外 接收/发送,一个或两个停止位插入,5-8位数据宽度和奇偶校验。 每个UART包括一个波特率发生器、一个发送器、一个接收器和一个控制单元,如图11-1所示。波特率发生器的输入可以是PCLK或者UEX
[单片机]
嵌入式<font color='red'>s3c2410</font>A UART部分中文解释
飞思卡尔16位单片机(三)——GPIO输出功能测试
一、GPIO介绍 GPIO是单片机最常用的功能,XEP100单片机的并行I/O的资源很丰富,XEP100的IO有PORTA、PORTB、PORTH、PORTJ、PORTM、PORTP、PORTS、PORTT、PORTK和PORTE共10组IO。这些I/O口除了具有通用I/O功能外,还分别具有专用I/O的功能。可以根据需要进行设置,专用I/O功能启用后,通用I/O功能自动关闭。 在使用单片机的并行I/O时要进行一些设置,主要的设置如下所示: 1功能设置 每个I/O子系统都有一个功能设置寄存器,其中的几个位用于部分或者全部引脚的功能设定,设定为专用功能后,方向设置功能可能自然禁止,但上拉、下拉及降功率驱动功能一般仍然有效,具体
[单片机]
飞思卡尔16位单片机(三)——<font color='red'>GPIO</font>输出功能测试
赛普拉斯淡出制造角逐,力、联电成最佳代工拍档
赛普拉斯半导体公司(Cypress Semiconductor)从制造角逐中撤身后采取的另一个步骤是,该公司将与代工厂联华电子公司(UMC)签约共同生产先进的SRAM芯片,该种芯片的第一款产品将于今年晚些时候用65纳米工艺进行生产。 另一方面,身为宏力半导体制造有限公司的合作伙伴,赛普拉斯正求助于UMC以帮助巩固其“轻晶圆厂”策略,赛普拉斯简洁地称该策略为“摩尔定律不再”。这也是保持其外包能力处于领先地位的一个重要举措,在这一领域需要生产大量新的SRAM。赛普拉斯负责制造和技术的执行副总裁Shahin Sharifzadeh强调,这是赛普拉斯首次将其旗舰SRAM产品的生产承包出去。 该公司也在亚洲寻找更多的代工合作伙伴,并会考
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved