Библиотека для работы с VDMA

Предупреждение

Этот документ не является достоверным. Описанные свойства могут не поддерживаться в ПО или поддерживаться не так как описано в документе. Свойства могут измениться при финальной реализации.

Данная библиотека предназначена для организации пересылок данных между внешней памятью и XYRAM. Библиотека позволяет настраивать как одиночные пересылки, так и множественные пересылки с использованием цепочек.

Данная библиотека является частью библиотеки elcore-runtime.

Для работы с библиотекой необходимо в файле с проектом подключить заголовочный файл dma.h.

Константы библиотеки VDMA

#define E50_DMA_CH0R 0x10223000
#define E50_DMA_CH1R 0x10223080
#define E50_DMA_CH2R 0x10223100
#define E50_DMA_CH3R 0x10223180

#define DmaCh0 ((E50_DmaChan*)E50_DMA_CH0R)
#define DmaCh1 ((E50_DmaChan*)E50_DMA_CH1R)
#define DmaCh2 ((E50_DmaChan*)E50_DMA_CH2R)
#define DmaCh3 ((E50_DmaChan*)E50_DMA_CH3R)

#define DMA_CFG_RD ((0 << 0) | (3 << 3) | (3 << 7))
#define DMA_CFG_WR ((1 << 0) | (3 << 3) | (3 << 7))

Константы DmaCh0-DmaCh3 определяют множество каналов VDMA.

Константы DMA_CFG_RD и DMA_CFG_WR определяют типовые конфигурации каналов VDMA.

Запуск одиночной пересылки

int DmaInit(volatile E50_DmaChan *ch, uint64_t xy, uint64_t mm, int32_t ofsext, int32_t ofsint, int len, int cfg);

Функция DmaInit() предназначена для настройки VDMA на одиночную пересылку. Описание параметров функции:

ch

Канал VDMA. Возможные значения:

  • DmaCh0 — VDMA канал 0.

  • DmaCh1 — VDMA канал 1.

  • DmaCh2 — VDMA канал 2.

  • DmaCh3 — VDMA канал 3.

xy

Адрес памяти XYRAM.

mm

Адрес во внешней памяти.

ofsext

Знаковое смещение прибавляемое к текущему адресу внешней памяти.

ofsint

Знаковое смещение прибавляемое к текущему адресу памяти XYRAM.

len

Количество байт, передаваемых в рамках данной пересылки.

cfg

Конфигурация канала. Возможные значения:

  • DMA_CFG_RD — пересылка данных из внешней памяти в XYRAM.

  • DMA_CFG_WR — пересылка данных из XYRAM во внешнюю память.

Для более быстрого завершения пересылки необходимо, чтобы параметры xy, mm, ofsext, ofsint и len были кратны степени двойки (максимум шестнадцати). При этом максимально допустимое значение параметра len определяется произведением 65536 и максимальной степнью кратности. В случае успеха функция DmaInit() возвращает нулевое значение.

void DmaRun(volatile E50_DmaChan *ch);

Функция DmaRun() предназначена для запуска одного VDMA канала, указанного в качестве параметра функции.

void DmaWait(volatile E50_DmaChan *ch);

Функция DmaWait() предназначена для ожидания завершения одного VDMA канала, указанного в качестве параметра функции.

Запуск множественных пересылок через цепочки

typedef struct E50_DmaChain {
  size_t ntasks;
  E50_DmaTask *tasks;

  E50_DmaChain(size_t ntasks);

  ~E50_DmaChain();

  int AddDmaChain(size_t pos, uint64_t xy, uint64_t mm, int32_t ofsext,
                  int32_t ofsint, int len, int cfg);
  void SetDmaChainForChannel(volatile E50_DmaChan* ch);
} E50_DmaChain;

Для настройки цепочки заданий для VDMA необходимо:

  1. Создать экземпляр структуры E50_DmaChain, передав конструктору в качестве параметра количество цепочек.

  2. Для созданного экземпляра структуры E50_DmaChain вызывать метод AddDmaChain() для каждой цепочки. Описание параметров функции:

    xy

    Адрес памяти XYRAM.

    mm

    Адрес во внешней памяти.

    ofsext

    Знаковое смещение прибавляемое к текущему адресу внешней памяти после передачи одномерной части массива.

    ofsint

    Знаковое смещение прибавляемое к текущему адресу памяти XYRAM после передачи одномерной части массива.

    len

    Количество байт, передаваемых в рамках данной пересылки.

    cfg

    Конфигурация канала. Возможные значения:

    • DMA_CFG_RD — пересылка данных из внешней памяти в XYRAM.

    • DMA_CFG_WR — пересылка данных из XYRAM во внешнюю память.

    Для более быстрого завершения пересылки необходимо, чтобы параметры xy, mm, ofsext, ofsint и len были кратны степени двойки (максимум шестнадцати). При этом максимально допустимое значение параметра len определяется произведением 65536 и максимальной степнью кратности. В случае успеха функция DmaInit() возвращает нулевое значение.

  3. Для экземпляра структуры E50_DmaChain вызывать метод SetDmaChainForChannel(), передав в качестве аргумента канал VDMA, который будет выполнять данные цепочки. Возможные значения параметра функции:

    • DmaCh0 — VDMA канал 0.

    • DmaCh1 — VDMA канал 1.

    • DmaCh2 — VDMA канал 2.

    • DmaCh3 — VDMA канал 3.

  4. Для запуска VDMA канала вызвать функцию DmaRun().

  5. Дождаться завершения работы VDMA канала с помощью DmaWait().