如何使用Python写入硬件中的寄存器?

我有一个C函数,通过打开设备描述符(nf10)可以完美地读/写硬件寄存器。 我正在尝试使用Python做同样的事情。 我能够读取寄存器,但我无法写入寄存器。 为什么我不能写? 有没有更好的方法来对硬件中的寄存器进行读/写操作?

相关的Python代码:

#! /usr/bin/env python import os from fcntl import * from struct import * SIOCDEVPRIVATE = 35312 NF10_IOCTL_CMD_READ_STAT = SIOCDEVPRIVATE + 0 NF10_IOCTL_CMD_WRITE_REG = SIOCDEVPRIVATE + 1 NF10_IOCTL_CMD_READ_REG = SIOCDEVPRIVATE + 2 def rdaxi(addr): f = open("/dev/nf10", "r+") arg = pack("q", int(addr, 16)) value = ioctl(f, NF10_IOCTL_CMD_READ_REG, arg) value = unpack("q", value) value = value[0] value = hex(value & int("0xffffffff", 16)) f.close() return value def wraxi(addr, value): f = open("/dev/nf10", "r+") arg = (int(addr, 16) << 32) + int(value, 16) arg = pack("q", arg) ioctl(f, NF10_IOCTL_CMD_WRITE_REG, arg) f.close() 

相关的C代码

 #include  #include  #include  #include  #include  #define NF10_IOCTL_CMD_READ_STAT (SIOCDEVPRIVATE+0) #define NF10_IOCTL_CMD_WRITE_REG (SIOCDEVPRIVATE+1) #define NF10_IOCTL_CMD_READ_REG (SIOCDEVPRIVATE+2) int main(int argc, char* argv[]){ int f; uint64_t v; uint64_t addr; uint64_t val; if(argc < 3){ printf("usage: rdaxi reg_addr(in hex) reg_val(in_hex)\n\n"); return 0; } else{ sscanf(argv[1], "%llx", &addr); sscanf(argv[2], "%llx", &val); } //---------------------------------------------------- //-- open nf10 file descriptor for all the fun stuff //---------------------------------------------------- f = open("/dev/nf10", O_RDWR); if(f < 0){ perror("/dev/nf10"); return 0; } printf("\n"); // High 32 bits are the AXI address, // low 32 bits are the value written to that address v = (addr << 32) + val; if(ioctl(f, NF10_IOCTL_CMD_WRITE_REG, v) < 0){ perror("nf10 ioctl failed"); return 0; } printf("\n"); close(f); return 0; 

}

我认为最好在C中对寄存器实现低级操作,并将C编译为.so。 然后在python中加载.so。

我怀疑“endianness”可能是你的问题。 但是,如果不知道你正在写的硬件,很难说。 我注意到你已从包函数调用中删除了字节顺序说明符。 大多数硬件寄存器都是big-endian,这意味着它们期望在最低内存地址处为bit 0,在最高地址处为最高有效位。

如果没有字节顺序说明符,Python将使用您的本机字节序包,这在英特尔系统上是小端的。 尝试使用big-endian说明符打包它,以便所有内容保持与开始时相同的顺序:

 arg = pack(">q", arg)