Ich hatte hier: Beitrag "XMEGA 16-bit DMA Burst Transfer für Display Parallel Bus" vor kurzen
eine Anfrage gestellt.
Ich konnte das Problem inzwischen lösen.
Es war ein unheimliches gefrickel. Deshalb stelle ich den Code hier noch
eben rein.
Fakten:
Das Ergebnis kann sich sehen lassen. Mit Übertakteten XMEGA erreiche ich
33,3 Vollbilder aus dem Externen SRAM. Bei einer Auflösung von 240px *
320px und 16bit per Pixel.
Das entspricht einer Transferrate von fast 5MByte/s. Wobei der
Speicherbus zwar viel belegt ist aber die CPU fast dauerhaft frei.
Aus dem internen RAM geht es noch wesentlich schneller. Allerdings passt
da kein Vollbild rein. Deshalb hatte ich keine Lust es genau zu testen.
Ich habe die Routine getestet mit dem TFT320_QVT mit SSD1289 Controller,
welches für rund 10€ bei EBay zu haben ist. Es sollte allerdings auch
Problemlos mit anderen Displays mit 16-Bit Interface funktionieren.
Anbindung:
Das ist meine Anschlusskonfiguration. Der Pin WR an PORTC PIN3 ist
wichtig sonst muss ein anderer timer2 genutzt werden. Ansonsten kann man
das wohl nach belieben machen:
1 | #define SSD_LPORT PORTA
|
2 | #define SSD_HPORT PORTB
|
3 |
|
4 | #define SSD_CONTROL_PORT PORTC
|
5 |
|
6 |
|
7 | // control line pins
|
8 | #define LCD_CD_bm PIN2_bm //RS
|
9 | #define LCD_WR_bm PIN3_bm //LCMPD of TCC2
|
10 | #define LCD_RD_bm PIN4_bm
|
11 | #define LCD_CS_bm PIN5_bm
|
12 | #define LCD_RES_bm PIN6_bm //Reset
|
Weitere Funkionen:
Für die Initialisierung des Displays und dessen commands habe ich mir
eine kleine Bibliothek geschrieben. Die unterscheidet sich allerdings
nur minimal von den vielen die im Netz verfügbar sind. Wenn sich dennoch
jemand dafür interessiert bin ich gerne bereit zu teilen.
Verfahren:
Das verfahren ist Grundlegend so das 2 DMA Channel benutz werden um die
Daten auf die Ports zu kopieren. Dann startet ein dritter DMA Kanal der
ein Byte in das CNT registers des Timers 2 Kopiert welcher dann ein
kurzen Puls generiert, damit die Daten vom Display übernommen werden.
Auf den IRQ des Timers werden die DMA Kanäle dann erneut getriggert usw.
Die Routinen sind noch relativ stark im RAW Format, damit meine ich es
sind alle noch nicht viele #define's gesetzt oder Makros definiert. So
kann man sie wahrscheinlich am besten lesen.
Die Initialisierung für den EBI-Bus habe ich mal mit rein kopiert.
Format:
Die Bilder werden in Arrays erwartet welche diese Form haben:
uint8_t bild[2][height][width];
Wobei highbyte und lowbyte getrennt von einander gespeichert werden
bild[0] enthällt alle highbytes
und
bild[1] alle lowbytes.
Das ist leider nicht anderes möglich wenn man es schnell möchte. Stellt
in der Praxis jedoch auch kaum ein Nachteil da.
Entwicklung:
Ich werde das ganze wahrscheinlich noch weiter entwickeln und in eine
echte Bibliothek umwandeln. Wenn daran auch jemand Interesse hat gebe
ich die Fortschritte gerne weiter.
Anmerkung:
Für Bugs, Vorschläge und Code Request habe ich ein offenes Ohr. Ich
werde jedoch nur minimalen support zur Einrichtung geben und falls mir
danach ist werde ich Anfragen ignorieren.
Viel Spaß und liebe Grüße
Felix
Nachtrag: Ein paar der Code-Kommentare in der main.c sind leider noch
aus einer alten Version aber das merkt man schon. :)