Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1341464
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类:

2012-03-28 14:24:28

原文地址:linux内核__REG、__REG2宏 作者:开源通宝

Linux内核中定义了很多宏,对硬件端口和寄存器进行操作,从网上搜集了一些宏定义的信息:

1. __REG简单的说就是获得后面所示物理地址映射后的虚拟地址,例如:

#define GPLR0   __REG(0x40E00000)    /* GPIO Pin-Level Register GPIO<31:0> */
#define GPLR1   __REG(0x40E00004)    /* GPIO Pin-Level Register GPIO<63:32> */
#define GPLR2   __REG(0x40E00008)    /* GPIO Pin-Level Register GPIO<80:64> */

pxa处理器内部寄存器的物理地址和内核空间的虚拟地址对应关系如下:

Intel PXA internal I/O mappings:* 0x40000000 - 0x41ffffff <--> 0xf8000000 - 0xf9ffffff

* 0x44000000 - 0x45ffffff <--> 0xfa000000 - 0xfbffffff

* 0x48000000 - 0x49ffffff <--> 0xfc000000 - 0xfdffffff

2. #define GPLR(x)   __REG2(0x40E00000, ((x) & 0x60) >> 3).

还有一个转换的句子#define GPIO_BIT(x) (1 << ((x) & 0x1f))

GPIO共有80个,所以32bit的寄存器只好没组做3个. GPIO_BIT就是1左移x位(并且不要超过32);而GPLR(X)则是根据x的数值(这个是GPIO号,如16,37,72)得到3个GPLR中属 于该GPIO的GPLR的起始地址,(__REG2就是获得两个地址的和).这样子可以通过下面的赋值方法:

GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | GPIO_bit(GPIO49_nPWE);来设置GPIO48所在GPSR的2个位.这么一大堆,是为了用到GPIO号定义好的宏.简单的 GPSR3=XXXX|XXXX也是可以的.

3. side effect(译为边际效应或副作用):是指读取某个地址时可能导致该地址内容发生变化,比如,有些设备的中断状态寄存器只要一读取,便自动清零。I/O寄存器的操作具有side effect,因此,不能对其操作不能使用cpu缓存

阅读(1607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~