#嵌入式设备 #USB设备 #桥接 #总线 #内存 #UART #Wishbone

app wishbone-tool

一个用于控制嵌入式设备Wishbone总线的库和命令行程序

5个版本

0.7.9 2021年5月14日
0.7.5 2020年7月13日
0.7.3 2020年6月30日
0.7.2 2020年6月30日
0.7.1 2020年6月30日

#652 in 硬件支持

Apache-2.0

285KB
6K SLoC

wishbone-tool - 一站式Wishbone二进制和库

wishbone-tool 可用于与设备内部的Wishbone桥进行交互。

以下是一些你可以使用 wishbone-tool 做的事情

  • 窥视和探测内存,类似于使用 devmem2
  • 测试内存和桥接链路质量
  • 将Wishbone桥暴露给以太网
  • 将GDB服务器附加到软核

目前支持的Wishbone桥包括

  • USB - 用于与Valentyusb(如Fomu)配合使用
  • 串行 - 通用UART,通常运行在115200(但可以通过 --baud 进行更改)
  • SPI - 使用来自 spibone 的2、3或4线SPI
  • 以太网 - TCP(例如,wishbone-tool 的远程副本)或UDP(通过Etherbone)
  • PCI Express - 使用暴露CSR寄存器银行的PCIe软核

二进制文件

可以在 发行版 部分找到预编译版本的 wishbone-tool

构建

要构建 wishbone-tool

  1. 安装Rust和Cargo。最简单的方法是访问 https://rustup.rs/ 并遵循说明。
  2. 进入 wishbone-tool 目录。
  3. 运行 cargo buildcargo build --release

wishbone-tool 二进制文件将位于 target/debug/target/release/ 之下。

用法

默认情况下,wishbone-tool将通过USB进行通信,尝试打开PID为0x5bf0的设备。它还将运行peek/poke服务器,允许对目标设备上的内存地址进行基本操作。

USB桥接器

只需运行wishbone-tool [地址]即可查看特定地址。要指定特定的供应商ID,传递--vid [ID],例如--vid 0xb0f1。要从内存区域(如0x10000000)读取,运行

$ # Read from address 0x10000000 via USB
$ wishbone-tool 0x10000000
INFO [wishbone_tool::usb_bridge] waiting for target device
INFO [wishbone_tool::usb_bridge] opened USB device device 019 on bus 001
Value at 00000000: 6f80106f
$

要将值写入内存,添加一个额外的参数

$ wishbone-tool 0x10000000 0x12345678
INFO [wishbone_tool::usb_bridge] opened USB device device 019 on bus 001
$ wishbone-tool 0x10000000
INFO [wishbone_tool::usb_bridge] opened USB device device 019 on bus 001
Value at 00000000: 12345678
$

串行桥接器

您可以通过指定--serial参数来连接到串行端口

$ wishbone-tool --serial COM4: 0x00000000
Value at 00000000: ffffffff
$ wishbone-tool --serial /dev/ttyUSB0 0x00000000
Value at 00000000: ffffffff

请确保您有写入串行端口的权限。在某些Linux系统上,您可能需要将您的用户添加到dialout组。

以太网桥接器

要连接到以太网设备,传递--ethernet-host参数

$ wishbone-tool --ethernet 192.168.100.50 0x00000000
Value at 00000000: ffffffff

要连接到不同的端口,添加--ethernet-port PORT_NUMBER。最后,如果您想连接到另一个wishbone-tool的副本或到lxserver的副本,添加--ethernet-tcp以将连接从Etherbone切换到TCP。

PCIe桥接器

如果您的设备通过PCI Express连接,您可以使用--pcie-bar FILE_PATH指定PCIe BAR。这将在/sys/bus下作为设备。

请注意,在PCIe模式下运行时,仅暴露内存空间的一小部分。这意味着您可能需要指定--register-offset OFFSET,因为例如,PCIe BAR中的地址0可能实际上对应于地址0xe0000000,而wishbone-tool需要知道如何进行转换。

SPI桥接器

如果您指定了--spi-pinswishbone-tool将通过SPI与目标设备通信。目前这仅在Raspberry Pi上支持。指定物理Broadcom引脚编号。有关更多详细信息,请参阅Pinout.xyz。例如,假设您想将COPI、CPIO、CLK和CS_N连接到Raspberry Pi引脚3、5、7和12。如果您查看该网站,您会看到引脚3是BCM2,引脚5是BCM3,引脚7是BCM4,引脚12是BCM18。因此,您提供给wishbone-tool的参数是--spi-pins 2,3,4,18

交叉UART

如果您的桥接器通过UART,那么这意味着您的UART已被占用,并且不可用作控制台。或者如果您通过其他介质连接,并且只有一根电缆连接两个设备。LiteX支持创建一个“交叉”UART,wishbone-tool可以与之交互并在本地显示终端。

要将UART桥接器和交叉UART添加到设计中,使用uart_name="crossover"实例化主SoC对象,并添加一个单独的Wishbone桥接器。

   class MySoC(SoCCore):
      def __init__(self, platform, sys_clk_freq):
         SoCCore.__init__(self, platform, sys_clk_freq, uart_name="crossover")

         # Add a bridge with the real UART pins
         self.submodules.uart_bridge = UARTWishboneBridge(
               platform.request("serial"),
               sys_clk_freq,
               baudrate=115200)
         self.add_wb_master(self.uart_bridge.wishbone)

然后,要交互式地与终端交互,运行wishbone-tool并向其提供构建的csr.csv文件,并添加-s terminal标志

$ wishbone-tool -s terminal --csr-csv build/csr.csv
$

请注意,您可以同时运行多个wishbone-tool服务器。例如,要同时运行gdb服务器,运行

$ wishbone-tool -s gdb -s terminal --csr-csv build/csr.csv
$

要退出会话,按Ctrl-C

GDB服务器

如果你的软核中包含Vexriscv CPU,您可以通过启用调试模式,并使用wishbone-tool作为gdbserver。

命令行自动补全

您可以使用-c选项生成wishbone-tool的自动补全。例如,要为bash生成自动补全,请运行

$ wishbone-tool -c bash > wishbone-tool.bash
$ . wishbone-tool.bash
$

自动补全适用于zsh、bash、fish、powershell和elvish。

wishbone-bridge作为库

您也可以将wishbone-bridge作为库在您的程序中使用。更多信息请参阅wishbone-bridge文档

依赖

~7–17MB
~193K SLoC