Ajustes en GDSTx
Toca el turno al TFT. Pretendo que la librería pueda controlar tanto la pantalla NHD de 4.3" (y de forma general chips FT81X), como al propio gameduino 3.
Hace tiempo logré aislar los parámetros de configuración del TFT del shield:
//Gameduino3 shield
if (GameduinoX==1){
GD.wr32(REG_HCYCLE, 548);
GD.wr32(REG_VCYCLE, 292);
cmd_regwrite(REG_OUTBITS, 666);
cmd_regwrite(REG_DITHER, 1);
cmd_regwrite(REG_ROTATE, ROTACION);
cmd_regwrite(REG_PCLK_POL, 1); //1 gameduino 23X 0 FT801/FT800/FT81x
cmd_regwrite(REG_PCLK, 5);
}
Es posible aplicar los tiempos de la pantalla NHD de 4.3" (NHD43) a los tiempos del TFT del gameduino 3, pero todavía tengo pendiente agregar un parámetro a la configuración (config.h): REG_SWIZZLE. En el TFT NHD43, esta es la configuración:
//TFT NHD FT813 4.3"
if (SizeEVE==43)
{
cmd_setrotate(ORIENTACION);
GD.wr32(REG_HSIZE, 480);//480
GD.wr32(REG_HCYCLE, 548);//548
GD.wr32(REG_HOFFSET, 43);//43
GD.wr32(REG_HSYNC0, 0);//0
GD.wr32(REG_HSYNC1, 41);//41
GD.wr32(REG_VSIZE, 272);//272
GD.wr32(REG_VCYCLE, 292);//292
GD.wr32(REG_VOFFSET, 12);//12
GD.wr32(REG_VSYNC0, 0);//0
GD.wr32(REG_VSYNC1, 10);//10
GD.wr32(REG_PCLK, 5);//5
GD.wr32(REG_SWIZZLE, 0);
GD.wr32(REG_PCLK_POL, 1);//1
GD.wr32(REG_CSPREAD, 1);//1
GD.wr32(REG_DITHER, 1);//1
//GD.wr(REG_ROTATE, 0);
}
Me parece que para el shield el valor de REG_SWIZZLE es 3. Para tener en cuenta si está conectado o no el gameduino 3, considero conveniente agregar una variable en el archivo config.h, y otra variable más que permita realizar o no la carga de la rutina de calibración. También exploraré hasta dónde es posible llevar la frecuencia del bus SPI0. Esta es la primera secuencia que voy a trabajar para la r-Pi Pico:
#if defined(ARDUINO_ARCH_RP2040)
#define SizeEVE 43
#define ORIENTACION 0 // 0, 1, 2, 3, FT81X/BT81X 0 normal
#define ROTACION 0 // 0,1 FT80x
#define CS 17 // SPI0 rPi-Pico
#define NHDTouch 1 // 1 cargar rutinas panel táctil 0 para NHD: aparentemente no lo requiere?¿ Revisar funcionamiento de EEPROM en Pi-Pico, para ajustar vector táctil
#define GameduinoX 0 // 1 gameduinoX shield instalado 0 otros como NHD43
#endif
En el archivo GDSTx.h, únicamente agregaré la siguiente secuencia para ajustar las frecuencias de SPI0 y SPI1:
#if defined(ARDUINO_ARCH_RP2040) //*******************************************************RP2040-Pico
#if (SizeEVE==43)
#define SetSPISpeed 24000000 //SPI0
#endif
#define SD_PIN 13 //SPI1
#define SetSDSpeed 24
#endif //*******************************************************RP2040-Pico
No es necesario modificar nada más.
En GDSTx.ccp es necesario configurar SPI1 para permitir el acceso al lector microSD, para que funcione con SdFat con lo aprendido en el ejemplo SdInfo. Al inicio agregaré estas líneas:
#if defined(ARDUINO_ARCH_RP2040) //*******************************************************RP2040-Pico
#include "EEPROM.h"
#define SD_CONFIG SdSpiConfig(SD_PIN, DEDICATED_SPI, SD_SCK_MHZ(SetSDSpeed), &SPI1) //Bus SPI-1
SdFs SD; //type 3
#endif //*******************************************************RP2040-Pico
La función GD.begin, debe permitir el acceso al lector microSD, agregando la línea:
#if defined(ARDUINO_ARCH_RP2040) //*******************************************************RP2040-Pico
SD.begin(SD_CONFIG);
#endif //*******************************************************RP2040-Pico
Luego debe poder cargarse la tabla de tiempos de NHD43 o bien la correspondiente al gameduino 3, tomando en cuenta la diferencia en REG_SWIZZLE que permite ajustar la secuencia RGB para cada TFT, ya que tienen un orden diferente
//TFT NHD FT813 4.3"
if (SizeEVE==43)
{
cmd_setrotate(ORIENTACION);
GD.wr32(REG_HSIZE, 480);//480
GD.wr32(REG_HCYCLE, 548);//548
GD.wr32(REG_HOFFSET, 43);//43
GD.wr32(REG_HSYNC0, 0);//0
GD.wr32(REG_HSYNC1, 41);//41
GD.wr32(REG_VSIZE, 272);//272
GD.wr32(REG_VCYCLE, 292);//292
GD.wr32(REG_VOFFSET, 12);//12
GD.wr32(REG_VSYNC0, 0);//0
GD.wr32(REG_VSYNC1, 10);//10
GD.wr32(REG_PCLK, 5);//5
if (GameduinoX==0)
{
GD.wr32(REG_SWIZZLE, 0);// NHD43
}
if (GameduinoX==1)
{
GD.wr32(REG_SWIZZLE, 3);//gameduino 3
}
GD.wr32(REG_PCLK_POL, 1);//1
GD.wr32(REG_CSPREAD, 1);//1
GD.wr32(REG_DITHER, 1);//1
//GD.wr(REG_ROTATE, 0);
}
Toca el turno al vector táctil. Este vector de una dimensión tiene 25 registros. El primero se consulta para determinar si se debe cargar la rutina de calibración o no. Si el vector está vacío tendrá el valor de 0. Durante la rutina de calibración, cada parámetro debe almacenarse en secuencia en alguno de los registros de memoria designados en el chip EVEx, en este caso es en el registro: REG_TOUCH_TRANSFORM_A. Al finalizar la calibración, el primer registro tomará el valor 1.
De esta forma no es necesario calibrar la pantalla cada vez que se conecta o cada vez que se sube un sketch al MCU.
Generalmente este vector se puede almacenar en una eeprom, aprovechando que los valores se ubican entre 0 y 255. La r-Pi Pico no tiene una eeprom física, se puede agregar una externa, pero hasta ahora no he conseguido que funcione la 24LC512 que pretendía conectar.
Afortunadamente es posible una emular eeprom en la memoria flash. Como el vector solo se crea una vez, no hay problema con la frecuencia de sobreescritura, la librería puede consultar el primer registro del vector para obtener el estatus. La secuencia de consulta queda así:
#if defined(ARDUINO_ARCH_RP2040)
EEPROM.begin(512); //eeprom emulada en r-Pi Pico
if (NHDTouch==1)
{
if (EEPROM.read(0) == 0)
{
self_calibrate();
for (int i = 0; i < 24; i++)
{
EEPROM.write(1 + i, GDTR.rd(REG_TOUCH_TRANSFORM_A + i));
}
EEPROM.write(0, 1);
EEPROM.commit(); //finaliza y guarda cambios en la eeprom emulada
} else {
for (int i = 0; i < 24; i++)
{
GDTR.wr(REG_TOUCH_TRANSFORM_A + i, EEPROM.read(1 + i));
}
}
}
#endif
En el archivo wiring.h solo hay que agregar estas líneas al inicio:
#if defined(ARDUINO_ARCH_RP2040)
pinMode(SD_PIN, OUTPUT);
digitalWrite(SD_PIN, HIGH);
#endif
Creo que son todos los ajustes en GDSTx, en cuanto tenga un tiempo, cablearé el bus SPI0 al cabezal de 20 pines en que conectaré el TFT. Como el vector de memoria está vacío lo primero que debería mostrar la pantalla es la rutina de calibración del panel táctil y luego el skecth de bech de carga de imágenes jpg que diseñé para probar panel táctil, funcionamiento de la microSD y rendimiento del MCU, otra vez a cruzar los dedos...