Use el encabezado Gpio de Raspberry Pi como interfaz de asignación de memoria

Raspberry Pi es realmente un dispositivo interesante por admitir tantas funciones en un factor de forma tan pequeño y simple. Si se puede acceder al encabezado de expansión GPIO de la misma manera que a una interfaz mapeada en memoria normal, más proyectos podrán usarla como plataforma de desarrollo. Algunas preguntas al respecto:

  1. ¿Se pueden agregar los pines GPIO en el encabezado en una sola instrucción de acceso a la memoria en su hardware (chip)? Si no es así (supongo), ¿se puede conectar alguna placa/circuito de expansión al conector para modificar el comportamiento de modo que pueda ser compatible con dicho método de acceso? ¿Cómo ves un diseño así?

  2. Si todo esto parece imposible o demasiado complicado, veo que una solución viable es envolver el acceso en una biblioteca o capa de abstracción. ¿Ha existido ese tipo de trabajo? ¿Hay algún trabajo similar? No estoy mirando el acceso a la zona de usuario, estoy pensando en algún tipo de biblioteca de kernel que facilite el desarrollo de controladores de nivel de kernel basados ​​​​en R-Pi.

Gracias de antemano por sus comentarios.

Es probable que SPI sea la mejor manera. Mirando a su alrededor, parece que 32 MHz es la velocidad máxima que funciona, por lo que el rendimiento será de alrededor de 4 MB/s como máximo. Es posible que sea mejor simplemente usar USB FLASH y paginación o quizás archivos mapeados en memoria.
Peter, ¿alguna sugerencia sobre cómo mapear SPI de nuevo al bus de memoria en el lado periférico?
No específicamente, pero lo principal que me viene a la mente es un mod de administración de memoria del kernel para cargar fallas de página desde su SPI RAM. Tenga en cuenta que la CPU no podrá acceder de forma nativa a los datos, primero deberá cargarse en la memoria "real". Es por eso que pensé que poner un archivo de página en una memoria USB sería mucho más rápido, aunque los tiempos de escritura/resistencia pueden ser un problema. Supongo que también podría considerar hacer un dispositivo USB MSD que use RAM en lugar de FLASH.
Peter, Excelente explicación sobre la falla de la página y la parte de manejo. No estoy seguro de que comprenda que me gusta acceder a dispositivos externos asignados a la memoria, no a la memoria real.

Respuestas (2)

El Raspberry Pi expone 17 pines GPIO en P1, y la placa Rev. 2 expone 4 más en P5. Estos pines no se pueden usar directamente como un bus de E/S mapeado en memoria, como podría haber encontrado en un sistema antiguo basado en microprocesador.

Supongo que podría hacer un bit-bang en un bus de este tipo, pero el número limitado de pines sería un problema. Podría, por ejemplo, definir un bus de datos de 8 bits, una luz estroboscópica de lectura, una luz estroboscópica de escritura y usar los 7 (u 11) bits restantes como un bus de direcciones. Sin embargo, dado que los bits GPIO disponibles no son secuenciales, su funcionamiento sería lento; el controlador en el RPi tendría que establecer y borrar bits individualmente.

Un mejor enfoque sería usar los buses I2C y/o SPI (serie) que están disponibles en el encabezado P1 para implementar memoria externa y/o E/S asignadas a la memoria.

Dave, buenos puntos. ¿Alguna idea de qué chip se puede usar para mapear el I2C o SPI de regreso al bus de memoria? Sé que en el lado del host agregar una página MMU y modificar el controlador de fallas puede asignar un acceso a la memoria a la transacción SPI o I2C.
especifique en qué bus de memoria está interesado. hay muchos. (Harvard no es una respuesta). Por lo general, la E/S proporcionada ya está asignada a la memoria en el espacio de direcciones raspi, por lo que no tiene que hacer lo que está tratando de hacer. simplemente conecte el periférico y use la entrada/salida para el bus de periféricos (spi, i2c, etc). hay rams y roms que usan estos buses (spi, i2c, etc.) si lo que busca es solo memoria

En realidad, puede realizar operaciones de E/S basadas en la memoria, solo eche un vistazo al ejemplo de WiringPI en http://elinux.org/RPi_Low-level_peripherals .

Sin embargo, hay algunas advertencias: debe abrir el /dev/memdispositivo, lo que significa que debe ser root. Sé que hay algunas personas que planean crear un /dev/gpio-memdispositivo especial para que solo esta parte del espacio de direcciones sea accesible (para un usuario/grupo con menos privilegios).

Para ver el código real que ya hace esto, eche un vistazo a Wiring Pi ( https://projects.drogon.net/raspberry-pi/wiringpi/ ) o LogAn ( https://github.com/r42/logan ).

LogAn lee todos los pines GPIO en un solo acceso a la memoria: ya se usó para depurar/diagnosticar el protocolo SPI en el RPI (ver https://github.com/R42/pinokia ). Tenga en cuenta que Pinokia usa E/S basadas en memoria para escribir en los pines.

Para ver ejemplos de placas que hacen un uso extensivo de GPIO, consulte Gertboard ( http://www.element14.com/community/docs/DOC-51726?ICID=hp-gertboard-banner ) y PiFace ( http:// uk.farnell.com/jsp/search/productdetail.jsp?SKU=2218566&MER=baynote-2218566-pr ).