2013-07-04 4 views
3

Я пытаюсь написать программу python для чтения и записи регистров из/в Hardware. Мое чтение прекрасно пишет, но моя запись не работает. Я думаю, проблема в том, что я делаю struct.pack. Может кто-нибудь из вас рассказать мне, почему. Также будет здорово, если вы сможете поделиться, если есть лучший способ записать в регистры через дескрипторы устройств. Я уже пробовал (ctypes), и я предпочитаю иметь собственный код python для чтения/записи. спасибо за ваше время ..любая замена для struct.pack?

#!/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

Разве это не дубликат вашего собственного вопроса ранее: http://stackoverflow.com/q/17426932/1980029? Если так, было бы лучше отредактировать существующий вопрос с большей информацией, чем открыть новый. – robjohncox

+0

Это не то же самое. Здесь я не называю функции вместо того, чтобы знать, есть ли альтернатива для struct.pack, а если нет, то какие другие альтернативы. – user2532296

+1

addr = '0x7d400000' .. int (addr, 16) - вы можете просто написать 0x7d400000 как целочисленную константу в python - не нужно создавать строку и анализировать ее – Knio

ответ

0

Выглядит немного опасно использовать struct.pack ('Q'), так как фактическая структура (netfpga_register_t) имеет два 32-битовых полей, поэтому пакет ('II') будет более уместным.

Кроме того, в netfpga_register_t поля поступают в следующем порядке: reg_id и reg_val. Если платформа малозначительная, ваше значение переходит в первые 4 байта, а не в последние. Еще одна веская причина для использования struct.pack ('II', addr, value).

Смежные вопросы