static int msm_bahama_setup_pcm_i2s(int mode) { int fm_state = 0, bt_state = 0; int rc = 0; struct marimba config = { .mod_id = SLAVE_ID_BAHAMA}; fm_state = marimba_get_fm_status(&config); bt_state = marimba_get_bt_status(&config); switch (mode) { case BT_PCM_ON: case BT_PCM_OFF: if (!fm_state) rc = config_pcm(mode); break; case FM_I2S_ON: rc = config_i2s(mode); break; case FM_I2S_OFF: if (bt_state) rc = config_pcm(BT_PCM_ON); else rc = config_i2s(mode); break; default: rc = -EIO; pr_err("%s:Unsupported mode", __func__); } return rc; }
void AudioOutputI2SQuad::begin(void) { #if 1 dma.begin(true); // Allocate the DMA channel first block_ch1_1st = NULL; block_ch2_1st = NULL; block_ch3_1st = NULL; block_ch4_1st = NULL; // TODO: can we call normal config_i2s, and then just enable the extra output? config_i2s(); CORE_PIN22_CONFIG = PORT_PCR_MUX(6); // pin 22, PTC1, I2S0_TXD0 -> ch1 & ch2 CORE_PIN15_CONFIG = PORT_PCR_MUX(6); // pin 15, PTC0, I2S0_TXD1 -> ch3 & ch4 dma.TCD->SADDR = i2s_tx_buffer; dma.TCD->SOFF = 2; dma.TCD->ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1) | DMA_TCD_ATTR_DMOD(3); dma.TCD->NBYTES_MLNO = 4; dma.TCD->SLAST = -sizeof(i2s_tx_buffer); dma.TCD->DADDR = &I2S0_TDR0; dma.TCD->DOFF = 4; dma.TCD->CITER_ELINKNO = sizeof(i2s_tx_buffer) / 4; dma.TCD->DLASTSGA = 0; dma.TCD->BITER_ELINKNO = sizeof(i2s_tx_buffer) / 4; dma.TCD->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; dma.triggerAtHardwareEvent(DMAMUX_SOURCE_I2S0_TX); update_responsibility = update_setup(); dma.enable(); I2S0_TCSR = I2S_TCSR_SR; I2S0_TCSR = I2S_TCSR_TE | I2S_TCSR_BCE | I2S_TCSR_FRDE; dma.attachInterrupt(isr); #endif }
void AudioOutputI2S::begin(void) { dma.begin(true); // Allocate the DMA channel first block_left_1st = NULL; block_right_1st = NULL; // TODO: should we set & clear the I2S_TCSR_SR bit here? config_i2s(); CORE_PIN22_CONFIG = PORT_PCR_MUX(6); // pin 22, PTC1, I2S0_TXD0 #if defined(KINETISK) dma.TCD->SADDR = i2s_tx_buffer; dma.TCD->SOFF = 2; dma.TCD->ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); dma.TCD->NBYTES_MLNO = 2; dma.TCD->SLAST = -sizeof(i2s_tx_buffer); dma.TCD->DADDR = (void *)((uint32_t)&I2S0_TDR0 + 2); dma.TCD->DOFF = 0; dma.TCD->CITER_ELINKNO = sizeof(i2s_tx_buffer) / 2; dma.TCD->DLASTSGA = 0; dma.TCD->BITER_ELINKNO = sizeof(i2s_tx_buffer) / 2; dma.TCD->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; #endif dma.triggerAtHardwareEvent(DMAMUX_SOURCE_I2S0_TX); update_responsibility = update_setup(); dma.enable(); I2S0_TCSR = I2S_TCSR_SR; I2S0_TCSR = I2S_TCSR_TE | I2S_TCSR_BCE | I2S_TCSR_FRDE; dma.attachInterrupt(isr); }
void AudioOutputI2S2::begin(void) { dma.begin(true); // Allocate the DMA channel first block_left_1st = NULL; block_right_1st = NULL; config_i2s(); CORE_PIN2_CONFIG = 2; //2:TX_DATA0 dma.TCD->SADDR = i2s2_tx_buffer; dma.TCD->SOFF = 2; dma.TCD->ATTR = DMA_TCD_ATTR_SSIZE(1) | DMA_TCD_ATTR_DSIZE(1); dma.TCD->NBYTES_MLNO = 2; dma.TCD->SLAST = -sizeof(i2s2_tx_buffer); dma.TCD->DOFF = 0; dma.TCD->CITER_ELINKNO = sizeof(i2s2_tx_buffer) / 2; dma.TCD->DLASTSGA = 0; dma.TCD->BITER_ELINKNO = sizeof(i2s2_tx_buffer) / 2; dma.TCD->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR; dma.TCD->DADDR = (void *)((uint32_t)&I2S2_TDR0 + 2); dma.triggerAtHardwareEvent(DMAMUX_SOURCE_SAI2_TX); // I2S2_RCSR |= I2S_RCSR_RE; I2S2_TCSR |= I2S_TCSR_TE | I2S_TCSR_BCE | I2S_TCSR_FRDE; update_responsibility = update_setup(); dma.attachInterrupt(isr); dma.enable(); }