Forum: Mikrocontroller und Digitale Elektronik Problem mit SD-Karte Blockgröße und DMA


von SsD (Gast)


Lesenswert?

Hallo.

Ich habe einen Grafikcontroller von Solomon Systech (SSD1926) welcher 
ein Interface für eine SD-Karte hat.
Die verwendete SD-Karte benutzt derzeit FAT32 als Dateisystem.

Ich möchte nun Bilder (Format rgb565, wie Bmp mit 16 bpp nur ohne 
Header) direkt von der SD-Karte in den Framebuffer des SSD1926 kopieren.
Der SSD unterstützt diese Funktion auch mittels DMA.
Damit das aber so Funktioniert wie vorgesehen, muss ich Byteweise bzw. 
mit einem Boundary von 2 Byte (weil 16bpp) auf die SD-Karte zugreifen 
können.

Kann ich mit dem Befehl CMD16 die Blockgröße zwischenzeitlich auf 2 Byte 
ändern, und nach der Transaktion wieder auf 512 setzen?
Wird das von allen Karten unterstützt? In der Spec habe ich gelesen, 
dass für das Lesen eine Blockgröße von 1-512 erlaub ist.


fg

von Falk B. (falk)


Lesenswert?

@SsD (Gast)

>Die verwendete SD-Karte benutzt derzeit FAT32 als Dateisystem.

>Ich möchte nun Bilder (Format rgb565, wie Bmp mit 16 bpp nur ohne
>Header) direkt von der SD-Karte in den Framebuffer des SSD1926 kopieren.
>Der SSD unterstützt diese Funktion auch mittels DMA.
>amit das aber so Funktioniert wie vorgesehen, muss ich Byteweise bzw.
>mit einem Boundary von 2 Byte (weil 16bpp) auf die SD-Karte zugreifen
>können.

Geht so direkt nicht. Braucht man auch kaum.

>Kann ich mit dem Befehl CMD16 die Blockgröße zwischenzeitlich auf 2 Byte
>ändern, und nach der Transaktion wieder auf 512 setzen?

AFAIK nein. Lies einfach 512 Byte und organisier deine Datenverarbeitung 
sinnvoll. So macht es der Rest der Welt.

>Wird das von allen Karten unterstützt? In der Spec habe ich gelesen,
>dass für das Lesen eine Blockgröße von 1-512 erlaub ist.

Ausserdem hast du ein Dateisystem, das macht den direkten Zufriff auf 
die SD-Karte. Deine Applikation sieht davon GAR NICHTS, die kennt nur 
fread() und fwrite() Funktionen. Dort kann man byteweise zugreifen, das 
Dateisystem puffert das intelligent.

von SsD (Gast)


Lesenswert?

Das ist so nicht ganz richtig.
Da die Übertragung von der SD-Karte in den Framebuffer nicht über meinen 
µC läuft sondern direkt über DMA, kann ich nicht einfach mehr Bytes 
lesen und anschließend nur die gewünschten nehmen.
Der µC macht nichts anderes als den DMA des Grafikcontrollers zu 
initialisieren und anschließend die DMA transaktion zu starten.
Dem Grafikcontroller ist es egal ob da ein Dateisystem ist oder nicht, 
der greift auf Byteebene zu.

Ich frage mich, warum diese Funktion (SD-->Framebuffer über DMA) 
vorhanden ist, wenn es nicht geht... :/

von Falk B. (falk)


Lesenswert?

@ SsD (Gast)

>Da die Übertragung von der SD-Karte in den Framebuffer nicht über meinen
>µC läuft sondern direkt über DMA, kann ich nicht einfach mehr Bytes
>lesen und anschließend nur die gewünschten nehmen.
>Der µC macht nichts anderes als den DMA des Grafikcontrollers zu
>initialisieren und anschließend die DMA transaktion zu starten.
>Dem Grafikcontroller ist es egal ob da ein Dateisystem ist oder nicht,
>der greift auf Byteebene zu.

Wirklich?

>Ich frage mich, warum diese Funktion (SD-->Framebuffer über DMA)
>vorhanden ist, wenn es nicht geht... :/

Geht schon, aber wahrscheinlich anders als du denkst. Das Ding hat ja 
einen Speicher, mit diverse Sachen gemacht werden können.

"The LCD controller of SSD1926 supports LCD panel for mobile phone with 
size, for example, 176x220 and 240x160 resolution at color depth 1, 2, 
4, 8, 16 and 32 bit-per-pixel (bpp)."

für 240x160 Pixel bei 32 Bit Farbtiefe braucht man gerade mal 153kB 
Speicher. Also lädt der IC das bild von SD-karte mit normalen 
Sektorzugriffen in den SRAM und gut. Dort holt es der LCD-Controller ab 
und schiebt es periodisch an das LCD raus. Wenn es ein JPEG ist, wird 
vorher noch entpackt, logisch. Aber die Daten werden mit Sicherheit 
NICHT direkt von SD-Karte gelesen und direkt angezeigt.

von SsD (Gast)


Lesenswert?

Mein Display hat eine Auflösung von 480*272 mit 16bpp - kannst du aber 
nicht wissen da ich es nicht angegeben habe. Sorry.

Aber 480*272*2 = 255kB.
Da müsste mir theoretisch noch 1 kB für solche untaten bereit stehen - 
ich werde das gleich mal Probieren.
Danke für den Hinweis.


PS:
Genuer gesagt wird das von Microchip angebotene PicTail+ SSD1926 Board 
mit dem dazugehörigen PoweTip Display verwendet. Auch wenn dieses Setup 
nicht direkt im Datenblatt vom SSD steht wird es unterstützt (da auch 
von Microchip angeboten).

von Jim M. (turboj)


Lesenswert?

SsD schrieb:
> Kann ich mit dem Befehl CMD16 die Blockgröße zwischenzeitlich auf 2 Byte
> ändern, und nach der Transaktion wieder auf 512 setzen?

Bei nur 2 Bytes hast Du aber massiven Overhead, da ein Lesebefehl dann 
mindestens 12 Bytes lang ist.

> Wird das von allen Karten unterstützt?

Natürlich nicht. Das Feature ist IIRC optional.

SDHC Karten können das überhaupt nicht, da dort nur 512 Byte Blöcke 
addressierbar sind.

von SsD (Gast)


Lesenswert?

Habs jetzt so gelöst, wie Falk Brunner vorgeschlagen hat.

Ich nutze das eine kByte, welches am Grafikcontroller noch frei ist und 
kann somit direkt mittels DMA 2 Sektoren von der SD-Karte auslesen. 
Damit kommt die SD-Karte klar.
Anschließend kopiere ich einfach die Bildstücke an die gewünschte 
Position und lese wieder 2 Sektoren ein, bis das Bild fertig ist.

Der Code dafür ist etwas zum Gehirnverbiegen (vorallem, wenn nur Teile 
eines Bildes geladen werden sollen), aber nichts was nicht machbar 
ist...

Vielen Dank für den Denkanstoß!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.