Rename project to insert it into nightly test.
[bertos.git] / bertos / drv / wm8731.c
index 3bb09f28dcc88f2777c63d8028ad755399d24537..e96ce6f1614d76eb2d4949a9ede95074619f808b 100644 (file)
@@ -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);
 }