【问题标题】:How do I use registers and offset addresses?如何使用寄存器和偏移地址?
【发布时间】:2016-06-01 14:14:18
【问题描述】:

目前,我正在尝试编写一个 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)之外的所有位都关闭,对吗?

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

在此先感谢大家!

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

【问题讨论】:

    标签: c++ memory driver cpu-registers gpio


    【解决方案1】:

    经过研究,我发现了一些东西:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 2016-11-11
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多