10

¡Hola Gurus de Linux Kernel Driver!Acceso a un puerto serie desde un módulo de kernel de Linux

Estoy escribiendo un controlador v4l2 para una cámara que utiliza una interfaz en serie para la configuración. Me gustaría que el controlador configure la cámara, ya que mantiene el código del cliente constante en todos los modelos de cámara. La pregunta es: ¿cuál es la mejor manera de acceder a la interfaz serial de la cámara desde el módulo del controlador?

Por lo que he escuchado, acceder a los archivos desde un controlador de kernel es un gran no-no, pero se puede hacer. Como tal, actualmente estoy usando el siguiente fragmento de código, pero se siente como un truco.

oldfs = get_fs(); 
set_fs(KERNEL_DS); 

fd->f_pos=0; 
fd->f_op->write(fd, data, data_len, &fd->f_pos); 

set_fs(oldfs); 

Mi pregunta es realmente: ¿cuál es la forma correcta de hacer esto?

Respuesta

4

presumo que desde un puerto serie está involucrado, esto debe ser una especie de incrustado sistema. Después de todo, no muchas PC incluso tienen puertos seriales. También asumo que el puerto serie se puede considerar una conexión permanente, al menos desde la perspectiva del usuario. Si eso es cierto, entonces realmente no quieres un dispositivo TTY. Desea acceder al dispositivo como un UART privado.

Si echa un vistazo a los códecs de audio Wolfson (sound/soc/wm * .c) verá un ejemplo de dispositivos que se comunican principalmente a través de I2S pero que tienen una interfaz I2C auxiliar para la configuración. Esto es conceptualmente lo que quieres, creo. El controlador presenta una interfaz unificada para el software y emite comandos al hardware que sea apropiado. Obviamente, esto es mucho más limpio que tener que exponer los detalles de implementación de hardware al espacio de usuario.

No pude encontrar un buen ejemplo de un controlador UART en el kernel que funciona de esta manera, pero espero haber descrito qué buscar. Desde el punto de vista de la pureza práctica en lugar de técnica, podría ser mejor hacer E/S de archivo desde el kernel.

+0

Gracias por esto: los controladores Wolfson Micro son buenos ejemplos. Todavía no está claro cuál es la mejor manera de usar un UART (¡Realmente no quiero reescribir el controlador UART!), Pero este es un gran comienzo. ¡Gracias! – IndigoFire

1

Primero, le aconsejaría que encuentre una forma de hacerlo desde el espacio de usuario si es posible: lo que trata de lograr aquí realmente es el código de espacio de usuario en el código del kernel.

Pero si no encuentra una manera de hacerlo, este article le muestra cómo hacer llamadas de espacio de usuario en kernelspace.

Puesto que usted quiere acceder a un puerto serie, usted debe tener las llamadas que TTY orientado, por ejemplo, para abrir:

serial_fd = sys_open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)) 
+0

Entiendo que esto realmente debería estar en el espacio de usuario, así que supongo que la pregunta es: ¿cómo puedo tener un controlador v4l2 recibiendo ioctl para controlar el zoom que requiere comandos enviados a través de un puerto serie? – IndigoFire

+0

¡Gracias por el excelente artículo! Explica muchas cosas que no entendí sobre kernel y espacios de usuario. – IndigoFire

Cuestiones relacionadas