Загрузка данных
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;
}