Comment utiliser la mémoire Flash avec les puces BT81x ?

Pour comprendre le moteur vidéo embarqué (EVE) – BT81x, il faut se rappeler qu’il n’a pas de solution typique, comme c’est le cas dans les systèmes embarqués avec des écrans LCD. Qu’est-ce que cela signifie ?

Les puces EVE n’ont pas de mémoire tampon, ce qui signifie que toutes les opérations d’affichage sont effectuées au moment de l’exécution.

L’utilisation de la mémoire flash NOR permet de stocker et d’afficher directement à partir de celle-ci : des images, des fichiers audio et vidéo. Vous pouvez également utiliser des polices personnalisées stockées dans la mémoire flash, préparées dans EVE Asset Builder (décrit ci-dessous).

BT81x dispose d’une mémoire flash série située à 80 0000h

Détection de la mémoire, en utilisant la carte d’évaluation STM32 en configuration directe (pont USB -> SPI)

Pour prendre en charge différents fournisseurs de puces flash SPI NOR, le premier bloc (4096 octets) de la flash est réservé au pilote de la flash appelé fichier BLOB, fourni par Bridgetek. Le fichier BLOB doit être programmé en premier, afin que l’état flash puisse passer en mode pleine vitesse (rapide). Le premier bloc (4096 octets) de la puce flash contient un fichier blob correct.

Création d’un fichier image flash

Le fichier généré est un fichier *.bin contenant les données flash et un fichier *.map contenant les adresses et les tailles des fichiers en mémoire.

Programmation de la mémoire à l’aide de la carte d’évaluation STM32

Configuration de la carte d’évaluation STM32 et du module LCD en mode direct :

Veuillez télécharger les pilotes à partir de : https://ftdichip.com/drivers/d2xx-drivers/

Exemples de code C pour les opérations flash :

Les exemples de code sont disponibles sur Riverdi GitHub :
https://github.com/riverdi/EVE3_flash_write
(veuillez noter que les mêmes exemples fonctionneront pour les puces EVE4 et EVE3).

Pour les autres plates-formes, il suffit de modifier les fonctions de gestion du système de fichiers telles que fopen(), fread(), fclose().

Le code de l’exemple de démonstration utilise la bibliothèque FatFS pour lire les données de la carte SD et les placer dans la mémoire flash NOR d’EVE.

Polices : Format hérité

Format bitmap : Sélectionner tout, ou une combinaison de L1, L2, L4, L8

Prise en charge de la commande EVE : Sélectionnez la commande SETFONT ou SETFONT2 pour configurer le fichier de police. MANUEL RIVERDI

  • SETFONT : Génère une table métrique des polices compatibles avec FT80X, l’option par défaut.
  • SETFONT2 : génère une table de métriques de polices compatibles BT81X/FT81X pour la commande Cmd_SetFont2. Les fichiers générés avec cette option ne sont pas compatibles avec le FT80X.

Adresse des données de police (tableau des mesures + glyphe) : Adresse pour placer les données de police dans RAM_G

Jeu de caractères défini par l’utilisateur : Si cette option n’est pas sélectionnée (par défaut), tous les caractères de la police seront convertis. Si cette option est sélectionnée, seule une liste de caractères d’un fichier texte sera convertie. Les caractères de cette liste doivent être définis dans le fichier de polices d’entrée.

Caractères ASCII imprimables [32-126]: Si cette option est sélectionnée, les caractères ASCII dont le point de code est compris entre 32 et 126 seront convertis.

Sortie :

  • Génère le fichier de blocs métriques ainsi que les données bitmap au format L1, L2, L4, L8.
  • La sortie est un bloc métrique de 148 octets suivi des données bitmap brutes.
  • Cet outil génère également un exemple de code C pour en démontrer l’utilisation.
  • Les données de sortie sont préparées pour 1 poignée d’image bitmap.

uint8_t font[]=

{

/*Fin des données brutes de la bitmap —*/

}

#define FONT_HANDLE (1)

#define FONT_FILE_ADDRESS (RAM_G + 1000)

#define FIRST_CHARACTER (32)

void Load_Font(uint32_t i)

{

Gpu_CoCmd_Dlstart(phost) ;

App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)) ;

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)) ;

Gpu_Hal_WrMem(phost, FONT_FILE_ADDRESS, font, sizeof(font)) ;

//Gpu_Hal_LoadImageToMemory(phost, « path\to\digital-7_24_L8.raw », FONT_FILE_ADDRESS, LOAD) ;

Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER) ;

Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, OPT_FORMAT, « display %d « , i) ;

App_WrCoCmd_Buffer(phost, DISPLAY()) ;

Gpu_CoCmd_Swap(phost) ;

App_Flush_Co_Buffer(phost) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

}

Comment utiliser la police personnalisée étendue stockée dans la mémoire flash ?

1. Tout d’abord, il faut générer les fichiers glypth et xfont à partir de la police ttf :

2. Générer le fichier flash.bin

3. Programmez le Flash (bouton de mise à jour), essayez de déconnecter l’USB si vous remarquez des problèmes.

4. Code :

La police se trouve dans la mémoire flash (fichier glypth), vous devez copier xfont dans GRAM.


void
Load_XFont(
void
)

{

uint32_t fontAddr = RAM_G ;

// NOTE : N’oubliez pas d’écrire le fichier de glyphes dans la mémoire flash du BT815 à l’adresse 4096.

// Passage du flash en mode FULL

Gpu_CoCmd_FlashFast(phost, 0) ;

// Chargement du fichier xfont dans la RAM graphique

Gpu_CoCmd_FlashRead(phost, RAM_G, 52096, 4416) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

Gpu_CoCmd_Dlstart(phost) ;

App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)) ;

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)) ;

