Skocz do zawartości

FLASH NOR not-memory mapped, TouchGFX i linker script


Gieneq

Pomocna odpowiedź

Cześć,

W projekcie mam do użycia zewnętrzny FLASH. Pamieć działa, testowałem zapis i odczyt. Przetestowałem cache w TouchGFX i działa pobranie grafik z zewnętrznego FLASHa do bufora cache w ramie. Teraz chcę użyć go do przechownia grafik dla potrzeb TouchGFX od ST.

Na stronie TouchGFX jest napisane jak można podejść do tematu i kluczowy moment to:

Cytat

The linker selects an address for the bitmaps. This selection is based on the section the bitmaps are placed in. All bitmaps in TouchGFX is by default put into the ExtFlashSection.

The standard linker scripts (here for GCC) puts this section into flash together with other read-only data.

In this example we will put the image data in the ExtFlashSection at address 0x24000000. You can select any address that is otherwise unused (not part of the code or data address space).

Czyli dla wgrania kodu wybieram jakiś obszar, nic się tam i tak nie zapisze, a później musze interpretować adresy w funkcji obsługi cache z frameworku touchGFX:

// This function is called whenever a bitmap is cached. Must copy a number of bytes from the (non-memory-mapped) source
// to the cache.
bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
{
  // If requested data is located within the memory block we have assigned for ExtFlashSection,
  // provide an implementation for data copying.
  if (src >= 0x24000000 && src < 0x24100000)
  {
    void* dataOffset = src - 0x24000000;
    // In this example we assume graphics is placed in SD card, and that we have an appropriate function
    // for copying data from there.
    sdcard_read(dest, dataOffset, numBytes);
    return true;
  }
  else
  {
    // For all other addresses, just use the default implementation.
    // This is important, as blockCopy is also used for other things in the core framework.
    return HAL::blockCopy(dest, src, numBytes);
  }
}

Wybrałem adres RAM D3 jako nieużywany obszar i dodałem do linkera:

  .intr_data(NOLOAD) :
  {
  	. = ALIGN(1);
  	. = ABSOLUTE(0x30000000);
  	*(.internal_cache)
  } >RAM_D2
  
ExtFlashSection :
{
   *(ExtFlashSection ExtFlashSection.*)
} >EXT_FLASH_DUMMY
  

działa, ale jakoś mi się nie podoba. Macie pomysł jak wybrać nieużywany obszar dla 16MB?

Tu obszary z RAMu:

image.thumb.png.62c1520d95e6353b38dd7c43c6d29ce7.png

Dla niektórych obszarów wgranie jest przerywane przez błęd.

  • Lubię! 2
Link do komentarza
Share on other sites

ExtFlashSection(UNLOAD) :
{
   *(ExtFlashSection ExtFlashSection.*)
} >EXT_FLASH_DUMMY
  

Wygląda na to, że sprawa jest bardzo prosta. Dodanie atrybuty UNLOAD powoduje, że dane są w wynikowym pliku binarnym, czyli zostaną przypisane adresy zmiennych, ale dane te nie zostaną umieszczone w targecie.

Link do komentarza
Share on other sites

Ostatecznie udało się skończyć ten temat. Jest jeszcze sporo do poprawy ale działa.

Atrybut UNLOAD faktycznie pomógł, ale tylko do przygotowania binarki dla STMki. Żeby przygotować plik do wgrania trzeba to usunąć, wtedy w pliku elf znajdzie się sektor. Jeżeli tego się nie zrobi, to podczas ekstrakcji sektorów wystąpi błąd. Do ekstrakcji prygotowałem plik bat z poleceniem:

@echo off
echo Extracting images from EnbioWiFi.elf...
echo If no ExtFlashSection, temporary remove (NOLOAD)

:: Replace the path and file name as needed
arm-none-eabi-objcopy --dump-section ExtFlashSection=images.bin ../Debug/EnbioWiFi.elf

echo Extraction complete.
pause

objcopy generuje plik bin którego początek można przełożyć na początek tej udawanej przestrzeni adresów. Te z kolei tłumaczę na adresy pamięci NOR FLASH.

Dodałem też obsługę pendriva w trybie Mass Storage (MSC) i po enumeracji następuje proces kopiowania buforem 1k około 1.5M grafik do zewnętrznego FLASHa. Przy kolejnym restarcie zawartość FLASHa jest cachowana w zewnętrznym RAMie, który jest już memory mapped 😄 

Także na koniec pytanie:

image.thumb.png.0b8aad3dd69402bd92232343b1700f3e.png

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.