2 个版本
0.1.1 | 2020年8月7日 |
---|---|
0.1.0 | 2020年7月28日 |
#83 in #register
17KB
372 行
bitinfo
bitinfo
是一个工具,通过解码它们的值来使处理寄存器更容易。
是什么?
让我们从一个工具的工作示例开始。假设你正在调试一个新传感器,并想知道一个寄存器是否包含预期的值。你读取它,得到一个难以理解的 0x4E0
。这可以通过手工解码,但这就是 bitinfo
发挥作用的地方。这难道不比手工解码更好吗?
borgel$ bitinfo STPM.DSP_CR3.0x4E0
STPM.DSP_CR3 0x4E0 -> | |
-----------------------+-------------------------------------------+-----------------------------------------------------------------------
SAG_TIME_THR | 1248 | The sag time
ZCR_SEL | V1 / 7.8125 kHz | Selection bit for ZCR/CLK pin, (output depends on ZCR/CLK enable bit)
ZCR_EN | CLK |
TMP_TOL | 12.5% | Tamper tolerance
TMP_EN | tamper disable | Tamper detect enable
S/W Reset | 0x0 | Software reset
S/W Latch 1 | 0x0 |
S/W Latch 2 | 0x0 |
S/W Auto Latch | Disabled | Auto latch
LED_OFF1 | LED output on | LED pin output disable
LED_OFF2 | LED output on | LED pin output disable
EN_CUM | Cumulative is the sum of channel energies | Cumulative energy calculaton
REF_FRQ | 50 Hz | Reference line frequency
bitinfo
允许开发者指定配置文件,描述设备寄存器的层次结构(在本例中为 STPM.DSP_CR3
),然后根据这些描述解码任意数值。
获取它
目前可在所有具有 Rust 工具链的平台上获取,请访问 http://crates.io。只需
cargo install --force bitinfo
# the `--force` forces `cargo` to install the latest version if you have an earlier one
使用它
使用 bitinfo
需要两个方面的知识;如何调用它以及如何配置寄存器描述。
调用
安装后,bitinfo
是一个单独的二进制文件,可以从 shell 中调用。 bitinfo
将帮助您描述一个数字,即使它不知道如何将其解码为特定的寄存器值。
borgel$ bitinfo 0xa5
165 -> 165 0xA5 0b10100101
borgel$ bitinfo 0x0F0
240 | 240 0xF0 0b11110000
任何常见的数值格式都可以正常工作(0x 十六进制,0b 二进制和 0 十进制)。
它还可以描述第 i 位设置的位。
borgel$ bitinfo --bits 0xa5
165 | 165 0xA5 0b10100101
-----+---------------------
| 0th set
| 2th set
| 5th set
| 7th set
但是,当描述具有描述性配置文件的价值时,该工具更有用。如果在包含 bitinfo
配置文件的目录树中工作,可以指定特定的设备进行查询。
borgel$ bitinfo R2-Device.Register1.0x1A
R2-Device.Register1 0x1A -> |
-----------------------------+--------------------
A nibble of decimals | 10
A bamboozler to control | Bamboozler enabled
为了解码特定的寄存器,bitinfo
必须
- 在其搜索路径中有适当的配置文件可见
- 使用对要解码的寄存器的命名引用进行调用,该寄存器必须在适当命名的可见配置文件中存在
请注意
- 分隔符可以是
.:/
的任何组合 - 设备和寄存器名称区分大小写,必须与配置文件完全匹配
配置
bitinfo
使用配置文件来描述它可以解码的寄存器和字段。要查看一个高度注释的示例配置,该配置描述了所有允许的字段,请检查示例目录中的此样本。
配置文件必须按照以下模式命名 .bitinfo.<可选名称>.yaml
才能被工具检测到。可选名称可用于组织目的,以便在同一个地方清楚地描述多个配置文件,但可以省略。它目前在解码过程中不被使用。
bitinfo
通过两种方式搜索配置文件:检查包括当前目录在内的每个目录,以及通过在命令行中指定目录。每次执行 bitinfo
都会搜索这些路径并加载所有匹配名称模式的配置文件。它将所有配置一起搜索以解决用户查询,因此大型项目可以将寄存器描述分散到多个文件中。
预期用例是项目在项目根目录中包含配置(以便它们在项目下方随处可见)或在特定模块的源附近包含特定于该模块的配置。
示例
一个非常简单的配置可能看起来像这样
R1-Device:
description: This is the top level of organization. Think part number like LIS2DH or STM32F104
preferred_format: hex
fields:
BField1:
start: 0
width: 1
description: I'm not sure what a bamboozler is, are you?
# sometimes it can be handy to describe what the flag states mean
patterns:
0b0: Bamboozler disabled
0b1: Bamboozler enabled
对此设备的查询将看起来像这样
# bamboozler disabled
borgel$ bitinfo --configs ../examples/ R1-Device.0
R1-Device 0x1A -> | |
-------------------+---------------------+---------------------------------------------
BField1 | Bamboozler disabled | I'm not sure what a bamboozler is, are you?
# and with the bamboozler enabled
borgel$ bitinfo --configs ../examples/ R1-Device.1
R1-Device 0x0A -> | |
-------------------+--------------------+---------------------------------------------
BField1 | Bamboozler enabled | I'm not sure what a bamboozler is, are you?
这有点简化。最常用的配置至少包含一个额外的组织层,看起来更像是这样
R2-Device:
description: This is the top level of organization. Often an entire device (CPU, complex sensor, etc)
registers:
Register1:
description: A second level of organization. Think of a peripheral or register in a CPU or sensor
fields:
A decimal slice:
start: 0
width: 4
preferred_format: dec
BField2:
start: 4
width: 1
patterns:
0b0: Bamboozler disabled
0b1: Bamboozler enabled
请注意,这里的 寄存器
可以嵌套到任意深度。
对上述设备的查询命令将如下所示
borgel$ bitinfo --configs ../examples/ R2-Device.Register1.0x1A
R2-Device.Register1 0x1A -> |
-----------------------------+--------------------
A nibble of decimals | 10
A bamboozler to control | Bamboozler enabled
请注意,上述示例是在相对于存储库中的源目录的情况下运行的,这就是为什么将示例目录作为显式搜索路径传递的原因。
请参阅示例目录以获取有关可用字段及其用法的详细说明。
已知限制
- 尽管没有理由它需要限制为32位寄存器,但在某些地方假定是这样
- 仅通过完全工作的Rust安装(但任何平台!)
- 输出格式选项有限(具体来说,没有选项)
- 可能还有更多。欢迎PR!
依赖关系
~7–17MB
~208K SLoC