i2c_putc(ctx->i2c, (uint8_t)((tmp & 0xFF00) >> 8));
i2c_putc(ctx->i2c, (uint8_t)(tmp & 0xFF));
- if (i2c_error(ctx->i2c))
- LOG_ERR("Error while send command to codec.\n");
+ int err = i2c_error(ctx->i2c);
+ if (err)
+ LOG_ERR("Error[%d] while send command to codec.\n", err);
}
+#define RANGECONV(data, y1, y2) (((((int32_t)(data)) * ((y2) - (y1))) / ((1 << 8) - 1)) + (y1))
void wm8731_setVolume(Wm8731 *ctx, uint16_t device, uint8_t volume)
{
uint16_t value;
- if (device & WM8731_LINE_IN_RX)
+ if (device & WM8731_LINE_IN)
{
if (!volume)
- wm8731_write(ctx, WM8731_REG_RIGHT_LINEIN, BV(WM8731_LINMUTE_BIT));
+ {
+ wm8731_write(ctx, WM8731_REG_RIGHT_LINEIN, BV(WM8731_LINMUTE_BIT) | BV(WM8731_RLINBOTH_BIT));
+ wm8731_write(ctx, WM8731_REG_LEFT_LINEIN, BV(WM8731_LINMUTE_BIT) | BV(WM8731_LRINBOTH_BIT));
+ }
- value = DIV_ROUND(volume * WM8731_LINVOL_BITS_MASK, 100) & WM8731_LINVOL_BITS_MASK;
+ value = DIV_ROUND(volume * WM8731_LINVOL_BITS_MASK, 100);
- wm8731_write(ctx, WM8731_REG_RIGHT_LINEIN, ~BV(WM8731_LINMUTE_BIT));
- wm8731_write(ctx, WM8731_REG_RIGHT_LINEIN, value);
- LOG_INFO("Set LINE IN Rx vol[%d]%% raw[%d]\n", volume, value);
+ wm8731_write(ctx, WM8731_REG_RIGHT_LINEIN, ~BV(WM8731_LINMUTE_BIT) | value);
+ wm8731_write(ctx, WM8731_REG_LEFT_LINEIN, ~BV(WM8731_RINMUTE_BIT) | value);
+ LOG_INFO("Set LINE IN vol[%d]%% raw[%d]\n", volume, value);
}
- if (device & WM8731_LINE_IN_LX)
+ if (device & WM8731_HEADPHONE)
{
- if (!volume)
- wm8731_write(ctx, WM8731_REG_LEFT_LINEIN, BV(WM8731_LINMUTE_BIT));
-
- value = DIV_ROUND(volume * WM8731_RINVOL_BITS_MASK, 100) & WM8731_RINVOL_BITS_MASK;
+ value = DIV_ROUND(volume * WM8731_RHPVOL_BITS_MASK, 100);
- wm8731_write(ctx, WM8731_REG_LEFT_LINEIN, ~BV(WM8731_LINMUTE_BIT));
- wm8731_write(ctx, WM8731_REG_LEFT_LINEIN, value);
- LOG_INFO("Set LINE IN Lx vol[%d]%% raw[%d]\n", volume, value);
- }
-
-
- if (device & WM8731_HEADPHONE_RX)
- {
- value = DIV_ROUND(volume * WM8731_RHPVOL_BITS_MASK, 100) & WM8731_LHPVOL_BITS_MASK;
- wm8731_write(ctx, WM8731_REG_RIGHT_HPOUT, value | BV(WM8731_RZCEN_BIT));
- LOG_INFO("Set HEADPHONE Rx vol[%d]%% raw[%d]\n", volume, value);
- }
-
-
- if (device & WM8731_HEADPHONE_LX)
- {
- value = DIV_ROUND(volume * WM8731_LHPVOL_BITS_MASK, 100) & WM8731_LHPVOL_BITS_MASK;
- wm8731_write(ctx, WM8731_REG_LEFT_HPOUT, value | BV(WM8731_LZCEN_BIT));
- LOG_INFO("Set HEADPHONE Lx vol[%d]%% raw[%d]\n", volume, value);
+ wm8731_write(ctx, WM8731_REG_RIGHT_HPOUT, value | BV(WM8731_RZCEN_BIT) | BV(WM8731_RLHPBOTH_BIT));
+ wm8731_write(ctx, WM8731_REG_LEFT_HPOUT, value | BV(WM8731_LZCEN_BIT) | BV(WM8731_LRHPBOTH_BIT));
+ LOG_INFO("Set HEADPHONE vol[%d]%% raw[%d]\n", volume, value);
}
}
/* Configure the codec */
- wm8731_write(ctx, WM8731_REG_DIGITAL_PATH_CTRL, CONFIG_WM8731_DEEMP | CONFIG_WM8731_DAPC |
- (CONFIG_WM8731_DACMU << WM8731_DACMU));
- wm8731_write(ctx, WM8731_REG_ANALOGUE_PATH_CTRL, (CONFIG_WM8731_MICBOOST ? WM8731_MICBOOST : ~WM8731_MICBOOST) |
- CONFIG_WM8731_INSEL | CONFIG_WM8731_BYPASS | CONFIG_WM8731_SIDEATT);
+ wm8731_write(ctx, WM8731_REG_DIGITAL_PATH_CTRL, CONFIG_WM8731_DEEMP | CONFIG_WM8731_DAPC | (CONFIG_WM8731_DACMU << WM8731_DACMU));
- wm8731_write(ctx, WM8731_REG_DA_INTERFACE_FORMAT, 0x2);
- wm8731_write(ctx, WM8731_REG_SAMPLECTRL, 0x6);
+ #if CONFIG_WM8731_MICBOOST
+ wm8731_write(ctx, WM8731_REG_ANALOGUE_PATH_CTRL, BV(WM8731_MICBOOST) | CONFIG_WM8731_INSEL | CONFIG_WM8731_BYPASS | CONFIG_WM8731_SIDEATT);
+ #else
+ wm8731_write(ctx, WM8731_REG_ANALOGUE_PATH_CTRL, (CONFIG_WM8731_INSEL | CONFIG_WM8731_BYPASS | CONFIG_WM8731_SIDEATT) & ~BV(WM8731_MICBOOST));
+ #endif
- wm8731_write(ctx, WM8731_REG_ACTIVE_CTRL, 1);
+ #if CONFIG_WM8731_MS
+ wm8731_write(ctx, WM8731_REG_DA_INTERFACE_FORMAT, CONFIG_WM8731_INTERFACE_FORMAT | CONFIG_WM8731_IWL_BITS | BV(WM8731_MS_BIT));
+ #else
+ wm8731_write(ctx, WM8731_REG_DA_INTERFACE_FORMAT,
+ (CONFIG_WM8731_INTERFACE_FORMAT | CONFIG_WM8731_IWL_BITS | BV(WM8731_MS_BIT)) & ~BV(WM8731_MS_BIT));
+ #endif
+
+ wm8731_write(ctx, WM8731_REG_SAMPLECTRL, CONFIG_WM8731_SAMPLING_RATES);
/* By default we turn on all devices and disable only the outclock */
- wm8731_write(ctx, WM8731_REG_PWDOWN_CTRL, 0x47);
+ wm8731_write(ctx, WM8731_REG_ACTIVE_CTRL, 1);
+ wm8731_write(ctx, WM8731_REG_PWDOWN_CTRL, 0x40);
}