我很困惑如何在 u-boot 中映射寄存器(例如:用于 uart 控制器)?它们是否在 DDR 中映射内存?如果是怎么办?如果不是,那么 U-Boot 中“外设地址是内存映射的”是什么意思?
问问题
1391 次
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 回答