2

我很困惑如何在 u-boot 中映射寄存器(例如:用于 uart 控制器)?它们是否在 DDR 中映射内存?如果是怎么办?如果不是,那么 U-Boot 中“外设地址是内存映射的”是什么意思?

4

1 回答 1

1

欢迎来到 Stackoverflow。

在 SoC 中使用不同类型的互连将寄存器映射到硬件级别的RAM 内存地址空间。例如,让我们以 OMAP 35x 系列为例,看看 UART 寄存器如何映射到 SoC 的RAM内存地址空间,以及我们如何在 U-Boot 中访问它们。

OMAP 35x 的技术参考手册中表 2-3。L4-Core Memory Space Mapping,我们看到 UART1 的基地址是0x4806A000,大小(它占用的 RAM)是 4KB。

这意味着 UART1 的寄存器被映射到RAM,即从该地址开始的 4KB 区域中的内存空间。

要访问 UART1 的寄存器,我们需要知道它与基地址的偏移量才能得到它的实际地址。这些偏移量可在表 17-39 UART IrDA CIR 寄存器汇总中找到。

一旦我们知道实际地址,我们就会使用指向该寄存器的指针

unsigned int * (base_address + offset)

一旦我们有了指针,我们就可以取消引用它来读/写寄存器。例如

要读取变量“x”中的寄存器,我们使用:

unsigned int x;
x = *(unsigned int * (base_address + offset));

写寄存器也是类似的

*(unsigned int *(base_address + offset)) = some_value;

为了更好地理解内存映射是如何在硬件级别实现的,请浏览 TRM 的第 2 章“内存映射”。

于 2013-08-01T03:07:40.090 回答