歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux系統下操作硬件寄存器

Linux系統下操作硬件寄存器

日期:2017/2/28 16:07:03   编辑:Linux教程

經過一兩天的摸索,基本上對在linux控制硬件有了個初步的認識:在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

Copyright © Linux教程網 All Rights Reserved