2019/11/13

Rescatando un touchpad



Hallé tirado el cadáver vandalizado de una Toshiba Satellite a la que le quedaba la pantalla (b140xw0 v.8), el mother, el cooler, el chip wifi (Atheros AR5B95 Wireless Network Adapter con conector mini-pcie), los mini speakers, seguro que hay una flash por ahí que no pude encontrar y el touchpad, Synaptics 920-001019-02 rev A:



Foto tomada de algún foro ruso


Primero lamenté haber tirado el circuito que había entre el touchpad y el mother, pues me había parecido que sólo le agregaba los botones físicos. Luego, cuando ví esta foto me confundí, pensé... no sé qué pensé.

http://3.bp.blogspot.com/-P5Ez1B_MFrg/UPKVd_DeK_I/AAAAAAAAB6o/dzUWOPNjT_s/s1600/synaptic-apple-mag-g3-2_v1.PNG


Ahí me dí cuenta que esas letras amarillas estan asociadas los pines del chip y no a los test points o al conector,


Tambien me sobran cables con respecto al conector DIN, entonces reflexioné:

¿Y si 4 y 5, botón derecho e izquierdo no son salidas si no entradas al dispositivo? Eso sería razonable, en caso contrario la interfaz del lado de la computadora debería entender por un lado los mensajes del mouse y por otro los botones.

Lo que debe ocurrir es que el chip lee 4 y 5 los codifica en PS/2 data como corresponde.

Seguro que en la documentación está pero siendo un auténtico programador, cuanto más tarde en leerla ¡¡mejor!!



Ayuda que esté en Amazon como un componente aislado, pues entonces no hay dependencias intermedias.



En lo más parecido a una datasheet que hallé dice que puede ser PS/2, ADB o serial, apostaré a PS/2, respaldado por la mención en esta conversación.



Con el tester y comparando con esa datashit hice este mapeo, parece bastante compatible con esto:





pin mini din 6testpointpin chipcomentario
1 +5vT20 T2244
2 dataT103spoiler: clock
3 clkT112spoiler: data
4 switchT67
5 switchT76
6 groundT2345


Esto está respaldado por GIMP, usando pencil tool + shift. Intenté con Fuzzy Select pero la imagen no tiene la suficiente calidad.





Me ofende que con respecto al otro chip estén invertidos data y clk, igual no sé si son los mismos chips...



¿Cómo sigo? ¿Le adapto un conector mini DIN 6 y lo conecto a una PC vieja? ¿Tán fácil? Ni tanto, quizás tendría que cargarle el driver del synaptic, si no me sale nunca voy a estar seguro del motivo de la falla.

El problema es que si mirás el mapeo más arriba, Data y Clock están invertidos, no tengo documentación confiable, tengo que distinguir probando cuál es cada uno.  En las menciones a T10 y T11 en esta conversación todo parece confirmar que el pin chip 2 es data y el 3 clock, tambien en esta y esta, así que será el primer intento.


Le tendría que dar power, clock y mirar que aparece en data, que es el Camino Correcto Más Difícil Pero Más Cierto. Tengo que poner Cierto y no Seguro por que Seguro me transmite una seguridad en todo aspecto y lo más seguro es que queme algo, mejor Cierto como cercano a la Verdad.

Pero, en los programas que hay en esos links y recuerdo en el pdf, hay un protocolo a seguir, me parece improbable que por el simple hecho de darle corriente y clock aparezca algo en data, igual quizás pueda confirmar el pinout.


Los 5v me condenan a usar arduino en lugar de edu-ciaa-nxp. De paso puedo probar que funcione la conexión a PS/2 con algún dispositivo así no tengo dos incógnitas a la vez.


Arduino PS/2 a teclado o mouse


Como tengo un teensy, sigo los pasos para instalar teensyduino, que consiste en bajarse Arduino IDE e instalar, tomando nota de la ruta, bajar el instalador de teensyduino, aplicar udev rules, ejecutar el instalador de teensyduino para ver que versiones de Arduino IDE soporta. En este momento soporta 1.8.10 que es la última, ijuu!!


Next, next, los next que hagan falta y darle la ruta que recordaste antes.

Por las dudas un blinky primero: ejecutar la IDE, elegir teensy2.0++ como target, buscar el ejemplo de blinky, elegir pin 6 como led, si no baja el programa de una, configurar asi:

  • usb type: serial
  • cpu speed 16 Mhz
  • port: /dev/ttyACM0 serial (teensy 2++)
  • programmer: avr isp o avr isp mkii, tira un error pero funciona...



Luego hay que bajar y copiar las librerías de PS/2 en

~/bin/arduino-1.8.10/libraries


Conectarle un mouse y ver que anda con el ejemplo.


Por suerte tengo un cajón lleno de porquerías, por ejemplo este adaptador de un montón de cosas, incluido mini din 6 pines:


(1) Data, (3) Ground, (4) 5v, (5) Clock


Tuve que usar un teclado pues parece que tiré todos los mouses PS/2 que tenía.


Usé el ejemplo ./libraries/ps2/examples/ps2_kbd/ps2_kbd.pde con

// pin 3 data
// pin 5 clock
// kdbd(clock, data)
PS2 kbd(5,3)


Separé los pines para poder meter las puntas del osciloscopio, muy bonito, otro día exploraré el encoding.

No presté atención a qué tecla oprimí, sólo sé que 71 F0 71 vino por el serial monitor



Arduino PS/2 a touchpad


