![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Driver del aire acondicionadoNotas 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===
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:
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:
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 proyectoTabla de contenidos: IntroducciónEl aire acondicionado (driver bajo la tutela de Ana y Eva) tiene la "peculiaridad" de comunicarse de manera no estándar por el puerto serie. CablesLas 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:
Hilos que usa:
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. ProtocoloA 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 |