wiki:mwr_driver

Version 7 (modified by alain, 12 years ago) ( diff )

--

GIET_VM / MWR Driver

The mwr_driver.c​ and mwr_driver.h​ files define the MWR driver for the vci_mwmr_dma peripheral.

The vci_mwmr_dma component is a multi-channels DMA controller that can be used to connect an hardware coprocesseur to a VCI interconnect. This component provides the coprocessor one or several TO_COPROC or FROM_COPROC FIFO type communication channels, without address. Each T0_COPROC/FROM_COPROC port contains an hardware FIFO interface (DATA, R_WOK, W_ROK signals), plus three signals (REQ, ACK, BURSTS) allowing the coprocessor to request an integer number of data burst. Each burst contains a fixed number of 32 bits words. The burst length is an hardware parameter.

Each channel implements two running modes:

  • in MWMR mode the channel FSM transfer an infinite" stream of data to or from a MWMR software FIFO, implementing the 7 steps MWMR protocol.
  • in DMA mode the channel FSM transfer a fixed size chunk of data to or from a memory buffer, with an optional completion signaling interrupt.

It is an internal peripheral, that can be replicated in all clusters.

The addressable registers map and command codes are defined here​.

void _mwr_channel_init( unsigned int cluster_xy, unsigned int channel, unsigned int mode, unsigned long long buffer_paddr, unsigned int buffer_size, unsigned long long desc_paddr, unsigned long long lock_paddr )

This function initialises all registers defining one communication channel for a given coprocessor.

  • cluster_xy is the cluster index
  • channel is the channel index
  • mode is the requested mode (MWMR / DMA_IRQ / DMA_NO_IRQ)
  • buffer_paddr is the memory buffer physical address
  • buffer_size is the memory buffer size (bytes)
  • desc_paddr is the MWMR descriptor physical address (only used in MWMR mode)
  • lock_paddr is the MWMR lock physical address (only used in MWMR mode)

void _mwr_channel_start( unsigned int cluster_xy, unsigned int channel )

This function activates one communication channel for a given coprocessor (set a non zero value in the RUNNING channel register).

  • cluster_xy is the cluster index
  • channel is the channel index

void _mwr_channel_stop( unsigned int cluster_xy, unsigned int channel )

This function desactivates one communication channel for a given coprocessor (set a zero value in the RUNNING channel register).

  • cluster_xy is the cluster index
  • channel is the channel index

void _mwr_isr( unsigned int irq_type, unsigned int irq_id, unsigned int channel )

This Interrupt Service Routine handles the IRQ signaling the completion of a data transfer for a channel running in DMA_IRQ mode). It set the _dma_done[x][y] synchronisation variable.

Note: See TracWiki for help on using the wiki.