【问题标题】:Memory mapped registers in PythonPython中的内存映射寄存器
【发布时间】:2012-05-14 16:47:07
【问题描述】:

有没有人想出一个很好的解决方案来在 Python 下使用内存映射设备寄存器?理想情况下,可以让我使用命名寄存器,甚至这些寄存器中的命名位域,以一种不完全临时的方式?理想情况下是跨平台的,但我只能使用 Linux。

似乎 mmap 和 ctypes 结构的某种组合可能能够处理它,但是 a)结构似乎不允许您指定位域位置(它们在 C 中也没有,所以......),并且 b ) 我不知道如何将 Struct 映射放在 mmap 上。

或者我从根本上问我如何将圆锯用作螺丝刀? (即它不这样做,你到底为什么要这样做?)

C 中的一个示例(未经测试,不可使用)如下所示:

volatile struct {
    uint32_t mfr_id;
    uint32_t prod_id;
    uint32_t ctl;
    uint32_t dummy[5];
    ...
} * pDev;
hFile = open('/dev/bridge', O_RDWR)
pDev = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, hFile, 0);
assert(pDev->mfr_id == 0x12345678);
assert(pDev->prod_id == 0xDEADBEEF);

uint32_t temp = pDev->ctl;
temp &= CTL_ACCESS_MASK | CTL_SHIFT_MASK;
temp |= CTL_ACCESS_RO | CTL_SHIFT_5;
pDev->ctl = temp;

【问题讨论】:

  • 我不知道答案,但如果还没有它的库,创建一个将是一个好项目!
  • 为什么需要这样做?请提供您要解决的实际问题的详细信息。 (我感觉您可能正在尝试与串行或并行端口通信;有用于此的库。)
  • bitstring 模块擅长位域操作....但首先不能帮助您获取数据。
  • @Li-aungYip,我希望。不,最终目标是通过 PCIe-VME 桥接器与 VME 卡通信。桥将有一个真正的内核空间驱动程序,允许将 VME 地址空间的范围映射为 PCI 内存空间,但是为每个 VME 卡做内核空间驱动程序是不可行的,应该真的没有必要。
  • 正如您所说,大多数情况下这可以使用 ctypes 完成 - 但我们需要更多关于如何开始的信息。您可以链接到 C 中的示例以与内存映射设备寄存器通信吗?

标签: python device-driver


【解决方案1】:

我认为最简单的方法是用 C 编写访问器函数并从 Python 调用它们(在 ctypes 和 Cython 之间,从 Python 调用 C 代码并不难)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多