@@ -84,25 +84,25 @@ void AudioInputAnalog::begin(unsigned int pin) | |||
SIM_SCGC7 |= SIM_SCGC7_DMA; | |||
SIM_SCGC6 |= SIM_SCGC6_DMAMUX; | |||
DMA_CR = 0; | |||
DMA_TCD2_SADDR = &ADC0_RA; | |||
DMA_TCD2_SOFF = 0; | |||
DMA_TCD2_ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD2_NBYTES_MLNO = 2; | |||
DMA_TCD2_SLAST = 0; | |||
DMA_TCD2_DADDR = analog_rx_buffer; | |||
DMA_TCD2_DOFF = 2; | |||
DMA_TCD2_CITER_ELINKNO = sizeof(analog_rx_buffer) / 2; | |||
DMA_TCD2_DLASTSGA = -sizeof(analog_rx_buffer); | |||
DMA_TCD2_BITER_ELINKNO = sizeof(analog_rx_buffer) / 2; | |||
DMA_TCD2_CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG2 = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG2 = DMAMUX_SOURCE_ADC0 | DMAMUX_ENABLE; | |||
DMA_TCD_SADDR(AUDIO_IN_ADC_DMA_CHANNEL) = &ADC0_RA; | |||
DMA_TCD_SOFF(AUDIO_IN_ADC_DMA_CHANNEL) = 0; | |||
DMA_TCD_ATTR(AUDIO_IN_ADC_DMA_CHANNEL) = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD_NBYTES_MLNO(AUDIO_IN_ADC_DMA_CHANNEL) = 2; | |||
DMA_TCD_SLAST(AUDIO_IN_ADC_DMA_CHANNEL) = 0; | |||
DMA_TCD_DADDR(AUDIO_IN_ADC_DMA_CHANNEL) = analog_rx_buffer; | |||
DMA_TCD_DOFF(AUDIO_IN_ADC_DMA_CHANNEL) = 2; | |||
DMA_TCD_CITER_ELINKNO(AUDIO_IN_ADC_DMA_CHANNEL) = sizeof(analog_rx_buffer) / 2; | |||
DMA_TCD_DLASTSGA(AUDIO_IN_ADC_DMA_CHANNEL) = -sizeof(analog_rx_buffer); | |||
DMA_TCD_BITER_ELINKNO(AUDIO_IN_ADC_DMA_CHANNEL) = sizeof(analog_rx_buffer) / 2; | |||
DMA_TCD_CSR(AUDIO_IN_ADC_DMA_CHANNEL) = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG(AUDIO_IN_ADC_DMA_CHANNEL) = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG(AUDIO_IN_ADC_DMA_CHANNEL) = DMAMUX_SOURCE_ADC0 | DMAMUX_ENABLE; | |||
update_responsibility = update_setup(); | |||
DMA_SERQ = 2; | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH2); | |||
DMA_SERQ = AUDIO_IN_ADC_DMA_CHANNEL; | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH(AUDIO_IN_ADC_DMA_CHANNEL)); | |||
} | |||
void dma_ch2_isr(void) | |||
void DMA_ISR(AUDIO_IN_ADC_DMA_CHANNEL)(void) | |||
{ | |||
uint32_t daddr, offset; | |||
const uint16_t *src, *end; | |||
@@ -110,8 +110,8 @@ void dma_ch2_isr(void) | |||
audio_block_t *left; | |||
//digitalWriteFast(3, HIGH); | |||
daddr = (uint32_t)DMA_TCD2_DADDR; | |||
DMA_CINT = 2; | |||
daddr = (uint32_t)(DMA_TCD_DADDR(AUDIO_IN_ADC_DMA_CHANNEL)); | |||
DMA_CINT = AUDIO_IN_ADC_DMA_CHANNEL; | |||
if (daddr < (uint32_t)analog_rx_buffer + sizeof(analog_rx_buffer) / 2) { | |||
// DMA is receiving to the first half of the buffer |
@@ -28,6 +28,13 @@ | |||
#define input_adc_h_ | |||
#include "AudioStream.h" | |||
#include "utility/dma_chan.h" | |||
#ifdef __MK20DX128__ | |||
#define AUDIO_IN_ADC_DMA_CHANNEL 2 | |||
#else | |||
#define AUDIO_IN_ADC_DMA_CHANNEL 6 | |||
#endif | |||
class AudioInputAnalog : public AudioStream | |||
{ | |||
@@ -35,7 +42,7 @@ public: | |||
AudioInputAnalog(unsigned int pin) : AudioStream(0, NULL) { begin(pin); } | |||
virtual void update(void); | |||
void begin(unsigned int pin); | |||
friend void dma_ch2_isr(void); | |||
friend void DMA_ISR(AUDIO_IN_ADC_DMA_CHANNEL)(void); | |||
private: | |||
static audio_block_t *block_left; | |||
static uint16_t block_offset; |
@@ -50,30 +50,30 @@ void AudioInputI2S::begin(void) | |||
CORE_PIN13_CONFIG = PORT_PCR_MUX(4); // pin 13, PTC5, I2S0_RXD0 | |||
DMA_CR = 0; | |||
DMA_TCD1_SADDR = &I2S0_RDR0; | |||
DMA_TCD1_SOFF = 0; | |||
DMA_TCD1_ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD1_NBYTES_MLNO = 2; | |||
DMA_TCD1_SLAST = 0; | |||
DMA_TCD1_DADDR = i2s_rx_buffer; | |||
DMA_TCD1_DOFF = 2; | |||
DMA_TCD1_CITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD1_DLASTSGA = -sizeof(i2s_rx_buffer); | |||
DMA_TCD1_BITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD1_CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG1 = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG1 = DMAMUX_SOURCE_I2S0_RX | DMAMUX_ENABLE; | |||
DMA_TCD_SADDR(AUDIO_IN_I2S_DMA_CHANNEL) = &I2S0_RDR0; | |||
DMA_TCD_SOFF(AUDIO_IN_I2S_DMA_CHANNEL) = 0; | |||
DMA_TCD_ATTR(AUDIO_IN_I2S_DMA_CHANNEL) = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD_NBYTES_MLNO(AUDIO_IN_I2S_DMA_CHANNEL) = 2; | |||
DMA_TCD_SLAST(AUDIO_IN_I2S_DMA_CHANNEL) = 0; | |||
DMA_TCD_DADDR(AUDIO_IN_I2S_DMA_CHANNEL) = i2s_rx_buffer; | |||
DMA_TCD_DOFF(AUDIO_IN_I2S_DMA_CHANNEL) = 2; | |||
DMA_TCD_CITER_ELINKNO(AUDIO_IN_I2S_DMA_CHANNEL) = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD_DLASTSGA(AUDIO_IN_I2S_DMA_CHANNEL) = -sizeof(i2s_rx_buffer); | |||
DMA_TCD_BITER_ELINKNO(AUDIO_IN_I2S_DMA_CHANNEL) = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD_CSR(AUDIO_IN_I2S_DMA_CHANNEL) = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG(AUDIO_IN_I2S_DMA_CHANNEL) = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG(AUDIO_IN_I2S_DMA_CHANNEL) = DMAMUX_SOURCE_I2S0_RX | DMAMUX_ENABLE; | |||
update_responsibility = update_setup(); | |||
DMA_SERQ = 1; | |||
DMA_SERQ = AUDIO_IN_I2S_DMA_CHANNEL; | |||
// TODO: is I2S_RCSR_BCE appropriate if sync'd to transmitter clock? | |||
//I2S0_RCSR |= I2S_RCSR_RE | I2S_RCSR_BCE | I2S_RCSR_FRDE | I2S_RCSR_FR; | |||
I2S0_RCSR |= I2S_RCSR_RE | I2S_RCSR_FRDE | I2S_RCSR_FR; | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH1); | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH(AUDIO_IN_I2S_DMA_CHANNEL)); | |||
} | |||
void dma_ch1_isr(void) | |||
void DMA_ISR(AUDIO_IN_I2S_DMA_CHANNEL)(void) | |||
{ | |||
uint32_t daddr, offset; | |||
const int16_t *src, *end; | |||
@@ -81,8 +81,8 @@ void dma_ch1_isr(void) | |||
audio_block_t *left, *right; | |||
//digitalWriteFast(3, HIGH); | |||
daddr = (uint32_t)DMA_TCD1_DADDR; | |||
DMA_CINT = 1; | |||
daddr = (uint32_t)(DMA_TCD_DADDR(AUDIO_IN_I2S_DMA_CHANNEL)); | |||
DMA_CINT = AUDIO_IN_I2S_DMA_CHANNEL; | |||
if (daddr < (uint32_t)i2s_rx_buffer + sizeof(i2s_rx_buffer) / 2) { | |||
// DMA is receiving to the first half of the buffer | |||
@@ -189,27 +189,27 @@ void AudioInputI2Sslave::begin(void) | |||
CORE_PIN13_CONFIG = PORT_PCR_MUX(4); // pin 13, PTC5, I2S0_RXD0 | |||
DMA_CR = 0; | |||
DMA_TCD1_SADDR = &I2S0_RDR0; | |||
DMA_TCD1_SOFF = 0; | |||
DMA_TCD1_ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD1_NBYTES_MLNO = 2; | |||
DMA_TCD1_SLAST = 0; | |||
DMA_TCD1_DADDR = i2s_rx_buffer; | |||
DMA_TCD1_DOFF = 2; | |||
DMA_TCD1_CITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD1_DLASTSGA = -sizeof(i2s_rx_buffer); | |||
DMA_TCD1_BITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD1_CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG1 = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG1 = DMAMUX_SOURCE_I2S0_RX | DMAMUX_ENABLE; | |||
DMA_TCD_SADDR(AUDIO_IN_I2S_DMA_CHANNEL) = &I2S0_RDR0; | |||
DMA_TCD_SOFF(AUDIO_IN_I2S_DMA_CHANNEL) = 0; | |||
DMA_TCD_ATTR(AUDIO_IN_I2S_DMA_CHANNEL) = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); | |||
DMA_TCD_NBYTES_MLNO(AUDIO_IN_I2S_DMA_CHANNEL) = 2; | |||
DMA_TCD_SLAST(AUDIO_IN_I2S_DMA_CHANNEL) = 0; | |||
DMA_TCD_DADDR(AUDIO_IN_I2S_DMA_CHANNEL) = i2s_rx_buffer; | |||
DMA_TCD_DOFF(AUDIO_IN_I2S_DMA_CHANNEL) = 2; | |||
DMA_TCD_CITER_ELINKNO(AUDIO_IN_I2S_DMA_CHANNEL) = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD_DLASTSGA(AUDIO_IN_I2S_DMA_CHANNEL) = -sizeof(i2s_rx_buffer); | |||
DMA_TCD_BITER_ELINKNO(AUDIO_IN_I2S_DMA_CHANNEL) = sizeof(i2s_rx_buffer) / 2; | |||
DMA_TCD_CSR(AUDIO_IN_I2S_DMA_CHANNEL) = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG(AUDIO_IN_I2S_DMA_CHANNEL) = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG(AUDIO_IN_I2S_DMA_CHANNEL) = DMAMUX_SOURCE_I2S0_RX | DMAMUX_ENABLE; | |||
update_responsibility = update_setup(); | |||
DMA_SERQ = 1; | |||
DMA_SERQ = AUDIO_IN_I2S_DMA_CHANNEL; | |||
// TODO: is I2S_RCSR_BCE appropriate if sync'd to transmitter clock? | |||
//I2S0_RCSR |= I2S_RCSR_RE | I2S_RCSR_BCE | I2S_RCSR_FRDE | I2S_RCSR_FR; | |||
I2S0_RCSR |= I2S_RCSR_RE | I2S_RCSR_FRDE | I2S_RCSR_FR; | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH1); | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH(AUDIO_IN_I2S_DMA_CHANNEL)); | |||
} | |||
@@ -24,10 +24,17 @@ | |||
* THE SOFTWARE. | |||
*/ | |||
#ifndef input_i2s_h_ | |||
#define _input_i2sh_ | |||
#ifndef _input_i2s_h_ | |||
#define _input_i2s_h_ | |||
#include "AudioStream.h" | |||
#include "utility/dma_chan.h" | |||
#ifdef __MK20DX128__ | |||
#define AUDIO_IN_I2S_DMA_CHANNEL 1 | |||
#else | |||
#define AUDIO_IN_I2S_DMA_CHANNEL 5 | |||
#endif | |||
class AudioInputI2S : public AudioStream | |||
{ | |||
@@ -35,7 +42,7 @@ public: | |||
AudioInputI2S(void) : AudioStream(0, NULL) { begin(); } | |||
virtual void update(void); | |||
void begin(void); | |||
friend void dma_ch1_isr(void); | |||
friend void DMA_ISR(AUDIO_IN_I2S_DMA_CHANNEL)(void); | |||
protected: | |||
AudioInputI2S(int dummy): AudioStream(0, NULL) {} // to be used only inside AudioInputI2Sslave !! | |||
static bool update_responsibility; |
@@ -55,22 +55,23 @@ void AudioOutputPWM::begin(void) | |||
SIM_SCGC7 |= SIM_SCGC7_DMA; | |||
SIM_SCGC6 |= SIM_SCGC6_DMAMUX; | |||
DMA_CR = 0; | |||
DMA_TCD3_SADDR = pwm_dma_buffer; | |||
DMA_TCD3_SOFF = 4; | |||
DMA_TCD3_ATTR = DMA_TCD_ATTR_SSIZE(2) | DMA_TCD_ATTR_DSIZE(2) | DMA_TCD_ATTR_DMOD(4); | |||
DMA_TCD3_NBYTES_MLNO = 8; | |||
DMA_TCD3_SLAST = -sizeof(pwm_dma_buffer); | |||
DMA_TCD3_DADDR = &FTM1_C0V; | |||
DMA_TCD3_DOFF = 8; | |||
DMA_TCD3_CITER_ELINKNO = sizeof(pwm_dma_buffer) / 8; | |||
DMA_TCD3_DLASTSGA = 0; | |||
DMA_TCD3_BITER_ELINKNO = sizeof(pwm_dma_buffer) / 8; | |||
DMA_TCD3_CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG3 = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG3 = DMAMUX_SOURCE_FTM1_CH0 | DMAMUX_ENABLE; | |||
DMA_SERQ = 3; | |||
DMA_TCD_SADDR(AUDIO_OUT_PWM_DMA_CHANNEL) = pwm_dma_buffer; | |||
DMA_TCD_SOFF(AUDIO_OUT_PWM_DMA_CHANNEL) = 4; | |||
DMA_TCD_ATTR(AUDIO_OUT_PWM_DMA_CHANNEL) = DMA_TCD_ATTR_SSIZE(2) | |||
| DMA_TCD_ATTR_DSIZE(2) | DMA_TCD_ATTR_DMOD(4); | |||
DMA_TCD_NBYTES_MLNO(AUDIO_OUT_PWM_DMA_CHANNEL) = 8; | |||
DMA_TCD_SLAST(AUDIO_OUT_PWM_DMA_CHANNEL) = -sizeof(pwm_dma_buffer); | |||
DMA_TCD_DADDR(AUDIO_OUT_PWM_DMA_CHANNEL) = &FTM1_C0V; | |||
DMA_TCD_DOFF(AUDIO_OUT_PWM_DMA_CHANNEL) = 8; | |||
DMA_TCD_CITER_ELINKNO(AUDIO_OUT_PWM_DMA_CHANNEL) = sizeof(pwm_dma_buffer) / 8; | |||
DMA_TCD_DLASTSGA(AUDIO_OUT_PWM_DMA_CHANNEL) = 0; | |||
DMA_TCD_BITER_ELINKNO(AUDIO_OUT_PWM_DMA_CHANNEL) = sizeof(pwm_dma_buffer) / 8; | |||
DMA_TCD_CSR(AUDIO_OUT_PWM_DMA_CHANNEL) = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; | |||
DMAMUX0_CHCFG(AUDIO_OUT_PWM_DMA_CHANNEL) = DMAMUX_DISABLE; | |||
DMAMUX0_CHCFG(AUDIO_OUT_PWM_DMA_CHANNEL) = DMAMUX_SOURCE_FTM1_CH0 | DMAMUX_ENABLE; | |||
DMA_SERQ = AUDIO_OUT_PWM_DMA_CHANNEL; | |||
update_responsibility = update_setup(); | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH3); | |||
NVIC_ENABLE_IRQ(IRQ_DMA_CH(AUDIO_OUT_PWM_DMA_CHANNEL)); | |||
} | |||
void AudioOutputPWM::update(void) | |||
@@ -96,15 +97,15 @@ void AudioOutputPWM::update(void) | |||
} | |||
} | |||
void dma_ch3_isr(void) | |||
void DMA_ISR(AUDIO_OUT_PWM_DMA_CHANNEL)(void) | |||
{ | |||
int16_t *src; | |||
uint32_t *dest; | |||
audio_block_t *block; | |||
uint32_t saddr, offset; | |||
saddr = (uint32_t)DMA_TCD3_SADDR; | |||
DMA_CINT = 3; | |||
saddr = (uint32_t)(DMA_TCD_SADDR(AUDIO_OUT_PWM_DMA_CHANNEL)); | |||
DMA_CINT = AUDIO_OUT_PWM_DMA_CHANNEL; | |||
if (saddr < (uint32_t)pwm_dma_buffer + sizeof(pwm_dma_buffer) / 2) { | |||
// DMA is transmitting the first half of the buffer | |||
// so we must fill the second half |
@@ -28,6 +28,13 @@ | |||
#define output_pwm_h_ | |||
#include "AudioStream.h" | |||
#include "utility/dma_chan.h" | |||
#ifdef __MK20DX128__ | |||
#define AUDIO_OUT_PWM_DMA_CHANNEL 3 | |||
#else | |||
#define AUDIO_OUT_PWM_DMA_CHANNEL 7 | |||
#endif | |||
class AudioOutputPWM : public AudioStream | |||
{ | |||
@@ -35,7 +42,7 @@ public: | |||
AudioOutputPWM(void) : AudioStream(1, inputQueueArray) { begin(); } | |||
virtual void update(void); | |||
void begin(void); | |||
friend void dma_ch3_isr(void); | |||
friend void DMA_ISR(AUDIO_OUT_PWM_DMA_CHANNEL)(void); | |||
private: | |||
static audio_block_t *block_1st; | |||
static audio_block_t *block_2nd; |
@@ -0,0 +1,72 @@ | |||
/* Audio Library for Teensy 3.X | |||
* Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com | |||
* | |||
* Development of this audio library was funded by PJRC.COM, LLC by sales of | |||
* Teensy and Audio Adaptor boards. Please support PJRC's efforts to develop | |||
* open source software by purchasing Teensy or other PJRC products. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a copy | |||
* of this software and associated documentation files (the "Software"), to deal | |||
* in the Software without restriction, including without limitation the rights | |||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
* copies of the Software, and to permit persons to whom the Software is | |||
* furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice, development funding notice, and this permission | |||
* notice shall be included in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
* THE SOFTWARE. | |||
*/ | |||
#ifndef dma_chan_h_ | |||
#define dma_chan_h_ | |||
#define DMA_ISR(ch) DMA_ISR_EXP(ch) | |||
#define DMA_ISR_EXP(ch) dma_ch ## ch ## _isr | |||
#define IRQ_DMA_CH(ch) IRQ_DMA_CH_EXP(ch) | |||
#define IRQ_DMA_CH_EXP(ch) IRQ_DMA_CH ## ch | |||
#define DMAMUX0_CHCFG(ch) DMAMUX0_CHCFG_EXP(ch) | |||
#define DMAMUX0_CHCFG_EXP(ch) DMAMUX0_CHCFG ## ch | |||
#define DMA_TCD_SADDR(ch) DMA_TCD_SADDR_EXP(ch) | |||
#define DMA_TCD_SADDR_EXP(ch) DMA_TCD ## ch ## _SADDR | |||
#define DMA_TCD_SOFF(ch) DMA_TCD_SOFF_EXP(ch) | |||
#define DMA_TCD_SOFF_EXP(ch) DMA_TCD ## ch ## _SOFF | |||
#define DMA_TCD_ATTR(ch) DMA_TCD_ATTR_EXP(ch) | |||
#define DMA_TCD_ATTR_EXP(ch) DMA_TCD ## ch ## _ATTR | |||
#define DMA_TCD_NBYTES_MLNO(ch) DMA_TCD_NBYTES_MLNO_EXP(ch) | |||
#define DMA_TCD_NBYTES_MLNO_EXP(ch) DMA_TCD ## ch ## _NBYTES_MLNO | |||
#define DMA_TCD_SLAST(ch) DMA_TCD_SLAST_EXP(ch) | |||
#define DMA_TCD_SLAST_EXP(ch) DMA_TCD ## ch ## _SLAST | |||
#define DMA_TCD_DADDR(ch) DMA_TCD_DADDR_EXP(ch) | |||
#define DMA_TCD_DADDR_EXP(ch) DMA_TCD ## ch ## _DADDR | |||
#define DMA_TCD_DOFF(ch) DMA_TCD_DOFF_EXP(ch) | |||
#define DMA_TCD_DOFF_EXP(ch) DMA_TCD ## ch ## _DOFF | |||
#define DMA_TCD_CITER_ELINKNO(ch) DMA_TCD_CITER_ELINKNO_EXP(ch) | |||
#define DMA_TCD_CITER_ELINKNO_EXP(ch) DMA_TCD ## ch ## _CITER_ELINKNO | |||
#define DMA_TCD_DLASTSGA(ch) DMA_TCD_DLASTSGA_EXP(ch) | |||
#define DMA_TCD_DLASTSGA_EXP(ch) DMA_TCD ## ch ## _DLASTSGA | |||
#define DMA_TCD_BITER_ELINKNO(ch) DMA_TCD_BITER_ELINKNO_EXP(ch) | |||
#define DMA_TCD_BITER_ELINKNO_EXP(ch) DMA_TCD ## ch ## _BITER_ELINKNO | |||
#define DMA_TCD_CSR(ch) DMA_TCD_CSR_EXP(ch) | |||
#define DMA_TCD_CSR_EXP(ch) DMA_TCD ## ch ## _CSR | |||
#endif |