免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1820 | 回复: 0
打印 上一主题 下一主题

Linux操作系统s3c2410 GPIO的宏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-24 10:22 |只看该作者 |倒序浏览
一、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 三、write_gpio_bit(x,v)宏分析

  write_gpio_bit宏传入两个参数,第一个为GPIO端口号,如GPIO_G12;第二个参数为1或0,为相应IO口设置高电平或低电平输出。具体宏展开如下:
代码
#define write_gpio_bit(x, v)
({
GPDAT(GRAB_PORT((x))) &= ~(0x1 > 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四、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);
代码
#define set_gpio_ctrl(x)
({ GPCON(GRAB_PORT((x))) &= ~(0x3 五、结束
 
 以上主要结合《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)等,实现方法和上述类似,在此不再一一赘述!
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/90876/showart_2101805.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP