ELIOT1 HAL
Загрузка...
Поиск...
Не найдено
hal_dma.h
См. документацию.
1
20#ifndef HAL_DMA_H
21#define HAL_DMA_H
22
23#include "hal_common.h"
24
28#define HAL_DMA_DRIVER_VERSION (MAKE_VERSION(1, 0, 0))
29
31#define DMA_AHB_MAX_BLOCK_SIZE (4095U)
33#define HAL_FEATURE_DMA_NUMBER_OF_CHANNELS (8U)
35#define HAL_FEATURE_DMA_MAX_NUMBER_HW_HANDSHAKES (16U)
37#define HAL_FEATURE_DMA_ALL_CHANNELS (HAL_FEATURE_DMA_NUMBER_OF_CHANNELS * 2U)
39#define HAL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE (4U)
41#define DMA_ALLOCATE_HEAD_DESCRIPTORS(name, number) \
42 dma_descriptor_t name[number] __attribute__((aligned(HAL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE)))
44#define REG_OFFSET (0x58)
45
47#define DMA_HANDSHAKE_UART0_TX (0U)
49#define DMA_HANDSHAKE_UART0_RX (1U)
51#define DMA_HANDSHAKE_UART1_TX (2U)
53#define DMA_HANDSHAKE_UART1_RX (3U)
55#define DMA_HANDSHAKE_UART2_TX (0U)
57#define DMA_HANDSHAKE_UART2_RX (1U)
59#define DMA_HANDSHAKE_UART3_TX (2U)
61#define DMA_HANDSHAKE_UART3_RX (3U)
62
64#define DMA_HANDSHAKE_SPI0_TX (4U)
66#define DMA_HANDSHAKE_SPI0_RX (5U)
68#define DMA_HANDSHAKE_SPI1_TX (6U)
70#define DMA_HANDSHAKE_SPI1_RX (7U)
72#define DMA_HANDSHAKE_SPI2_TX (8U)
74#define DMA_HANDSHAKE_SPI2_RX (9U)
75
77#define DMA_HANDSHAKE_I2C0_TX (10U)
79#define DMA_HANDSHAKE_I2C0_RX (11U)
81#define DMA_HANDSHAKE_I2C1_TX (12U)
83#define DMA_HANDSHAKE_I2C1_RX (13U)
85#define DMA_HANDSHAKE_QSPI_TX (14U)
87#define DMA_HANDSHAKE_QSPI_RX (15U)
88
89
91#define DMA_CHANNEL_CTL_BLOCKSIZE_MASK (0xFFF00000000ULL)
92#define DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT (32ULL)
97#define DMA_CHANNEL_CTL_BLOCKSIZE(x) (((uint64_t)((uint64_t)(x)) << DMA_CHANNEL_CTL_BLOCKSIZE_SHIFT) & DMA_CHANNEL_CTL_BLOCKSIZE_MASK)
98
116#define DMA_CHANNEL_CTL(blockSize, srcEnChain, dstEnChain, transferType, \
117 scatter, gather, srcMSize, dstMSize, sInc, dInc, \
118 srcTransferWidth, dstTransferWidth, int_en) \
1190x0ULL | DMA_CHANNEL_CTL_BLOCKSIZE(blockSize) | \
120DMA_CTL0_LO_LLP_SRC_EN_VAL(srcEnChain) | \
121DMA_CTL0_LO_LLP_DST_EN_VAL(dstEnChain) | \
122DMA_CTL0_LO_TT_FC_VAL(transferType) | \
123DMA_CTL0_LO_DST_SCATTER_EN_VAL(scatter) | \
124DMA_CTL0_LO_SRC_GATHER_EN_VAL(gather) | \
125DMA_CTL0_LO_SRC_MSIZE_VAL(srcMSize) | \
126DMA_CTL0_LO_DEST_MSIZE_VAL(dstMSize) | \
127DMA_CTL0_LO_SINC_VAL(sInc) | \
128DMA_CTL0_LO_DINC_VAL(dInc) | \
129DMA_CTL0_LO_SRC_TR_WIDTH_VAL(srcTransferWidth) | \
130DMA_CTL0_LO_DST_TR_WIDTH_VAL(dstTransferWidth) | \
131DMA_CTL0_LO_INT_EN_VAL(int_en)
132
136enum {
143};
144
148enum {
157};
158
162enum {
163 DMA_Incr = 0U,
164 DMA_Decr = 1U,
166};
167
177
191
206
220
222typedef struct _dma_descriptor {
223 __IOM uint32_t SAR;
224 __IOM uint32_t DAR;
225 __IOM uint32_t LLP;
226 __IOM uint32_t CTL_LO;
227 __IOM uint32_t CTL_HI;
228 __IOM uint32_t SSTAT;
229 __IOM uint32_t DSTAT;
231
233typedef struct _dma_channel_reg {
234 __IOM uint32_t SAR_LO;
235 __IOM uint32_t SAR_HI;
236 __IOM uint32_t DAR_LO;
237 __IOM uint32_t DAR_HI;
238 __IOM uint32_t LLP_LO;
239 __IOM uint32_t LLP_HI;
240 __IOM uint32_t CTL_LO;
241 __IOM uint32_t CTL_HI;
242 __IOM uint32_t SSTAT_LO;
243 __IOM uint32_t SSTAT_HI;
244 __IOM uint32_t DSTAT_LO;
245 __IOM uint32_t DSTAT_HI;
246 __IOM uint32_t SSTATAR_LO;
247 __IOM uint32_t SSTATAR_HI;
248 __IOM uint32_t DSTATAR_LO;
249 __IOM uint32_t DSTATAR_HI;
250 __IOM uint32_t CFG_LO;
251 __IOM uint32_t CFG_HI;
252 __IOM uint32_t SGR_LO;
253 __IOM uint32_t SGR_HI;
254 __IOM uint32_t DSR_LO;
255 __IOM uint32_t DSR_HI;
257
274
286
287struct _dma_handle;
288
290typedef void (*dma_callback)(struct _dma_handle *handle, void *user_data,
291 dma_irq_t intmode);
292
302
322
333void DMA_Init(DMA_Type *base);
334
340void DMA_Deinit(DMA_Type *base);
341
353 uint32_t channel);
354
361static inline void DMA_EnableChannel(DMA_Type *base, uint32_t channel)
362{
363 base->CHENREG_LO |= (uint32_t)((1 << (channel + 8)) | (1 << channel));
364}
365
372void DMA_DisableChannel(DMA_Type *base, uint32_t channel);
373
380static inline void DMA_EnableChannelPeriphRq(DMA_Type *base,
381 uint32_t channel)
382{
383 base->REQDSTREG_LO = ((1 << (channel + 8)) | (1 << channel));
384 base->REQSRCREG_LO = ((1 << (channel + 8)) | (1 << channel));
385}
386
395 uint32_t req_num);
396
404void DMA_SetChannelPriority(DMA_Type *base, uint32_t channel,
405 dma_priority_t priority
406);
407
416 void *user_data);
417
426static inline bool DMA_ChannelIsActive(DMA_Type *base, uint32_t channel)
427{
428 return ((base->CHENREG_LO >> channel) & 1);
429}
430
448dma_priority_t DMA_GetChannelPriority(DMA_Type *base, uint32_t channel);
449
457uint64_t DMA_GetCTLCfgMask(struct dma_channel_ctl_cfg *ctlxcfg);
458
470 void *src_addr,
471 void *dst_addr,
472 uint64_t xfer_cfg
473);
474
505);
506
534 dma_descriptor_t *descriptor
535);
536
545uint32_t DMA_GetDescriptorCount(uint32_t size_bytes, uint8_t transfer_width);
546
553
568
580void DMA_EnableChannelInterrupt(DMA_Type *base, uint32_t channel,
581 uint8_t int_mask);
582
590void DMA_DisableChannelInterrupt(DMA_Type *base, uint32_t channel,
591 uint8_t int_mask);
592
602void DMA_SetupDescriptor(dma_descriptor_t *desc, uint64_t xfercfg,
603 void *src_addr, void *dst_addr,
604 void *next_desc
605);
606
637 uint64_t xfer_cfg, void *src_addr, void *dst_addr
638);
639
646
655 bool scatter_en, bool gather_en);
656
664void DMA_SetupSrcGather(dma_handle_t *handle, uint32_t count, uint32_t interval);
665
673void DMA_SetupDstScatter(dma_handle_t *handle, uint32_t count, uint32_t interval);
674
683
688#endif /* HAL_DMA_H */
689
static bool DMA_ChannelIsActive(DMA_Type *base, uint32_t channel)
Функция для проверки работы DMA канала
Definition hal_dma.h:426
dma_status_t DMA_SubmitChannelTransfer(dma_handle_t *handle, dma_channel_config_t *config)
Отправление конфигурации передачи
struct _dma_multiblock_config dma_multiblock_config_t
Конфигурация многоблочной передачи
_dma_status
Статусы возврата из функций для драйвера DMA.
Definition hal_dma.h:171
struct _dma_channel_config dma_channel_config_t
Конфигурация канала DMA.
void DMA_PrepareChannelTransfer(dma_channel_config_t *config, void *src_addr, void *dst_addr, uint64_t xfer_cfg)
Подготовка канала к передаче
enum _dma_priority dma_priority_t
Приоритеты каналов
void DMA_AbortTransfer(dma_handle_t *handle)
Прерывание передачи без потери данных
void DMA_SetChannelPriority(DMA_Type *base, uint32_t channel, dma_priority_t priority)
Установка приоритета канала
struct _dma_channel_reg dma_channel_regs
Дескриптор на регистры канала DMA.
dma_status_t DMA_StartTransfer(dma_handle_t *handle)
Начать транзакцию
enum _dma_int dma_irq_t
Источники прерываний DMA.
void DMA_DisableChannelInterrupt(DMA_Type *base, uint32_t channel, uint8_t int_mask)
Отключение источника прерывания
void DMA_Deinit(DMA_Type *base)
Отключение DMA.
_dma_priority
Приоритеты каналов
Definition hal_dma.h:181
enum _dma_transfer_type dma_transfer_type_t
Тип пересылок DMA и управление размером блока
dma_priority_t DMA_GetChannelPriority(DMA_Type *base, uint32_t channel)
Получение информации о приоритете канала
void DMA_EnableChannelInterrupt(DMA_Type *base, uint32_t channel, uint8_t int_mask)
Разрешение источника прерывания
void DMA_ScatterGatherEnable(struct dma_channel_ctl_cfg *ctlxcfg, bool scatter_en, bool gather_en)
Разрешение режимов Разброса/Сбора
_dma_transfer_type
Тип пересылок DMA и управление размером блока
Definition hal_dma.h:210
static void DMA_EnableChannel(DMA_Type *base, uint32_t channel)
Активация канала
Definition hal_dma.h:361
_dma_int
Источники прерываний DMA.
Definition hal_dma.h:195
static void DMA_EnableChannelPeriphRq(DMA_Type *base, uint32_t channel)
Установка запроса на передачу с периферией
Definition hal_dma.h:380
dma_status_t DMA_SubmitChannelTransferParameter(dma_handle_t *handle, uint64_t xfer_cfg, void *src_addr, void *dst_addr)
Отправка конфигурации передачи в таблицу дескрипторов
void DMA_InitMultiblockDescriptor(dma_descriptor_t *desc, dma_multiblock_config_t *config)
Функция, инициализирующая DMA дескрипторы многоблочной передачи.
void DMA_SetupDstScatter(dma_handle_t *handle, uint32_t count, uint32_t interval)
Настройка режима разброса приемника
uint64_t DMA_GetCTLCfgMask(struct dma_channel_ctl_cfg *ctlxcfg)
Получение маски для конфигурации пересылки
enum _dma_status dma_status_t
Статусы возврата из функций для драйвера DMA.
struct _dma_handle dma_handle_t
Управляющая структура передачи
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.
void(* dma_callback)(struct _dma_handle *handle, void *user_data, dma_irq_t intmode)
Функция обратного вызова
Definition hal_dma.h:290
void DMA_SetupSrcGather(dma_handle_t *handle, uint32_t count, uint32_t interval)
Настройка режима сбора источника
void DMA_Init(DMA_Type *base)
Включение DMA.
void DMA_ChannelIRQHandle(dma_handle_t *handle)
Обработчик прерываний
void DMA_SetupDescriptor(dma_descriptor_t *desc, uint64_t xfercfg, void *src_addr, void *dst_addr, void *next_desc)
Инициализация дескриптора
struct _dma_descriptor dma_descriptor_t
Описатель следующего блока DMA (LLI)
uint32_t DMA_GetDescriptorCount(uint32_t size_bytes, uint8_t transfer_width)
Расчёт количества дескрипторов многоблочной передачи
void DMA_HardwareHandshakeEnable(dma_handle_t *handle, bool enable, uint32_t req_num)
Установка аппаратного интерфейса запроса DMA.
void DMA_DisableChannel(DMA_Type *base, uint32_t channel)
Выключение канала
void DMA_SetCallback(dma_handle_t *handle, dma_callback callback, void *user_data)
Установка функции обратного вызова
@ DMA_Status_NoBase
Definition hal_dma.h:174
@ DMA_Status_Fail
Definition hal_dma.h:175
@ DMA_Status_Busy
Definition hal_dma.h:173
@ DMA_Status_Success
Definition hal_dma.h:172
@ DMA_Decr
Definition hal_dma.h:164
@ DMA_NoChange
Definition hal_dma.h:165
@ DMA_Incr
Definition hal_dma.h:163
@ DMA_ChannelPriority0
Definition hal_dma.h:182
@ DMA_ChannelPriority3
Definition hal_dma.h:185
@ DMA_ChannelPriority7
Definition hal_dma.h:189
@ DMA_ChannelPriority6
Definition hal_dma.h:188
@ DMA_ChannelPriority5
Definition hal_dma.h:187
@ DMA_ChannelPriority4
Definition hal_dma.h:186
@ DMA_ChannelPriority1
Definition hal_dma.h:183
@ DMA_ChannelPriority2
Definition hal_dma.h:184
@ DMA_PeripheralToPeripheral_DMA
Definition hal_dma.h:214
@ DMA_PeripheralToMemory_Peripheral
Definition hal_dma.h:215
@ DMA_MemoryToPeripheral_Peripheral
Definition hal_dma.h:217
@ DMA_MemoryToMemory_DMA
Definition hal_dma.h:211
@ DMA_PeripheralToMemory_DMA
Definition hal_dma.h:213
@ DMA_PeripheralToPeripheral_DST
Definition hal_dma.h:218
@ DMA_PeripheralToPeripheral_SRC
Definition hal_dma.h:216
@ DMA_MemoryToPeripheral_DMA
Definition hal_dma.h:212
@ DMA_IntSrcTran
Definition hal_dma.h:199
@ DMA_IntDstTran
Definition hal_dma.h:198
@ DMA_AllIRQ
Definition hal_dma.h:202
@ DMA_IntError
Definition hal_dma.h:200
@ DMA_IntTfr
Definition hal_dma.h:196
@ DMA_IntBlock
Definition hal_dma.h:197
@ DMA_BurstSize1
Definition hal_dma.h:149
@ DMA_BurstSize16
Definition hal_dma.h:152
@ DMA_BurstSize128
Definition hal_dma.h:155
@ DMA_BurstSize8
Definition hal_dma.h:151
@ DMA_BurstSize256
Definition hal_dma.h:156
@ DMA_BurstSize4
Definition hal_dma.h:150
@ DMA_BurstSize64
Definition hal_dma.h:154
@ DMA_BurstSize32
Definition hal_dma.h:153
@ DMA_Transfer32BitWidth
Definition hal_dma.h:139
@ DMA_Transfer8BitWidth
Definition hal_dma.h:137
@ DMA_Transfer64BitWidth
Definition hal_dma.h:140
@ DMA_Transfer256BitWidth
Definition hal_dma.h:142
@ DMA_Transfer128BitWidth
Definition hal_dma.h:141
@ DMA_Transfer16BitWidth
Definition hal_dma.h:138
Конфигурация канала DMA.
Definition hal_dma.h:278
uint64_t ctlx_cfg
Definition hal_dma.h:282
bool is_src_periph
Definition hal_dma.h:283
void * src_addr
Definition hal_dma.h:279
void * next_desc
Definition hal_dma.h:281
void * dst_addr
Definition hal_dma.h:280
bool is_dst_periph
Definition hal_dma.h:284
Дескриптор на регистры канала DMA.
Definition hal_dma.h:233
__IOM uint32_t SSTATAR_HI
Definition hal_dma.h:247
__IOM uint32_t DSTATAR_HI
Definition hal_dma.h:249
__IOM uint32_t DSR_LO
Definition hal_dma.h:254
__IOM uint32_t SSTAT_LO
Definition hal_dma.h:242
__IOM uint32_t LLP_HI
Definition hal_dma.h:239
__IOM uint32_t CTL_LO
Definition hal_dma.h:240
__IOM uint32_t DAR_HI
Definition hal_dma.h:237
__IOM uint32_t CFG_LO
Definition hal_dma.h:250
__IOM uint32_t CTL_HI
Definition hal_dma.h:241
__IOM uint32_t CFG_HI
Definition hal_dma.h:251
__IOM uint32_t LLP_LO
Definition hal_dma.h:238
__IOM uint32_t DAR_LO
Definition hal_dma.h:236
__IOM uint32_t SGR_LO
Definition hal_dma.h:252
__IOM uint32_t DSTAT_HI
Definition hal_dma.h:245
__IOM uint32_t DSTAT_LO
Definition hal_dma.h:244
__IOM uint32_t DSR_HI
Definition hal_dma.h:255
__IOM uint32_t SAR_LO
Definition hal_dma.h:234
__IOM uint32_t SSTATAR_LO
Definition hal_dma.h:246
__IOM uint32_t SAR_HI
Definition hal_dma.h:235
__IOM uint32_t SGR_HI
Definition hal_dma.h:253
__IOM uint32_t SSTAT_HI
Definition hal_dma.h:243
__IOM uint32_t DSTATAR_LO
Definition hal_dma.h:248
Описатель следующего блока DMA (LLI)
Definition hal_dma.h:222
__IOM uint32_t CTL_LO
Definition hal_dma.h:226
__IOM uint32_t CTL_HI
Definition hal_dma.h:227
__IOM uint32_t DAR
Definition hal_dma.h:224
__IOM uint32_t LLP
Definition hal_dma.h:225
__IOM uint32_t DSTAT
Definition hal_dma.h:229
__IOM uint32_t SSTAT
Definition hal_dma.h:228
__IOM uint32_t SAR
Definition hal_dma.h:223
Управляющая структура передачи
Definition hal_dma.h:296
void * user_data
Definition hal_dma.h:298
DMA_Type * base
Definition hal_dma.h:299
dma_callback callback
Definition hal_dma.h:297
uint32_t channel
Definition hal_dma.h:300
Конфигурация многоблочной передачи
Definition hal_dma.h:306
uint32_t src_incr
Definition hal_dma.h:314
bool gather_en
Definition hal_dma.h:311
uint32_t dst_burst_size
Definition hal_dma.h:313
uint32_t src_data_width
Definition hal_dma.h:316
void * dst_addr
Definition hal_dma.h:319
bool scatter_en
Definition hal_dma.h:310
uint32_t count
Definition hal_dma.h:307
dma_transfer_type_t transfer_type
Definition hal_dma.h:309
uint32_t data_size
Definition hal_dma.h:308
void * src_addr
Definition hal_dma.h:318
uint32_t dst_data_width
Definition hal_dma.h:317
bool int_en
Definition hal_dma.h:320
uint32_t src_burst_size
Definition hal_dma.h:312
uint32_t dst_incr
Definition hal_dma.h:315
Описание конфигурации пересылки
Definition hal_dma.h:259
uint8_t dst_incr
Definition hal_dma.h:269
dma_transfer_type_t transfer_type
Definition hal_dma.h:263
bool scatter_en
Definition hal_dma.h:264
bool int_en
Definition hal_dma.h:272
bool gather_en
Definition hal_dma.h:265
bool llp_dst_en
Definition hal_dma.h:262
uint8_t src_incr
Definition hal_dma.h:268
uint8_t dst_tr_width
Definition hal_dma.h:271
uint8_t src_tr_width
Definition hal_dma.h:270
bool llp_src_en
Definition hal_dma.h:261
uint8_t dst_burst_size
Definition hal_dma.h:267
uint8_t src_burst_size
Definition hal_dma.h:266
uint16_t block_size
Definition hal_dma.h:260