MPC563XM Reference Manual, Rev. 1
120
Freescale Semiconductor
Preliminary—Subject to Change Without Notice
Throughout this document,
n
is used to reference the channel number. Additionally, data sizes are defined
as byte (8-bit), halfword (16-bit), word (32-bit) and doubleword (64-bit).
7.2.2
Features
The DMA module supports the following features:
•
All data movement via dual-address transfers: read from source, write to destination
— Programmable source, destination addresses, transfer size, plus support for enhanced
addressing modes
•
Transfer control descriptor organized to support two-deep, nested transfer operations
— An
inner
data transfer loop defined by a “minor” byte transfer count
— An
outer
data transfer loop defined by a “major” iteration count
•
Channel service request via one of three methods:
— Explicit software initiation
— Initiation via a channel-to-channel linking mechanism for continuous transfers
– Independent channel linking at end of minor loop and/or major loop
— Peripheral-paced hardware requests (one per channel)
— For all three methods,
one service request per execution of the minor loop is required
•
Support for fixed-priority and round-robin channel arbitration
•
Channel completion reported via optional interrupt requests
— One interrupt per channel, optionally asserted at completion of major iteration count
— Error terminations are optionally enabled per channel, and logically summed together to form
a small number of error interrupt outputs
•
Support for scatter/gather DMA processing
The structure of the transfer control descriptor is fundamental to the operation of the DMA module. It is
defined below in a ‘C‘ pseudo-code specification:
NOTE
To compile these structures, change any periods '.' in the variable name to
underscores '_'.
typedef union {
struct {
/* citer.e_link = 1 */
unsigned short citer.linkch:6; /* link channel number, */
unsigned short citer:9; /* current (“major”) iteration count */
} minor_link_enabled;
/* channel link at end of the minor loop */
struct {
/* citer.e_link = 0 */
unsigned short citer:15; /* current (“major”) iteration count */
} minor_link_disabled;
/* no linking at end of the minor loop */
} t_minor_link_citer;
typedef union {
struct {
/* biter.e_link = 1 */
unsigned short biter.linkch:6; /* link channel number, */
unsigned short biter:9; /* beginning (“major”) iteration count */