linein功能原理
使用I2S协议,将外部设备的音频数据通过3.5mm数据线传输给耳机,耳机用speaker播放音频数据。
3,5mm的数据线,有三级和四级式插针结构,因为四级包含了左声道L、右声道R、麦克风、GND,三级少了一个麦克风。单纯的传输外部音乐音频的话,三级其实也够了。
硬件设计
根据pinmux表格参考文件步板子,配置I2S的PIN。
如图参考:
软件配置
BES平台的linein功能已经集成,配置比较简单。
开宏:
#export AUDIO_LINEIN ?=1
ifeq($(AUDIO_LINEIN),1)
KBUILD_CPPFLAGS +=-DAUDIO_LINEIN
export AF_DEVICE_I2S:=1
检查一下I2S是否打开,如果没有打开需要将其打开:
KBUILD_CPPFLAGS += -DI2S_MCLK_FROM_SPDIF
KBUILD_CPPFLAGS += -DI2S_MCLK_PIN
KBUILD_CPPFLAGS += -DI2S_MCLK_IOMUX_INDEX=33
检查一下公版的你的PIN配置是否和公版默认配置一致:
void hal_iomux_set_i2s1(void)
void hal_iomux_set_i2s_mclk(void)
void hal_iomux_set_mcu_i2s0(void)
{
static const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_i2s[] = {
{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_MCU_I2S0_WS, I2S0_VOLTAGE_SEL, HAL_IOMUX_PIN_NOPULL},
{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_MCU_I2S0_SCK, I2S0_VOLTAGE_SEL, HAL_IOMUX_PIN_NOPULL},
{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_MCU_I2S0_SDI0, I2S0_VOLTAGE_SEL, HAL_IOMUX_PIN_NOPULL},
{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_MCU_I2S0_SDO, I2S0_VOLTAGE_SEL, HAL_IOMUX_PIN_NOPULL},
};
hal_iomux_init(pinmux_i2s, ARRAY_SIZE(pinmux_i2s));
}
配置音频播放通道和初始化AD模块:
在int app_play_linein_onoff(bool onoff)函数中修改。
第一个device是耳机播放解码配置不要乱改,相当于耳机的linein音频的输出端。
第二个device是耳机linein数据的输入,需要改为AUD_STREAM_USE_I2S0_MASTER
AD模块的使能配置,在下面stream打开后调用即可。
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
ADxxx_init();
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
最后就是根据检测到linein插入,调用int app_play_linein_onoff(bool onoff)播放外部音乐即可