update mic dac volume range

This commit is contained in:
Steven Dan
2026-03-26 10:43:19 +08:00
parent fb30861ffd
commit 3057690b98
6 changed files with 113 additions and 88 deletions

View File

@@ -76,7 +76,7 @@ unsigned g_mute_enable = 0;
unsigned g_mute_state = 0; unsigned g_mute_state = 0;
unsigned g_mute_state_old = 1; unsigned g_mute_state_old = 1;
unsigned g_unmute_dac_state, g_unmute_time, g_format_time; unsigned g_unmute_dac_state, g_unmute_time, g_format_time;
unsigned g_volume_level = 15, g_saved_volume_level = 15; unsigned g_volume_level = 29, g_saved_volume_level = 29;
unsigned g_request_volume_set = 0; unsigned g_request_volume_set = 0;
unsigned g_init_saved_settings = 0; unsigned g_init_saved_settings = 0;
unsigned g_host_volume = 0x0; unsigned g_host_volume = 0x0;
@@ -84,7 +84,7 @@ unsigned g_host_volume = 0x0;
unsigned char g_hid_status_report_data[63] = {0}; unsigned char g_hid_status_report_data[63] = {0};
unsigned int g_hid_status_report_index = 0; unsigned int g_hid_status_report_index = 0;
unsigned g_last_volume_level = 0xFF; // 上次已上报的音量级别0xFF表示初始化未完成 unsigned g_last_volume_level = 0xFF; // 上次已上报的音量级别0xFF表示初始化未完成
unsigned g_mic_volume_level = 38; // 麦克风PGA增益级别1-38对应NAU88L21寄存器值 unsigned g_mic_volume_level = 37; // 麦克风PGA增益级别0=mute, 1-37=0dB~36dBHID可见范围
unsigned g_request_mic_volume_set = 0; unsigned g_request_mic_volume_set = 0;
unsigned g_last_mic_volume_level = 0xFF; // 上次已上报的麦克风增益级别0xFF表示初始化未完成 unsigned g_last_mic_volume_level = 0xFF; // 上次已上报的麦克风增益级别0xFF表示初始化未完成
unsigned g_dac_m_gain = 0; unsigned g_dac_m_gain = 0;
@@ -159,10 +159,10 @@ 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_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) #define NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE (NAU88L21_PGA_GAIN_REG_MAX_VALUE)
// DAC 音量控制范围: 共 16 级 (0~15) // DAC 监听音量控制范围: 共 30 级 (0~29)
// 0 = mute (全灭, reg 0x0034=0x0000), 1~15 = -28dB ~ 0dB2dB/步 // 0 = mute (全灭, reg 0x0034=0x0000), 1~29 = -28dB ~ 0dB1dB/步
#define DAC_LEVEL_MIN 0 // mute0 LEDs #define DAC_LEVEL_MIN 0 // mute0 LEDs
#define DAC_LEVEL_MAX 15 // 0dB15 LEDs #define DAC_LEVEL_MAX 29 // 0dB15 LEDs
#define DAC_LEVEL_DEFAULT DAC_LEVEL_MAX #define DAC_LEVEL_DEFAULT DAC_LEVEL_MAX
static inline void NAU88C22_REGREAD(unsigned reg, unsigned &val, client interface i2c_master_if i2c) static inline void NAU88C22_REGREAD(unsigned reg, unsigned &val, client interface i2c_master_if i2c)
@@ -198,27 +198,28 @@ static inline i2c_regop_res_t NAU88C22_REGWRITE(unsigned reg, unsigned val, clie
void dac_volume(signed level) void dac_volume(signed level)
{ {
unsigned tmp = 0xcf + level*2; // 1dB/步: level 范围 -28 ~ 0对应寄存器 0xcf-28=0xb3 ~ 0xcf
// NAU88C22_REGWRITE(0x33, tmp + 0x200, i2c); unsigned tmp = 0xcf + level;
// NAU88C22_REGWRITE(0x34, tmp, i2c);
unsafe {NAU88C22_REGWRITE(0x0034, (tmp<<8|tmp), (client interface i2c_master_if)i_i2c_client);} unsafe {NAU88C22_REGWRITE(0x0034, (tmp<<8|tmp), (client interface i2c_master_if)i_i2c_client);}
} }
void mic_volume(unsigned level) void mic_volume(unsigned level)
{ {
unsigned temp; if (level == 0)
if(level == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
{ {
unsafe {NAU88C22_REGWRITE(0x0035, (0xd2d2), (client interface i2c_master_if)i_i2c_client);} // mute: 关闭PGA和输出放大器
unsafe {NAU88C22_REGWRITE(0x007E, 0, (client interface i2c_master_if)i_i2c_client);}
unsafe {NAU88C22_REGWRITE(0x0035, 0, (client interface i2c_master_if)i_i2c_client);}
} }
else if (level == 1) else if(level == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
{ {
unsafe {NAU88C22_REGWRITE(0x0035, (0x0), (client interface i2c_master_if)i_i2c_client);} // 内部最大值 (reg=38, +1.5dB数字增益仅firmware使用)
unsafe {NAU88C22_REGWRITE(0x0035, (0xd2d2), (client interface i2c_master_if)i_i2c_client);}
} }
else else
{ {
debug_printf("volume write %08x\n", level<<8); // 1-37: 0dB ~ 36dB1dB/步
debug_printf("mic_volume write reg=%d\n", level);
unsafe {NAU88C22_REGWRITE(0x007E, (level << 8), (client interface i2c_master_if)i_i2c_client);} 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);} unsafe {NAU88C22_REGWRITE(0x0035, (0xcfcf), (client interface i2c_master_if)i_i2c_client);}
} }
@@ -498,7 +499,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
} }
// 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value // 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value
g_volume_level = dac_level; g_volume_level = dac_level;
g_mic_volume_level = codec_adc_pga_gain_reg_value; // 麦克风HID范围上限37 (register=38的+1.5dB仅firmware内部使用)
g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37;
// ADCL PGA default setting // 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 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
@@ -964,7 +966,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
// 增加音量 // 增加音量
mic_volume(++codec_adc_pga_gain_reg_value); mic_volume(++codec_adc_pga_gain_reg_value);
g_mic_volume_level = codec_adc_pga_gain_reg_value; g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37;
debug_printf("volume up %d\n", 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); 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]; uint8_t new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
@@ -982,7 +984,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
// 减小音量 // 减小音量
mic_volume(--codec_adc_pga_gain_reg_value); mic_volume(--codec_adc_pga_gain_reg_value);
g_mic_volume_level = codec_adc_pga_gain_reg_value; g_mic_volume_level = (codec_adc_pga_gain_reg_value <= 37) ? codec_adc_pga_gain_reg_value : 37;
debug_printf("volume down %d\n", 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); save_value(mic_vol_path, codec_adc_pga_gain_reg_value);
@@ -1271,14 +1273,20 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
if (g_request_mic_volume_set) { if (g_request_mic_volume_set) {
g_request_mic_volume_set = 0; g_request_mic_volume_set = 0;
unsigned new_mic_level = g_mic_volume_level; unsigned new_mic_level = g_mic_volume_level;
if (new_mic_level >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && if (new_mic_level <= 37) { // 0=mute, 1-37=0dB~36dB
new_mic_level <= NAU88L21_PGA_GAIN_REG_MAX_VALUE) {
uint8_t new_led_count; uint8_t new_led_count;
if (new_mic_level == 0) {
// mute: 静音硬件codec_adc_pga_gain_reg_value回到最小值
mic_volume(0);
codec_adc_pga_gain_reg_value = NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE;
new_led_count = 0;
} else {
codec_adc_pga_gain_reg_value = new_mic_level; codec_adc_pga_gain_reg_value = new_mic_level;
mic_volume(codec_adc_pga_gain_reg_value); mic_volume(codec_adc_pga_gain_reg_value);
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value);
// 更新麦克风增益指示LED
new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value]; new_led_count = mic_gain_to_led[codec_adc_pga_gain_reg_value];
}
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value);
// 更新麦克风增益指示LEDL系列
for (int i = 0; i < 15; i++) { for (int i = 0; i < 15; i++) {
if (i < new_led_count) if (i < new_led_count)
led_on(&led_ctx, led_l_physical_map[i]); led_on(&led_ctx, led_l_physical_map[i]);
@@ -1286,7 +1294,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
led_off(&led_ctx, led_l_physical_map[i]); led_off(&led_ctx, led_l_physical_map[i]);
} }
led_update_all(&led_ctx); led_update_all(&led_ctx);
debug_printf("HID SET_MIC_VOLUME: pga=%d\n", codec_adc_pga_gain_reg_value); debug_printf("HID SET_MIC_VOLUME: level=%d pga=%d\n", new_mic_level, codec_adc_pga_gain_reg_value);
} }
} }

