Spis treści
Jak korzystać z pamięci Flash z układami BT81x
Aby zrozumieć działanie silnika wideo EVE (Embedded Video Engine) – BT81x, należy pamiętać, że nie ma on typowego rozwiązania, jak ma to miejsce w systemach wbudowanych z ekranami LCD. Co to oznacza?
Układy EVE nie posiadają bufora ramki – oznacza to, że wszystkie operacje związane z wyświetlaniem są wykonywane w czasie wykonywania programu.
Wykorzystanie pamięci flash typu NOR pozwala na przechowywanie i bezpośrednie wyświetlanie z niej: zdjęć, plików audio i wideo. Można również korzystać z niestandardowych czcionek zapisanych w pamięci flash, przygotowanych w programie EVE Asset Builder (opisanym poniżej).
Układ BT81x posiada pamięć flash szeregową umieszczoną pod adresem 80 0000h


Wykrywanie pamięci przy użyciu płyty ewaluacyjnej STM32 w konfiguracji bezpośredniej (mostek USB → SPI)


Aby zapewnić obsługę układów pamięci flash NOR typu SPI różnych producentów, pierwszy blok (4096 bajtów) pamięci flash jest zarezerwowany dla sterownika pamięci flash, tzw. pliku BLOB, dostarczanego przez firmę Bridgetek. Plik BLOB należy zaprogramować jako pierwszy, aby pamięć flash mogła przejść w tryb pełnej prędkości (szybki). W pierwszym bloku (4096 bajtów) układu pamięci flash zaprogramowano prawidłowy plik BLOB.
Tworzenie pliku obrazu Flash


Wygenerowany plik to plik *.bin zawierający dane flash oraz plik *.map zawierający adresy i rozmiary pliku w pamięci.


Programowanie pamięci za pomocą płytki ewaluacyjnej STM32
Konfiguracja płyty ewaluacyjnej STM32 i modułu LCD w trybie bezpośrednim:


Proszę pobrać sterowniki ze strony: https://ftdichip.com/drivers/d2xx-drivers/


Przykłady kodu w języku C dotyczące operacji z pamięcią flash:


Przykłady kodu można znaleźć na profilu Riverdi w serwisie GitHub: https://github.com/riverdi/EVE3_flash_write ( należy pamiętać, że te same przykłady będą działać zarówno dla układów EVE4, jak i EVE3).
W przypadku innych platform wystarczy zmienić funkcje zarządzające systemem plików, takie jak fopen(), fread(), fclose().
Kod przykładowy wykorzystuje bibliotekę FatFS do odczytu danych z karty SD i zapisania ich w pamięci flash NOR EVE.
Czcionki: Format starszej generacji


Format bitmapy: Zaznacz wszystko lub kombinację opcji L1, L2, L4, L8
Obsługa poleceń EVE: Wybierz polecenie SETFONT lub SETFONT2, aby skonfigurować plik czcionki. Instrukcje Riverdi
- SETFONT: Wygeneruj tabelę metryczną czcionek zgodną ze standardem FT80x — opcja domyślna.
- SETFONT2: Generuje tabelę metryczną czcionek zgodną z serią BT81x/FT81x dla polecenia Cmd_SetFont2. Pliki wygenerowane przy użyciu tej opcji nie są zgodne z serią FT80x
Adres danych czcionki (tabela metryk + glify): adres, pod którym należy umieścić dane czcionki w pamięci RAM_G
Zestaw znaków zdefiniowany przez użytkownika: Jeśli opcja ta nie jest zaznaczona (ustawienie domyślne), konwersji zostaną poddane wszystkie znaki zawarte w czcionce. Jeśli opcja ta zostanie zaznaczona, konwersji zostaną poddane wyłącznie znaki z listy zawartej w pliku tekstowym; znaki z tej listy muszą być zdefiniowane w pliku czcionki wejściowej.
Znaki ASCII do wydruku [32–126]: Jeśli opcja ta zostanie zaznaczona, znaki ASCII o kodach od 32 do 126 zostaną przekonwertowane.
Wynik:
- Wygeneruj plik bloku metrycznego oraz dane bitmapowe w formatach L1, L2, L4 i L8.
- Wynikiem jest jeden blok metryczny o rozmiarze 148 bajtów, po którym następują surowe dane bitmapy.
- Narzędzie to generuje również próbkę kodu w języku C, ilustrującą sposób jego użycia.
- Dane wyjściowe są przygotowane dla 1 uchwytu bitmapy.
uint8_t font[] =
{
/*Bitmap Raw Data end —*/
}
#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);
}
Jak korzystać z rozszerzonej czcionki na zamówienie zapisanej w pamięci flash
1. Najpierw musisz wygenerować pliki glypth i xfont na podstawie czcionki TTF:


