#register #decode #cli #command-line-tool

app bitinfo

一个命令行工具,使处理寄存器更容易

2 个版本

0.1.1 2020年8月7日
0.1.0 2020年7月28日

#83 in #register

MIT 许可证

17KB
372

bitinfo

CircleCI Version info

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