Texas Instruments TMS320DM646x 사용자 설명서

다운로드
페이지 135
www.ti.com
2.5.2
Transmit and Receive Descriptor Queues
Architecture
The EMAC module processes descriptors in linked list chains as discussed in
. The lists
controlled by the EMAC are maintained by the application software through the use of the head descriptor
pointer registers (HDP). Since the EMAC supports eight channels for both transmit and receive, there are
eight head descriptor pointer registers for both. They are:
TXnHDP - Transmit Channel DMA Head Descriptor Pointer Register
RXnHDP - Receive Channel DMA Head Descriptor Pointer Register
After an EMAC reset and before enabling the EMAC for send or receive, all 16 head descriptor pointer
registers must be initialized to 0.
The EMAC uses a simple system to determine if a descriptor is currently owned by the EMAC or by the
application software. There is a flag in the buffer descriptor flags called OWNER. When this flag is set, the
packet that is referenced by the descriptor is considered to be owned by the EMAC. Note that ownership
is done on a packet based granularity, not on descriptor granularity, so only SOP descriptors make use of
the OWNER flag. As packets are processed, the EMAC patches the SOP descriptor of the corresponding
packet and clears the OWNER flag. This is an indication that the EMAC has finished processing all
descriptors up to and including the first with the EOP flag set, indicating the end of the packet (note this
may only be one descriptor with both the SOP and EOP flags set).
To add a descriptor or a linked list of descriptors to an EMAC descriptor queue for the first time, the
software application simply writes the pointer to the descriptor or first descriptor of a list to the
corresponding HDP register. Note that the last descriptor in the list must have its “next” pointer cleared to
0. This is the only way the EMAC has of detecting the end of the list. So in the case where only a single
descriptor is added, its “next descriptor” pointer must be initialized to 0.
The HDP must never be written to a second time while a previous list is active. To add additional
descriptors to a descriptor list already owned by the EMAC, the NULL “next” pointer of the last descriptor
of the previous list is patched with a pointer to the first descriptor in the new list. The list of new
descriptors to be appended to the existing list must itself be NULL terminated before the pointer patch is
performed.
There is a potential race condition where the EMAC may read the “next” pointer of a descriptor as NULL in
the instant before an application appends additional descriptors to the list by patching the pointer. This
case is handled by the software application always examining the buffer descriptor flags of all EOP
packets, looking for a special flag called end of queue (EOQ). The EOQ flag is set by the EMAC on the
last descriptor of a packet when the descriptor’s “next” pointer is NULL. This is the way the EMAC
indicates to the software application that it believes it has reached the end of the list. When the software
application sees the EOQ flag set, and there are more descriptors to process, the application may at that
time submit the new list, or the portion of the appended list that was missed, by writing the new list pointer
to the same HDP that started the process.
This process applies when adding packets to a transmit list, and empty buffers to a receive list.
Ethernet Media Access Controller (EMAC)/Management Data Input/Output (MDIO)
22
SPRUEQ6 – December 2007