导航:首页 > 源码编译 > linux源码中arm外设寄存器地址

linux源码中arm外设寄存器地址

发布时间:2022-06-23 00:56:53

A. linux源码中ARM外设寄存器地址在哪定义

这个要看你使用的是哪种平台(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单片机 不是, 它地址重叠,
正是用这两种不同的寻址方式来
区分操作的是内存还是寄存器..

阅读全文

与linux源码中arm外设寄存器地址相关的资料

热点内容
程序员做中介怎么样 浏览:139
怎么把解压视频保存到手机 浏览:449
app欠费怎么查询 浏览:348
录音文件夹怎么压缩 浏览:896
编程培训机构学费 浏览:499
华为麦芒5服务器地址 浏览:744
怎么把app里面的app上锁 浏览:938
java数字运算 浏览:164
java读取上传的文件 浏览:373
xp怎么加密文档 浏览:273
压缩机风扇电机转速慢 浏览:88
文件服务器如何查看访问人员 浏览:127
绝佳买卖指标加密 浏览:758
git分支编译 浏览:156
51单片机c语言应用程序设计实例精讲 浏览:562
华为安卓手机编译器 浏览:48
怎样在打开微信前加密 浏览:666
旺旺聊天记录怎么加密 浏览:413
王安忆长恨歌pdf 浏览:621
mobile文件夹可以卸载吗 浏览:282