【发布时间】: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