Gpu_CoCmd_SetFont2(phost, 1, fontAddr, 0) ;

Gpu_CoCmd_Text(phost, 50, 50, 1, 0, u8« ABCDEFG 1234567890 ») ;

App_WrCoCmd_Buffer(phost, DISPLAY()) ;

Gpu_CoCmd_Swap(phost) ;

App_Flush_Co_Buffer(phost) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

}

Images

EVE accepte les fichiers d’images JPEG/PNG/BMP à convertir.

Format de sortie : Le format de sortie des images est l’un des suivants :

ARGB1555, L1, L2, L4, L8, RGB232, ARGB2, ARGB4, RGB565, PALETTED565, PALETTED4444, PALETTED8, format ASTC de 4×4 à 12×12, format DXT1ASTC peuvent également être utilisés pour jouer des animations.

Exemple de code C pour afficher un fichier JPEG (le fichier JPEG est décompressé en GRAM) :


static void
Load_Jpeg(Gpu_Hal_Context_t *phost, uint32_t adr)

{

Gpu_CoCmd_Dlstart(phost) ;

App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)) ;

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)) ;

//Gpu_CoCmd_FlashHelper_SwitchFullMode(&host) ;

Gpu_CoCmd_FlashSource(phost, adr) ;

Gpu_CoCmd_LoadImage(phost, 0, OPT_FLASH ) ;

/Démarrer le dessin de l’image bitmap

App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS)) ;

App_WrCoCmd_Buffer(phost, VERTEX2II(0, 0, 0, 0)) ;

App_WrCoCmd_Buffer(phost, END()) ;

App_WrCoCmd_Buffer(phost, RESTORE_CONTEXT()) ;

App_WrCoCmd_Buffer(phost, DISPLAY()) ;

Gpu_CoCmd_Swap(phost) ;

App_Flush_Co_Buffer(phost) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

//platform_sleep_ms(3000) ;

}

Affichage direct de l’image ASTC à partir de la mémoire flash :


static void
Load_ImageASTC(Gpu_Hal_Context_t *phost, uint32_t adr, uint16_t fmt)

{

uint16_t iw = 1280 ;

uint16_t ih = 800 ;

Gpu_CoCmd_Dlstart(phost) ;

//App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)) ;

//App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)) ;

//Gpu_CoCmd_FlashSource(phost, adr) ;

Gpu_CoCmd_SetBitmap(phost, (0x800000 | adr/ 32 ), fmt, iw, ih) ;

//Gpu_CoCmd_SetBitmap(phost, RAM_G,RGB565 , iw, ih) ;

/Démarrer le dessin de l’image bitmap

App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS)) ;

App_WrCoCmd_Buffer(phost, VERTEX2F(0, 0)) ;

App_WrCoCmd_Buffer(phost, END()) ;

App_WrCoCmd_Buffer(phost, RESTORE_CONTEXT()) ;

App_WrCoCmd_Buffer(phost, DISPLAY()) ;

Gpu_CoCmd_Swap(phost) ;

App_Flush_Co_Buffer(phost) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

}

Vidéo à partir de la mémoire flash

Le fichier vidéo doit être converti en *.avi au format MJEG.

Code permettant d’exécuter une vidéo à partir d’une mémoire flash :

Gpu_CoCmd_FlashHelper_SwitchFullMode(&host) ;

Gpu_Hal_Wr32(phost, REG_PLAY_CONTROL, 1) ;

Gpu_CoCmd_Dlstart(phost) ;

App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)) ;

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)) ;

Gpu_CoCmd_FlashSource(phost, adr) ;

App_WrCoCmd_Buffer(phost, CMD_PLAYVIDEO) ;

App_WrCoCmd_Buffer(phost, OPT_FLASH|OPT_FULLSCREEN|OPT_NOTEAR) ;

App_Flush_Co_Buffer(phost) ;

Gpu_Hal_WaitCmdfifo_empty(phost) ;

Audio

Convertissez les fichiers WAV/MP3 en fichiers compatibles avec EVE.

Fichier d’entrée : Le fichier audio original à convertir.

Dossier de sortie : Dossier contenant les fichiers convertis.

Format de sortie : Format audio de la sortie

  • PCM signé 8 bits
  • 8 bit u-Law
  • 4 bits IMA ADPCM

Générer une animation

Convertit un fichier GIF ou une liste de fichiers PNG/JPEG/BMP en un fichier d’animation compatible avec EVE. L’animation est prise en charge par les puces BT81X et supérieures.

Fichier d’entrée ou dossier : Les utilisateurs peuvent sélectionner un fichier GIF ou un dossier d’images. Le dossier image doit contenir des fichiers PNG/JPEG/BMP dont le nom séquentiel correspond à l’expression régulière « .*[0- 9]+\.(png|jpeg|jpg|bmp) ». Le numéro indique la séquence des images animées. Par exemple : « 001.png », « 002.png », « 002.png » : « 001.png », « 002.png ».

Dossier de sortie : Dossier contenant les fichiers convertis.

Blocs d’empreintes ASTC : Sélectionnez l’un des éléments suivants : 4×4, 5×4, 5×5, 6×5, 6×6, 8×5, 8×6, 8×8, 10×5, 10×6, 10×8, 10×10, 12×10, 12×12

Vitesse de compression : très rapide, rapide, moyenne, complète et exhaustive. La qualité augmente de très rapide à exhaustive, tandis que la vitesse d’encodage diminue également.