Skip to content

Commit 94eb2b3

Browse files
author
mkuettner97
committed
add limiter and volume control for transparency mode
1 parent cf11377 commit 94eb2b3

4 files changed

Lines changed: 68 additions & 34 deletions

File tree

src/drivers/ADAU1860.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "openearable_common.h"
44
#include <zephyr/logging/log_ctrl.h>
55
#include <zephyr/logging/log.h>
6+
#include <math.h>
67
LOG_MODULE_REGISTER(ADAU1860, 3);
78

89
/*
@@ -226,6 +227,10 @@ int ADAU1860::setup_DAC() {
226227
writeReg(registers::PB_CTRL, &pb_ctrl, sizeof(pb_ctrl));
227228

228229
#if CONFIG_FDSP
230+
// set volume
231+
uint8_t dac_vol = 0xFF - MAX_VOLUME_REG_VAL;
232+
writeReg(registers::DAC_VOL0, &dac_vol, sizeof(dac_vol));
233+
229234
// Unmute DAC
230235
uint8_t dac_ctrl2 = 0x0;
231236
dac.writeReg(registers::DAC_CTRL2, &dac_ctrl2, sizeof(dac_ctrl2));
@@ -334,8 +339,9 @@ int ADAU1860::mute(bool active) {
334339
#endif
335340
}
336341

337-
int ADAU1860::fdsp_safe_load(uint8_t address, safe_load_params params) {
338-
writeReg(registers::FDSP_SL_ADDR, &address, sizeof(address));
342+
int ADAU1860::fdsp_safe_load(sl_address address, safe_load_params params) {
343+
uint8_t _address = address;
344+
writeReg(registers::FDSP_SL_ADDR, &_address, sizeof(_address));
339345
writeReg(registers::FDSP_SL_P0_0, (uint8_t *) params, sizeof(safe_load_params));
340346

341347
uint8_t val = 1;
@@ -344,7 +350,7 @@ int ADAU1860::fdsp_safe_load(uint8_t address, safe_load_params params) {
344350
return 0;
345351
}
346352

347-
int ADAU1860::fdsp_safe_load(uint8_t address, int n, uint32_t param) {
353+
int ADAU1860::fdsp_safe_load(sl_address address, int n, uint32_t param) {
348354
uint32_t params[FDSP_NUM_PARAMS];
349355

350356
for (int i = 0; i < FDSP_NUM_PARAMS; i++) {
@@ -353,7 +359,8 @@ int ADAU1860::fdsp_safe_load(uint8_t address, int n, uint32_t param) {
353359

354360
params[n] = param;
355361

356-
writeReg(registers::FDSP_SL_ADDR, &address, sizeof(address));
362+
uint8_t _address = address;
363+
writeReg(registers::FDSP_SL_ADDR, &_address, sizeof(_address));
357364
//writeReg(registers::FDSP_SL_P0_0 + n * sizeof(param), (uint8_t *) &param, sizeof(param));
358365
writeReg(registers::FDSP_SL_P0_0, (uint8_t *) params, sizeof(safe_load_params));
359366

@@ -365,22 +372,30 @@ int ADAU1860::fdsp_safe_load(uint8_t address, int n, uint32_t param) {
365372

366373
int ADAU1860::fdsp_mute(bool active) {
367374
uint32_t val = active ? 0x00000000 : 0x08000000;
368-
fdsp_safe_load(1, 4, val);
375+
fdsp_safe_load(MUTE, 4, val);
369376

370377
return 0;
371378
}
372379

373380
int ADAU1860::set_volume(uint8_t volume) {
381+
#if CONFIG_FDSP
382+
// Unmute I2S Datapath
383+
int ret;
384+
ret = fdsp_set_volume(volume);
385+
return ret;
386+
#else
374387
uint8_t dac_vol = 0xFF-volume;
375388
writeReg(registers::DAC_VOL0, &dac_vol, sizeof(dac_vol)); // unmute
376389

377390
return 0;
391+
#endif
378392
}
379393

380394

381395
int ADAU1860::fdsp_set_volume(uint8_t volume) {
382-
uint8_t dac_vol = 0xFF-volume;
383-
writeReg(registers::DAC_VOL0, &dac_vol, sizeof(dac_vol)); // unmute
396+
float _val = ((float) (1<<27)) * powf(10.f, -3.f * (((float) (0xFF - volume)) / 255.f));
397+
uint32_t val = MIN(_val, (1 << 27));
398+
fdsp_safe_load(VOLUME, 4, val);
384399

385400
return 0;
386401
}

src/drivers/ADAU1860.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434

3535
typedef uint32_t safe_load_params[FDSP_NUM_PARAMS];
3636

37+
enum sl_address {
38+
BIQ_0 = 0,
39+
//LIMIT_1 = 1,
40+
VOLUME = 1,
41+
MUTE = 2,
42+
MIXER = 3,
43+
LIMITER_MASTER = 4
44+
};
45+
3746
class ADAU1860 {
3847
public:
3948
enum registers : uint32_t {
@@ -406,8 +415,8 @@ class ADAU1860 {
406415
int fdsp_set_volume(uint8_t volume);
407416
uint8_t fdsp_get_volume();
408417

409-
int fdsp_safe_load(uint8_t address, safe_load_params params);
410-
int fdsp_safe_load(uint8_t address, int n, uint32_t param);
418+
int fdsp_safe_load(sl_address address, safe_load_params params);
419+
int fdsp_safe_load(sl_address address, int n, uint32_t param);
411420

412421
const int address = DT_REG_ADDR(DT_NODELABEL(adau1860));
413422

src/drivers/Lark-fdsp.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,34 +26,34 @@
2626

2727
#include <stdint.h>
2828

29-
uint32_t fdsp_program[6] =
29+
uint32_t fdsp_program[8] =
3030
{
31-
0x00825000, 0x01805200, 0x01C04800, 0x04800000, 0x00000000, 0x00000000
31+
0x00825000, 0x01804800, 0x01805200, 0x01C04800, 0x01005400, 0x04800000, 0x00000000, 0x00000000
3232
};
3333

34-
uint32_t fdsp_param_bank_a[5][6] =
34+
uint32_t fdsp_param_bank_a[5][8] =
3535
{
36-
{0x07F25BCB, 0x17F00000, 0xD1A40000, 0xC8000000, 0x00000000, 0x00000000},
37-
{0xF0ABC70F, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
38-
{0x07646947, 0x00014700, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
39-
{0x0F53B26D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
40-
{0xF8A8B46A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
36+
{0x07E46D88, 0x17F00000, 0xC9F00000, 0xD1A40000, 0x08000C80, 0xD4000000, 0x00000000, 0x00000000},
37+
{0xF0BC6002, 0x00000000, 0x00000000, 0x06000000, 0x08000D40, 0x00000000, 0x00000000, 0x00000000},
38+
{0x076154D0, 0x02014700, 0x00014700, 0x08000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
39+
{0x0F42901C, 0x00000000, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
40+
{0xF8B92DC6, 0x04000000, 0x00000000, 0x00000000, 0x80000000, 0x00000000, 0x00000000, 0x00000000}
4141
};
4242

43-
uint32_t fdsp_param_bank_b[5][6] =
43+
uint32_t fdsp_param_bank_b[5][8] =
4444
{
45-
{0x080E80C3, 0x17F00000, 0xD1A40000, 0xC8000000, 0x00000000, 0x00000000},
46-
{0xF10EB9D6, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
47-
{0x0703C77C, 0x00014700, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
48-
{0x0EF1462A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
49-
{0xF8EDB7C1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
45+
{0x080E80C3, 0x17F00000, 0xC9F00000, 0xD1A40000, 0x00000C80, 0xD4000000, 0x00000000, 0x00000000},
46+
{0xF10EB9D6, 0x00000000, 0x00000000, 0x08000000, 0x00000D40, 0x00000000, 0x00000000, 0x00000000},
47+
{0x0703C77C, 0x00014700, 0x00014700, 0x08000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
48+
{0x0EF1462A, 0x00000000, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
49+
{0xF8EDB7C1, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x00000000, 0x00000000, 0x00000000}
5050
};
5151

52-
uint32_t fdsp_param_bank_c[5][6] =
52+
uint32_t fdsp_param_bank_c[5][8] =
5353
{
54-
{0x080E80C3, 0x17F00000, 0xD1A40000, 0xC8000000, 0x00000000, 0x00000000},
55-
{0xF10EB9D6, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
56-
{0x0703C77C, 0x00014700, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
57-
{0x0EF1462A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
58-
{0xF8EDB7C1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
54+
{0x080E80C3, 0x17F00000, 0xC9F00000, 0xD1A40000, 0x00000C80, 0xD4000000, 0x00000000, 0x00000000},
55+
{0xF10EB9D6, 0x00000000, 0x00000000, 0x08000000, 0x00000D40, 0x00000000, 0x00000000, 0x00000000},
56+
{0x0703C77C, 0x00014700, 0x00014700, 0x08000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
57+
{0x0EF1462A, 0x00000000, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000},
58+
{0xF8EDB7C1, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x00000000, 0x00000000, 0x00000000}
5959
};

src/modules/hw_codec_adau1860.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ K_THREAD_STACK_DEFINE(volume_msg_sub_thread_stack, CONFIG_VOLUME_MSG_SUB_STACK_S
4444
static uint16_t zbus_vol_conversion(uint8_t volume)
4545
{
4646
//return (((uint16_t)volume + 1) / 2) + 0x40;
47+
#ifdef CONFIG_FDSP
48+
return volume;
49+
#else
4750
return (((int)volume + 1) * (MAX_VOLUME_REG_VAL - MIN_VOLUME_REG_VAL) / 255) + MIN_VOLUME_REG_VAL;
51+
#endif
4852
}
4953

5054
/**
@@ -125,10 +129,16 @@ int hw_codec_volume_set(uint8_t set_val)
125129
volume_reg_val = set_val;
126130
if (volume_reg_val == 0) {
127131
LOG_WRN("Volume at MIN (-64dB)");
132+
#ifdef CONFIG_FDSP
133+
} else if (volume_reg_val >= 255) {
134+
LOG_WRN("Volume at MAX (0dB)");
135+
}
136+
#else
128137
} else if (volume_reg_val >= MAX_VOLUME_REG_VAL) {
129138
LOG_WRN("Volume at MAX (0dB)");
130139
volume_reg_val = MAX_VOLUME_REG_VAL;
131140
}
141+
#endif
132142

133143
ret = dac.set_volume(volume_reg_val);
134144

@@ -229,6 +239,11 @@ int hw_codec_default_conf_enable(void)
229239
{
230240
int ret;
231241

242+
ret = hw_codec_volume_adjust(0);
243+
if (ret) {
244+
return ret;
245+
}
246+
232247
//ret = dac.setup();
233248
if (!muted) {
234249
ret = dac.mute(false);
@@ -237,11 +252,6 @@ int hw_codec_default_conf_enable(void)
237252
}
238253
}
239254

240-
ret = hw_codec_volume_adjust(0);
241-
if (ret) {
242-
return ret;
243-
}
244-
245255
return 0;
246256
}
247257

0 commit comments

Comments
 (0)