
在linux-2.6.8.1/include/asm-arm/arch-s3c2410/map.h中定义了大部分硬件的物理地址和他们的虚拟地址。
现以gpio
F为例说明,gpio
的pa
基址(ba)为0x56000000,GPFCON
pa为0x56000050
即:可见偏移量为0x50,而我们在看看GPFCON
va
,vaba
:0xf0e0
0000,va:0xf0e0
0050,偏移量为0x50。我们只要知道了vaba,和他的偏移量,我们就能计算出va,从而,就可以对其进行 *** 作了。
如何获取vaba:在linux-2.6.8.1/include/asm-arm/arch-s3c2410/map.h中有定义。
计算机中,分级分层的思想随处可见,这也是计算机上的一个基本的思想和思路。
在LINUX *** 作系统中分了三级,三级偏移,一级地址的ba为0xf0000000,偏移到第二级,0xf0e0
0000
(以GPIO为例),再次偏移到第三级,0xf0e0
0050
(以GPFCON为例)。现在,就可以在linux
下通过0xf0e0
0050来对GPFCON
寄存器来进行 *** 作了。
源码中的实现过程如下:
#define
S3C2410_ADDR(x)
(0xF0000000+(x))//map.h
//linux下所有硬件一级地址vaba:0xF0000000
#define
S3C2410_VA_GPIO
S3C2410(0X00E00000)//map.h
//GPIO的偏移量0x00E00000,加上这个偏移量后,到了GPIO器件
#define
S3C2410_GPIOREG(x)
((x)+S3C2410_VA_GPIO)
#define
S3C2410_GPFCON
S3C2410_GPIOREG(0x50)//regs-gpio.h
//GPFCON寄存器的偏移量0x50,加上这个偏移量后,到了具体的寄存器,可以对硬件进行 *** 作了
#define
S3C2410_GPFDAT
S3C2410_GPIOREG(0x54)//regs-gpio.h
#define
S3C2410_GPFUP
S3C2410_GPIOREG(0x58)//regs-gpio.h
归根揭底在驱动程序中 *** 作的还是寄存器
在头文件中定义一下寄存器的绝对地址 然後 *** 作寄存器的
举个例子 #define config @0x00000120
然後在驱动程序.C中读写config寄存器 就行了
不是很明白你的意思。寄存器是个硬件的结构,存在CPU中,比如EAX,EBX,ECX,EDX这些通用寄存器。硬件设备也会有寄存器,用来给软件提供控制的方法。比如显卡肯定有个寄存器来启用或者禁用。读写寄存器标准的使用IN,OUT指令(IA架构)。当然也会有把寄存器映射到内存空间,想读写内存一样读写寄存器。用户态程序一般是无法访问寄存器的,除非驱动程序把寄存器映射到用户进程空间欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)