Como seguimos sin saber cual es clock y cual es data, le voy a poner una resistencia de 4k7 en serie a ver que pasa.


No pasa nada, ni al derecho ni al revés, pruebo sin resistencias:




Lo que cambié con respecto al ejemplo fue ajustar los pines en

./libraries/ps2/examples/ps2_mouse/

// pin 3 data
// pin 5 clock
// kdbd(clock, data)
PS2 mouse(5,3);


y este if para que el monitor no se llene de basura:

   // send the data back up
  if (mx != 0 || my != 0 ) {
    Serial.print(mstat, BIN);
    Serial.print("\tX=");
    Serial.print(mx, DEC);
    Serial.print("\tY=");
    Serial.print(my, DEC);
    Serial.println();
  }


Listo, anda, a otra cosa, algún día lo conectaré a algo. Dos fotitos más para quienes prefieren dibujitos a leer:



 El detalle de los cables y los puntos de soldado en los TP




El sensor pegado a la tapa de una caja de tarjetas


2019/11/05

Para estudiar Free Range VHDL

Estas son los recursos de los que me he servido para estudiar y practicar el fantástico libro Free Range VHDL, que se puede comprar, se puede bajar mediante un formulario que no me anduvo o se puede generar el pdf a partir del latex:

$ sudo apt get latex-full
$ git clone https://github.com/fabriziotappero/Free-Range-VHDL-book.git 
$ cd Free-Range-VHDL-book
$ chmod 755 clean compile
$ ./compile

latex-full es un poco drástico y son 3.5 GB, seguro que hay una opción más óptima o sudo apt remove latex-full al terminar.


El libro no explica como sintetizar ni simular ni generar el bitstream ni programar el dispositivo.

Sintetizar


Probé primero con gvhdl pues está en los repos de la distribución, pero no andaban bien y el Colo me señaló esta conversación y me recomendó ghdl:




$ sudo apt install gnat-5                    ;# 100 MB

$ git clone https://github.com/ghdl/ghdl.git ;# 110 MB
$ cd ghdl
$ git checkout -b v0.36

$ mkdir build
$ cd build
$ ../configure
$ make
$ sudo make install


<nota de color>

El tener que crear el directorio build es medio chancho y se debe a que no está versionado. Hay al menos dos maneras de versionar una carpeta "vacía" en git:


$ touch build/.gitkeep 
$ git add build

o esta un poco más retorcida pero indudablemente más completa, pues si te olvidás de hacer un clean lo que haya adentro no te aparece. Un .gitignore dentro de la carpeta con este contenido:

*
!.gitignore


</nota de color>



Luego es tan sencillo como


$ ghdl -a hello_world.vhdl
$ ghdl -e hello_world
$ ghdl -r hello_world


Que en nada se va a manifestar a menos que usés std.textio o generés waveforms.

Con respecto a los nombres, -e y -r usan el nombre de la entity que haya dentro del vhdl.


Las manifestaciones pueden ser por stdout o volcar las señales a un archivo que entienda gtkwave.

STDOUT

Hay que usar una libreria llamada textio. Luego, se escriben en una variable valores con formato y eventualmente se vuelcan en stdout:


Mensajes a stdout



Además de write() existen hwrite(), owrite() y brite() que imprimen en hexa, octal y binario pero no me los entiende mi ghdl, pese a que están en el código. Son los que hacen falta para imprimir los vectores.

Tambien se puede imprimir a archivos, pero ni lo probé, no sé si intentaré solucionarlo, lo veré cuando explore más a fondo el tema de simulación.

Lo mejor que hallé es https://lauri.võsandi.com/hdl/ghdl.html

Cuidado que --help no dá todas las opciones que si están en las migajas de más abajo.



Waveform


$ sudo apt install gtkwave

Luego, en teoría, si tomás el ejemplo del lauri:

$ ghdl -a full_adder.vhd full_adder_testbench.vhd

$ ghdl -e full_adder_testbench
$ ghdl -r full_adder_testbench \
               --vcd=out.vcd \
               --fst=out.fst \
               --wave=out.wave

deberías poder usar gtkwave, pero pese a lo que dice la documentación, gtkwave no entiende out.wave. Además, los otros dos archivos, aunque son válidos y proveen información de los pines, no hay datos. O eso pensé, luego miré http://enos.itcollege.ee/~vpesonen/lisa/lab_example.html
y aunque no lo dice, logré deducir que hay que pedirle:


  1. elegir un componente en la jerarquía
  2. elegir un pin o bus en las señales
  3. append/insert/replace



Había pensado subir mis resultados de los ejercicios del libro y mis propios ejercicios a github, pero me distraje con otro libro, asi que lo que está es algo muy incompleto.

Lamentablemente no sólo me distraje con ese libro si no con todo mi proyecto de Forzando Brutalmente MD5 y perdí contacto con VHDL, en algún  momento cuando necesite, retomaré.

Para poder hacer todo esto tuve que seguir las migajas:

https://ghdl.readthedocs.io/en/latest/
https://ghdl.readthedocs.io/en/latest/building/Building.html
https://ghdl.readthedocs.io/en/latest/building/mcode/GNULinux-GNAT.html
https://ghdl.readthedocs.io/en/latest/using/Simulation.html
https://vhdlguide.wordpress.com/2017/09/22/textio/

La conversación previamente mencionada me llevó a este interesante documento, http://qucs.sourceforge.net/docs/tutorial/digital.pdf