update dac volume
This commit is contained in:
@@ -31,9 +31,6 @@ extern "C" {
|
||||
unsigned g_ch0_level = 0;
|
||||
unsigned g_ch1_level = 0;
|
||||
|
||||
unsigned g_extra_digial_gain_flag = 0;
|
||||
|
||||
|
||||
#define NAU88C25 0
|
||||
|
||||
#if NAU88C25
|
||||
@@ -154,6 +151,12 @@ void board_setup()
|
||||
#define NAU88L21_PGA_GAIN_REG_MAX_VALUE 0x25+1 // 0x25=37, 36dB. +1 is for extra 1.5dB digital gain
|
||||
#define NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE (NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
||||
|
||||
// DAC 音量控制范围: 共 16 级 (0~15)
|
||||
// 0 = mute (全灭, reg 0x0034=0x0000), 1~15 = -28dB ~ 0dB,2dB/步
|
||||
#define DAC_LEVEL_MIN 0 // mute,0 LEDs
|
||||
#define DAC_LEVEL_MAX 15 // 0dB,15 LEDs
|
||||
#define DAC_LEVEL_DEFAULT DAC_LEVEL_MAX
|
||||
|
||||
static inline void NAU88C22_REGREAD(unsigned reg, unsigned &val, client interface i2c_master_if i2c)
|
||||
{
|
||||
i2c_regop_res_t result;
|
||||
@@ -185,11 +188,12 @@ static inline i2c_regop_res_t NAU88C22_REGWRITE(unsigned reg, unsigned val, clie
|
||||
return result;
|
||||
}
|
||||
|
||||
void dac_volume(unsigned level)
|
||||
void dac_volume(signed level)
|
||||
{
|
||||
// unsigned tmp = 0xcf + level;
|
||||
unsigned tmp = 0xcf + level*2;
|
||||
// NAU88C22_REGWRITE(0x33, tmp + 0x200, i2c);
|
||||
// NAU88C22_REGWRITE(0x34, tmp, i2c);
|
||||
unsafe {NAU88C22_REGWRITE(0x0034, (tmp<<8|tmp), (client interface i2c_master_if)i_i2c_client);}
|
||||
}
|
||||
|
||||
void mic_volume(unsigned level)
|
||||
@@ -198,19 +202,17 @@ void mic_volume(unsigned level)
|
||||
|
||||
if(level == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
||||
{
|
||||
temp = 1;
|
||||
SET_SHARED_GLOBAL(g_extra_digial_gain_flag, temp);
|
||||
|
||||
//NAU88C22_REGWRITE(0x007E, ((NAU88L21_PGA_GAIN_REG_MAX_VALUE-1) << 8), (client interface i2c_master_if)i_i2c_client); // HW is using PGA_GAINL
|
||||
//NAU88C22_REGWRITE(0x007E, level, (client interface i2c_master_if)i_i2c_client); // PGA_GAINR is not used
|
||||
unsafe {NAU88C22_REGWRITE(0x0035, (0xd2d2), (client interface i2c_master_if)i_i2c_client);}
|
||||
}
|
||||
else if (level == 1)
|
||||
{
|
||||
unsafe {NAU88C22_REGWRITE(0x0035, (0x0), (client interface i2c_master_if)i_i2c_client);}
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = 0;
|
||||
SET_SHARED_GLOBAL(g_extra_digial_gain_flag, temp);
|
||||
|
||||
unsafe {NAU88C22_REGWRITE(0x007E, (level << 8), (client interface i2c_master_if)i_i2c_client);} // HW is using PGA_GAINL
|
||||
//NAU88C22_REGWRITE(0x007E, level, (client interface i2c_master_if)i_i2c_client); // PGA_GAINR is not used
|
||||
debug_printf("volume write %08x\n", level<<8);
|
||||
unsafe {NAU88C22_REGWRITE(0x007E, (level << 8), (client interface i2c_master_if)i_i2c_client);}
|
||||
unsafe {NAU88C22_REGWRITE(0x0035, (0xcfcf), (client interface i2c_master_if)i_i2c_client);}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,7 +308,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
|
||||
int codec_adc_pga_gain_reg_value = NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE;// NAU88L21_PGA_GAIN_REG_MAX_VALUE;//0x01;//0x1f;
|
||||
|
||||
int dac_level = 0;
|
||||
int dac_level = DAC_LEVEL_DEFAULT;
|
||||
|
||||
// mic endcoder 变量
|
||||
uint8_t prev_encode_input1 = 0;
|
||||
@@ -359,6 +361,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
unsigned /* char */ saved_mode;
|
||||
unsigned char saved_uac1_mode = 0;
|
||||
unsigned char path[] = "game_mode";
|
||||
unsigned char mic_vol_path[] = "mic_vol";
|
||||
unsigned char dac_vol_path[] = "dac_vol";
|
||||
unsigned host_os;
|
||||
|
||||
delay_milliseconds(10);
|
||||
@@ -468,23 +472,48 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
//led_waterfall(&led_ctx, 50);
|
||||
|
||||
|
||||
// 从 Flash 恢复 mic/dac 音量
|
||||
{
|
||||
unsigned char saved_mic = load_value(mic_vol_path);
|
||||
if(saved_mic >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && saved_mic <= NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
||||
codec_adc_pga_gain_reg_value = saved_mic;
|
||||
else
|
||||
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value);
|
||||
|
||||
unsigned char saved_dac = load_value(dac_vol_path);
|
||||
if(saved_dac <= DAC_LEVEL_MAX)
|
||||
dac_level = saved_dac;
|
||||
else
|
||||
save_value(dac_vol_path, (unsigned char)dac_level);
|
||||
}
|
||||
|
||||
// ADCL PGA default setting
|
||||
mic_volume(codec_adc_pga_gain_reg_value); // make sure to write adc reg after initialize the codec, otherwise it does not take effect because of the hardware reset in the initial code
|
||||
current_mic_led_pos = mic_gain_to_led[codec_adc_pga_gain_reg_value] - 1;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮L系列当前位置
|
||||
led_on(&led_ctx, led_l_physical_map[i]);
|
||||
int mic_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
|
||||
for(int i = 0; i < 15; i++)
|
||||
{
|
||||
if (i < mic_led_count)
|
||||
led_on(&led_ctx, led_l_physical_map[i]);
|
||||
else
|
||||
led_off(&led_ctx, led_l_physical_map[i]);
|
||||
}
|
||||
}
|
||||
//led_update_all(&led_ctx);
|
||||
|
||||
current_mic_led_pos = mic_gain_to_led[dac_level] - 1;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
// DAC 默认音量(mute 时写 0x0000)
|
||||
if(dac_level == DAC_LEVEL_MIN)
|
||||
unsafe { NAU88C22_REGWRITE(0x0034, 0x0000, (client interface i2c_master_if)i_i2c_client); }
|
||||
else
|
||||
dac_volume(dac_level - DAC_LEVEL_MAX);
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮D系列当前位置
|
||||
led_on(&led_ctx, led_d_physical_map[i]);
|
||||
int dac_led_count = dac_gain_to_led[dac_level];
|
||||
for(int i = 0; i < 15; i++)
|
||||
{
|
||||
if (i < dac_led_count)
|
||||
led_on(&led_ctx, led_d_physical_map[i]);
|
||||
else
|
||||
led_off(&led_ctx, led_d_physical_map[i]);
|
||||
}
|
||||
}
|
||||
// Initialize mode button LEDs: at most one may be lit at a time
|
||||
led_off(&led_ctx, LED_MUSIC);
|
||||
@@ -917,12 +946,13 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
if(current_dir == 1) { // 顺时针
|
||||
if((codec_adc_pga_gain_reg_value < NAU88L21_PGA_GAIN_REG_MAX_VALUE) && (flag_mic_mute == 0)) {
|
||||
uint8_t old_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
|
||||
|
||||
|
||||
// 增加音量
|
||||
mic_volume(++codec_adc_pga_gain_reg_value);
|
||||
|
||||
debug_printf("volume up %d\n", codec_adc_pga_gain_reg_value);
|
||||
save_value(mic_vol_path, codec_adc_pga_gain_reg_value);
|
||||
uint8_t new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
|
||||
|
||||
|
||||
// 如果LED数增加,点亮新增的那个LED
|
||||
if(new_led_count > old_led_count) {
|
||||
// 新点亮的LED索引 = new_led_count - 1
|
||||
@@ -933,9 +963,11 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
} else { // 逆时针
|
||||
if((codec_adc_pga_gain_reg_value > NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE) && (flag_mic_mute == 0)) {
|
||||
uint8_t old_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
|
||||
|
||||
|
||||
// 减小音量
|
||||
mic_volume(--codec_adc_pga_gain_reg_value);
|
||||
debug_printf("volume down %d\n", codec_adc_pga_gain_reg_value);
|
||||
save_value(mic_vol_path, codec_adc_pga_gain_reg_value);
|
||||
|
||||
uint8_t new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
|
||||
|
||||
@@ -1009,14 +1041,16 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
|
||||
// 执行音量调节
|
||||
if(hp_current_dir == 1) { // 顺时针
|
||||
if(dac_level < NAU88L21_PGA_GAIN_REG_MAX_VALUE && flag_hp_mute == 0) {
|
||||
uint8_t old_led_count = mic_gain_to_led[dac_level];
|
||||
|
||||
if(dac_level < DAC_LEVEL_MAX && flag_hp_mute == 0) {
|
||||
uint8_t old_led_count = dac_gain_to_led[dac_level];
|
||||
|
||||
// 增加音量
|
||||
++dac_level;
|
||||
|
||||
uint8_t new_led_count = mic_gain_to_led[dac_level];
|
||||
|
||||
dac_volume(dac_level - DAC_LEVEL_MAX);
|
||||
save_value(dac_vol_path, dac_level);
|
||||
|
||||
uint8_t new_led_count = dac_gain_to_led[dac_level];
|
||||
|
||||
// 如果LED数增加,点亮新增的那个LED
|
||||
if(new_led_count > old_led_count) {
|
||||
// 新点亮的LED索引 = new_led_count - 1
|
||||
@@ -1025,14 +1059,19 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
}
|
||||
}
|
||||
} else { // 逆时针
|
||||
if(dac_level > NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && flag_hp_mute == 0) {
|
||||
uint8_t old_led_count = mic_gain_to_led[dac_level];
|
||||
|
||||
if(dac_level > DAC_LEVEL_MIN && flag_hp_mute == 0) {
|
||||
uint8_t old_led_count = dac_gain_to_led[dac_level];
|
||||
|
||||
// 减小音量
|
||||
--dac_level;
|
||||
|
||||
uint8_t new_led_count = mic_gain_to_led[dac_level];
|
||||
|
||||
if(dac_level == DAC_LEVEL_MIN)
|
||||
unsafe { NAU88C22_REGWRITE(0x0034, 0x0000, (client interface i2c_master_if)i_i2c_client); }
|
||||
else
|
||||
dac_volume(dac_level - DAC_LEVEL_MAX);
|
||||
save_value(dac_vol_path, dac_level);
|
||||
|
||||
uint8_t new_led_count = dac_gain_to_led[dac_level];
|
||||
|
||||
// 如果LED数减少,关闭减少的那个LED
|
||||
if(new_led_count < old_led_count) {
|
||||
// 关闭的LED索引 = old_led_count - 1
|
||||
@@ -1087,21 +1126,19 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
||||
if(mode_change)
|
||||
if(flag_hp_mute)
|
||||
{
|
||||
current_mic_led_pos = mic_gain_to_led[dac_level] - 1;
|
||||
current_mic_led_pos = dac_gain_to_led[dac_level] - 1;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮L系列当前位置
|
||||
led_off(&led_ctx, led_d_physical_map[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
current_mic_led_pos = mic_gain_to_led[dac_level] - 1;
|
||||
current_mic_led_pos = dac_gain_to_led[dac_level] - 1;
|
||||
for(int i = 0; i <= current_mic_led_pos; i++)
|
||||
{
|
||||
if ((i < 15) && (i >= 0))
|
||||
// 点亮L系列当前位置
|
||||
led_on(&led_ctx, led_d_physical_map[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +129,28 @@ const uint8_t mic_gain_to_led[39] = {
|
||||
15 // [37] 增益36+1.5 digitial gain: 15个LED
|
||||
};
|
||||
|
||||
// DAC音量增益到LED数量的映射表
|
||||
// 索引 0 = 静音(0个LED, reg 0x0034=0x0000)
|
||||
// 索引 1~15: -28dB ~ 0dB,每灯对应 2dB 步进
|
||||
const uint8_t dac_gain_to_led[16] = {
|
||||
0, // [0] mute: 0 LEDs
|
||||
1, // [1] -28dB: 1 LED
|
||||
2, // [2] -26dB: 2 LEDs
|
||||
3, // [3] -24dB: 3 LEDs
|
||||
4, // [4] -22dB: 4 LEDs
|
||||
5, // [5] -20dB: 5 LEDs
|
||||
6, // [6] -18dB: 6 LEDs
|
||||
7, // [7] -16dB: 7 LEDs
|
||||
8, // [8] -14dB: 8 LEDs
|
||||
9, // [9] -12dB: 9 LEDs
|
||||
10, // [10] -10dB: 10 LEDs
|
||||
11, // [11] -8dB: 11 LEDs
|
||||
12, // [12] -6dB: 12 LEDs
|
||||
13, // [13] -4dB: 13 LEDs
|
||||
14, // [14] -2dB: 14 LEDs
|
||||
15, // [15] 0dB: 15 LEDs
|
||||
};
|
||||
|
||||
/*=========================================================================
|
||||
内部函数 - 获取实际OUT口
|
||||
-----------------------------------------------------------------------*/
|
||||
|
||||
@@ -66,6 +66,7 @@ extern const uint8_t led_l_physical_map[15];
|
||||
extern const uint8_t led_d_physical_map[15];
|
||||
|
||||
extern const uint8_t mic_gain_to_led[39];
|
||||
extern const uint8_t dac_gain_to_led[16];
|
||||
|
||||
/*=========================================================================
|
||||
基础控制API
|
||||
|
||||
Reference in New Issue
Block a user