c++ - 如何使用寄存器和偏移地址?

标签 c++ memory driver cpu-registers gpio

目前,我正在尝试编写一个 GPIO 驱动程序,并试图将我的头脑集中在一些事情上。在互联网上搜索后,我还没有真正找到关于基地址、寄存器和偏移地址的几个问题的明确答案。

对于下面的问题,假设我有一个任意寄存器 D1:F0 和一个 10h-13h 的偏移地址(大小为 32 位)。位 0 始终为 1 且保留,位 10:1 为 GPIO 基地址,位 31:11 保留且始终为 0。该寄存器的默认值为 00000001h。使用此信息:

1) 什么是关于 D1:F0 的功能编号到根端口映射?

2) D1:F0 是否包含可在代码中使用的端口?

3)偏移地址与问题1/问题2有什么关系?

4) 寄存器的默认值除了第一个保留位(应该是 1)外所有位都关闭,对吗?

偏执狂检查问题:位 [4:1] 表示位 1-4,对吗?

在此先感谢大家!

注意:我需要指出,这篇文章中的所有数据、寄存器、内存地址和偏移量都是任意的,绝不反射(reflect)我将使用/有权访问的数据。这只是概念性的,只是为了说明一点。

最佳答案

经过研究,我发现了一些事情:

1) 以D1:F0为例的Function Number-to-Root Port Mapping是表示寄存器在D设备>1, F功能 0 关于 PCH 和总线。总线设备可以具有多个“功能”,例如,可以由不同的外围设备使用。

2) 是和否。由于缺少更好的术语,NRP 表示法为您提供了总线设备到函数的逻辑映射,并屏蔽了寄存器的实际十六进制基地址和偏移量。处理器/芯片组文档包含总线起始位置的物理地址,并将这些地址与 NRP 表示法相关联。

3) 偏移地址与D1:F0 示例NRP 符号无关。 D1:F0 只是寄存器相对于总线的基地址的表示,而不是实际的寄存器地址。您会将偏移量(或偏移量范围)应用于寄存器的基地址。

4) 正确。只是用一个位域来验证,写在纸上验证。

附加问题:关于位的[Number1:Number2]表示位Number1Number2,从左到右读取位右(高位到低位位)。因此,例如,bits [15:4] 表示 bits 4 到 15,总共 12 位。

关于c++ - 如何使用寄存器和偏移地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571239/

相关文章:

c++ - 如何转发声明要在 unique_ptr 的标准容器中使用的类

linux - 如何为 Linux 编写低级设备驱动程序?

Windows 内核 ReadProcessMemory()/WriteProcessMemory()?

c++ - 指针有问题?

c# - 使用 RtlCopyMemory 在驱动程序中复制数据

c++ - 琐碎的析构函数会导致别名吗

c++ - 为什么g++返回-1时不返回错误

c++ - 没有删除运算符的 shared_ptr 内存泄漏

c - malloc 对象上的 Free throws 错误

MATLAB 内存不足,但不应如此