6

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;
4

1 に答える 1

0

最も簡単な方法は、C でアクセサー関数を記述し、Python から呼び出すことだと思います (ctypes と Cython の間では、Python から C コードを呼び出すことはそれほど難しくありません)。

于 2012-05-15T22:17:53.470 に答える