CondorBoard Driver Pantalla LCD

by

= Driver: Hello_world PC=

En el momento de escribir un driver para linux se debe tener claro que se va a trabajar en el espacio del kernel, y no en el espacio de usuario, por eso librerías usuales como stdio y funciones como printf no son validas.

El espacio del kernel es el encargado de gestionar los recursos hardware del sistema, es así que es una interface entre los programas ejecutados por el usuario y el hardware existente, por esto la necesidad de un driver que maneje correctamente cada dispositivo hardware para su correcto funcionamiento en una aplicación dada.

Este tutorial hace alusión a un driver para un dispositivo cuyo archivo estará montado en la carpeta "/dev" del sistema, por eso todas las explicaciones y códigos serán enfocados hacia esto, ahora se va a explicar a grandes rasgos como se debe definir un driver y después con el ejemplo se podrá captar mejor lo explicado.

Para el correcto desarrollo de un driver se debe tener definidas las siguientes funciones:

-Init: función encargada de la inicialización del driver del dispositivo. -Exit: función encargada de la eliminación del driver del dispositivo. -Read: función encargada de la lectura del dispositivo. -Write: función encargada de la escritura del dispositivo.

Se pueden definir tantas funciones como necesidades se tenga, pero las funciones anteriores son las básicas para un driver, así, apenas se cargue el driver se ejecutará la función init, cuando se elimine se ejecutará exit, cuando abramos el archivo en la carpeta "/dev", a través de la función read leeremos el dispositivo y con la función write escribiremos en el.

- Función "Init": se debe registrar el driver del dispositivo, declarar las operaciones que el driver ejecutara, reservar memoria e iniciar todas las variables y estados del dispositivo:

Para registrar el driver del dispositivo se debe definir la estructura "miscdevice" que contiene los datos del dispositivo y a través de la función " misc_register" se registra.

Para especificar las operaciones del driver se debe definir la estructura "file_operations", donde se definen las relaciones de las funciones que el usuario ejecutara sobre el archivo del dispositivo con las funciones del driver.

- Función "Exit" se hará lo contrario, así, se debe liberar tanto el dispositivo como el espacio de memoria usado, si se usa:

Para eliminar el driver del dispositivo de debe ejecutar la función " misc_deregister" con el apuntador a la estructura "miscdevice" definida anteriormente.

- Función "Read" con esta función lo que se pretende es leer el estado del dispositivo, para esto debemos pasar información del espacio del kernel al espacio de usuario, para esto contamos con la función:

copy_to_user(*to,*from,n), donde "to" es la dirección destino en el espacio de usuario, "from" es la direccion fuente en el espacio de kernel, y "n" es el numero de bytes a copiar, es de aclarar que "from" puede ser el apuntador a tipo de dato, estructura o objeto definido en el driver y "to" viene como parámetro de la función read.

- Función "Write" con esta función lo que se pretende es modificar el estado del dispositivo, donde se puede necesitar información del espacio de usuario, para esto contamos con la función:

copy_from_user(*to,*from,n), que es análoga a la función copy_to_user.

Habiendo entendido a grandes rasgos la estructura basica de un driver se mostrara un ejemplo de un driver para linux.

Para compilar el driver y generar el respectivo ".ko", kernel object, se debe ejecutar el siguiente Makefile en la carpeta donde esta el codigo fuente.

Después de haber generado el archivo .ko, para insertar el driver, en un terminal se ejecuta la función.

- sudo insmod ./hello_dev.ko, lo que insertamos como parametro es la ruta donde se encuentra el archivo generado ".ko

Para eliminar el driver, en un terminal se ejecuta la función:

- sudo rmmod hello_dev, lo que insertamos como parametro es el nombre del driver.

Para probar el funcionamiento del driver lo que hacemos es leer el dispositivo:

- sudo cat /dev/hello_dev

Y el driver nos retorna "Hello, world".

= Driver: condorBoard=

Habiendo entendido la construcción básica de un driver, procederemos a aplicar los conceptos para la construcción de un driver para la tarjeta Condorboard v1.5.

Tenemos recordar que la versión de linux en la que estamos trabajando es 2.6.30, y dado que no estamos trabajando en la misma arquitectura de un PC, para compilar cualquier programa que se ejecuta en la tarjeta debemos utilizar el compilador cruzaro "arm-linux-gnueabi-".

Para el driver de la pantalla LCD seguiremos con las funciones anteriormente explicadas así, en "Init" inicializarermos la pantalla, los pines de la tarjeta y registraremos el driver, con la funcion write escribiremos en la pantalla y con la fincion close eliminaremos el driver.

Ahora para la manipulación del periferico GPIO de la tarjeta haremos uso de las funciones definidas en el parche de linux para la tarjeta, las cuales se encuentran en "./linux-2.6.30/arch/arm/mach-at91/include/mach/gpio.h>" y donde contamos con la función "at91_set_gpio_output" para modificar los valores de los pines de GPIO y con la funcion "at91_get_gpio_value" para leer los valores de esta.

Estas funciones están definidas para el espacio del kernel, por lo tanto podemos hacer uso libre de estas para nuestros propósitos, ademas de encontrar muchas definiciones de funciones las cuales pueden ser utilizadas segun las necesidades.

Cabe decir que en la carpeta donde esta linux 2.6.30 esta el código fuente de todos los programas y definiciones del sistema operativo para la tarjeta, y si se nos presenta una necesidad, es muy probable que en el código del sistema operativo ya este resuelta.

Despues de tener el codigo fuente del driver, para compilarlo para la tarjeta condorboard ejecutamos el siguiente comando:

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

Donde definimos tanto la arquitectura como el compilador cruzado que vamos a implemetar para compilar el driver.

Esto nos genera el archivo puertoLCD.ko que insertaremos en la tarjeta.

Para insertar el driver se ejecuta el mismo comando del PC:

insmod ./puertoLCD.ko

Y si todo esta bien conectado tenemos el driver de la pantalla LCD funcionando, para probar se puuede imprimir el dmesg en la pantalla ejecutando el siguiente codigo:

dmesg->/dev/puertoLCD

Y temenos dmesg en la pantalla.

Para esto es de tener claro que

TRABAJANDO... asdasd