Библиотека для работы с 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 необходимо:
Создать экземпляр структуры
E50_DmaChain
, передав конструктору в качестве параметра количество цепочек.Для созданного экземпляра структуры
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()
возвращает нулевое значение.Для экземпляра структуры
E50_DmaChain
вызывать методSetDmaChainForChannel()
, передав в качестве аргумента канал VDMA, который будет выполнять данные цепочки. Возможные значения параметра функции:
DmaCh0
— VDMA канал 0.
DmaCh1
— VDMA канал 1.
DmaCh2
— VDMA канал 2.
DmaCh3
— VDMA канал 3.Для запуска VDMA канала вызвать функцию
DmaRun()
.Дождаться завершения работы VDMA канала с помощью
DmaWait()
.