2. Utwórz plik obrazu flash.bin


3. Program Flash (przycisk „Aktualizuj”) – w razie jakichkolwiek problemów spróbuj odłączyć kabel USB


4. Kod:
Czcionka znajduje się w pamięci flash (plik glypth). Należy skopiować plik xfont do pamięci GRAM.


void Load_XFont(void)
{
uint32_t fontAddr = RAM_G;
// NOTE: Remember to write glyph file into BT815’s flash at address 4096
// Switch Flash to FULL Mode
Gpu_CoCmd_FlashFast(phost, 0);
// Load xfont file into graphics RAM
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);
}
Zdjęcia


EVE obsługuje konwersję plików graficznych w formatach JPEG/PNG/BMP.
Format wyjściowy: Format wyjściowy obrazów; może to być jeden z poniższych:
ARGB1555, L1, L2, L4, L8, RGB232, ARGB2, ARGB4, RGB565, PALETTED565, PALETTED4444, PALETTED8, format ASTC od 4×4 do 12×12; do odtwarzania animacji można również użyć formatu DXT1ASTC.
Przykładowy kod w języku Cdo wyświetlania pliku JPEG (plik JPEG jest poddawany dekompresji w formacie 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);
//Start drawing 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);
}
Obraz ASTC wyświetlany bezpośrednio z pamięci 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);
//Start drawing 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);
}
Wideo z pamięci Flash
Plik wideo należy przekonwertować do formatu *.avi w formacie MJEG.


Kod umożliwiający odtworzenie pliku wideo z pamięci 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);
Dźwięk
Konwertuj pliki WAV/MP3 na format zgodny z EVE.


Plik wejściowy: Oryginalny plik audio, który ma zostać przekonwertowany.
Folder wyjściowy: Folder zawierający przekonwertowane pliki.
Format wyjściowy: Format audio pliku wyjściowego
- 8-bitowy format PCM ze znakiem
- 8-bitowy u-Law
- 4-bitowy IMA ADPCM
Wygeneruj animację
Konwertuj plik GIF lub listę plików PNG/JPEG/BMP na plik animacji zgodny z EVE. Animacja jest obsługiwana przez układ BT81x i nowsze wersje.


Plik lub folder wejściowy: Użytkownicy mogą wybrać plik GIF lub folder ze zdjęciami. Folder ze zdjęciami musi zawierać pliki w formatach PNG/JPEG/BMP, których nazwy są zgodne z wyrażeniem regularnym „.*[0-9]+.(png|jpeg|jpg|bmp)”. Liczba oznacza kolejność ramek animacji. Na przykład: „001.png”, „002.png”.
Folder wyjściowy: Folder zawierający przekonwertowane pliki.
Wymiary bloków ASTC: Wybierz jedną z poniższych opcji: 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
Szybkość kompresji: bardzo szybka, szybka, średnia, dokładna i wyczerpująca. Jakość wzrasta od poziomu „bardzo szybka” do „wyczerpująca”, przy czym jednocześnie maleje szybkość kodowania.
ODKRYJ NASZĄ
Whitepaper
Osiągnij idealną interakcję użytkownika z wyświetlaczem dzięki odpowiedniemu czujnikowi Touch Sensor IC. Czy kiedykolwiek zmagałeś się z problemami związanymi z fantomowymi dotknięciami lub certyfikacją? Rozwiń swoje prace B+R jak profesjonalista dzięki naszemu Whitepaperowi!



