View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

Driver del aire acondicionado

Notas sobre el driver del aire acondicionado

[Ir a descripción|Instalación driver solaris-io]




Monday, 17 November 2003, 10:23:10 am
Instalación de la script de inicio de aacserver en solaris Primero se escribe, como root, y dando permisos de ejecución, el fichero /etc/init.d/aacserver:
==CUT===
#!/sbin/sh
#
# script para arrancar el aacserver en solaris
#
# Historia:
#       17/11/03 Creacion
#
# Autor: Dario Rodriguez
# Siguiendo la misma estructura que el autofs de solaris

case "$1" in
'start')
        /usr/local/bin/aacserver 10001 2>/dev/null >/dev/null &
	# Para que deje trazas, comenta lo de arriba y pon esto:
	# ( /usr/local/bin/aacserver 10001 2>&1 ) >/tmp/aacserver.log &
        ;;

'stop')
        /usr/bin/pkill -x -u 0 aacserver
        ;;

*)
        echo "Usage: $0 { start | stop }"
        ;;
esac
exit 0
===CUT===

Y luego, como root y en /etc, se hace
for i in `ls rc*.d/*autofs` ; \
do nombre=`basename $i | sed "s/autofs/aacserver/g"` ; \
dir=`echo $i | sed "s:/.::g"` ; \
( cd $dir ; ln -s ../init.d/aacserver $nombre ; cd .. ) ; \
done


Ha sido probado en ana; espero que funcione ;-).

Tuesday, 23 September 2003, 10:19:18 am --Dario
Primeras pruebas con el aacserver Ana y Eva han empezado a probar el acserver y había un bug en él (calculaba mal el tamaño de los mensajes binarios). La nueva versión corregida: fuentes-aac-v1pl1.tgz

Friday, 19 September 2003, 6:49:16 pm --Dario Updated:17/11/2003
Terminado el aacserver Acabo de terminar el servidor que permite que se consulte al aire acondicionado mediante TCP/IP. Los fuentes están aquí: fuentes-aac-v1ga.tgz. Además se puede consultar el estado del servidor conectándose a él mediante un telnet y haciendo comandos como POLL,STATUS e incluso HELP y QUIT ;-). Por otro lado, el servidor sale ordenadamente ante un SIGINT (control-c). Los comandos que acepta el programa mediante un telnet son:

ComandoExplicación
POLLHace un poll del estilo que necesita móstoles central
STATUSDa información sobre las conexiones activas
HELPPone la ayuda :-)
QUITSale de la sesión


Pruebas Lo he instalado en Móstoles Central y hecho algunas pruebas (subdirectorio /home/siv/test-aac)... parece funcionar todo a la perfección.

Fuentes en la oficina Los fuentes reales están en
josue:/home/metro/Fuentes.MASTER/f_aacserver/.

Wednesday, 17 September 2003, 11:47:50 am --Dario
¡¡Exito!!! Ya comunico con el aire acondicionado de Móstoles Central. Los fuentes del test-aac han quedado así: test-aac.c (NOTA: los fuentes están un poco descuidados por las pruebas...).

Realización del programa de comunicación para captura He quedado con Ana en que hago un programa (stand-alone) que se comunica con el aire acondicionado. Dicho programa tendrá un socket (servidor) para recibir las peticiones. Dicho socket se va a comportar como si fuera el puerto serie en sí (recibe mensajes a preguntar al aire acondicionado del estilo de 0x80 0xD0 0x30 0x01 0x00 0xFE 0x7C) y devuelve por el socket la respuesta que dé el aire acondicionado. Todo ello con timeouts (por si).

Friday, 12 September 2003, 9:57:35 am -- Dario
Pruebas en campo en Móstoles Central Ayer fui la estación de Móstoles Central a poner un cable entre el aac y el pc de teleindicadores y hacer las pruebas que no funcionaron en Pradillo. El resultado fue bastante positivo: el cable funcionó (el protopiu ocmunicaba) y el test-aac recibía el echo, aunque no recibía la respuesta del aire acondicionado.

Instalación del driver solaris-io en Motoles Central Hoy he instalado el driver en la estación de Móstoles Central. El programa de truebas test-aac lo he dejado en /home/siv/test-aac/.

Thursday, 11 September 2003, 9:59:05 am --Dario
Pruebas en campo en Pradillo Estuvimos haciéndolas ayer por la tarde Bea y yo. Simplemente no comunicaba ni el protopiu (un desastre, vamos).

Friday, 5 September 2003, 6:27:49 pm --Dario
Primera versión de test-aac Ya tengo una versión de un programa que manda la pregunta al aac, pero no intenta recibir respuesta (todavía). Los fuentes aqui: test-aac.c

