struct.pack的任何替代品?

时间:2013-07-04 17:56:23

标签: python cpu-registers

我正在尝试编写一个python程序来读取和写入硬件中的寄存器。我的阅读写得很好,但我的写不起作用。我认为问题是当我做struct.pack时。你们任何人都可以告诉我原因。如果有更好的方法通过设备描述符写入寄存器,那么你可以分享它。我已经尝试过(ctypes),我更喜欢使用本地python代码进行读/写操作。谢谢你的时间..

#!/usr/bin/python
import os
from struct import *
from fcntl import *


SIOCDEVPRIVATE = 35312
NF10_IOCTL_CMD_READ_STAT = SIOCDEVPRIVATE + 0
NF10_IOCTL_CMD_WRITE_REG = SIOCDEVPRIVATE + 1
NF10_IOCTL_CMD_READ_REG = SIOCDEVPRIVATE + 2

addr= '0x7d400000'
value= '0x1234'
# Function for writing

f = open("/dev/nf10", "w")
arg = (int(addr, 16) << 32) + int(value, 16)
arg = pack("q",arg)
ioctl(f, NF10_IOCTL_CMD_WRITE_REG, arg)
f.close()

# Function for reading
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))
print value
f.close()

1 个答案:

答案 0 :(得分:0)

使用struct.pack('q')看起来有点危险,因为实际的struct(netfpga_register_t)有两个32位字段,所以包('II')更合适。

此外,在netfpga_register_t中,字段按此顺序排列:reg_id和reg_val。如果平台是little-endian,那么你的值将进入前4个字节,而不是最后的4个字节。使用struct.pack的另一个好理由('II',addr,value)。