ELIOT1 HAL
Загрузка...
Поиск...
Не найдено
Драйвер модуля DMA

Драйвер прямого доступа к памяти Подробнее...

Файлы

файл  hal_dma.h
 Интерфейс драйвера прямого доступа к памяти
 

Структуры данных

struct  _dma_descriptor
 Описатель следующего блока DMA (LLI) Подробнее...
 
struct  _dma_channel_reg
 Дескриптор на регистры канала DMA. Подробнее...
 
struct  dma_channel_ctl_cfg
 Описание конфигурации пересылки Подробнее...
 
struct  _dma_channel_config
 Конфигурация канала DMA. Подробнее...
 
struct  _dma_handle
 Управляющая структура передачи Подробнее...
 
struct  _dma_multiblock_config
 Конфигурация многоблочной передачи Подробнее...
 

Макросы

#define HAL_DMA_DRIVER_VERSION   (MAKE_VERSION(1, 0, 0))
 Версия драйвера
 
#define DMA_AHB_MAX_BLOCK_SIZE   (4095U)
 Максимальный размер транзакции на AHB шине
 
#define HAL_FEATURE_DMA_NUMBER_OF_CHANNELS   (8U)
 Число каналов одного контроллера DMA.
 
#define HAL_FEATURE_DMA_MAX_NUMBER_HW_HANDSHAKES   (16U)
 Максимальное число аппаратных интерфейсов запросов DMA.
 
#define HAL_FEATURE_DMA_ALL_CHANNELS   (HAL_FEATURE_DMA_NUMBER_OF_CHANNELS * 2U)
 Общее число каналов DMA.
 
#define HAL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE   (4U)
 Размер выравнивания дескриптора
 
#define DMA_ALLOCATE_HEAD_DESCRIPTORS(name, number)    dma_descriptor_t name[number] __attribute__((aligned(HAL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)))
 Объявление дескриптора и выравнивание адреса дескриптора
 
#define REG_OFFSET   (0x58)
 Разница адресов идентичных регистров из соседних каналов
 
#define DMA_HANDSHAKE_UART0_TX   (0U)
 Номер handshake запроса UART0 TX.
 
#define DMA_HANDSHAKE_UART0_RX   (1U)
 Номер handshake запроса UART0 RX.
 
#define DMA_HANDSHAKE_UART1_TX   (2U)
 Номер handshake запроса UART1 TX.
 
#define DMA_HANDSHAKE_UART1_RX   (3U)
 Номер handshake запроса UART1 RX.
 
#define DMA_HANDSHAKE_UART2_TX   (0U)
 Номер handshake запроса UART2 TX.
 
#define DMA_HANDSHAKE_UART2_RX   (1U)
 Номер handshake запроса UART2 RX.
 
#define DMA_HANDSHAKE_UART3_TX   (2U)
 Номер handshake запроса UART3 TX.
 
#define DMA_HANDSHAKE_UART3_RX   (3U)
 Номер handshake запроса UART3 RX.
 
#define DMA_HANDSHAKE_SPI0_TX   (4U)
 Номер handshake запроса SPI0 TX.
 
#define DMA_HANDSHAKE_SPI0_RX   (5U)
 Номер handshake запроса SPI0 RX.
 
#define DMA_HANDSHAKE_SPI1_TX   (6U)
 Номер handshake запроса SPI1 TX.
 
#define DMA_HANDSHAKE_SPI1_RX   (7U)
 Номер handshake запроса SPI1 RX.
 
#define DMA_HANDSHAKE_SPI2_TX   (8U)
 Номер handshake запроса SPI2 TX.
 
#define DMA_HANDSHAKE_SPI2_RX   (9U)
 Номер handshake запроса SPI2 RX.
 
#define DMA_HANDSHAKE_I2C0_TX   (10U)
 Номер handshake запроса I2C0 TX.
 
#define DMA_HANDSHAKE_I2C0_RX   (11U)
 Номер handshake запроса I2C0 RX.
 
#define DMA_HANDSHAKE_I2C1_TX   (12U)
 Номер handshake запроса I2C1 TX.
 
