Un buen controlador encapsula las capacidades del hardware y las pone a disposición del sistema operativo / aplicaciones de forma natural.
La mejor manera de hacer esto depende mucho del sistema operativo al que te dirijas y para qué tipo de hardware es el controlador.
Mi experiencia es todo con Linux y un pequeño sistema operativo personalizado en tiempo real.
Para Linux, recomiendo leer Controladores de dispositivos Linux . Es una buena introducción a los diferentes sabores de los controladores de Linux y las abstracciones que el sistema operativo les brinda.
Los dispositivos como los puertos serie en los que los datos se leen de manera secuencial, generalmente son manejados por controladores de dispositivo de caracteres con un nodo de dispositivo en el espacio de usuario para que las aplicaciones puedan leer. cat
puede leer de estos.
Los dispositivos de acceso aleatorio, como el almacenamiento flash y los discos duros, se manejan mediante dispositivos de bloque. dd
puede acceder a estos. Para ver un buen ejemplo, eche un vistazo al sistema Linux MTD .
Es muy probable que los controladores que se ocupan del hardware de bajo nivel con hardware deban implementarse en el espacio del kernel. Puede elegir crear un módulo de kernel que se pueda cargar en tiempo de ejecución o colocar su código de forma estática en el kernel de Linux.
Los controladores que se construyen sobre controladores genéricos existentes, como USB, pueden estar escritos en el espacio del usuario. Usando, por ejemplo, libusb .