3

ハードウェアとの間でレジスタを読み書きするための 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()
4

1 に答える 1

0

実際の構造体 (netfpga_register_t) には 2 つの 32 ビット フィールドがあるため、struct.pack('q') を使用するのは少し危険に見えます。そのため、pack('II') の方が適切です。

また、netfpga_register_t では、フィールドは reg_id と reg_val の順序になります。プラットフォームがリトルエンディアンの場合、値は最後のバイトではなく、最初の 4 バイトに入ります。struct.pack('II', addr, value) を使用するもう 1 つの正当な理由。

于 2014-02-03T16:47:19.197 に答える