Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real

 
SEGUIR LEYENDO
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
Periféricos de Computadores

Práctica 1:
Driver para el Reloj de Tiempo Real
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
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
Periféricos de Computadores Práctica 1: Driver para el Reloj de Tiempo Real
~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