Guía Hardware del daVinci por
Jesús
Arias.
(última actualización: 1999-10-26)
La información contenida en este documento es el resultado de un buen número de horas de ingeniería inversa en un PDA daVinci de 2Mb. Este análisis comienza con la apertura del PDA para ver que hay adentro, continua con una modificación hardware para poder utilizar el modo bootloader-serie del procesador dragonball, y termina con la ejecución de unos sencillos programas de prueba
Parte de esta información procede del desensamblado del Sistema Operativo. De esta manera Mark Tillotson encontró los comandos del chip NEXUS para el manejo de la pantalla táctil y los botones. La sección de arranque del S.O. también es muy interesante a la hora de identificar los pines de E/S de propósito general y el mapa de la memoria.
Otros datos, como los pines del conector del cradle, y su esquema, están disponibles libremente en Internet.
Esta documentación puede contener errores y/o ser incompleta.
El manual: "MC68EZ328 Integrated Processor User's Manual" de Motorola es indispensable a la hora de entender este documento.
Contenido:
Esquema general del daVinci.
Memoria La pantalla LCD. El chip Nexus.
(2000-06-23) S.O. experimental para daVincis basados en la CPU dragonball.
(1999-10-25) Modo de bajo consumo del Nexus. Medidas de consumo.
(1999-10-24) Funciones de los pines PF0 y PD1.
Hasta este momento se conocen dos modelos de daVinci: el 256 Kb y el 2Mb. la cantidad total de memoria de cada modelo es:
256K: 256 Kb RAM, 1MB Flash.
2Mb: 256 Kb RAM, 2MB Flash.
Como seguramente habrá notado, el primer modelo basa su nombre en la cantidad de RAM, mientras que el segundo se basa en la flash. Esto obedece claramente a una estrategia de mercado, pero personalmente pienso que es tan sólo un engaño.
Direccionamiento de la memoria.
El S.O. del daVinci direcciona su memoria a través de los chip-select programables del 68ez328. El mapa de memoria seleccionado coincide con el del Palm Pilot. ¿Por qué será?
FLASH PRINCIPAL $10C00000 (1 Mb)
FLASH SECUNDARIA $10400000 (1 Mb)
RAM $00000000 (Sólo los primeros 64 Kb) $10000000 (todos los 256 Kb)
La memoria RAM se implementa mediante dos chips HY62V8100A de Hyundai. Cada chip tiene 128k celdas de memoria de 8 bits cada una. El 68ez328 está configurado para usar un bus de datos de 16 bits, de modo que cada chip de RAM sólo ocupa medio bus de datos. Un chip está conectado a D0-D7 mientras que el otro está conectado a D8-D15.
Un aspecto interesante de la RAM es el doble direccionamiento. Esto es posible gracias al uso de dos chips-select del 68ez238 y de una puerta lógica externa, del chip 74hc08, que realiza una función OR entre ambos chip-select. Los chip-select en cuestión son:
CSB0: Base=$10000000 Size=256Kb Wait_States=0 Read_Only=NO Supervisor_Only=NO Bus_Width=16 bits
CSC0: Base=$00000000 Size=64Kb Wait_States=0 Read_Only=NO Supervisor_Only=NO Bus_Width=16 bits.
Hay dos chips de memoria flash de 1 Mb en la versión del daVinci de 2Mb o sólo un chip en el de 256Kb. El número de estos chips ha sido borrado intencionadamente por el fabricante, pero por el número de pines se deduce que deben tener un bus de 16 bits. De qualquier modo, todos los chips de memoria flash modernos pueden identificarse por software, y la flash del daVinci ha dado los siguientes números de identificación:
Manufacturer ID: $0004 (Fujitsu)
Device ID: $225B (MBM29LV800BA)
Estos chips de flash pueden proteger cada uno de sus sectores de forma individual. Una vez protegido, un sector no puede ser programado o borrado sin la aplicación de altas tensiones (12V) en el pin de reset y tras haber ejecutado un comando de desprotección, mientras que un sector no protegido se puede borrar y programar con sólo 3.3 voltios. La memoria flash principal tiene protegidos sus 3 primeros sectores (32 Kb). Esta zona de la memoria contiene el código de arranque del daVinci. El resto de la flash primaria (S.O.) y toda la flash secundaria (Aplicaciones) están sin proteger.
La flash primaria se selecciona mediante CSA0, que es el chip-select de arranque. La flash secundaria se selecciona mediante CSD0. La programación de estos chip-select es:
CSA0: Base=$10C00000 Size=1Mb Wait_States=1 Read_Only=NO Supervisor_Only=NO Bus_Width=16 bits Flash_Timming=NO
CSD0: Base=$10400000 Size=1Mb Wait_States=1 Read_Only=NO Supervisor_Only=NO Bus_Width=16 bits Flash_Timming=NO
Notas:
El controlador de la pantalla LCD tiene una conexión directa con el 68ez328. Los principales aspectos son:
El controlador LCD puede generar imágenes con 2 y 4 bit por pixel. Estos modos se programan a través del "LCD Panel Interface Configuration Register". El único problema asociado con estos modos es el parpadeo, que puede eliminarse programando un reloj de pixel más rápido en el "LCD Pixel Clock Divider Register". El divisor por defecto es 6, que es bueno para las imágenes de dos colores. Para los modos de 2 y 4 bits por pixel el divisor debe ser 3 y 1 respectivamente.
El daVinci incluye un chip a medida que se encarga de la pantalla táctil y de los botones. Este chip está etiquetado como "NEXUS rev 1.0", y se conecta al 68ez328 a través del interfaz de periféricos serie (SPI).
El SPI es un interfaz bidireccional. Mientras se saca un bit por SPIMTXD, entra otro bit por SPIMRXD. La temporización se controla por los flancos del reloj SPIMCLK. Desde el punto de vista del chip NEXUS, esto significa que se le pueden mandar comandos mientras se leen los datos previos.
El reloj del SPI está programado a una frecuencia muy baja (sysclock/512=32384 Hz). De este modo se dispone de tiempo suficiente para realizar las conversiones A/D mientras se transfieren los datos. La fase y polaridad el reloj toman los valores por defecto (00). Las transferencias son de 10 bits. Antes de cada transferencia se debe selecionar el chip NEXUS poniendo bajo el pin PD0. Entre la selección del chip NEXUS y la transferencia SPI se debe dejar un tiempo no inferior a 50 microsegundos.
El pin de E/S PD1 está conectado el reset del chip NEXUS. Para permitir el funcionamiento del chip este pin debe ponerse en alto.
Leyendo
las coordenadas de la pantalla táctil.
TRANSFER | SPI WRITE | SPI READ |
|
|
|
|
|
|
|
|
|
Las coordenadas X e Y se obtienen de un conversor A/D de 10 bit, por lo que su rango será: [0-1023].
Leyendo el
estado de los botones.
|
|
|
|
|
|
|
|
|
BUTTONS es una palabra de 10 bit. Los botones pulsados se leen como
0. La posición de los botones en BUTTONS es:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Leyendo el voltage
de las pilas.
|
|
|
|
|
|
|
|
|
El voltage es: Vbat*3.3/1024
Pasando el chip Nexus al modo de bajo consumo.
El chip NEXUS responde a un comando para reducir el consumo de corriente
cuando el daVinci está "dormido". Para apagar el chip NEXUS se debe
dejar un retardo bastante largo (milisegundos) desde el último comándo
válido hasta el comando de pasar a bajo consumo, que es:
TRANSFER | SPI WRITE | SPI READ |
|
|
|
Eventos que generan interrupciones.
El chip NEXUS solicita una interrupción al 68ez328 cuando se pulsa o suelta un boton, o cuando se pulsa en la pantalla táctil. Las interrupciones solicitadas son:
Comunicaciones serie y el Cradle.
Pines del conector del cradle.
El conector del cradle del daVinci es del tipo "borde de circuito impreso" y tiene 12 señales. Se emplean 4 señales en las comunicaciones serie. 3 son para el teclado externo, 1 para una interrupción reservada, 2 para la alimentación y 2 no están conectadas. Todas las señales tienen niveles lógicos CMOS (0 voltios para FALSO y 3.3 voltios para VERDADERO).
Pin
Number |
Signal
Name |
Description | Direction
with respect to daVinci |
Functionality |
1 | RxD | Data
Receive |
Input | Serial data in. Up to 115200 baud. |
2 | TxD | Data
Transmit |
Output | Serial data out. Up to 115200 baud. |
3 | RTS | Request to
Send |
Output | daVinci asserts RTS when it is
ready for host data. (not connected to PC) |
4 | CTS | Clear to
Send |
Input | Host asserts CTS when it is
ready for daVinci data. (not connected to PC) |
5 | GND
(Vss) |
Ground | Power | 0 Volts |
6 | PD3 | Keyboard | Input | Data input from keyboard |
7 | PD2 | Keyboard | ? | Clock for keyboard |
8 | IRQ6 | Reserved | Input | Reserved Interrupt input |
9 | IRQ1 | Keyboard | Input | Keyboard Interrupt |
10 | Vcc
(Vdd) |
Power | Power | 3.3 Volts |
11 | NC | - | - | Not connected (reserved) |
12 | NC | - | - | Not connected (reserved) |
Esquema del cradle. (Versión postscript.).
Conversión de niveles lógicos.
Como se puede ver en el esquema anterior, el PC debe proporcionar la alimentación para la conversión de niveles lógicos a través de los pines DTR y RTS. Para un buen funcionamiento DTR debe estar en alto (1 en MCR del 16550) y RTS en bajo (0 en MCR del 16550). Los niveles RS232 que se obtienen con este circuito son +3.3 y -12 voltios. El nivel alto es algo bajo, pero suficiente. Nótese que no se consume corriente del daVinci, de modo que las comunicaciones serie no tienen mucho efecto en la vida de las pilas. El pin TXD del daVinci puede programarse bien como salida de drenador abierto o como TOTEM-POLE.
La única forma de producir sonido en el daVinci es a través de su altavoz piezoeléctrico. Este altavoz está conectado a la salida PWMO, seguramente a través de un amplificador de tensión de un único transistor. La calidad de este sistema de sonido es tan mala, que sólo es útil para producir pitidos.
Las malas características del sistema de sonido del daVinci se deben a la naturaleza resonante del altavoz, a la ausencia de filtros anti-alias y seguramente a grandes no-linealidades en la etapa amplificadora. Aunque la salida PWMO del 68ez328 puede reproducir muestras de sonido de 8 bits a frecuencias de 8, 16 y 32 KHz, las enormes distorsiones de la electrónica analógica hacen inútil esta funcionalidad, como demuestra la siguiente prueba:
Se reprodujo una onda sinusoidal de 1500 Hz a través de PWMO, con una frecuencia de muestreo de 32384 Hz, y una repetición de muestras cuadruple, lo que da una frecuencia de muestreo efectiva de 8096 Hz, mientras que la portadora PWM está en 32 KHz. La onda muestreada y cuantizada es:
La baja frecuencia de muestreo hace parecer esta onda algo irregular, pero su espectro muestra claramente que se trata de un sonido muy "monocromático":
El sonido que realmente emite el daVinci tiene el siguiente espectro:
En esta gráfica se reslata la frecuencia fundamental (f0), de 1500 Hz, sus armónicos (2f0, 3f0,...), la frecuencia de muestreo (fs), de 8096 Hz y algunas frecuencias alias (fs-f0, fs-2f0,...). Como se puede ver, el espectro de la onda reproducida dista mucho del de un único tono. Además hay que destacar que la componente de mayor amplitud no es la frecuencia fundamental, sino el tercer armónico. La conclusión que se saca es:
El daVinci es incapaz de reproducir ondas muestreadas. Sólo pueden generarse ondas rectangulares o cuadradas. Esta limitación no es culpa del 68ez328, sino del amplificador y el altavoz.
Interruptor de la tapa de las pilas..
En la parte trasera del daVinci hay un pequeño interruptor que bloquea la tapa de las pilas. Este interruptor se debe subir para abrir el compartimento de las pilas y poder cambiarlas cuando están bajas. No se suele pensar que este interruptor tenga implicaciones en el software, pero una prueba demostró que el pin PD5 se pone en nivel bajo cuando se sube este interruptor. Este pin puede generar una interrupción de nivel 2, de modo que el S.O. puede realizar algún procesamiento "urgente" antes de quedarse sin alimentación.
La siguiente tabla muestra la corriente consumida por el daVinci bajo
diferentes condiciones de funcionamiento. las medidas se tomaron mientras
la CPU ejecutaba un bucle tonto:
|
|
CPU Full Speed (16.5 MHz), LCD ON, BACKLIGHT ON |
|
CPU Full Speed (16.5 MHz), LCD ON |
|
CPU Full Speed (16.5 MHz), LCD OFF |
|
CPU doze mode 1/32, LCD OFF |
|
CPU doze mode 0/32 (stopped), LCD OFF |
|
PLL OFF, LCD OFF |
|
PLL OFF, LCD OFF, Nexus Power-Down |
|
De la tabla anterior se puede inferir la corriente consumida por cada
subsistema del daVinci:
|
Current (mA) |
Nexus Chip |
|
LCD |
|
Backlight |
|
CPU at Full Speed (16.5MHz) |
|
CPU, doze mode: N/32 |
|
CPU Peripherals & PLL system |
|