¿Cuál es la mejor manera de aprender a desarrollar controladores de dispositivos en Linux o en cualquier plataforma? Hay algún buen libro/kits de hardware/software para hacerlo uno mismo?

Te apoyo en que Linux es la mejor opción para aprender el desarrollo de controladores de dispositivos ya que tienes muchos ejemplos (el núcleo de Linux representa sólo un pequeño porcentaje del código fuente total, la mayoría son controladores de dispositivos), muchos dispositivos soportados por Linux, documentación y una comunidad global bien establecida.

Para aprender el desarrollo de controladores de dispositivos, como cualquier otro conocimiento nuevo, el mejor enfoque para mí es aprender primero la teoría y luego hacer algo de práctica.

Si no sabes de sistemas operativos, recomiendo "Willam Stalling's OS book" [1]. Este libro tiene un enfoque más orientado al hardware a diferencia de otros libros de SO que se centran más en los algoritmos y estructuras de datos utilizados en los sistemas operativos.

Después de tener una visión general de alto nivel de los sistemas operativos, usted tiene que aprender sobre el desarrollo del kernel de Linux. El libro de Robert Love [2] es para mí el mejor sobre el tema. Usted puede aprender no sólo sobre el desarrollo del kernel de Linux, sino también las motivaciones detrás de las decisiones técnicas que conducen al diseño.

Entonces usted tiene que aprender sobre el desarrollo de controladores de dispositivos en Linux, dos libros que son muy buenos son "Linux Device Drivers" [3] y "Essential Linux Device Drivers" [4]. Estos dos libros son complementarios. El primero enseña cómo escribir controladores de dispositivos virtuales para dispositivos basados en memoria, por lo que puedes probar los ejemplos sin necesidad de hardware especial. Mientras que el segundo te muestra cómo se escriben realmente los controladores para dispositivos reales. Mantengo un repositorio actualizado con todos los ejemplos de LDD3 para que puedas compilar y probar en kernels recientes [5].

Una vez que tengas la teoría puedes empezar con la práctica escribiendo drivers de dispositivos reales. Necesitas un hardware que todavía no está soportado en Linux. La buena noticia es que probablemente ya tengas uno de estos dispositivos. Con la popularidad de la plataforma Android, es muy probable que tengas un dispositivo Android.

Aunque Android es un sistema operativo basado en Linux, Google por una decisión de diseño bifurcó el kernel de Linux y añadió algunas APIs [6] que no existen en el kernel de Linux. Estas APIs son utilizadas por los controladores de dispositivos y por esa razón, un desarrollador tiene que elegir si escribir un controlador de dispositivo para Android o para Linux.

Así que, portar los controladores de dispositivos de Android a Linux es una excelente oportunidad para aprender habilidades de desarrollo de controladores de dispositivos, el proceso de desarrollo del kernel de Linux y cómo trabajar con la comunidad de Linux mientras se hace algo útil.

[1]: http://williamstallings.com/OS/
[2]: http://blog.rlove.org/2010/07/linux-kernel-development-third-edition.html
[3]: http://lwn.net/Kernel/LDD3/
[4]: http://elinuxdd.com/
[5]: https://github.com/martinezjavier/ldd3
[6]: http://lwn.net/Articles/416690/