Fix PDMIn.c formatting
This commit is contained in:
parent
7fc0aa5791
commit
6d3698848c
@ -110,74 +110,75 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t *self,
|
|||||||
} else if (clock_pin == &pin_PB11) {
|
} else if (clock_pin == &pin_PB11) {
|
||||||
self->clock_unit = 1;
|
self->clock_unit = 1;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#else
|
||||||
#ifdef SAM_D5X_E5X
|
#ifdef SAM_D5X_E5X
|
||||||
if (clock_pin == &pin_PA10 || clock_pin == &pin_PB16) {
|
if (clock_pin == &pin_PA10 || clock_pin == &pin_PB16) {
|
||||||
self->clock_unit = 0;
|
self->clock_unit = 0;
|
||||||
} else if (clock_pin == &pin_PB12
|
} else if (clock_pin == &pin_PB12
|
||||||
#if defined(PIN_PB28) && !defined(IGNORE_PIN_PB28)
|
#if defined(PIN_PB28) && !defined(IGNORE_PIN_PB28)
|
||||||
|| data_pin == &pin_PB28) {
|
|| data_pin == &pin_PB28
|
||||||
#else
|
#endif
|
||||||
) {
|
) {
|
||||||
#endif
|
|
||||||
self->clock_unit = 1;
|
self->clock_unit = 1;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
#endif
|
||||||
raise_ValueError_invalid_pin_name(MP_QSTR_clock);
|
} else {
|
||||||
}
|
raise_ValueError_invalid_pin_name(MP_QSTR_clock);
|
||||||
|
}
|
||||||
|
|
||||||
self->data_pin = data_pin; // PA07, PA19 -> SD0, PA08, PB16 -> SD1
|
self->data_pin = data_pin; // PA07, PA19 -> SD0, PA08, PB16 -> SD1
|
||||||
|
|
||||||
#ifdef SAMD21
|
#ifdef SAMD21
|
||||||
if (false
|
if (false
|
||||||
#if defined(PIN_PA07) && !defined(IGNORE_PIN_PA07)
|
#if defined(PIN_PA07) && !defined(IGNORE_PIN_PA07)
|
||||||
|| data_pin == &pin_PA07
|
|| data_pin == &pin_PA07
|
||||||
#endif
|
#endif
|
||||||
#if defined(PIN_PA19) && !defined(IGNORE_PIN_PA19)
|
#if defined(PIN_PA19) && !defined(IGNORE_PIN_PA19)
|
||||||
|| data_pin == &pin_PA19
|
|| data_pin == &pin_PA19
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
self->serializer = 0;
|
self->serializer = 0;
|
||||||
} else if (false
|
} else if (false
|
||||||
#if defined(PIN_PA08) && !defined(IGNORE_PIN_PA08)
|
#if defined(PIN_PA08) && !defined(IGNORE_PIN_PA08)
|
||||||
|| data_pin == &pin_PA08
|
|| data_pin == &pin_PA08
|
||||||
|
#endif
|
||||||
|
#if defined(PIN_PB16) && !defined(IGNORE_PIN_PB16)
|
||||||
|
|| data_pin == &pin_PB16
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
self->serializer = 1;
|
||||||
|
#else
|
||||||
|
#ifdef SAM_D5X_E5X
|
||||||
|
if (data_pin == &pin_PB10 || data_pin == &pin_PA22) {
|
||||||
|
self->serializer = 1;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(PIN_PB16) && !defined(IGNORE_PIN_PB16)
|
} else {
|
||||||
|| data_pin == &pin_PB16
|
raise_ValueError_invalid_pin_name(MP_QSTR_data);
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
self->serializer = 1;
|
|
||||||
#endif
|
|
||||||
#ifdef SAM_D5X_E5X
|
|
||||||
if (data_pin == &pin_PB10 || data_pin == &pin_PA22) {
|
|
||||||
self->serializer = 1;
|
|
||||||
#endif
|
|
||||||
}else {
|
|
||||||
raise_ValueError_invalid_pin_name(MP_QSTR_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(bit_depth == 16 || bit_depth == 8) || !mono || oversample != OVERSAMPLING) {
|
|
||||||
mp_raise_NotImplementedError(translate("Only 8 or 16 bit mono with " MP_STRINGIFY(OVERSAMPLING) "x oversampling is supported."));
|
|
||||||
}
|
|
||||||
|
|
||||||
turn_on_i2s();
|
|
||||||
|
|
||||||
if (I2S->CTRLA.bit.ENABLE == 0) {
|
|
||||||
I2S->CTRLA.bit.SWRST = 1;
|
|
||||||
while (I2S->CTRLA.bit.SWRST == 1) {
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
#ifdef SAMD21
|
if (!(bit_depth == 16 || bit_depth == 8) || !mono || oversample != OVERSAMPLING) {
|
||||||
if ((I2S->CTRLA.vec.SEREN & (1 << self->serializer)) != 0) {
|
mp_raise_NotImplementedError(translate("Only 8 or 16 bit mono with " MP_STRINGIFY(OVERSAMPLING) "x oversampling is supported."));
|
||||||
mp_raise_RuntimeError(translate("Serializer in use"));
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef SAM_D5X_E5X
|
turn_on_i2s();
|
||||||
if (I2S->CTRLA.bit.RXEN == 1) {
|
|
||||||
mp_raise_RuntimeError(translate("Serializer in use"));
|
if (I2S->CTRLA.bit.ENABLE == 0) {
|
||||||
|
I2S->CTRLA.bit.SWRST = 1;
|
||||||
|
while (I2S->CTRLA.bit.SWRST == 1) {
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#ifdef SAMD21
|
||||||
|
if ((I2S->CTRLA.vec.SEREN & (1 << self->serializer)) != 0) {
|
||||||
|
mp_raise_RuntimeError(translate("Serializer in use"));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef SAM_D5X_E5X
|
||||||
|
if (I2S->CTRLA.bit.RXEN == 1) {
|
||||||
|
mp_raise_RuntimeError(translate("Serializer in use"));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef SAM_D5X_E5X
|
#ifdef SAM_D5X_E5X
|
||||||
#define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_J
|
#define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_J
|
||||||
#endif
|
#endif
|
||||||
@ -185,62 +186,62 @@ if (I2S->CTRLA.bit.ENABLE == 0) {
|
|||||||
#define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_G
|
#define GPIO_I2S_FUNCTION GPIO_PIN_FUNCTION_G
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t clock_divisor = (uint32_t)roundf(48000000.0f / sample_rate / oversample);
|
uint32_t clock_divisor = (uint32_t)roundf(48000000.0f / sample_rate / oversample);
|
||||||
float mic_clock_freq = 48000000.0f / clock_divisor;
|
float mic_clock_freq = 48000000.0f / clock_divisor;
|
||||||
self->sample_rate = mic_clock_freq / oversample;
|
self->sample_rate = mic_clock_freq / oversample;
|
||||||
if (mic_clock_freq < MIN_MIC_CLOCK || clock_divisor == 0) {
|
if (mic_clock_freq < MIN_MIC_CLOCK || clock_divisor == 0) {
|
||||||
mp_raise_ValueError(translate("sampling rate out of range"));
|
mp_raise_ValueError(translate("sampling rate out of range"));
|
||||||
}
|
}
|
||||||
// Find a free GCLK to generate the MCLK signal.
|
// Find a free GCLK to generate the MCLK signal.
|
||||||
uint8_t gclk = find_free_gclk(clock_divisor);
|
uint8_t gclk = find_free_gclk(clock_divisor);
|
||||||
if (gclk > GCLK_GEN_NUM) {
|
if (gclk > GCLK_GEN_NUM) {
|
||||||
mp_raise_RuntimeError(translate("Unable to find free GCLK"));
|
mp_raise_RuntimeError(translate("Unable to find free GCLK"));
|
||||||
}
|
}
|
||||||
self->gclk = gclk;
|
self->gclk = gclk;
|
||||||
|
|
||||||
enable_clock_generator(self->gclk, CLOCK_48MHZ, clock_divisor);
|
enable_clock_generator(self->gclk, CLOCK_48MHZ, clock_divisor);
|
||||||
connect_gclk_to_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit);
|
connect_gclk_to_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit);
|
||||||
|
|
||||||
// Clock unit configuration
|
// Clock unit configuration
|
||||||
|
|
||||||
uint32_t clkctrl = I2S_CLKCTRL_MCKSEL_GCLK |
|
uint32_t clkctrl = I2S_CLKCTRL_MCKSEL_GCLK |
|
||||||
I2S_CLKCTRL_NBSLOTS(2) |
|
I2S_CLKCTRL_NBSLOTS(2) |
|
||||||
I2S_CLKCTRL_FSWIDTH_SLOT |
|
I2S_CLKCTRL_FSWIDTH_SLOT |
|
||||||
I2S_CLKCTRL_SLOTSIZE_16;
|
I2S_CLKCTRL_SLOTSIZE_16;
|
||||||
|
|
||||||
// Serializer configuration
|
// Serializer configuration
|
||||||
#ifdef SAMD21
|
#ifdef SAMD21
|
||||||
uint32_t serctrl = (self->clock_unit << I2S_SERCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32);
|
uint32_t serctrl = (self->clock_unit << I2S_SERCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SAM_D5X_E5X
|
#ifdef SAM_D5X_E5X
|
||||||
uint32_t serctrl = (self->clock_unit << I2S_RXCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32);
|
uint32_t serctrl = (self->clock_unit << I2S_RXCTRL_CLKSEL_Pos) | SERCTRL(SERMODE_PDM2) | SERCTRL(DATASIZE_32);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Configure the I2S peripheral
|
// Configure the I2S peripheral
|
||||||
i2s_set_enable(false);
|
i2s_set_enable(false);
|
||||||
|
|
||||||
I2S->CLKCTRL[self->clock_unit].reg = clkctrl;
|
I2S->CLKCTRL[self->clock_unit].reg = clkctrl;
|
||||||
#ifdef SAMD21
|
#ifdef SAMD21
|
||||||
I2S->SERCTRL[self->serializer].reg = serctrl;
|
I2S->SERCTRL[self->serializer].reg = serctrl;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SAM_D5X_E5X
|
#ifdef SAM_D5X_E5X
|
||||||
I2S->RXCTRL.reg = serctrl;
|
I2S->RXCTRL.reg = serctrl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
i2s_set_enable(true);
|
i2s_set_enable(true);
|
||||||
|
|
||||||
// Run the clock all the time. This eliminates startup delay for the microphone,
|
// Run the clock all the time. This eliminates startup delay for the microphone,
|
||||||
// which can be 10-100ms. Turn serializer on as needed.
|
// which can be 10-100ms. Turn serializer on as needed.
|
||||||
i2s_set_clock_unit_enable(self->clock_unit, true);
|
i2s_set_clock_unit_enable(self->clock_unit, true);
|
||||||
|
|
||||||
claim_pin(clock_pin);
|
claim_pin(clock_pin);
|
||||||
claim_pin(data_pin);
|
claim_pin(data_pin);
|
||||||
|
|
||||||
gpio_set_pin_function(self->clock_pin->number, GPIO_I2S_FUNCTION);
|
gpio_set_pin_function(self->clock_pin->number, GPIO_I2S_FUNCTION);
|
||||||
gpio_set_pin_function(self->data_pin->number, GPIO_I2S_FUNCTION);
|
gpio_set_pin_function(self->data_pin->number, GPIO_I2S_FUNCTION);
|
||||||
|
|
||||||
self->bytes_per_sample = oversample >> 3;
|
self->bytes_per_sample = oversample >> 3;
|
||||||
self->bit_depth = bit_depth;
|
self->bit_depth = bit_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_hal_audiobusio_pdmin_deinited(audiobusio_pdmin_obj_t *self) {
|
bool common_hal_audiobusio_pdmin_deinited(audiobusio_pdmin_obj_t *self) {
|
||||||
|
Loading…
Reference in New Issue
Block a user