BestComm DMA des MPC5200B
Links
Die flexible DMA-Einheit des
MPC5200B ist einigermassen komplex und leider von
Freescale nicht sehr ausführlich dokumentiert. Deshalb habe ich hier noch einige Infos zusammengetragen.
Ganz nützliche Infos findet man unter
- Linux-Kernel, Datei bestcomm.c und weitere Quelldateien in diesem Umfeld
- Motorola Patentschrift US6421755
- PDF-Dokument sdHandAssemblyLcdDrd.pdf (einfach danach googlen)
- Application Note AN2604 - Introduction to BestComm
BestComm ist ein Modul, das im MPC5200B DMA-Funktionen implementiert. Die Transaktionen werden innerhalb von sog. Tasks mit Microcode implementiert. Die einzelnen Tasks werden je nach ihrere Priorität gesteuert von einem Scheduler hintereinander ausgeführt.
Der Microcode einer Task besteht aus einzelnen Anweisungen (Deskriptoren) mit optionalen Erweiterungen (Extensions). Es gibt prinzipiell zwei Arten von Anweisungen:
- LCD (Loop control descriptor): Beginn eine Schleife, Initialsierung von Variablen und Zeigern, Abbruchbedingung und Definition der Inkremente
- DRD (Data routing descriptor): "Body" der Schleife. Beschreibt die Datenpfade und kann zusätzliche logische Operationen bzw. CRC-Algorithmen auf die Daten anwenden
Die Anweisungen im einzelnen:
LCD |
Beginn einer Schleife |
LCDEXT Extended LCD |
wie LCD, jedoch gefolgt von einer Extension (weitere LCD-Anweisung) |
LCDEXT Literal |
Initialisierung einer Index-Variablen mit einem Literal (Konstanten) |
DRD1A |
(es folgt keine Extension) |
DRD2A |
(es folgt eine Erweiterung 2B1 oder 2B2) |
DRD2B1 (extension) |
|
DRD2B2 (extension) |
|
Grundsätzliche Regeln:
- Die erste Anweisung einer Task ist immer ein LCD bzw LCDEXT.
- Ein LCD kann auch aus mehreren Anweisungen bestehen (Extended).
- DRD (loop body) kann aus mehreren Anweisungen bestehen (MORE-Bit)
- Die Schleifen Index-Werte werden nicht in der Variablen-Tabelle gespeichert. Dort liegen die "Index-Variablen", d.h. Werte, mit denen ein Index geladen oder verglichen wird.
- Die Schleifenzähler werden in der Reihenfolge der Benutzung nach alloziiert
LCD
LCD (Basis + Extended)
Byte |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
Bit |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
LCD |
Ext |
* |
Index0 |
+ |
* |
Index1 |
Term |
* |
TermCond |
Incr0 |
Incr1 |
LCD |
Kennzeichnung: 1 = LCD, 0 = DRD |
Ext |
1 = LCD hat eine Erweiterung (das nachfolgende LCD ist die Erweiterung zu diesem) |
* |
Bits 29, 21 und 12: Indirekte Addressierung für die nachfolgenden Variablen, Dereferenzierung ähnlich wie in C |
Index0 |
Initialisierung der ersten Index-Variable (siehe unten) |
+ |
|
Index1 |
Initialisierung der zweiten Index-Variable (siehe unten) |
Term |
Art der Terminierung: 00 = Abbruchbedingung mit erster Index-Variable, 01 = Abbruch mit zweiter Index-Variable, 10 = Sonderfall "Literal LCD" (siehe unten), 11 = keine Terminierung |
TermCond |
Grenzwert für die Abbruchbedingung (siehe unten) |
Incr0 |
Auswahl, welche Inkrement-Variable aus der Variablen-Tabelle für den ersten Index zu nehmen ist (0-7), siehe auch unten bei "Variablen Tabelle" |
Incr1 |
Auswahl, welche Inkrement-Variable aus der Variablen-Tabelle für den zweiten Index zu nehmen ist (0-7) |
Index0, Index1, TermCond
Welche Werte hierfür genommen werden, wird folgendermassen konfiguriert:
Bemerkung: Ist das jeweilige "*"-Bit gesetzt, wird indirekt adressiert!
Index-Register-Comparison
LCD Literal constant
hat IMMER eine Extension (nachfolgendes LCD)
Byte |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
Bit |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
LCD |
Base |
Constant Bits [27:13] |
Term |
Constant Bits [12:0] |
LCD |
hier fest auf 1 |
Base |
Entscheidet, welcher Wert aus der Task-Table genommen wird, um die Bits [31:26] aufzufüllen (Base address) |
DRD
Variablen-Tabelle
Ein Eintrag in der Task-Tabelle zeigt auf die Variablen-Tabelle einer Task. Diese enthält 32 32-Bit Einträge. 0 bis 23 sind normale 32-Bit Variablen. Die Einträge 24 bis 31 sind Inkrement-Variablen (0-7, siehe Incr0/Incr1 bei LCD).
Increment-Variablen
Byte |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
Bit |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
Compare Type |
reserved |
16-Bit signed integer |
Siehe auch: Patentschrift
US Patent 6421744 - Direct memory access controller and method therefor
der Firma Motorola Inc. aus dem Jahr 2001
--
JoergWeinhardt - 08 Feb 2010