#define DMA_HANDSHAKE_I2C1_RX   (13U)
 Номер handshake запроса I2C1 RX.
 
#define DMA_HANDSHAKE_QSPI_TX   (14U)
 Номер handshake запроса QSPI TX.
 
#define DMA_HANDSHAKE_QSPI_RX   (15U)
 Номер handshake запроса QSPI RX.
 

CHANNEL_CTL - Регистр управления каналом

enum  
 Разрядность передачи канала DMA. Подробнее...
 
enum  
 Размер пакета передачи в словах данных разрядностью DMA_TransferBitWidth. Подробнее...
 
enum  
 Тип изменения адреса при пересылке Подробнее...
 
enum  _dma_status
 Статусы возврата из функций для драйвера DMA. Подробнее...
 
enum  _dma_priority
 Приоритеты каналов Подробнее...
 
enum  _dma_int
 Источники прерываний DMA. Подробнее...
 
enum  _dma_transfer_type
 Тип пересылок DMA и управление размером блока Подробнее...
 
typedef enum _dma_status dma_status_t
 Статусы возврата из функций для драйвера DMA.
 
typedef enum _dma_priority dma_priority_t
 Приоритеты каналов
 
typedef enum _dma_int dma_irq_t
 Источники прерываний DMA.
 
typedef enum _dma_transfer_type dma_transfer_type_t
 Тип пересылок DMA и управление размером блока
 
typedef struct _dma_descriptor dma_descriptor_t
 Описатель следующего блока DMA (LLI)
 
typedef struct _dma_channel_reg dma_channel_regs
 Дескриптор на регистры канала DMA.
 
typedef struct _dma_channel_config dma_channel_config_t
 Конфигурация канала DMA.
 
typedef void(* dma_callback) (struct _dma_handle *handle, void *user_data, dma_irq_t intmode)
 Функция обратного вызова
 
typedef struct _dma_handle dma_handle_t
 Управляющая структура передачи
 
typedef struct _dma_multiblock_config dma_multiblock_config_t
 Конфигурация многоблочной передачи
 
#define DMA_CHANNEL_CTL_BLOCKSIZE_MASK   (0xFFF00000000ULL)
 
#define DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT   (32ULL)
 
#define DMA_CHANNEL_CTL_BLOCKSIZE(x)   (((uint64_t)((uint64_t)(x)) << DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT) & DMA_CHANNEL_CTL_BLOCKSIZE_MASK)
 Размер блока
 
#define DMA_CHANNEL_CTL(blockSize, srcEnChain, dstEnChain, transferType, scatter, gather, srcMSize, dstMSize, sInc, dInc, srcTransferWidth, dstTransferWidth, int_en)
 Конфигурация регистра CTL.
 

API HAL для драйвера модуля DMA

void DMA_Init (DMA_Type *base)
 Включение DMA.
 
void DMA_Deinit (DMA_Type *base)
 Отключение DMA.
 
dma_status_t DMA_CreateHandle (dma_handle_t *handle, DMA_Type *base, uint32_t channel)
 Инициализация структуры dma_handle_t.
 
static void DMA_EnableChannel (DMA_Type *base, uint32_t channel)
 Активация канала
 
void DMA_DisableChannel (DMA_Type *base, uint32_t channel)
 Выключение канала
 
static void DMA_EnableChannelPeriphRq (DMA_Type *base, uint32_t channel)
 Установка запроса на передачу с периферией
 
void DMA_HardwareHandshakeEnable (dma_handle_t *handle, bool enable, uint32_t req_num)
 Установка аппаратного интерфейса запроса DMA.
 
void DMA_SetChannelPriority (DMA_Type *base, uint32_t channel, dma_priority_t priority)
 Установка приоритета канала
 
void DMA_SetCallback (dma_handle_t *handle, dma_callback callback, void *user_data)
 Установка функции обратного вызова
 
static bool DMA_ChannelIsActive (DMA_Type *base, uint32_t channel)
 Функция для проверки работы DMA канала
 
dma_priority_t DMA_GetChannelPriority (DMA_Type *base, uint32_t channel)
 Получение информации о приоритете канала
 
