Загрузка данных


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;
}