|
ELIOT1 HAL
|
Драйвер прямого доступа к памяти Подробнее...
Файлы | |
| файл | 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.
| #define DMA_CHANNEL_CTL | ( | blockSize, | |
| srcEnChain, | |||
| dstEnChain, | |||
| transferType, | |||
| scatter, | |||
| gather, | |||
| srcMSize, | |||
| dstMSize, | |||
| sInc, | |||
| dInc, | |||
| srcTransferWidth, | |||
| dstTransferWidth, | |||
| int_en ) |
Конфигурация регистра CTL.
| blockSize | Размер блока |
| srcEnChain | Разрешение цепочки для источника |
| dstEnChain | Разрешение цепочки для источника |
| transferType | Тип передачи и управление размером блока |
| scatter | Разрешение разброса приемника |
| gather | Разрешение сбора источника |
| srcMSize | Размер пакета источника |
| dstMSize | Размер пакета приемника |
| sInc | Тип изменения адреса источника |
| dInc | Тип изменения адреса приемника |
| srcTransferWidth | Разрядность обращения источника |
| dstTransferWidth | Разрядность обращения приемника |
| int_en | Разрешение прерываний |
| #define DMA_CHANNEL_CTL_BLOCKSIZE_MASK (0xFFF00000000ULL) |
Маска поля 'Размер блока' в регистре CTL
| #define DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT (32ULL) |
Смещение поля 'Размер блока' в регистре CTL
| anonymous enum |
| anonymous enum |
Разрядность передачи канала DMA.
| anonymous enum |
Размер пакета передачи в словах данных разрядностью DMA_TransferBitWidth.
| enum _dma_int |
| enum _dma_priority |
Приоритеты каналов
| enum _dma_status |
| enum _dma_transfer_type |
Тип пересылок DMA и управление размером блока
| void DMA_AbortTransfer | ( | dma_handle_t * | handle | ) |
Прерывание передачи без потери данных
| handle | Управляющая структура передачи |
| void DMA_ChannelIRQHandle | ( | dma_handle_t * | handle | ) |
Обработчик прерываний
| handle | Дескриптор DMA |
|
inlinestatic |
Функция для проверки работы DMA канала
| base | Базовый адрес DMA |
| channel | Номер канала |
| true | - канал активен |
| false | - канал не активен |
| 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 |
| void DMA_Deinit | ( | DMA_Type * | base | ) |
Отключение DMA.
| base | Базовый адрес DMA |
| void DMA_DisableChannel | ( | DMA_Type * | base, |
| uint32_t | channel ) |
Выключение канала
| base | Базовый адрес DMA |
| channel | Номер канала |
| void DMA_DisableChannelInterrupt | ( | DMA_Type * | base, |
| uint32_t | channel, | ||
| uint8_t | int_mask ) |
Отключение источника прерывания
| base | Базовый адрес DMA |
| channel | Номер канала |
| inttype | Тип прерывания |
|
inlinestatic |
Активация канала
| base | Базовый адрес DMA |
| channel | Номер канала |
| void DMA_EnableChannelInterrupt | ( | DMA_Type * | base, |
| uint32_t | channel, | ||
| uint8_t | int_mask ) |
Разрешение источника прерывания
Функция разрешает формирование прерывания типа inttype. Также для возникновения сигнала прерывания важно установить поле INT_EN в 1 в регистре CTLx.
| base | Базовый адрес DMA |
| channel | Номер канала |
| inttype | Тип прерывания |
|
inlinestatic |
Установка запроса на передачу с периферией
| base | Базовый адрес DMA |
| channel | Номер канала |
| dma_priority_t DMA_GetChannelPriority | ( | DMA_Type * | base, |
| uint32_t | channel ) |
Получение информации о приоритете канала
Эта функция считывает приоритет из регистра CFGx.
| base | Базовый адрес DMA |
| channel | Номер канала |
| uint64_t DMA_GetCTLCfgMask | ( | struct dma_channel_ctl_cfg * | ctlxcfg | ) |
Получение маски для конфигурации пересылки
| ctlxcfg | Описание конфигурации пересылки |
| uint32_t DMA_GetDescriptorCount | ( | uint32_t | size_bytes, |
| uint8_t | transfer_width ) |
Расчёт количества дескрипторов многоблочной передачи
| size_bytes | Объем данных в байтах |
| transfer_width | Ширина одного слова |
| void DMA_HardwareHandshakeEnable | ( | dma_handle_t * | handle, |
| bool | enable, | ||
| uint32_t | req_num ) |
Установка аппаратного интерфейса запроса DMA.
| handle | Управляющая структура передачи |
| enable | Разрешение аппаратного интерфейса |
| req_num | Номер периферийного блока |
| void DMA_Init | ( | DMA_Type * | base | ) |
Включение DMA.
| base | Базовый адрес DMA |
| void DMA_InitMultiblockDescriptor | ( | dma_descriptor_t * | desc, |
| dma_multiblock_config_t * | config ) |
Функция, инициализирующая DMA дескрипторы многоблочной передачи.
| desc | Указатель на начало массива дескрипторов многоблочной передачи |
| config | Разрешение прерываний |
| 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 |
| void DMA_ScatterGatherEnable | ( | struct dma_channel_ctl_cfg * | ctlxcfg, |
| bool | scatter_en, | ||
| bool | gather_en ) |
Разрешение режимов Разброса/Сбора
| ctlxcfg | Конфигурация пересылки |
| scatter_en | Разрешение режима Разброса |
| gather_en | Разрешение режима Сбора |
| void DMA_SetCallback | ( | dma_handle_t * | handle, |
| dma_callback | callback, | ||
| void * | user_data ) |
Установка функции обратного вызова
| handle | Управляющая структура передачи |
| callback | Функция обратного вызова |
| user_data | Данные пользователя |
| void DMA_SetChannelPriority | ( | DMA_Type * | base, |
| uint32_t | channel, | ||
| dma_priority_t | priority ) |
Установка приоритета канала
| base | Базовый адрес DMA |
| channel | Номер канала |
| priority | Приоритет |
| 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 | Следующий дескриптор |
| void DMA_SetupDstScatter | ( | dma_handle_t * | handle, |
| uint32_t | count, | ||
| uint32_t | interval ) |
Настройка режима разброса приемника
| handle | Управляющая структура передачи |
| count | Счетчик разброса |
| interval | Интервал разброса |
| void DMA_SetupSrcGather | ( | dma_handle_t * | handle, |
| uint32_t | count, | ||
| uint32_t | interval ) |
Настройка режима сбора источника
| handle | Управляющая структура передачи |
| count | Счетчик сбора |
| interval | Интервал сбора |
| dma_status_t DMA_StartTransfer | ( | dma_handle_t * | handle | ) |
Начать транзакцию
Функция выгружает дескриптор из таблицы дескрипторов и инициализирует регистр LLPx адресом выгруженного дескриптора. После чего включается канал и начинается передача.
| handle | Управляющая структура передачи |
| DMA_Status_Success | |
| DMA_Status_NoBase | |
| DMA_Status_Busy |
| void DMA_SubmitChannelDescriptor | ( | dma_handle_t * | handle, |
| dma_descriptor_t * | descriptor ) |
Отправка дескриптора передачи
Функция используется для конфигурации канала дескриптором, который начнет Многоблочную передачу.
| handle | Управляющая структура передачи |
| descriptor | Дескриптор передачи |
| dma_status_t DMA_SubmitChannelTransfer | ( | dma_handle_t * | handle, |
| dma_channel_config_t * | config ) |
Отправление конфигурации передачи
Функция инициализирует регистры канала в соответствии с параметрами структуры dma_channel_config_t. Используется для одноблочной передачи:
| handle | Структура передачи |
| config | Структура конфигурации передачи DMA канала |
| DMA_Status_Success | |
| DMA_Status_Busy | |
| DMA_Status_NoBase |
| 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 |