uint64_t DMA_GetCTLCfgMask (struct dma_channel_ctl_cfg *ctlxcfg)
 Получение маски для конфигурации пересылки
 
void DMA_PrepareChannelTransfer (dma_channel_config_t *config, void *src_addr, void *dst_addr, uint64_t xfer_cfg)
 Подготовка канала к передаче
 
dma_status_t DMA_SubmitChannelTransfer (dma_handle_t *handle, dma_channel_config_t *config)
 Отправление конфигурации передачи
 
void DMA_SubmitChannelDescriptor (dma_handle_t *handle, dma_descriptor_t *descriptor)
 Отправка дескриптора передачи
 
uint32_t DMA_GetDescriptorCount (uint32_t size_bytes, uint8_t transfer_width)
 Расчёт количества дескрипторов многоблочной передачи
 
void DMA_AbortTransfer (dma_handle_t *handle)
 Прерывание передачи без потери данных
 
dma_status_t DMA_StartTransfer (dma_handle_t *handle)
 Начать транзакцию
 
void DMA_EnableChannelInterrupt (DMA_Type *base, uint32_t channel, uint8_t int_mask)
 Разрешение источника прерывания
 
void DMA_DisableChannelInterrupt (DMA_Type *base, uint32_t channel, uint8_t int_mask)
 Отключение источника прерывания
 
void DMA_SetupDescriptor (dma_descriptor_t *desc, uint64_t xfercfg, void *src_addr, void *dst_addr, void *next_desc)
 Инициализация дескриптора
 
dma_status_t DMA_SubmitChannelTransferParameter (dma_handle_t *handle, uint64_t xfer_cfg, void *src_addr, void *dst_addr)
 Отправка конфигурации передачи в таблицу дескрипторов
 
void DMA_ChannelIRQHandle (dma_handle_t *handle)
 Обработчик прерываний
 
void DMA_ScatterGatherEnable (struct dma_channel_ctl_cfg *ctlxcfg, bool scatter_en, bool gather_en)
 Разрешение режимов Разброса/Сбора
 
void DMA_SetupSrcGather (dma_handle_t *handle, uint32_t count, uint32_t interval)
 Настройка режима сбора источника
 
void DMA_SetupDstScatter (dma_handle_t *handle, uint32_t count, uint32_t interval)
 Настройка режима разброса приемника
 
void DMA_InitMultiblockDescriptor (dma_descriptor_t *desc, dma_multiblock_config_t *config)
 Функция, инициализирующая DMA дескрипторы многоблочной передачи.
 

Подробное описание

Драйвер прямого доступа к памяти

Драйвер модуля DMA управляет каналами контроллеров DMA0 и DMA1.

Макросы

◆ DMA_CHANNEL_CTL

#define DMA_CHANNEL_CTL ( blockSize,
srcEnChain,
dstEnChain,
transferType,
scatter,
gather,
srcMSize,
dstMSize,
sInc,
dInc,
srcTransferWidth,
dstTransferWidth,
int_en )
Макроопределение:
0x0ULL | DMA_CHANNEL_CTL_BLOCKSIZE(blockSize) | \
DMA_CTL0_LO_LLP_SRC_EN_VAL(srcEnChain) | \
DMA_CTL0_LO_LLP_DST_EN_VAL(dstEnChain) | \
DMA_CTL0_LO_TT_FC_VAL(transferType) | \
DMA_CTL0_LO_DST_SCATTER_EN_VAL(scatter) | \
DMA_CTL0_LO_SRC_GATHER_EN_VAL(gather) | \
DMA_CTL0_LO_SRC_MSIZE_VAL(srcMSize) | \
DMA_CTL0_LO_DEST_MSIZE_VAL(dstMSize) | \
DMA_CTL0_LO_SINC_VAL(sInc) | \
DMA_CTL0_LO_DINC_VAL(dInc) | \
DMA_CTL0_LO_SRC_TR_WIDTH_VAL(srcTransferWidth) | \
DMA_CTL0_LO_DST_TR_WIDTH_VAL(dstTransferWidth) | \
DMA_CTL0_LO_INT_EN_VAL(int_en)
#define DMA_CHANNEL_CTL_BLOCKSIZE(x)
Размер блока
Definition hal_dma.h:97

