X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fwm8731.c;h=e96ce6f1614d76eb2d4949a9ede95074619f808b;hb=1ebcf9b89595826a5c158ae6a68d4c2407b1dd52;hp=3bb09f28dcc88f2777c63d8028ad755399d24537;hpb=dc639e27b6439986ff6f64d71889744a8c1bd976;p=bertos.git diff --git a/bertos/drv/wm8731.c b/bertos/drv/wm8731.c index 3bb09f28..e96ce6f1 100644 --- a/bertos/drv/wm8731.c +++ b/bertos/drv/wm8731.c @@ -61,53 +61,39 @@ static void wm8731_write(Wm8731 *ctx, uint8_t reg, uint16_t value) 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); } } @@ -151,15 +137,24 @@ void wm8731_init(Wm8731 *ctx, I2c *i2c, uint8_t codec_addr) /* 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 ? BV(WM8731_MICBOOST) : ~BV(WM8731_MICBOOST)) | - CONFIG_WM8731_INSEL | CONFIG_WM8731_BYPASS | CONFIG_WM8731_SIDEATT); - wm8731_write(ctx, WM8731_REG_DA_INTERFACE_FORMAT, CONFIG_WM8731_INTERFACE_FORMAT | CONFIG_WM8731_IWL_BITS | - (CONFIG_WM8731_MS ? BV(WM8731_MS_BIT) : ~BV(WM8731_MS_BIT))); + wm8731_write(ctx, WM8731_REG_DIGITAL_PATH_CTRL, CONFIG_WM8731_DEEMP | CONFIG_WM8731_DAPC | (CONFIG_WM8731_DACMU << WM8731_DACMU)); + + #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 + + #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_ACTIVE_CTRL, 1); - wm8731_write(ctx, WM8731_REG_PWDOWN_CTRL, 0x47); + wm8731_write(ctx, WM8731_REG_PWDOWN_CTRL, 0x40); }