這個要看你使用的是哪種平台(samsung還是ti等)和編寫哪種類型的程序(一般情況下都是驅動程序),如果是平台相關,則一般在arch/arm下,以三星為例,一般放在arch\arm\plat-s3c\include中,如果是驅動程序中用到的寄存器,會在相應驅動程序的頭文件中
B. 關於arm通用寄存器物理地址的問題
像這樣存在CPU內部的寄存器我們是不知道他們的地址的,平常我們說的地址都是說內存地址,更有說法是這種寄存器是沒有地址的!他們的訪問不是通過地址去訪問的,直接通過匯編指令中的寄存器名訪問的!所以你datasheet肯定是找不到的!datasheet上面能找到的是memory address,比如32位地址線的會有一個4G的空間,這樣的內存是通過地址線去訪問,而在CPU內部的寄存器是不通過地址線去訪問的!
C. ARM 地址問題
你好:
ARM是32位的處理器,地址范圍是0-4G,都是默認從0x0開始啟動。具體存儲介質映射的地址范圍每個晶元ARM生產商不盡相同。比如ARM7 ARM9 地址的映射是沒有做嚴格的規定的,這個由晶元生產商自己定,但是可以通過查看各個晶元對應的數據手冊能夠看到內存映射圖(memory map)。對於cortex M ARM有做了比較詳細的內存映射規定,比如前256M(0x00000000-0x1fffffff)空間用來映射Flash(很多晶元生產商不會映射這么大的Flash,只會映射一部分,比如1024K,64K等等),接下來的256M(0x20000000-0x3fffffff)用來映射SRAM,再接下來的256M是外設寄存器,在接下來的1G是片外RAM....(具體可以看《cortex M3的權威指南》)。
D. ARM linux內核啟動時幾個關鍵地址
1. 內核啟動地址
ZTEXTADDR
解壓代碼運行的開始地址。沒有物理地址和虛擬地址之分,因為此時MMU處於關閉狀態。這個地址不一定時RAM的地址,可以是支持讀寫定址的flash等存儲中介。
Start address of decompressor. here's no point in talking about virtual or physical addresses here, since the MMU will be off at the time when you call the decompressor code. You normally call the kernel at this address to start it booting. This doesn't have to be located in RAM, it can be in flash or other read-only or read-write addressable medium.
在arch/arm/boot/compressed/Makefile中說的很明確
#
# We now have a PIC decompressor implementation. Decompressors running
# from RAM should not define ZTEXTADDR. Decompressors running directly
# from ROM or Flash must define ZTEXTADDR (preferably via the config)
# FIXME: Previous assignment to ztextaddr-y is lost here. See SHARK
ifeq ($(CONFIG_ZBOOT_ROM),y)
ZTEXTADDR := $(CONFIG_ZBOOT_ROM_TEXT)
ZBSSADDR := $(CONFIG_ZBOOT_ROM_BSS)
else
ZTEXTADDR := 0
ZBSSADDR := ALIGN(8)
endif
ZRELADDR
內核啟動在RAM中的地址。壓縮的內核映像被解壓到這個地址,然後執行。
This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:
__virt_to_phys(TEXTADDR) == ZRELADDR
The initial part of the kernel is carefully coded to be position independent.
一般定義在項目目錄下,比如:
arch/arm/mach-at91/Makefile.boot: zreladdr-y += 0x70008000
arch/arm/mach-at91/Makefile.boot: zreladdr-y += 0x20008000
arch/arm/mach-cns3xxx/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-davinci/Makefile.boot: zreladdr-y += 0xc0008000
arch/arm/mach-davinci/Makefile.boot: zreladdr-y += 0x80008000
arch/arm/mach-dove/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-ebsa110/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-exynos/Makefile.boot: zreladdr-y += 0x40008000
arch/arm/mach-footbridge/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-gemini/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-gemini/Makefile.boot: zreladdr-y += 0x10008000
arch/arm/mach-integrator/Makefile.boot: zreladdr-y += 0x00008000
arch/arm/mach-iop13xx/Makefile.boot: zreladdr-y += 0x00008000
在arch/arm/boot/Makefile中被賦值:
ZRELADDR := $(zreladdr-y)
PARAMS_PHYS := $(params_phys-y)
INITRD_PHYS := $(initrd_phys-y)
... ...
ifneq ($(LOADADDR),)
UIMAGE_LOADADDR=$(LOADADDR)
else
ifeq ($(CONFIG_ZBOOT_ROM),y)
UIMAGE_LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
E. 請問在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
F. arm-linux平台,如何知道一個外設的物理地址
HD7279A上都沒有地址線,數據線,應該沒有所謂的物理地址。
G. ARM寄存器地址
簡單的歸納就是,CPU要通過BUS訪問的,都是統一編址的,包括內存和一些外設的寄存器之類。BUS負責address的map,並且有arbiter。
CPU能直接訪問的,就是不需要編址的,例如ARM的寄存器,Cache之類。
H. 在給ARM的外設配置的時候,都需要配置寄存器,每個寄存器都對應一個地址,那麼這個地址是指向哪裡的
你會寫到對應的功能寄存器中,不是你想像的RAM或者FLASH
I. 關於linux驅動中的寄存器地址
寄存器名字就成了「指針」,是一個地址
沒有的就要自己加了
J. ARM如何分配寄存器地址!
教你操作寄存器! 首先你要知道這個寄存器的地址.
比如說我知道某寄存器地址是4001140cH, 然後就
*(unsigned long*)0x4001140c=~0;//賦最大值(僅供參考)
arm晶元是統一編址的,對寄存器可間接定址.
(即 可使用指針)
51單片機 不是, 它地址重疊,
正是用這兩種不同的定址方式來
區分操作的是內存還是寄存器..