Конфигурация регистра CTL.

Аргументы
blockSizeРазмер блока
srcEnChainРазрешение цепочки для источника
dstEnChainРазрешение цепочки для источника
transferTypeТип передачи и управление размером блока
scatterРазрешение разброса приемника
gatherРазрешение сбора источника
srcMSizeРазмер пакета источника
dstMSizeРазмер пакета приемника
sIncТип изменения адреса источника
dIncТип изменения адреса приемника
srcTransferWidthРазрядность обращения источника
dstTransferWidthРазрядность обращения приемника
int_enРазрешение прерываний

◆ DMA_CHANNEL_CTL_BLOCKSIZE_MASK

#define DMA_CHANNEL_CTL_BLOCKSIZE_MASK   (0xFFF00000000ULL)

Маска поля 'Размер блока' в регистре CTL

◆ DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT

#define DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT   (32ULL)

Смещение поля 'Размер блока' в регистре CTL

Перечисления

◆ anonymous enum

anonymous enum

Тип изменения адреса при пересылке

Элементы перечислений
DMA_Incr 

Инкремент адреса

DMA_Decr 

Декремент адреса

DMA_NoChange 

Адрес не изменяется

◆ anonymous enum

anonymous enum

Разрядность передачи канала DMA.

Элементы перечислений
DMA_Transfer8BitWidth 

Ширина одного слова 8 бит

DMA_Transfer16BitWidth 

Ширина одного слова 16 бит

DMA_Transfer32BitWidth 

Ширина одного слова 32 бит

DMA_Transfer64BitWidth 

Ширина одного слова 64 бит

DMA_Transfer128BitWidth 

Ширина одного слова 128 бит

DMA_Transfer256BitWidth 

Ширина одного слова 256 бит

◆ anonymous enum

anonymous enum

Размер пакета передачи в словах данных разрядностью DMA_TransferBitWidth.

Элементы перечислений
DMA_BurstSize1 

Размер пакета 1

DMA_BurstSize4 

Размер пакета 4

DMA_BurstSize8 

Размер пакета 8

DMA_BurstSize16 

Размер пакета 16

DMA_BurstSize32 

Размер пакета 32

DMA_BurstSize64 

Размер пакета 64

DMA_BurstSize128 

Размер пакета 128

DMA_BurstSize256 

Размер пакета 256

◆ _dma_int

enum _dma_int

Источники прерываний DMA.

Элементы перечислений
DMA_IntTfr 

Завершение DMA пересылки

DMA_IntBlock 

Завершение передачи блока

DMA_IntDstTran 

Завершение передачи Приемнику

DMA_IntSrcTran 

Завершение передачи источнику

DMA_IntError 

Ошибка передачи AHB

DMA_AllIRQ 

Маска всех прерываний.

◆ _dma_priority

Приоритеты каналов

Элементы перечислений
DMA_ChannelPriority0 

Низший приоритет 0

DMA_ChannelPriority1 

Приоритет 1

DMA_ChannelPriority2 

Приоритет 2

DMA_ChannelPriority3 

Приоритет 3

DMA_ChannelPriority4 

Приоритет 4

DMA_ChannelPriority5 

Приоритет 5

DMA_ChannelPriority6 

Приоритет 6

DMA_ChannelPriority7 

Наивысший приоритет 7

◆ _dma_status

Статусы возврата из функций для драйвера DMA.

Элементы перечислений
DMA_Status_Success 

Функция выполнена успешно

DMA_Status_Busy 

Выбранный канал DMA занят

DMA_Status_NoBase 

Указанного базового адреса DMA не существует

DMA_Status_Fail 

Ошибка выполнения функции

◆ _dma_transfer_type

Тип пересылок DMA и управление размером блока

Элементы перечислений
DMA_MemoryToMemory_DMA 

Память-Память, DMA управляет размером блока

DMA_MemoryToPeripheral_DMA 

Память-Периферия, DMA управляет размером блока

DMA_PeripheralToMemory_DMA 

Периферия-Память, DMA управляет размером блока

DMA_PeripheralToPeripheral_DMA 

Периферия-Периферия, DMA управляет размером блока

