Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
PRÁCTICA 1: Driver para el reloj de tiempo real del sistema. INTRODUCCIÓN Se pretende generar un driver para acceder al reloj de tiempo real del sistema y de un programa de usuario que utilice las funciones definidas en la librería de driver para mostrar una fecha. La memoria CMOS de la placa base suele tener 64 Bytes accesibles. Los primeros 14 Bytes se reservan para almacenar la fecha, la hora y los registros de control y de estado del reloj de tiempo real. Para acceder a las posiciones de memoria es necesario utilizar dos registros (de Dirección y Datos) cuyas direcciones en el mapa de entrada y salida corresponden con las direcciones 70h y 71h. El procedo de lectura de una posición de memoria de la CMOS del sistema será el siguiente: • Primero se configura el registro de dirección (70h) con la dirección de la cual se desea leer. • A continuación se puede leer del registro de datos (71h) el valor almacenado en la posición solicitada. Para la escritura (nada recomendable para este dispositivo ya que afecta a la configuración del sistema completo) el proceso sería: • Primero se introduce el valor que se desea escribir en el registro de datos (71h). • A continuación se configura la dirección de memoria sobre la cual se desea realizar la escritura escribiéndola en el registro de dirección (70h). Para esta práctica las direcciones que apuntan a posiciones de la CMOS y que resultan interesantes son las siguientes: Dirección en la CMOS Contenido 00 Segundos 02 Minutos 04 Horas 06 Día de la semana 07 Día del mes 08 Mes 09 Año De forma que si se escribe la dirección 04 en el registro de Dirección (70h) pasado un tiempo aparecerá la hora en la que está el sistema en el registro de Datos (71h). Práctica 1: Driver para el Reloj de Tiempo Real 2
OBJETIVOS Son objetivos de esta primera práctica: • Familiarizar al alumno con el manejo del programa Windriver para la generación de las estructuras básicas en la programación de drivers de dispositivos. • Hacer que el alumno tenga que trabajar con un código C de complejidad media para la comprensión de las funciones generadas a partir de Windriver. • Permitir que el alumno inserte su propio código para generar un programa usuario capaz de solicitar datos al reloj de la placa base y de formatear dicha información para mostrar la fecha y la hora del sistema. PRÁCTICA La realización de la práctica se puede realizar con la versión de evaluación de Windriver. Se lanza la aplicación y en la ventana de inicio se muestran dos botones que nos permite elegir entre crear un nuevo proyecto o abrir uno existente. Se elige la opción de crear un nuevo dispositivo. A continuación se muestra la lista de dispositivos que Windriver detecta en el sistema. Práctica 1: Driver para el Reloj de Tiempo Real 3
Cuando se desea realizar un driver para un dispositivo que no aparece listado se elige la opción “ISA: ISA Device” y se pulsa el botón “Next”. Como no es un dispositivo previamente detectado por la aplicación, es preciso especificar el mapa de entrada y salida, el espacio de memoria, las interrupciones y los registros de entrada y salida. Para el driver que se propone en esta práctica es preciso definir el mapa de entrada y salida para definir las direcciones 70h y 71h. Práctica 1: Driver para el Reloj de Tiempo Real 4
Sobre este mapa de direcciones se definen el registro de Dirección y el de Datos de acuerdo a las especificaciones dadas en la introducción de este guión. Para definir estos registros hay que especificar sobre qué mapa de memoria se van a definir, el Offset respecto al origen de dicho mapa (para el registro de dirección el offset será 0 (70h) y para el registro de Datos será 1 (71h) y, por último el tamaño de estos registros (8 bits). Una vez que se han definido estos registros es posible comprobar que su definición responde a las expectativas iniciales. Para ello se puede seleccionar en primer lugar el registro de dirección y, presionando en la opción “Read/Write Register” escribir en el registro la dirección 04. Práctica 1: Driver para el Reloj de Tiempo Real 5
A continuación, se selecciona el registro de datos, se presiona a la opción de “Read/Write Register” y se elige leer del registro. En la ventana Data debería aparecer la hora del sistema si la definición del mapa de entrada y salida y de los registros es correcta. Por último, es preciso generar el código del driver que permitirá incluir el acceso al dispositivo desde otro código. Para ello se selecciona del menú “Project” la opción “Generate Code”. Y en las sucesivas ventanas que aparecen hay que seleccionar la Práctica 1: Driver para el Reloj de Tiempo Real 6
plataforma para la cual se desea generar el código y el nombre del proyecto que se acaba de generar. Práctica 1: Driver para el Reloj de Tiempo Real 7
Código generado Una vez que se ha generado el código desde el wizard de Windriver se dispone de varios archivos creados en el directorio elegido para almacenar el proyecto. Cmos_clock_diag.c – Contiene el código de un ejemplo. La estructura de este ejemplo de diagnóstico siempre propone un menú principal a partir del cual se puede acceder a las funciones básicas definidas para el dispositivo. En este caso estas funciones serán la escritura y lectura en o desde los registros de entrada y salida. Así como la configuración del mapa de entrada/salida activo y el tamaño de dichos registros. Cmos_clock_lib.h – Contiene los prototipos de las funciones definidas para el driver. Cmos_clock_lib.c – Contiene la implementación de las funciones básicas definidas para el driver. ~Windriver/simples/shared/wdc_diag_lib.h – Contiene los prototipos de las funciones definidas para el programa de diagnóstico que genera automáticamente Windriver. Práctica 1: Driver para el Reloj de Tiempo Real 8
~Windriver/simples/shared/wdc_diag_lib.c – Contiene la implementación de las funciones definidas de forma genérica para los programas de diagnóstico de Windriver. Es muy interesante porque desde estas funciones es desde dónde se realizan las llamadas a todas las funciones necesarias para acceder, por ejemplo, a los registros. Inserción de código nuevo A partir de este punto, para un dispositivo tan sencillo como este, se puede realizar un programa de usuario que acceda al hardware usando las funciones definidas en las funciones generadas por Windriver. Para la realización de esta práctica se pide: 1. Modificar el programa de diagnostico (en el archivo cmos_clock_diag.c la función MenuMain() ) para que muestre una nueva opción de menú que sea – System Time. 2. Crear una función cuyo prototipo sea int System_Time(void) con la siguiente implementación: int System_Time(void) { printf(“Hola Mundo \n”); return 0; } 3. Conseguir que al seleccionar la entrada recién incorporada al menú principal del programa de diagnóstico se ejecute la función System_time(). 4. Modificar la definición de la función System_Time() para que muestre la hora y la fecha del sistema. Para ello es preciso localizar las funciones para: a. Examinar la función MenuReadWriteRegs() del código cmos_clock_diag.c. b. Localizar las funciones dentro de la librería wdc_diag_lib.c que garantizan los accesos a los registros (WDC_DIAG_ReadWriteAddr()) (WDC_DIAG_ReadAddr8() y WDC_WriteAddr8()) c. Incorporar en la función System_Time() los accesos a registros. Escribir en el registro de Dirección los valores necesarios para poder recuperar del registro de datos los Práctica 1: Driver para el Reloj de Tiempo Real 9
valores de la fecha y la hora del sistema. Esta función deberá asegurar los siguientes pasos: i. Inicializar el espacio de direcciones. ii. Inicializar el dispositivo. iii. Configurar el Offset correspondiente de cada registro (Dirección y Datos). iv. Configurar el modo de acceso. v. Realizar las escrituras y lecturas. d. Dar formato a la información recuperada. Práctica 1: Driver para el Reloj de Tiempo Real 10
Práctica 1: Driver para el Reloj de Tiempo Real 11
También puede leer