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


static void wm8960_set_left_right_input(const struct device *dev, wm8960_input_t input, bool left)
{
    uint16_t val = 0;

printk("%s(%d) input=%d\n",__FUNCTION__,__LINE__,input);
    switch (input)
    {
        case kWM8960_InputClosed:
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val &= (uint16_t) ~(WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
            }
            else {
                val &= (uint16_t) ~(WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
            }
            wm8960_write_reg(dev, WM8960_REG_POWER1, val);
            break;

        case kWM8960_InputSingleEndedMic:
            /* Only LMN1 enabled, LMICBOOST to 13db, LMIC2B enabled */
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
            }
            else {
                val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
            }
            wm8960_write_reg(dev, WM8960_REG_POWER1, val);
            wm8960_write_reg(dev, WM8960_REG_LINPATH, 0x138);
            wm8960_write_reg(dev, WM8960_REG_LINVOL, 0x117);
            break;

        case kWM8960_InputDifferentialMicInput2:
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
            }
            else {
                val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
            }
            wm8960_write_reg(dev, WM8960_REG_POWER1, val);
            wm8960_write_reg(dev, WM8960_REG_LINPATH, 0x178);
            wm8960_write_reg(dev, WM8960_REG_LINVOL, 0x117);
            break;

        case kWM8960_InputDifferentialMicInput3:
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
            }
            else {
                val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
            }
            wm8960_write_reg(dev, WM8960_REG_POWER1, val);
            wm8960_write_reg(dev, WM8960_REG_LINPATH, 0x1B8);
            wm8960_write_reg(dev, WM8960_REG_LINVOL, 0x117);
            break;

        case kWM8960_InputLineINPUT2:
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
                wm8960_write_reg(dev, WM8960_REG_POWER1, val);
                wm8960_read_reg(dev, WM8960_REG_INBMIX1, &val);
                val |= 0xEU;
                wm8960_write_reg(dev, WM8960_REG_INBMIX1, val);
            }
            else {
                val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
                wm8960_write_reg(dev, WM8960_REG_POWER1, val);
                wm8960_read_reg(dev, WM8960_REG_INBMIX2, &val);
                val |= 0xEU;
                wm8960_write_reg(dev, WM8960_REG_INBMIX2, val);
            }
            break;

        case kWM8960_InputLineINPUT3:
            wm8960_read_reg(dev, WM8960_REG_POWER1, &val);
            if(left) {
                val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
                wm8960_write_reg(dev, WM8960_REG_POWER1, val);
                wm8960_read_reg(dev, WM8960_REG_INBMIX1, &val);
                val |= 0x70U;
                wm8960_write_reg(dev, WM8960_REG_INBMIX1, val);
            }
            else {
                val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
                wm8960_write_reg(dev, WM8960_REG_POWER1, val);
                wm8960_read_reg(dev, WM8960_REG_INBMIX2, &val);
                val |= 0x70U;
                wm8960_write_reg(dev, WM8960_REG_INBMIX2, val);
            }
            break;

        default:
            LOG_ERR("Errpr wm8960 Input %d\n",input);
    }
}

static int wm8960_route_input(const struct device *dev, audio_channel_t channel, uint32_t input)
{
	wm8960_input_t audio_input;

printk("%s(%d) channel=%d\n",__FUNCTION__,__LINE__,channel);
	switch (channel) {
	case AUDIO_CHANNEL_FRONT_LEFT:
		audio_input = kWM8960_InputDifferentialMicInput3;
		wm8960_set_left_right_input(dev, audio_input, true);
		break;

	case AUDIO_CHANNEL_FRONT_RIGHT:
		audio_input = kWM8960_InputDifferentialMicInput2;
		wm8960_set_left_right_input(dev, audio_input, false);
		break;

	default:
		return -EINVAL;
	}
	return 0;
}