DMA_PeripheralToMemory_Peripheral 

Периферия-Память, периферия управляет размером блока

DMA_PeripheralToPeripheral_SRC 

Периферия-Периферия, источник управляет размером блока

DMA_MemoryToPeripheral_Peripheral 

Память-Периферия, периферия управляет размером блока

DMA_PeripheralToPeripheral_DST 

Периферия-Периферия, приемник управляет размером блока

Функции

◆ DMA_AbortTransfer()

void DMA_AbortTransfer ( dma_handle_t * handle)

Прерывание передачи без потери данных

Аргументы
handleУправляющая структура передачи

◆ DMA_ChannelIRQHandle()

void DMA_ChannelIRQHandle ( dma_handle_t * handle)

Обработчик прерываний

Аргументы
handleДескриптор DMA

◆ DMA_ChannelIsActive()

static bool DMA_ChannelIsActive ( DMA_Type * base,
uint32_t channel )
inlinestatic

Функция для проверки работы DMA канала

Аргументы
baseБазовый адрес DMA
channelНомер канала
Возвращаемые значения
true- канал активен
false- канал не активен

◆ DMA_CreateHandle()

dma_status_t DMA_CreateHandle ( dma_handle_t * handle,
DMA_Type * base,
uint32_t channel )

Инициализация структуры dma_handle_t.

Аргументы
handleУправляющая структура передачи
baseБазовый адрес DMA
channelНомер канала
Возвращаемые значения
DMA_Status_Success
DMA_Status_NoBase

◆ DMA_Deinit()

void DMA_Deinit ( DMA_Type * base)

Отключение DMA.

Аргументы
baseБазовый адрес DMA

◆ DMA_DisableChannel()

void DMA_DisableChannel ( DMA_Type * base,
uint32_t channel )

Выключение канала

Аргументы
baseБазовый адрес DMA
channelНомер канала

◆ DMA_DisableChannelInterrupt()

void DMA_DisableChannelInterrupt ( DMA_Type * base,
uint32_t channel,
uint8_t int_mask )

Отключение источника прерывания

Аргументы
baseБазовый адрес DMA
channelНомер канала
inttypeТип прерывания

◆ DMA_EnableChannel()

static void DMA_EnableChannel ( DMA_Type * base,
uint32_t channel )
inlinestatic

Активация канала

Аргументы
baseБазовый адрес DMA
channelНомер канала

◆ DMA_EnableChannelInterrupt()

void DMA_EnableChannelInterrupt ( DMA_Type * base,
uint32_t channel,
uint8_t int_mask )

Разрешение источника прерывания

Функция разрешает формирование прерывания типа inttype. Также для возникновения сигнала прерывания важно установить поле INT_EN в 1 в регистре CTLx.

Аргументы
baseБазовый адрес DMA
channelНомер канала
inttypeТип прерывания

◆ DMA_EnableChannelPeriphRq()

static void DMA_EnableChannelPeriphRq ( DMA_Type * base,
uint32_t channel )
inlinestatic

Установка запроса на передачу с периферией

Аргументы
baseБазовый адрес DMA
channelНомер канала

◆ DMA_GetChannelPriority()

dma_priority_t DMA_GetChannelPriority ( DMA_Type * base,
uint32_t channel )

Получение информации о приоритете канала

Эта функция считывает приоритет из регистра CFGx.

Аргументы
baseБазовый адрес DMA
channelНомер канала
Возвращаемые значения
DMA_ChannelPriority0
DMA_ChannelPriority1
DMA_ChannelPriority2
DMA_ChannelPriority3
DMA_ChannelPriority4
DMA_ChannelPriority5
DMA_ChannelPriority6
DMA_ChannelPriority7

◆ DMA_GetCTLCfgMask()

uint64_t DMA_GetCTLCfgMask ( struct dma_channel_ctl_cfg * ctlxcfg)

Получение маски для конфигурации пересылки

Аргументы
ctlxcfgОписание конфигурации пересылки
Возвращает
Маска для конфигурации пересылки

◆ DMA_GetDescriptorCount()

uint32_t DMA_GetDescriptorCount ( uint32_t size_bytes,
uint8_t transfer_width )

