2012-05-14 5 views
5

誰かがPythonでメモリマップされたデバイスレジスタを扱うための良い解決策を考案しましたか?理想的には、名前付きレジスタや名前付きビットフィールドであっても、それらが完全にアドホックではない方法で作業することを可能にするものがありますか?理想的にはクロスプラットフォームですが、私はLinuxだけで暮らすことができます。Pythonでメモリマップされたレジスタ

Structsがmmap型とctypes型の組み合わせのように見えるかもしれませんが、a)Structsではビットフィールドの位置を指定することができないようです(Cではそうもありません)。 b)構造体マッピングをmmapの上にドロップする方法を理解できません。

または、サークルソーをドライバーとしてどのように使用することができますか? (?つまり、それはそれを行うと、なぜ地球上ではありません、あなたがしたいと思う)

例(NOT使用するために、テストされていない)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; 
+1

私は答えは分かりませんが、すでにライブラリがない場合は、作成すると良いプロジェクトになります。 – japreiss

+0

なぜこれを行う必要がありますか?解決しようとしている実際の問題の詳細をご記入ください。 (シリアルポートまたはパラレルポートに接続しようとしている可能性がありますが、そのためのライブラリがあります) –

+1

[bitstring](http://code.google.com/p/python-bitstring/)モジュールはビットフィールドの操作にはいいですが、最初のデータを取得するのに役立ちません。 – larsks

答えて

0

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

関連する問題