static int sgtl5000_route_input(const struct device *dev, audio_channel_t channel, uint32_t input)
{
/*
* Выбор аналогового входа для ADC (биты Capture Mux)
* Регистр SGTL5000_CHIP_ANA_CTRL, бит 2 (SEL_ADC):
* 0 = MIC_IN, 1 = LINE_IN
*/
switch (channel) {
case AUDIO_CHANNEL_SIDE_LEFT:
case AUDIO_CHANNEL_SIDE_RIGHT:
case AUDIO_CHANNEL_ALL:
if (input == 0) {
/* Предположим, 0 - это MIC_IN (микрофон) */
LOG_INF("Routing Input: MIC_IN");
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_CTRL, 0x0004, 0);
} else {
/* 1 или любое другое значение - LINE_IN (линейный вход) */
LOG_INF("Routing Input: LINE_IN");
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_CTRL, 0x0004, 0x0004);
}
break;
default:
return -EINVAL;
}
return 0;
}
static int sgtl5000_route_output(const struct device *dev, audio_channel_t channel, uint32_t output)
{
/*
* Выбор источника для наушников и управление питанием выходов HP / LINE_OUT
* Регистр SGTL5000_CHIP_ANA_CTRL, бит 6 (HP_SEL): 0 = DAC, 1 = LINE_IN (Bypass)
*/
switch (channel) {
case AUDIO_CHANNEL_HEADPHONE_LEFT:
case AUDIO_CHANNEL_HEADPHONE_RIGHT:
LOG_INF("Routing Output: Headphones (DAC -> HP)");
/* Направляем DAC на наушники (HP_SEL = 0) */
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_CTRL, SGTL5000_HP_SEL_MASK, 0);
/* Включаем питание каскада наушников и виртуальной земли VAG */
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_POWER,
SGTL5000_HP_POWERUP | SGTL5000_VAG_POWERUP,
SGTL5000_HP_POWERUP | SGTL5000_VAG_POWERUP);
break;
case AUDIO_CHANNEL_FRONT_LEFT:
case AUDIO_CHANNEL_FRONT_RIGHT:
LOG_INF("Routing Output: Line-Out (DAC -> LO)");
/* Для линейного выхода в SGTL5000 сигнал всегда идет с DAC,
* нам просто нужно убедиться, что каскад LINE_OUT включен в питании */
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_POWER,
SGTL5000_LINE_OUT_POWERUP | SGTL5000_VAG_POWERUP,
SGTL5000_LINE_OUT_POWERUP | SGTL5000_VAG_POWERUP);
break;
case AUDIO_CHANNEL_ALL:
LOG_INF("Routing Output: All enabled (HP & LO)");
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_CTRL, SGTL5000_HP_SEL_MASK, 0);
sgtl5000_update_reg(dev, SGTL5000_CHIP_ANA_POWER,
SGTL5000_HP_POWERUP | SGTL5000_LINE_OUT_POWERUP | SGTL5000_VAG_POWERUP,
SGTL5000_HP_POWERUP | SGTL5000_LINE_OUT_POWERUP | SGTL5000_VAG_POWERUP);
break;
default:
return -EINVAL;
}
return 0;
}