Aprendizaje del desarrollo de controladores de Linux con Raspberry Pi

13

Me gustaría escribir un controlador de dispositivo Linux para algún dispositivo de hardware real. ¿Qué periféricos Raspberry Pi se ajustan bien? Básicamente necesito lo siguiente:

  1. Debe ser lo suficientemente pequeño para un principiante (pocos meses como máximo, mejor unas pocas semanas).

  2. La hoja de datos debe estar disponible. Al principio estaba pensando en el adaptador USB-Ethernet, pero parece que tiene una hoja de datos muy limitada.

¿Algunas ideas? ¿Puede ser algo así como hacer que la consola serie funcione sobre GPIO?

ivan
fuente
2
Los controladores de Linux son módulos de kernel, y técnicamente no tienen que tener nada que ver con el hardware, por lo que lo primero que debe probar es probablemente una interfaz de dispositivo char, es decir, algo que proporcione un archivo de dispositivo char que pueda ser leído y / o escrito (al igual que las cosas en proc) para algún propósito trivial.
Ricitos de oro
Hice todo eso, completé tutoriales y escribí módulos de kernel para pseudodispositivos, junto con la lectura de libros sobre desarrollo de kernel / driver. Todo esto está bien, pero ahora quiero trabajar con hardware real ...
Ivan
Greg KH escribió esto hace un tiempo (en algunos aspectos puede estar un poco desactualizado): linuxjournal.com/article/7353 Así que hay dispositivos USB con hojas de datos públicas. Él tiene algunos consejos de ingeniería inversa allí (no me gustaría hacerlo con algo demasiado complicado aunque). Cosas para los pines GPIO Supongo que generalmente funcionan usando los controladores I2C existentes, etc., pero podría ignorar eso y hacer algo usted mismo.
Ricitos de oro

Respuestas:

4

Puede ser difícil aprender a escribir controladores al interactuar con dispositivos complicados y / o buses complicados. Debido a eso, recomendaría usar algunos dispositivos simples y conocidos (ignorando la implementación existente de sus controladores en el núcleo) como dispositivos I²C / SPI que generalmente se usan con microcontroladores. Por ejemplo, podría encontrar cualquier dispositivo que sea "compatible" con la comunidad Arduino (lo que significa que hay una biblioteca / documentación para él) e intente usarlo con RaspberryPi.

Si eso no es suficiente o no desea comprar demasiado hardware, puede crear uno usted mismo. Simplemente obtenga un microcontrolador (como atmega o algo así), cree un programa para que se convierta en un dispositivo y luego intente interactuar con él utilizando controladores de Linux. De esta manera, puede crear fácilmente programas que emularán diferentes clases de dispositivos. Y como usted mismo escribirá su "firmware", lo ayudará a depurar problemas.

Necesitas algunas habilidades de programación de microcontroladores para eso, pero no es difícil aprender a programar con Arduino y creo que de todos modos es un conocimiento útil para el programador de controladores.

Krzysztof Adamski
fuente
¿Qué hay de implementar la comunicación en serie en el software a través de pines GPIO? Por ejemplo, conecte el serial a la PC e intente al menos enviar algo a la consola. ¿Es viable?
Ivan
@ivan: No estoy seguro de haber entendido bien eso. Si, por serie, te refieres a UART / rs232 y por software, te refieres a bitbanging, entonces no es posible debido a restricciones de tiempo. Si, por otro lado, quiere decir (re) implementar un dispositivo serie Linux usando hardware RaspberryPi UART, entonces, por supuesto, es factible. Creo que toda la información necesaria sobre este hardware se puede encontrar en el BCM2835 ARM Peripheralsdocumento. Pero recuerde que para usarlo, primero debe deshabilitar el controlador existente en el núcleo.
Krzysztof Adamski
Gracias, pero ¿estás seguro de la imposibilidad de golpear el UART? Encontré este enlace: ganssle.com/articles/auart.htm, por lo que parece potencialmente factible para una baja velocidad en baudios y al menos solo para implementar la parte de envío (lo cual es más fácil).
Ivan
@ivan: Este artículo no parece ser sobre sistemas con sistemas operativos de propósito general como Linux. En UART, tiene restricciones de tiempo muy estrictas que son muy difíciles de cumplir sin un sistema operativo en tiempo real. Dicho esto, puede ser posible hacerlo a baja velocidad de transmisión, pero puede no ser realmente confiable.
Krzysztof Adamski
Parece que tienes razón: raspberrypi.stackexchange.com/questions/1987/… (sin embargo, hay una solución interesante allí). De nuevo, gracias por tu ayuda.
Ivan
3

Personalmente, comenzaría con un dispositivo muy simple, como uno o más LED conectados directamente a los pines GPIO.

Puede comprar un dispositivo listo para enchufar o cablear el suyo.

La razón por la que sugeriría esto es que la depuración de controladores es generalmente mucho más difícil que un programa normal, por lo tanto, un desafío simple para comenzar es útil, también puede usar ese código como método de depuración para dispositivos más complejos (estado a un pin GPIO para conectar a un osciloscopio) donde el tiempo es importante.

Si es de interés, hay un controlador de kernel para LedBorg disponible aquí , la fuente debería ser un ejemplo razonablemente simple para manejar pines GPIO en un intervalo regular.

PiBorg
fuente
Hola @PiBorg. ¿Puede contarme algunos recursos que me ayuden a aprender a codificar un controlador simple para un dispositivo como uno o más LED conectados directamente a los pines GPIO?
Sagar
0

El "dispositivo" más simple para el que puede escribir un controlador de hardware (si el desarrollo del controlador de hardware es lo suyo) también puede ser tan simple como un LED (agregué las comillas porque técnicamente un LED no es un dispositivo, pero sigue siendo una pieza de hardware) como ha sugerido @PiBorg.

Otras opciones serían algunos dispositivos / componentes fáciles de interactuar, como fotoresistores, sensores infrarrojos pasivos (abreviatura: PIR), sensores de temperatura, ventiladores de PC (preferiblemente un ventilador de 4 cables que le permite no solo monitorear sino también controlar el RPM), matrices de puntos LED, etc. Básicamente, estos dispositivos simples le permitirán tener el mínimo de hardware (para que pueda ver y tocar lo que realmente ha logrado) y al mismo tiempo puede aprender sobre muchos temas que se utilizan para dispositivos mucho más complejos donde La complejidad proviene principalmente del protocolo que utilizan.

Tenga en cuenta también que no necesita hacer un esfuerzo adicional para cavar en los módulos del kernel. Por supuesto, si quieres hacer eso, nadie te detendrá. :)

Aquí hay un ejemplo de interfaz de un sensor infrarrojo pasivo (voy a probarlo pronto cuando se entregue mi PIR: 3). Puede tomar esto y comenzar a profundizar en el mundo del kernel de Linux para ver cómo, por ejemplo, puede crear un controlador de kernel, que funcione con el PIR.

rbaleksandar
fuente