Расчёт количества дескрипторов многоблочной передачи

Аргументы
size_bytesОбъем данных в байтах
transfer_widthШирина одного слова
Возвращает
Количество дескрипторов многоблочной передачи

◆ DMA_HardwareHandshakeEnable()

void DMA_HardwareHandshakeEnable ( dma_handle_t * handle,
bool enable,
uint32_t req_num )

Установка аппаратного интерфейса запроса DMA.

Аргументы
handleУправляющая структура передачи
enableРазрешение аппаратного интерфейса
req_numНомер периферийного блока

◆ DMA_Init()

void DMA_Init ( DMA_Type * base)

Включение DMA.

Аргументы
baseБазовый адрес DMA

◆ DMA_InitMultiblockDescriptor()

void DMA_InitMultiblockDescriptor ( dma_descriptor_t * desc,
dma_multiblock_config_t * config )

Функция, инициализирующая DMA дескрипторы многоблочной передачи.

Аргументы
descУказатель на начало массива дескрипторов многоблочной передачи
configРазрешение прерываний

◆ DMA_PrepareChannelTransfer()

void DMA_PrepareChannelTransfer ( dma_channel_config_t * config,
void * src_addr,
void * dst_addr,
uint64_t xfer_cfg )

Подготовка канала к передаче

Эта функция инициализирует структуру dma_channel_config_t

Аргументы
configУказатель на структуру конфигурации канала
src_addrНачальный адрес Источника
dst_addrНачальный адрес Приемника
xfer_cfgКонфигурация регистра CTL

◆ DMA_ScatterGatherEnable()

void DMA_ScatterGatherEnable ( struct dma_channel_ctl_cfg * ctlxcfg,
bool scatter_en,
bool gather_en )

Разрешение режимов Разброса/Сбора

Аргументы
ctlxcfgКонфигурация пересылки
scatter_enРазрешение режима Разброса
gather_enРазрешение режима Сбора

◆ DMA_SetCallback()

void DMA_SetCallback ( dma_handle_t * handle,
dma_callback callback,
void * user_data )

Установка функции обратного вызова

Аргументы
handleУправляющая структура передачи
callbackФункция обратного вызова
user_dataДанные пользователя

◆ DMA_SetChannelPriority()

void DMA_SetChannelPriority ( DMA_Type * base,
uint32_t channel,
dma_priority_t priority )

Установка приоритета канала

Аргументы
baseБазовый адрес DMA
channelНомер канала
priorityПриоритет

◆ DMA_SetupDescriptor()

void DMA_SetupDescriptor ( dma_descriptor_t * desc,
uint64_t xfercfg,
void * src_addr,
void * dst_addr,
void * next_desc )

Инициализация дескриптора

Аргументы
descДескриптор DMA
xfercfgКонфигурация передачи для дескриптора
src_addrАдрес источника
dst_addrАдрес приемника
next_descСледующий дескриптор

◆ DMA_SetupDstScatter()

void DMA_SetupDstScatter ( dma_handle_t * handle,
uint32_t count,
uint32_t interval )

Настройка режима разброса приемника

Аргументы
handleУправляющая структура передачи
countСчетчик разброса
intervalИнтервал разброса

◆ DMA_SetupSrcGather()

void DMA_SetupSrcGather ( dma_handle_t * handle,
uint32_t count,
uint32_t interval )

Настройка режима сбора источника

Аргументы
handleУправляющая структура передачи
countСчетчик сбора
intervalИнтервал сбора

◆ DMA_StartTransfer()

dma_status_t DMA_StartTransfer ( dma_handle_t * handle)

Начать транзакцию

Функция выгружает дескриптор из таблицы дескрипторов и инициализирует регистр LLPx адресом выгруженного дескриптора. После чего включается канал и начинается передача.

Аргументы
handleУправляющая структура передачи
Возвращаемые значения
DMA_Status_Success
DMA_Status_NoBase
DMA_Status_Busy

◆ DMA_SubmitChannelDescriptor()

void DMA_SubmitChannelDescriptor ( dma_handle_t * handle,
dma_descriptor_t * descriptor )

