¿Alguien ha encontrado una buena solución para trabajar con registros de dispositivos mapeados en memoria en Python? Idealmente, ¿algo que me permita trabajar con registros con nombre, e incluso denominar bitfields en esos registros, de una manera que no sea totalmente ad hoc? Idealmente, multiplataforma, pero puedo vivir solo con Linux.Registros mapeados de memoria en Python
Parece que una combinación de estructuras mmap y ctypes podría ser capaz de manejarlo, pero a) Las estructuras no parecen permitirle especificar ubicaciones de campo de bits (ni lo hacen en C, entonces ...), y b) No puedo entender cómo eliminaría un mapeo de Struct en la parte superior de un mmap.
¿O estoy preguntando fundamentalmente cómo puedo usar una sierra circular como destornillador? (Es decir, no hacer eso y por qué en la tierra que desea?)
Un ejemplo en C (no probado, NO para el uso) sería algo así como:
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;
No sé la respuesta, pero si todavía no hay una biblioteca para ella, crear una sería un buen proyecto. – japreiss
¿Por qué necesita hacer esto? Proporcione detalles del problema real que está tratando de resolver. (Tengo la sensación de que puede estar intentando hablar con un puerto en serie o paralelo; hay bibliotecas para eso) –
El módulo [bitstring] (http://code.google.com/p/python-bitstring/) es bueno en la manipulación del campo de bits ... pero en primer lugar no te ayuda a obtener los datos. – larsks