我怎样写使用Python在硬件寄存器? [英] How do I write to registers in hardware using Python?

查看:1821
本文介绍了我怎样写使用Python在硬件寄存器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个C函数,可以读/打开设备描述符(nf10)完美地写入到硬件寄存器。我试图做使用Python一样。我能够读取寄存器,但我不能写寄存器。为什么我不能写?有没有更好的方式来做到读/在硬件寄存器写?

I have a C function which can read/write perfectly into the hardware register by opening the device descriptor (nf10). I am trying to do the same using Python. I am able to read the registers, but I am not able to write registers. Why am I unable to write? Is there a better way to do read/write for registers in hardware?

相关的Python code:

Relevant Python code:

#! /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 $ C $ç

relevant C code

#include <fcntl.h>
#include <sys/ioctl.h> 
#include <stdio.h>
#include <stdint.h>
#include <string.h>

#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。然后加载。所以在蟒蛇。

I think it's best to implement lower-level operations on registers in C, and compile C to .so. Then load the .so in python.

这篇关于我怎样写使用Python在硬件寄存器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