Отправка дескриптора передачи

Функция используется для конфигурации канала дескриптором, который начнет Многоблочную передачу.

DMA_SetupDescriptor(next_desc0, xfercfg, src_addr, dst_addr, next_desc1);
DMA_SetupDescriptor(next_desc1, xfercfg, src_addr, dst_addr, next_desc2);
DMA_SetupDescriptor(next_desc2, xfercfg, src_addr, dst_addr, NULL);
DMA_CreateHandle(handle, base, channel)
uint64_t xfercfg = DMA_CHANNEL_CTL(
LEN, true, true,
false, false,
true
);
DMA_SubmitChannelDescriptor(handle, next_desc0)
dma_status_t DMA_StartTransfer(dma_handle_t *handle)
Начать транзакцию
void DMA_SubmitChannelDescriptor(dma_handle_t *handle, dma_descriptor_t *descriptor)
Отправка дескриптора передачи
dma_status_t DMA_CreateHandle(dma_handle_t *handle, DMA_Type *base, uint32_t channel)
Инициализация структуры dma_handle_t.
#define DMA_CHANNEL_CTL(blockSize, srcEnChain, dstEnChain, transferType, scatter, gather, srcMSize, dstMSize, sInc, dInc, srcTransferWidth, dstTransferWidth, int_en)
Конфигурация регистра CTL.
Definition hal_dma.h:116
void DMA_SetupDescriptor(dma_descriptor_t *desc, uint64_t xfercfg, void *src_addr, void *dst_addr, void *next_desc)
Инициализация дескриптора
@ DMA_Incr
Definition hal_dma.h:163
@ DMA_MemoryToMemory_DMA
Definition hal_dma.h:211
@ DMA_BurstSize4
Definition hal_dma.h:150
@ DMA_Transfer32BitWidth
Definition hal_dma.h:139
Аргументы
handleУправляющая структура передачи
descriptorДескриптор передачи

◆ DMA_SubmitChannelTransfer()

dma_status_t DMA_SubmitChannelTransfer ( dma_handle_t * handle,
dma_channel_config_t * config )

Отправление конфигурации передачи

Функция инициализирует регистры канала в соответствии с параметрами структуры dma_channel_config_t. Используется для одноблочной передачи:

DMA_CreateHandle(handle, base, channel);
uint64_t xfercfg = DMA_CHANNEL_CTL(
LEN, true, true,
false, false,
true
);
DMA_PrepareChannelTransfer(config, src_addr, dst_addr, xfercfg)
DMA_SubmitChannelTransfer(handle, config);
dma_status_t DMA_SubmitChannelTransfer(dma_handle_t *handle, dma_channel_config_t *config)
Отправление конфигурации передачи
void DMA_PrepareChannelTransfer(dma_channel_config_t *config, void *src_addr, void *dst_addr, uint64_t xfer_cfg)
Подготовка канала к передаче
Аргументы
handleСтруктура передачи
configСтруктура конфигурации передачи DMA канала
Возвращаемые значения
DMA_Status_Success
DMA_Status_Busy
DMA_Status_NoBase

◆ DMA_SubmitChannelTransferParameter()

dma_status_t DMA_SubmitChannelTransferParameter ( dma_handle_t * handle,
uint64_t xfer_cfg,
void * src_addr,
void * dst_addr )

Отправка конфигурации передачи в таблицу дескрипторов

Использование: Одноблочная передача

uint64_t xfercfg = DMA_CHANNEL_CTL(
LEN, false, false,
false, false,
true
);
DMA_CreateHandle(handle, base, channel)
DMA_SubmitChannelTransferParameter(handle, xfercfg, src_addr, dst_addr);
dma_status_t DMA_SubmitChannelTransferParameter(dma_handle_t *handle, uint64_t xfer_cfg, void *src_addr, void *dst_addr)
Отправка конфигурации передачи в таблицу дескрипторов
Аргументы
handleУправляющая структура передачи
xfer_cfgМаска конфигурации пересылки
src_addrАдрес данных передатчика
dst_addrАдрес данных приемника
Возвращаемые значения
DMA_Status_Success
DMA_Status_Busy
DMA_Status_NoBase