View File

@@ -607,12 +607,12 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
} }
// 处理设置麦克风增益命令 (0x82) - SET_MIC_VOLUME // 处理设置麦克风增益命令 (0x82) - SET_MIC_VOLUME
// 范围: 1-38 (NAU88L21 PGA寄存器值1=0dB, 38≈36+1.5dB) // 范围: 0-37 (0=mute, 1-37=0dB~36dB, 1dB/步; register=38的+1.5dB仅firmware内部)
if (data[1] == 0x82) { if (data[1] == 0x82) {
uint8_t mic_level = data[2]; uint8_t mic_level = data[2];
// 参数验证: 1-38 // 参数验证: 0-37
if (mic_level < 1 || mic_level > 38) { if (mic_level > 37) {
return false; return false;
} }
@@ -636,8 +636,8 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
// 获取音量级别 // 获取音量级别
uint8_t volume_level = data[2]; uint8_t volume_level = data[2];
// 参数验证: 0-15 (0=mute, 1-15 = -28dB~0dB) // 参数验证: 0-29 (0=mute, 1-29=-28dB~0dB, 1dB/步)
if (volume_level > 15) { if (volume_level > 29) {
return false; return false;
} }

View File

@@ -601,9 +601,9 @@ class EQDesigner(QMainWindow):
volume_control_layout = QHBoxLayout() volume_control_layout = QHBoxLayout()
self.volume_label = QLabel("监听音量 (0x93/0x94):") self.volume_label = QLabel("监听音量 (0x93/0x94):")
self.volume_spin = QSpinBox() self.volume_spin = QSpinBox()
self.volume_spin.setRange(0, 15) self.volume_spin.setRange(0, 29)
self.volume_spin.setValue(15) self.volume_spin.setValue(29)
self.volume_spin.setSuffix(" (0=静音, 15=0dB)") self.volume_spin.setSuffix(" (0=静音, 29=0dB)")
volume_control_layout.addWidget(self.volume_label) volume_control_layout.addWidget(self.volume_label)
volume_control_layout.addWidget(self.volume_spin) volume_control_layout.addWidget(self.volume_spin)
volume_layout.addRow(volume_control_layout) volume_layout.addRow(volume_control_layout)
@@ -622,9 +622,9 @@ class EQDesigner(QMainWindow):
mic_vol_control_layout = QHBoxLayout() mic_vol_control_layout = QHBoxLayout()
self.mic_volume_label = QLabel("麦克风增益 (0x82/0x83):") self.mic_volume_label = QLabel("麦克风增益 (0x82/0x83):")
self.mic_volume_spin = QSpinBox() self.mic_volume_spin = QSpinBox()
self.mic_volume_spin.setRange(1, 38) self.mic_volume_spin.setRange(0, 37)
self.mic_volume_spin.setValue(38) self.mic_volume_spin.setValue(37)
self.mic_volume_spin.setSuffix(" (1=0dB, 38=最大)") self.mic_volume_spin.setSuffix(" (0=静音, 1=0dB, 37=36dB)")
mic_vol_control_layout.addWidget(self.mic_volume_label) mic_vol_control_layout.addWidget(self.mic_volume_label)
mic_vol_control_layout.addWidget(self.mic_volume_spin) mic_vol_control_layout.addWidget(self.mic_volume_spin)
volume_layout.addRow(mic_vol_control_layout) volume_layout.addRow(mic_vol_control_layout)
@@ -2316,7 +2316,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
log_message(LOG_LEVEL_ERROR, f"设置并保存EQ模式时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"设置并保存EQ模式时出错: {str(e)}", self.log_level)
def on_set_volume(self): def on_set_volume(self):
"""设置监听音量级别发送0x93命令范围0-15""" """设置监听音量级别发送0x93命令范围0-290=静音1=-28dB29=0dB1dB/步"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return return
@@ -2327,7 +2327,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
self, self,
"确认设置监听音量", "确认设置监听音量",
f"将要设置监听音量级别为: {volume_level}\n\n" f"将要设置监听音量级别为: {volume_level}\n\n"
f"音量范围: 0-15 (0=静音, 1=-28dB, ..., 15=0dB)\n\n" f"音量范围: 0-29 (0=静音, 1=-28dB, ..., 29=0dB, 1dB/步)\n\n"
f"是否继续?", f"是否继续?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes | QMessageBox.No,
QMessageBox.No QMessageBox.No
@@ -2343,7 +2343,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
data = bytearray(63) data = bytearray(63)
data[0] = 0x77 data[0] = 0x77
data[1] = 0x93 # SET_VOLUME data[1] = 0x93 # SET_VOLUME
data[2] = volume_level # 0-15 data[2] = volume_level # 0-29
log_message(LOG_LEVEL_INFO, f"正在设置监听音量级别为 {volume_level}...", self.log_level) log_message(LOG_LEVEL_INFO, f"正在设置监听音量级别为 {volume_level}...", self.log_level)
h.write([0x01] + list(data)) h.write([0x01] + list(data))
@@ -2385,7 +2385,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
QMessageBox.information( QMessageBox.information(
self, "监听音量级别", self, "监听音量级别",
f"当前监听音量级别: {volume_level}\n\n" f"当前监听音量级别: {volume_level}\n\n"
f"音量范围: 0-15 (0=静音, 1=-28dB, ..., 15=0dB)" f"音量范围: 0-29 (0=静音, 1=-28dB, ..., 29=0dB, 1dB/步)"
) )
else: else:
log_message(LOG_LEVEL_ERROR, f"无效的0x94响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) log_message(LOG_LEVEL_ERROR, f"无效的0x94响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level)
@@ -2398,7 +2398,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
log_message(LOG_LEVEL_ERROR, f"读取监听音量时出错: {str(e)}", self.log_level) log_message(LOG_LEVEL_ERROR, f"读取监听音量时出错: {str(e)}", self.log_level)
def on_set_mic_volume(self): def on_set_mic_volume(self):
"""设置麦克风增益级别发送0x82命令范围1-38""" """设置麦克风增益级别发送0x82命令范围0-370=静音1=0dB37=36dB1dB/步"""
if self.device_combo.currentData() is None: if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return return
@@ -2409,7 +2409,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
self, self,
"确认设置麦克风增益", "确认设置麦克风增益",
f"将要设置麦克风增益级别为: {mic_level}\n\n" f"将要设置麦克风增益级别为: {mic_level}\n\n"
f"增益范围: 1-38 (1=0dB, 38≈36+1.5dB)\n\n" f"增益范围: 0-37 (0=静音, 1=0dB, ..., 37=36dB, 1dB/步)\n\n"
f"是否继续?", f"是否继续?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes | QMessageBox.No,
QMessageBox.No QMessageBox.No
@@ -2425,7 +2425,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
data = bytearray(63) data = bytearray(63)
data[0] = 0x77 data[0] = 0x77
data[1] = 0x82 # SET_MIC_VOLUME data[1] = 0x82 # SET_MIC_VOLUME
data[2] = mic_level # 1-38 data[2] = mic_level # 0-37
log_message(LOG_LEVEL_INFO, f"正在设置麦克风增益级别为 {mic_level}...", self.log_level) log_message(LOG_LEVEL_INFO, f"正在设置麦克风增益级别为 {mic_level}...", self.log_level)
h.write([0x01] + list(data)) h.write([0x01] + list(data))
@@ -2467,7 +2467,7 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
QMessageBox.information( QMessageBox.information(
self, "麦克风增益级别", self, "麦克风增益级别",
f"当前麦克风增益级别: {mic_level}\n\n" f"当前麦克风增益级别: {mic_level}\n\n"
f"增益范围: 1-38 (1=0dB, 38≈36+1.5dB)" f"增益范围: 0-37 (0=静音, 1=0dB, ..., 37=36dB, 1dB/步)"
) )
else: else:
log_message(LOG_LEVEL_ERROR, f"无效的0x83响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) log_message(LOG_LEVEL_ERROR, f"无效的0x83响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level)

View File

@@ -8,8 +8,8 @@
### 1.2 支持的指令列表 ### 1.2 支持的指令列表
| 指令码 | 命令名称 | 功能 | 方向 | 描述 | | 指令码 | 命令名称 | 功能 | 方向 | 描述 |
|--------|----------|------|------|------| |--------|----------|------|------|------|
| 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益1-381=0dB, 38=约36+1.5dB | | 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益0=静音, 1-37=0dB~36dB, 1dB/步 |
| 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别1-38 | | 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别0=静音, 1-37=0dB~36dB |
| 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 | | 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 |
| 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 | | 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 |
| 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 | | 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 |
@@ -19,8 +19,8 @@
| 0x90 | RESET_EQ_PARAMS | 复位EQ参数 | 主机→设备 | 删除Flash中的EQ参数并恢复头文件预设参数 | | 0x90 | RESET_EQ_PARAMS | 复位EQ参数 | 主机→设备 | 删除Flash中的EQ参数并恢复头文件预设参数 |
| 0x91 | GET_EQ_MODE_COUNT | 获取EQ模式总数 | 主机→设备 | 返回预定义加用户模式的总数(不包含禁用模式) | | 0x91 | GET_EQ_MODE_COUNT | 获取EQ模式总数 | 主机→设备 | 返回预定义加用户模式的总数(不包含禁用模式) |
| 0x92 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | 主机→设备 | 设置当前EQ模式(0-9)并保存到Flash开机时自动恢复 | | 0x92 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | 主机→设备 | 设置当前EQ模式(0-9)并保存到Flash开机时自动恢复 |
| 0x93 | SET_VOLUME | 设置监听音量级别 | 主机→设备 | 设置设备监听音量级别0-150=静音, 1-15=-28dB~0dB, 2dB/步) | | 0x93 | SET_VOLUME | 设置监听音量级别 | 主机→设备 | 设置设备监听音量级别0=静音, 1-29=-28dB~0dB, 1dB/步) |
| 0x94 | GET_VOLUME | 获取监听音量级别 | 主机→设备 | 读取设备当前监听音量级别0-150=静音, 1-15=-28dB~0dB | | 0x94 | GET_VOLUME | 获取监听音量级别 | 主机→设备 | 读取设备当前监听音量级别0=静音, 1-29=-28dB~0dB, 1dB/步 |
| 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关ON/OFF禁用时保存当前模式启用时恢复之前模式 | | 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关ON/OFF禁用时保存当前模式启用时恢复之前模式 |
| 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态ON/OFF | | 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态ON/OFF |
| 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 | | 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 |
@@ -47,17 +47,20 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x82 | 命令码 1 | 1 | 0x82 | 命令码
2 | 1 | uint8 | 增益级别 (1-38: 1=0dB, 38≈36+1.5dB,每级约1dB步) 2 | 1 | uint8 | 增益级别 (0=静音, 1-37=0dB~36dB, 1dB/步)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
**参数说明**: **参数说明**:
- **增益级别范围:** 1-38共38级 - **增益级别范围:** 0-37共38级
- **对应硬件**NAU88C22 ADC PGA增益寄存器reg 0x007E,直接写入寄存器值 - **对应硬件**NAU88C22 ADC PGA增益寄存器reg 0x007E+ 输出放大器reg 0x0035
- 1最小增益0dB - 0静音mute同时清零 reg 0x007E 和 0x0035
- 38最大增益约36+1.5dB数字增益) - 10dB最小有效增益)
- 中间各级约1dB步进 - 21dB
- 0 和 >38 均为无效值,固件将拒绝设置 - ...1dB/步)
- 3736dB最大HID可设置增益
- **注意**内部寄存器值38约+1.5dB数字增益为firmware保留HID不可设置
- >37 为无效值,固件将拒绝设置
**设备端处理**: **设备端处理**:
- 设置后立即应用到ADC PGA硬件 - 设置后立即应用到ADC PGA硬件
@@ -87,12 +90,12 @@
0 | 1 | 0x01 | Report ID 0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1 1 | 1 | 0x77 | 同步头1
2 | 1 | 0x83 | 同步头2 2 | 1 | 0x83 | 同步头2
3 | 1 | uint8 | 当前增益级别 (1-38) 3 | 1 | uint8 | 当前增益级别 (0=静音, 1-37=0dB~36dB)
4-62 | 59 | 0x00 | 保留字节 4-62 | 59 | 0x00 | 保留字节
``` ```
**主动上报说明**: **主动上报说明**:
- 编码器旋转导致增益变化时,设备主动向主机上报当前增益 - 编码器旋转导致增益变化时,设备主动向主机上报当前增益最大上报37内部38时上报37
- HID SET_MIC_VOLUME0x82命令成功执行后设备也主动上报新增益 - HID SET_MIC_VOLUME0x82命令成功执行后设备也主动上报新增益
### 2.1 0x8A - SET_EQ_MODE (切换EQ模式) ### 2.1 0x8A - SET_EQ_MODE (切换EQ模式)
@@ -342,25 +345,25 @@
---------|------|------|------ ---------|------|------|------
0 | 1 | 0x77 | 同步头1 0 | 1 | 0x77 | 同步头1
1 | 1 | 0x93 | 命令码 1 | 1 | 0x93 | 命令码
2 | 1 | uint8 | 音量级别 (0-15: 0=静音, 1=-28dB, ..., 15=0dB) 2 | 1 | uint8 | 音量级别 (0-29: 0=静音, 1=-28dB, ..., 29=0dB)
3-62 | 60 | 0x00 | 保留字节 3-62 | 60 | 0x00 | 保留字节
``` ```
**参数说明**: **参数说明**:
- **音量级别范围:** 0-15共16级) - **音量级别范围:** 0-29共30级)
- **说明:** 控制设备监听输出DAC/耳机)音量级别 - **说明:** 控制设备监听输出DAC/耳机)音量级别
- 0: 静音muteDAC完全静音 - 0: 静音muteDAC完全静音
- 1: -28dB最小有效音量 - 1: -28dB最小有效音量
- 2: -26dB - 2: -27dB
- ...(每级2dB步进 - ...(每级1dB步进
- 15: 0dB最大音量 - 29: 0dB最大音量
- **对应硬件**NAU88C22 DAC音量寄存器reg 0x003416级精度 - **对应硬件**NAU88C22 DAC音量寄存器reg 0x003430级精度1dB/步)
**设备端处理**: **设备端处理**:
- 设置后立即应用到DAC硬件 - 设置后立即应用到DAC硬件
- 同步更新前面板LEDD系列15个LED反映当前音量级别 - 同步更新前面板LEDD系列15个LED反映当前音量级别每2级对应1个LED
- 保存到Flashdac_vol路径断电重启后自动恢复 - 保存到Flashdac_vol路径断电重启后自动恢复
- 如果参数超出范围(>15),固件将拒绝设置 - 如果参数超出范围(>29),固件将拒绝设置
**返回值**: **返回值**:
无直接返回值。如需确认音量是否设置成功请使用GET_VOLUME命令读取当前音量。设备端音量变化含编码器旋转引起的变化会主动通过0x94格式上报。 无直接返回值。如需确认音量是否设置成功请使用GET_VOLUME命令读取当前音量。设备端音量变化含编码器旋转引起的变化会主动通过0x94格式上报。
@@ -384,7 +387,7 @@
0 | 1 | 0x01 | Report ID 0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1 1 | 1 | 0x77 | 同步头1
2 | 1 | 0x94 | 同步头2 2 | 1 | 0x94 | 同步头2
3 | 1 | uint8 | 当前音量级别 (0-15: 0=静音, 1-15=-28dB~0dB) 3 | 1 | uint8 | 当前音量级别 (0-29: 0=静音, 1-29=-28dB~0dB, 1dB/步)
4-62 | 59 | 0x00 | 保留字节 4-62 | 59 | 0x00 | 保留字节
``` ```

View File

@@ -129,26 +129,40 @@ const uint8_t mic_gain_to_led[39] = {
15 // [37] 增益36+1.5 digitial gain: 15个LED 15 // [37] 增益36+1.5 digitial gain: 15个LED
}; };
// DAC音量增益到LED数量的映射表 // DAC监听音量增益到LED数量的映射表
// 索引 0 = 静音(0个LED, reg 0x0034=0x0000) // 索引 0 = 静音 (0个LED, reg 0x0034=0x0000)
// 索引 1~15: -28dB ~ 0dB每灯对应 2dB 步进 // 索引 1~29: -28dB ~ 0dB1dB/步每2个dB对应1个LED最后1dB独占15号LED
const uint8_t dac_gain_to_led[16] = { const uint8_t dac_gain_to_led[30] = {
0, // [0] mute: 0 LEDs 0, // [0] mute: 0 LEDs
1, // [1] -28dB: 1 LED 1, // [1] -28dB: 1 LED
2, // [2] -26dB: 2 LEDs 1, // [2] -27dB: 1 LED
3, // [3] -24dB: 3 LEDs 2, // [3] -26dB: 2 LEDs
4, // [4] -22dB: 4 LEDs 2, // [4] -25dB: 2 LEDs
5, // [5] -20dB: 5 LEDs 3, // [5] -24dB: 3 LEDs
6, // [6] -18dB: 6 LEDs 3, // [6] -23dB: 3 LEDs
7, // [7] -16dB: 7 LEDs 4, // [7] -22dB: 4 LEDs
8, // [8] -14dB: 8 LEDs 4, // [8] -21dB: 4 LEDs
9, // [9] -12dB: 9 LEDs 5, // [9] -20dB: 5 LEDs
10, // [10] -10dB: 10 LEDs 5, // [10] -19dB: 5 LEDs
11, // [11] -8dB: 11 LEDs 6, // [11] -18dB: 6 LEDs
12, // [12] -6dB: 12 LEDs 6, // [12] -17dB: 6 LEDs
13, // [13] -4dB: 13 LEDs 7, // [13] -16dB: 7 LEDs
14, // [14] -2dB: 14 LEDs 7, // [14] -15dB: 7 LEDs
15, // [15] 0dB: 15 LEDs 8, // [15] -14dB: 8 LEDs
8, // [16] -13dB: 8 LEDs
9, // [17] -12dB: 9 LEDs
9, // [18] -11dB: 9 LEDs
10, // [19] -10dB: 10 LEDs
10, // [20] -9dB: 10 LEDs
11, // [21] -8dB: 11 LEDs
11, // [22] -7dB: 11 LEDs
12, // [23] -6dB: 12 LEDs
12, // [24] -5dB: 12 LEDs
13, // [25] -4dB: 13 LEDs
13, // [26] -3dB: 13 LEDs
14, // [27] -2dB: 14 LEDs
14, // [28] -1dB: 14 LEDs
15, // [29] 0dB: 15 LEDs
}; };
/*========================================================================= /*=========================================================================

View File

@@ -66,7 +66,7 @@ extern const uint8_t led_l_physical_map[15];
extern const uint8_t led_d_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 mic_gain_to_led[39];
extern const uint8_t dac_gain_to_led[16]; extern const uint8_t dac_gain_to_led[30];
/*========================================================================= /*=========================================================================
基础控制API 基础控制API