请问在linux环境下中如何 *** 作寄存器?

请问在linux环境下中如何 *** 作寄存器?,第1张

在linux下控制硬件和在无 *** 作系统下控制硬件的不同主要在于硬件的地址不一样,在linux下要使用va(虚拟地址),而在无 *** 作系统下可以直接使用硬件的pa(物理地址)。

在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架构)。当然也会有把寄存器映射到内存空间,想读写内存一样读写寄存器。用户态程序一般是无法访问寄存器的,除非驱动程序把寄存器映射到用户进程空间


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8900076.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存