NOTA: requiere tener instalado el solaris-io driver y que el dispositivo sea del usuario que ejecuta el programa (vamos, que tenga permisos sobre él).

Wednesday, 3 September 2003, 12:37 pm --Dario
Uso desde el usuario metro Basta con hacer, como root, un "chown metro /devices/pseudo/iop@0:iop" o "chown siv /devices/pseudo/iop@0:iop" (según sea el caso, si captura o teleindicadores)

Tuesday, 2 September 2003, 6:11:46 pm --Dario
Notas sobre cambio de paridad y datos pendientes de transmitir En principio se podría detectar que no quedan datos para transmitir si:
 (inb(0x3fa)&6)==2)
Rationale: Ver la descripción del puerto 0x3FA (Interrupt Identification Register - IIR (read only))


Thursday, 14 August 2003, 12:24:59 pm
Ejemplo físico de cambiar la paridad accediendo a la UART

Primero se espera a que se haya transmitido todo el mensaje, haciendo un "busy-wait" al THRE del byte del LSR (Line Status Register), es decir, que se ponga a 1 el bit 5 del 0X3FD.

POSIBLEMENTE HAYA QUE DESACTIVAR LA FIFO PARA QUE ESTO FUNCIONE o bien hacer toda la comunicación por el puerto serie "a mano" (sin usar el driver del s.o.).

He modificado en ana:/home/metro/Fuentes.MASTER/f_aire_acond/solaris-io/solaris-io el ioprtest llamándole ioprtest2 y lee bien los registros del com1:
===CUT===
# ./ioprtest2
Port 3f8 : 20
Port 3f9 : f
Port 3fa : c1
Port 3fb : 13
Port 3fc : b
#
===CUT===


Wednesday, 13 August 2003, 6:21:25 pm --Dario Updated: 13/11/2003
Instalar el driver iop

Hemos instalado (Javi y yo) el driver de iop en ana, compilando el programa solaris-io.tar.gz
en ana:/home/metro/sun/f_solaris-io/solaris-io. Los pasos que se han seguido son:
  1. Se compila el programa con un make (Nota: esto ya deberia estar hecho, no hace falta que lo hagas si existe el fichero iop)
  2. Como root, se copian los ficheros iop y iop.conf en /kernel/drv
  3. En /kernel/drv se cambian los permisos de iop con "chmod a+x iop" , y el grupo de iop y de iop.conf con "chgrp sys iop*"
  4. Se instala el driver con un "add_drv iop"
  5. Se reinicia con un "/usr/sbin/reboot -- -r"
  6. Una vez que reinicie, haces, como root, un "chown metro /devices/pseudo/iop@0:iop" o "chown siv /devices/pseudo/iop@0:iop" (según sea el caso, si captura o teleindicadores)

Cuando reinicia, los programas que se ejecuten como root pueden leer/escribir en los puertos serie usando dicho driver (ver ejemplo en los fuentes del driver y en la libreria asociada).

Friday, 1 August 2003, 10:36:35 am --Dario
Parece que hay que cambiar la paridad "a mano" ya que el cambio hecho por el S.O. es demasiado lento. Para ello hay que tocar los registros de los puertos serie.

Cambiar la paridad accediendo a la UART

(Update 14/08/2003: Ver UART y Puerto serie)

Los puertos serie tienen como dirección base por defecto:
COM 1 - 03F8 - IRQ 4
COM 2 - 02F8 - IRQ 3

Para el com1, tenemos que (información cogida del helppc):
        Port 3FB - Line Control Register - LCR  (read/write)

        |7|6|5|4|3|2|1|0|  2FB, 3FB  Line Control Register
         | | | | | | +-+---- word length select bits (see below)
         | | | | | +------- 0 = 1 stop bit, 1 = 1.5 or 2  (see note)
         | | | | +-------- 0 = no parity, 1 = parity (PEN)
         | | | +--------- 0 = odd parity, 1 = even (EPS)
         | | +---------- 0 = parity disabled, 1 = enabled
         | +----------- 0 = turn break off, 1 = force spacing break state
         +------------ 1 = baud rate divisor (DLAB); 0 = RBR, THR or IE

       Bits
         10     Word length bits
         00 = 5 bits per character
         01 = 6 bits per character
         10 = 7 bits per character
         11 = 8 bits per character

        - stop bits = 1.5 for 5 bit words or 2 for 6, 7 or 8 bit words
        - bit 7 changes the mode of registers 3F8 and 3F9.  If set these
          registers become the LSB and MSB of the baud rate divisor.
          Otherwise 3F8 is the Transmit/Receive Buffer Register and 3F9 is
          the Interrupt Enable Register.


