jueves, 19 de abril de 2012

Sesión 10.


Por ahora no hemos conseguido solventar el error
Por lo visto el error se debe a esto: El EP9302 es un integrado que
incluye el ARM9 y algunos componentes adicionales. Pues bien, en el
Sistema Operativo, hay algunos componentes del EP9302 no están mapeados en memoria. Para poder mapearlos en memoria a nivel de drivernos han comentado que hay que seguir este tipo de estructura:

DIO_DIR7 0xDIRECCION 
//Definir los buffer 
 volatile char *ptr_1; 
//comprobar disponibilidad 
if(check_mem_region(DIO_DIR7, 1)) {               printk("DUMB: espacio de memoria en uso: DIO_DIR07\n");                    return -EBUSY;       } 

//Tomar memoriarequest_mem_region(DIO_DIR7, 1, "dumb_driver_07");  
     ptr_1 = __ioremap(DIO_DIR7, 1, 0); 
printk("dumb: ptr_1 remap = %p\n", ptr_1);
 //Dar valor 
 ptr_1[0] = 0xAA; 
 // Salir 
 release_mem_region(DIO_DIR7, 1);






Sin embargo, hemos desarrollado esa estructura para el driver y nos sigue dando exactamente el mismo error.
Aún seguimos en el laboratorio, pero sin ayuda, no creo que consigamos avanzar.

He aqui una foto del problema (en el log):


miércoles, 18 de abril de 2012

Sesión 9

Ha sido una de las sesiones menos productivas. Hemos descubierto que el driver del ADC no nos funciona, después de conectarle un voltaje a la entrada. A lo que dejamos hecho en la practica anterior faltaba asignarle el driver a su archivo:
"mknod   /dev/adc  c  70  0"
Al parecer cuando intentamos acceder a un registro desde el driver --> segmentation fault.
Hemos visto el log, y pone algo del estilo de "kernel paging error".
Como Álvaro no estaba para ayudarnos, nos hemos dedicado ha hacer el driver del Timer y a pensar como estructurar el driver/aplicación de interrupciones.

Esperamos arreglar esto pronto.

miércoles, 11 de abril de 2012

Sesión 8.

Bueno, la verdad es que ha sido una mañana en la que hemos aprendido bastante.
Hemos estado al principio repasando un poco todo lo de controladores y estudiando uno que nos habían proporcionado hecho (aun que era solo para los LEDs rojo y verde de la placa). Cuando hemos conseguido entenderlo todo nos hemos puesto manos a la obra para hacer nuestro propio controlador (el del ADC).
La verdad es que al final ha sido más facil de lo que pensábamos aun que hemos tenido que llamar a nuestro tutor para un par de cosas:
a) El primer problema era qué funciones del ADC meter en el controlador, y qué meter en la aplicación de usuario.
Álvaro nos ha comentado que esto está un poco en mano del programador y lo hemos hecho como nos ha parecido (aun que el nos ha dado el visto bueno).
b) El otro problema era que los los controladores solo se comunican con la aplicación mediante "char" y el registro de datos del ADC era de 12 bits, con lo cual hemos tenido que dividir el valor leido en 2 valores, y mandarselo a la aplicación en un buffer (buf[0] , buf[1]).
La aplicación a su ver tenía que reconvertirlo a un numero de 12 bits y calcular la tensión a la que equivale.

Finalmente hemos conseguido crear el controlador. Lo hemos compilado y cargado en la placa, así como el ejecutable de la aplicación.
El problema es que no nos dio tiempo a comprobar que funcionaba todo conectando un voltaje al pin del ADC, pero el programa se ejecutaba correctamente hasta el punto en el que tenía que leer el registro de datos del ADC (comprobado con printf y printk), lo cual es esperanzador.

Según nos han contado,una vez haces un driver los demás siguen el mismo esquema y todo te es más fácil, así que esperamos avanzar rápido (ya que las interrupciones estaban practicamente programadas para "micro desnudo" y solo tenemos que adaptarlas con un driver al sistema operativo ).