我正在编写一个用户空间驱动程序,用于在 Python 3.5 中访问 FPGA 寄存器,它mmap
是 FPGA 的 PCI 地址空间,获得一个memoryview
以提供对内存映射寄存器空间的直接访问,然后用于struct.pack_into("<I", ...)
将 32 位值写入选定的 32 -位对齐地址。
def write_u32(address, data):
assert address % 4 == 0, "Address must be 32-bit aligned"
path = path.lib.Path("/dev/uio0")
file_size = path.stat().st_size
with path.open(mode='w+b') as f:
mv = memoryview(mmap.mmap(f.fileno(), file_size))
struct.pack_into("<I", mv, address, data)
不幸的是,似乎在struct.pack_into
写入memset(buf, 0, ...)
实际值之前清除了寄存器。通过检查 FPGA 中的写操作,我可以看到寄存器在设置真值之前设置为 0x00000000,因此 PCI 总线上至少有两次写入(实际上对于 32 位访问,有 3 个,两个 0写入,然后是实际数据。64 位涉及六次写入)。这会导致一些寄存器对写入操作的次数进行计数,或者一些“写入时清除”或在写入时触发某些事件的副作用。
我想使用另一种方法将寄存器数据一次性写入内存映射寄存器空间。我已经研究过了ctypes.memmove
,它看起来很有希望(还没有工作),但我想知道是否还有其他方法可以做到这一点。
请注意,寄存器读取使用struct.unpack_from
效果很好。
请注意,我还通过使用记录所有访问的 QEMU 驱动程序消除了 FPGA——在写入数据之前,我看到了相同的双零写入访问。