Acceder a registros usando Linux. Está explicado en el IO Port Programming HOWTO:

http://new.linuxnow.com/docs/content/IO-Port-Programming/IO-Port-Programming-2.html

Acceder a registros usando Solaris
Solaris, don't allow port access from user space
http://www.amayita.com/debian/1_not_mine/cqcam/cqcam-0.91/docs/PORTING
Sin embargo, el proyecto cqcam ya hizo un driver para poder salvar ese obstáculo (solaris-io.tar.gz y solaris-io-client.tar.gz)


Descripción del proyecto


Tabla de contenidos:


Introducción


El aire acondicionado (driver bajo la tutela de Ana y Eva) tiene la "peculiaridad" de comunicarse de manera no estándar por el puerto serie.


Cables


Las pruebas de cables se han hecho con el protopiu (y el analizador lógico lars) en la estación de Móstoles Central. Dicha estación no tenía cable, con lo que se ha llevado uno "de aquí" para las pruebas.

Configuración de protopiu:
  • remoto: 1
  • pc: 30

Hilos que usa:
Hilo2345
PCRxTxENGD
AACTxRxENGD

Explicación del hilo 4 (EN): es el DTR en el PC (transmite el PC, el AAC escucha). Cuando el PC transmite, pone el DTR alto, y el AAC va haciendo echo. Una vez que el PC termina de transmitir, vuelve a poner el DTR bajo y el AAC envia la respuesta.


Protocolo

A continuación va el texto que describe dicho protocolo

==CUT===
Informe sobre el protocolo con el aire acondicionado
====================================================

 A continuación va el volcado de lo que transmite tanto el protopiu como la
respuesta del aire acondicionado. Pongo etiquetas indicando la paridad usada
a partir de ese punto.

protopiu
--------

        impar: FF
               82

        par..: D0
               30
               01
               00
               FE
               7C

aac
---


        impar: 82

        par..: 05
               01
               30
               00
               FF
               47

NOTAS:

1. cuando el protopiu transmite, pone a 1 la señal de DTR (pin 4 del db9). Ver
   más abajo sobre sómo hacer eso.

2. el aac transmite dejando 1bit (100us) de pausa entre palabra (byte) y palabra

3. cuando el protopiu transmite el aac hace eco(repite lo que manda el protopiu)

---
Para poder leer del puerto lo que dice el aac:

   Método "ad-hoc" (probar primero):

        - el programa se ha de ejecutar como root
        - antes de leer hacer un

                system("stty -inpck ignpar -parenb < /dev/ttya")

          sustituyendo el ttya por el puerto que se esté usando para leer.

    Método "serio":

===CUT===
#include <termios.h>
#include <sys/ioctl.h>
#include "puertoserie.c"

int
PuertoSerieNoParityCheck(sPuertoSerie *Puerto)
{
        struct termios InfoTerm;
        /* Comprobaciones de sanidad */
        if(Puerto==NULL || Puerto->Fich==-1)
                return(-1);
        /* Cambiamos la configuración para quitar la comprobación de paridad /
        ioctl(Puerto->Fich,TCGETS,&InfoTerm);
        InfoTerm.c_iflag=(tcflag_t)IGNPAR;
        ioctl(Puerto->Fich,TCSETS,&InfoTerm);
        return(0);
}
===CUT===

        Habría que probar si eso es correcto (yo no lo daría por hecho).

----
Para cambiar el estado del DTR antes de escribir en el puerto:

>       bits = TIOCM_DTR;
>       ioctl(fd, TIOCMBIS, &bits);
>       ioctl(fd, TIOCMBIC, &bits);
>

o bien

>
>       ioctl(fd, TIOCSDTR, NULL);
>       ioctl(fd, TIOCCDTR, NULL);


Deberían ser equivalentes (el primer ioctl lo debería poner a 1 y otro a cero),
aunque me fio más de  los primeros (ver http://bama.ua.edu/cgi-bin/man-cgi?termio+7I )

Para más info ver:

        http://www.netsys.com/sunmgr/1997-10/msg00168.html

Si hay dudas, mensajito a dario@softhome.net o telefonazo ;-).

---
        Saludos,
                Dario
                (dario@softhome.net)

==CUT===

Además de lo anterior, hay que usar el ioctl para cambiar los parámetros del puerto usando TCSETSW en vez de TCSETS (para que los cambios no sean inmediatos sino en cuanto se vacíe la cola de escritura).



Attachs:
solaris-io.tar.gz
solaris-io-client.tar.gz
test-aac.c
test-aac.c
fuentes-aac-v1ga.tgz
fuentes-aac-v1pl1.tgz