ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_dmac.c
Go to the documentation of this file.
1
35
36#include "ra8_dmac.h"
37
38#include <stdint.h>
39
40#include "ra8_attributes.h"
41#include "ra8_check.h"
42#include "ra8_dmac_internal.h"
43#include "ra8_dmac_regs.h"
44#include "ra8_err.h"
45#include "ra8_log.h"
46#include "ra8_mstp.h"
47
64bool priv_ra8_dmac_internal_mode_disables_dts(uint32_t mode_normal_val,
65 uint32_t mode_repeat_block_val,
66 uint32_t mode)
67{
68 return (mode == mode_normal_val) || (mode == mode_repeat_block_val);
69}
70
88 uint32_t mode_repeat_block_val,
89 uint32_t mode)
90{
91 return irq_each && (mode != mode_repeat_block_val);
92}
93
94static const char* s_tag = "DMAC";
95
96/* =============================================================================
97 * Local helpers
98 * =============================================================================
99 */
100
124RA8_INTERNAL static inline uint16_t internal_sz_code(ra8_dmac_width_t width)
125{
126 switch (width) {
128 return k_ra8_dmtmd_sz_byte;
130 return k_ra8_dmtmd_sz_half;
132 return k_ra8_dmtmd_sz_word;
133 default:
134 return k_ra8_dmtmd_sz_byte;
135 }
136}
137
163{
164 switch (mode) {
173 default:
175 }
176}
177
199{
202 (uint32_t)mode)) {
204 }
205 switch (area) {
211 default:
213 }
214}
215
235RA8_INTERNAL static inline uint16_t internal_dmamd_value(bool src_inc, bool dst_inc)
236{
237 uint16_t v = 0U;
238 if (src_inc) {
240 }
241 if (dst_inc) {
243 }
244 return v;
245}
246
264RA8_INTERNAL static inline uint16_t internal_dmtmd_value(const ra8_dmac_config_t* cfg)
265{
266 uint16_t v = 0U;
267 v |= (uint16_t)(internal_sz_code(cfg->width) << k_ra8_dmtmd_sz_pos);
268 v |= (uint16_t)(internal_md_code(cfg->mode) << k_ra8_dmtmd_md_pos);
269 v |= (uint16_t)(internal_dts_code(cfg->mode, cfg->repeat_area) << k_ra8_dmtmd_dts_pos);
270 return v;
271}
272
291RA8_INTERNAL static inline uint8_t internal_dmint_value(const ra8_dmac_config_t* cfg)
292{
293 uint8_t v = 0U;
294 if (cfg->enable_dtie) {
296 }
299 (uint32_t)cfg->mode)) {
301 }
302 return v;
303}
304
323RA8_INTERNAL static inline uint32_t internal_dmcra_value(const ra8_dmac_config_t* cfg)
324{
325 uint32_t v = (uint32_t)cfg->count;
326 if (cfg->mode != k_ra8_dmac_mode_normal) {
327 v |= ((uint32_t)cfg->count << k_ra8_dmcra_high_pos);
329 }
330 return v;
331}
332
333/* Validate a `cfg` descriptor before touching hardware -- see implementation for details. */
335{
336 if (cfg->width > k_ra8_dmac_width_word) {
338 }
341 }
342 return k_ra8_ok;
343}
344
364 const ra8_dmac_config_t* cfg)
365{
366 /* HUM 17.2.14 DMCNT, p 743 -- clear DTE before reprogramming. */
367 reg->DMCNT = 0U;
368 /* HUM 17.2.10 DMTMD, p 738. */
369 reg->DMTMD = internal_dmtmd_value(cfg);
370 /* HUM 17.2.12 DMAMD, p 741. */
371 reg->DMAMD = internal_dmamd_value(cfg->src_inc, cfg->dst_inc);
372 /* HUM 17.2.4 DMSAR p 734, 17.2.6 DMDAR p 735. */
373 reg->DMSAR = cfg->src;
374 reg->DMDAR = cfg->dst;
375 /* HUM 17.2.8 DMCRA. */
376 reg->DMCRA = internal_dmcra_value(cfg);
377 /* HUM 17.2.9 DMCRB p 737 -- "Set the same value for DMCRBH and DMCRBL
378 * in repeat transfer mode, block transfer mode and repeat-block
379 * transfer mode." Mirror block_count into both halves; normal mode
380 * leaves DMCRB at 0 ("In normal transfer mode, DMCRB is not used"). */
381 if (cfg->mode == k_ra8_dmac_mode_normal) {
382 reg->DMCRB = 0U;
383 } else {
384 const uint32_t bc = (uint32_t)cfg->block_count;
385 reg->DMCRB = bc | (bc << k_ra8_dmcra_high_pos);
386 }
387 /* HUM 17.2.13 DMOFR p 743 -- offset-addition not exposed. */
388 reg->DMOFR = 0U;
389 /* HUM 17.2.11 DMINT p 739. */
390 reg->DMINT = internal_dmint_value(cfg);
391}
392
393/* =============================================================================
394 * Public API
395 * =============================================================================
396 */
397
398ra8_err_t ra8_dmac_start(uint8_t channel, const ra8_dmac_config_t* cfg)
399{
400 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
401 const ra8_err_t verr = internal_validate_cfg(cfg);
402 if (verr != k_ra8_ok) {
403 return verr;
404 }
405
406 volatile r_dmac_channel_regs_t* reg = ra8_dmac(channel);
407 if (reg == nullptr) {
409 }
410
411 /* DMAC0 + DTC0 share MSTPA22; the ref count tracks how many DMAC
412 * channels (or the DTC) currently need the bit cleared.
413 * HUM Ch 11.2.6 "MSTPCRA : Module Stop Control Register A", p 443. */
415 RA8_RETURN_ON_ERROR(mst_err, s_tag, "dmac_start: mstp enable");
416
417 internal_program_channel(reg, cfg);
418
419 /* HUM 17.2.20 DMAST p 749 -- the shared activation gate must be
420 * set before any per-channel DTE write takes effect. FSP does the
421 * same in `R_DMAC_Open` (`r_dmac.c` line 178). Idempotent: leaving
422 * it set across multiple channels is the documented behaviour. */
424
425 /* HUM 17.2.14 DMCNT p 743 -- arm the channel. */
427
428 ra8_log_info_val(s_tag, "dmac_start ch", (uint32_t)channel);
429 return k_ra8_ok;
430}
431
432ra8_err_t ra8_dmac_stop(uint8_t channel)
433{
434 volatile r_dmac_channel_regs_t* reg = ra8_dmac(channel);
435 if (reg == nullptr) {
437 }
438 /* HUM 17.2.14 DMCNT p 743. */
439 reg->DMCNT = 0U;
440 /* Drop the matching MSTP reference acquired in ra8_dmac_start. */
442}
443
444/* =============================================================================
445 * Sweep 6 extensions: repeat / block start helpers, address-mode, callbacks
446 * =============================================================================
447 */
448
464
467
468/* Force ``cfg->mode`` then delegate to the validated start path -- see implementation for details. */
470internal_start_with_mode(uint8_t channel, const ra8_dmac_config_t* cfg, ra8_dmac_mode_t forced_mode)
471{
472 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
473 ra8_dmac_config_t local = *cfg;
474 local.mode = forced_mode;
475 return ra8_dmac_start(channel, &local);
476}
477
479{
481}
482
484{
485 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg must not be nullptr");
486 if (cfg->block_count == 0U) {
488 }
490}
491
493 ra8_dmac_addr_mode_t src_mode,
494 ra8_dmac_addr_mode_t dest_mode)
495{
496 if ((src_mode > k_ra8_dmac_addr_decrement) || (dest_mode > k_ra8_dmac_addr_decrement)) {
498 }
499 volatile r_dmac_channel_regs_t* reg = ra8_dmac(channel);
500 if (reg == nullptr) {
502 }
503 /* HUM 17.2.12 DMAMD p 741 -- preserve DARA/SARA/DADR/SADR fields and
504 * only rewrite the SM/DM 2-bit slots. */
505 uint16_t v = reg->DMAMD;
506 v &= (uint16_t)~(k_ra8_dmamd_sm_mask | k_ra8_dmamd_dm_mask);
507 v |= (uint16_t)((uint16_t)src_mode << k_ra8_dmamd_sm_pos);
508 v |= (uint16_t)((uint16_t)dest_mode << k_ra8_dmamd_dm_pos);
509 reg->DMAMD = v;
510 return k_ra8_ok;
511}
512
515{
516 if (channel >= k_ra8_dmac_channel_count) {
518 }
519 s_dmac_cb_slots[channel].half_fn = fn;
520 s_dmac_cb_slots[channel].half_ctx = ctx;
521 return k_ra8_ok;
522}
523
525{
526 if (channel >= k_ra8_dmac_channel_count) {
528 }
529 s_dmac_cb_slots[channel].full_fn = fn;
530 s_dmac_cb_slots[channel].full_ctx = ctx;
531 return k_ra8_ok;
532}
533
535void ra8_dmac_dispatch(uint8_t channel)
536{
537 if (channel >= k_ra8_dmac_channel_count) {
538 return;
539 }
540 const ra8_dmac_callback_fn_t fn = s_dmac_cb_slots[channel].full_fn;
541 void* const ctx = s_dmac_cb_slots[channel].full_ctx;
542 if (fn != nullptr) {
543 fn(ctx);
544 }
545}
546
548void ra8_dmac_dispatch_half(uint8_t channel)
549{
550 if (channel >= k_ra8_dmac_channel_count) {
551 return;
552 }
553 const ra8_dmac_callback_fn_t fn = s_dmac_cb_slots[channel].half_fn;
554 void* const ctx = s_dmac_cb_slots[channel].half_ctx;
555 if (fn != nullptr) {
556 fn(ctx);
557 }
558}
559
560/* =============================================================================
561 * Software trigger + completion query (DMREQ.SWREQ / DMSTS.ACT)
562 * =============================================================================
563 */
564
566{
567 volatile r_dmac_channel_regs_t* reg = ra8_dmac(channel);
568 if (reg == nullptr) {
570 }
571 /* HUM Ch 17.2.15 "DMREQ : DMAC Software Start Register" p 744 */
572 reg->DMREQ = (uint8_t)k_ra8_dmreq_swreq_mask;
573 return k_ra8_ok;
574}
575
576ra8_err_t ra8_dmac_is_active(uint8_t channel, bool* out_active)
577{
578 RA8_CHECK_NULL_PTR(out_active, s_tag, "out_active must not be nullptr");
579 volatile const r_dmac_channel_regs_t* reg = ra8_dmac(channel);
580 if (reg == nullptr) {
582 }
583 /* HUM Ch 17.2.16 "DMSTS : DMAC Status Register" p 745 */
584 *out_active = ((reg->DMSTS & (uint8_t)k_ra8_dmsts_act_mask) != 0U);
585 return k_ra8_ok;
586}
587
588ra8_err_t ra8_dmac_wait_idle(uint8_t channel, uint32_t poll_limit)
589{
590 volatile const r_dmac_channel_regs_t* reg = ra8_dmac(channel);
591 if (reg == nullptr) {
593 }
594 for (uint32_t i = 0U; i < poll_limit; ++i) {
595 /* HUM Ch 17.2.16 "DMSTS : DMAC Status Register" p 745 */
596 if ((reg->DMSTS & (uint8_t)k_ra8_dmsts_act_mask) == 0U) {
597 return k_ra8_ok;
598 }
599 }
601}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Definition ra8_check.h:184
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
void ra8_dmac_dispatch_half(uint8_t channel)
Fire the per-channel half-complete callback (DMINT.RPTIE path).
Definition ra8_dmac.c:548
static void internal_program_channel(volatile r_dmac_channel_regs_t *reg, const ra8_dmac_config_t *cfg)
Programme every per-channel register from cfg.
Definition ra8_dmac.c:363
bool priv_ra8_dmac_internal_mode_disables_dts(uint32_t mode_normal_val, uint32_t mode_repeat_block_val, uint32_t mode)
Pure DTS-disabled predicate – see header for full contract.
Definition ra8_dmac.c:64
static uint16_t internal_md_code(ra8_dmac_mode_t mode)
Translate cfg->mode -> DMTMD.MD 2-bit code.
Definition ra8_dmac.c:162
static uint32_t internal_dmcra_value(const ra8_dmac_config_t *cfg)
Compose the DMCRA register value.
Definition ra8_dmac.c:323
void ra8_dmac_dispatch(uint8_t channel)
Fire the per-channel completion callback (DMINT.DTIE path).
Definition ra8_dmac.c:535
static uint16_t internal_dts_code(ra8_dmac_mode_t mode, ra8_dmac_repeat_area_t area)
Translate cfg->repeat_area -> DMTMD.DTS 2-bit code.
Definition ra8_dmac.c:197
ra8_err_t ra8_dmac_start_repeat(uint8_t channel, const ra8_dmac_config_t *cfg)
Programme a DMAC channel in repeat-area transfer mode.
Definition ra8_dmac.c:478
ra8_err_t ra8_dmac_attach_half_complete_handler(uint8_t channel, ra8_dmac_callback_fn_t fn, void *ctx)
Attach a half-block IRQ callback to a DMAC channel.
Definition ra8_dmac.c:514
ra8_err_t ra8_dmac_stop(uint8_t channel)
Disable a DMAC0 channel and drop its MSTP reference.
Definition ra8_dmac.c:432
static ra8_err_t internal_validate_cfg(const ra8_dmac_config_t *cfg)
Definition ra8_dmac.c:334
ra8_err_t ra8_dmac_is_active(uint8_t channel, bool *out_active)
Query whether a DMAC0 channel is mid-transfer.
Definition ra8_dmac.c:576
ra8_err_t ra8_dmac_start(uint8_t channel, const ra8_dmac_config_t *cfg)
Programme and enable a DMAC0 channel.
Definition ra8_dmac.c:398
static uint16_t internal_dmtmd_value(const ra8_dmac_config_t *cfg)
Compose the DMTMD register value.
Definition ra8_dmac.c:264
ra8_err_t ra8_dmac_set_address_mode(uint8_t channel, ra8_dmac_addr_mode_t src_mode, ra8_dmac_addr_mode_t dest_mode)
Override the DMAMD.SM / DMAMD.DM address-update modes.
Definition ra8_dmac.c:492
ra8_err_t ra8_dmac_start_block(uint8_t channel, const ra8_dmac_config_t *cfg)
Programme a DMAC channel in block-transfer mode.
Definition ra8_dmac.c:483
static ra8_dmac_cb_slot_t s_dmac_cb_slots[k_ra8_dmac_channel_count]
One slot per DMAC0 channel.
Definition ra8_dmac.c:466
static uint16_t internal_sz_code(ra8_dmac_width_t width)
Translate cfg->width -> DMTMD.SZ 2-bit code.
Definition ra8_dmac.c:124
static ra8_err_t internal_start_with_mode(uint8_t channel, const ra8_dmac_config_t *cfg, ra8_dmac_mode_t forced_mode)
Definition ra8_dmac.c:470
ra8_err_t ra8_dmac_wait_idle(uint8_t channel, uint32_t poll_limit)
Spin until a DMAC0 channel goes idle or a poll bound expires.
Definition ra8_dmac.c:588
static uint16_t internal_dmamd_value(bool src_inc, bool dst_inc)
Compose the DMAMD register value from the increment flags.
Definition ra8_dmac.c:235
bool priv_ra8_dmac_internal_dmint_extra_irq(bool irq_each, uint32_t mode_repeat_block_val, uint32_t mode)
Pure extra-IRQ predicate – see header for full contract.
Definition ra8_dmac.c:87
static uint8_t internal_dmint_value(const ra8_dmac_config_t *cfg)
Compose the DMINT register value.
Definition ra8_dmac.c:291
ra8_err_t ra8_dmac_attach_callback(uint8_t channel, ra8_dmac_callback_fn_t fn, void *ctx)
Attach a transfer-end IRQ callback to a DMAC channel.
Definition ra8_dmac.c:524
ra8_err_t ra8_dmac_software_trigger(uint8_t channel)
Software-trigger one transfer request on a DMAC0 channel.
Definition ra8_dmac.c:565
8-channel DMA controller (DMAC0) driver
void(* ra8_dmac_callback_fn_t)(void *ctx)
Per-channel DMAC completion / half-complete callback signature.
Definition ra8_dmac.h:212
ra8_dmac_mode_t
Transfer mode select.
Definition ra8_dmac.h:67
@ k_ra8_dmac_mode_repeat
DMTMD.MD = 01b.
Definition ra8_dmac.h:69
@ k_ra8_dmac_mode_repeat_block
DMTMD.MD = 11b.
Definition ra8_dmac.h:71
@ k_ra8_dmac_mode_normal
DMTMD.MD = 00b.
Definition ra8_dmac.h:68
@ k_ra8_dmac_mode_block
DMTMD.MD = 10b.
Definition ra8_dmac.h:70
ra8_dmac_repeat_area_t
Selects which side is the repeat / block area (DMTMD.DTS).
Definition ra8_dmac.h:82
@ k_ra8_dmac_repeat_area_dest
DTS = 00b.
Definition ra8_dmac.h:83
@ k_ra8_dmac_repeat_area_none
DTS = 10b.
Definition ra8_dmac.h:85
@ k_ra8_dmac_repeat_area_src
DTS = 01b.
Definition ra8_dmac.h:84
ra8_dmac_width_t
Transfer element width.
Definition ra8_dmac.h:50
@ k_ra8_dmac_width_word
32-bit transfers (DMTMD.SZ = 10b).
Definition ra8_dmac.h:53
@ k_ra8_dmac_width_byte
8-bit transfers (DMTMD.SZ = 00b).
Definition ra8_dmac.h:51
@ k_ra8_dmac_width_half
16-bit transfers (DMTMD.SZ = 01b).
Definition ra8_dmac.h:52
ra8_dmac_addr_mode_t
Per-side address-update mode (DMAMD.SM / DMAMD.DM).
Definition ra8_dmac.h:196
@ k_ra8_dmac_addr_decrement
11b: decrement.
Definition ra8_dmac.h:200
Test-access surface for ra8_dmac internal helpers (MC/DC).
DMAC (Direct Memory Access Controller) register layout for the RA8D2.
static volatile r_dmac_channel_regs_t * ra8_dmac(uint8_t channel)
Pointer to DMAC channel channel (0..7), or NULL on error.
@ k_ra8_dmac_channel_count
RA8 DMAC channel count.
@ k_ra8_dmamd_dm_mask
RA8 dmamd dm mask.
@ k_ra8_dmamd_sm_mask
RA8 dmamd sm mask.
@ k_ra8_dmtmd_md_normal
00b: normal transfer.
@ k_ra8_dmtmd_md_repeat
01b: repeat transfer.
@ k_ra8_dmtmd_md_repeat_block
11b: repeat-block transfer.
@ k_ra8_dmtmd_md_block
10b: block transfer.
@ k_ra8_dmcra_low_mask
RA8 dmcra low mask.
@ k_ra8_dmcra_high_mask
RA8 dmcra high mask.
@ k_ra8_dmcra_high_pos
RA8 dmcra high pos.
@ k_ra8_dmcnt_dte_mask
RA8 dmcnt dte mask.
@ k_ra8_dmreq_swreq_mask
RA8 dmreq swreq mask.
@ k_ra8_dmast_dmst_mask
RA8 dmast dmst mask.
@ k_ra8_dmamd_dm_pos
DM[1:0] dst addr update mode.
@ k_ra8_dmamd_sm_pos
SM[1:0] src addr update mode.
static volatile r_dma_shared_regs_t * ra8_dma_shared(void)
Pointer to the shared DMA module-control bank.
@ k_ra8_dmint_esie_mask
RA8 dmint esie mask.
@ k_ra8_dmint_rptie_mask
RA8 dmint rptie mask.
@ k_ra8_dmint_dtie_mask
RA8 dmint dtie mask.
@ k_ra8_dmtmd_sz_pos
SZ[1:0] bit 8..9 – transfer size.
@ k_ra8_dmtmd_md_pos
MD[1:0] bit 14..15 – mode.
@ k_ra8_dmtmd_dts_pos
DTS[1:0] bit 12..13 – repeat area.
@ k_ra8_dmtmd_sz_byte
00b: 8-bit.
@ k_ra8_dmtmd_sz_word
10b: 32-bit.
@ k_ra8_dmtmd_sz_half
01b: 16-bit.
@ k_ra8_dmamd_addr_increment
10b: increment.
@ k_ra8_dmsts_act_mask
RA8 dmsts act mask.
@ k_ra8_dmtmd_dts_dest_repeat
00b: dest is repeat/block area.
@ k_ra8_dmtmd_dts_none
10b: no repeat/block area.
@ k_ra8_dmtmd_dts_src_repeat
01b: src is repeat/block area.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_out_of_range
Sensor or peripheral output out of valid range.
Definition ra8_err.h:337
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
Definition ra8_err.h:304
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
Definition ra8_mstp.c:343
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
Definition ra8_mstp.c:382
@ k_ra8_mstp_dmac0_dtc0
MSTPA22 DMAC0+DTC0 (shared).
volatile uint8_t DMAST
+0x00 DMA Module Activation (bit DMST).
Per-channel DMAC register window.
volatile uint8_t DMSTS
+0x1E Status (ESIF/DTIF/ACT).
volatile uint16_t DMAMD
+0x14 Address Mode.
volatile uint8_t DMREQ
+0x1D Software Start (SWREQ/CLRS).
volatile uint16_t DMTMD
+0x10 Transfer Mode.
volatile uint8_t DMINT
+0x13 Interrupt Setting.
volatile uint32_t DMOFR
+0x18 Offset Register.
volatile uint32_t DMSAR
+0x00 Source address.
volatile uint32_t DMCRA
+0x08 Transfer count (DMCRAL/DMCRAH).
volatile uint8_t DMCNT
+0x1C Transfer Enable (bit DTE).
volatile uint32_t DMCRB
+0x0C Block transfer count.
volatile uint32_t DMDAR
+0x04 Destination address.
Per-channel callback slot pair (full-complete + half-complete).
Definition ra8_dmac.c:458
void * half_ctx
Context for half_fn.
Definition ra8_dmac.c:462
void * full_ctx
Context for full_fn.
Definition ra8_dmac.c:460
ra8_dmac_callback_fn_t half_fn
DMINT.RPTIE user handler.
Definition ra8_dmac.c:461
ra8_dmac_callback_fn_t full_fn
DMINT.DTIE user handler.
Definition ra8_dmac.c:459
DMAC channel configuration.
Definition ra8_dmac.h:121
ra8_dmac_mode_t mode
Transfer mode (DMTMD.MD).
Definition ra8_dmac.h:128
ra8_dmac_repeat_area_t repeat_area
DMTMD.DTS area select.
Definition ra8_dmac.h:130
uint16_t count
Transfer count (DMCRA low).
Definition ra8_dmac.h:124
bool irq_each
Enable RPTIE/ESIE per repeat.
Definition ra8_dmac.h:131
uint32_t src
Source address (DMSAR).
Definition ra8_dmac.h:122
bool enable_dtie
Enable DMINT.DTIE on full end.
Definition ra8_dmac.h:132
bool dst_inc
true: DM = increment, else fixed.
Definition ra8_dmac.h:127
bool src_inc
true: SM = increment, else fixed.
Definition ra8_dmac.h:126
uint16_t block_count
DMCRB block/repeat count.
Definition ra8_dmac.h:129
uint32_t dst
Destination address (DMDAR).
Definition ra8_dmac.h:123
ra8_dmac_width_t width
Transfer element width.
Definition ra8_dmac.h:125