update program key

This commit is contained in:
Steven Dan
2026-06-11 14:39:54 +08:00
parent 6b73d01910
commit dc62ec762e
5 changed files with 93 additions and 60 deletions

View File

@@ -83,11 +83,12 @@ unsigned g_update_led = 0x0;
// CODEC I2C lines
on tile[0]: port p_scl = PORT_I2C_SCL;
on tile[0]: port p_sda = PORT_I2C_SDA;
on tile[0]: in port p_button = XS1_PORT_8D; //bit 4: mode button, bit 5: volume down button, bit 6: mic mute button, bit 7: volume up button
// 改动原因:硬件上 mic mute 与 mode 按键对调bit4=mic mute、bit6=mode与 C1_KEY_*_MASK 一致)。
on tile[0]: in port p_button = XS1_PORT_8D; //bit 4: mic mute button, bit 5: volume down button, bit 6: mode button, bit 7: volume up button
on tile[1]: out port p_mode_led_red = XS1_PORT_1F;
on tile[1]: out port p_leds = XS1_PORT_4D; //bit 0: mode led green, bit 1: mode led blue, bit 2: mic mute led red, bit 3: mic mute led green
on tile[1]: out port p_mic_mute_led_blue = XS1_PORT_1G;
on tile[1]: out port p_mic_mute_led_red = XS1_PORT_1F;
on tile[1]: out port p_leds = XS1_PORT_4D; //bit 0: mic mute led green, bit 1: mic mute led blue, bit 2: mode led red, bit 3: mode led green
on tile[1]: out port p_mode_led_blue = XS1_PORT_1G;
timer tm;
#define SE_DELAY (2000000000) //20s delay
@@ -99,9 +100,9 @@ timer tm;
#define EQ_SYNC_DELAY (50000000) //500ms delay for EQ parameter sync
// 改动原因C1四个实体按键全部接在XS1_PORT_8D的bit4-bit7统一定义位掩码避免在按键状态机中直接使用魔数。
#define C1_KEY_MODE_MASK 0x10
#define C1_KEY_MODE_MASK 0x40
#define C1_KEY_VOL_DOWN_MASK 0x20
#define C1_KEY_MIC_MUTE_MASK 0x40
#define C1_KEY_MIC_MUTE_MASK 0x10
#define C1_KEY_VOL_UP_MASK 0x80
// 改动原因g_dac_vol在C1中按NAU88C22 DAC音量寄存器值保存限制在现有dac_volume注释对应的-66dB~0dB范围内。
@@ -1968,16 +1969,16 @@ void send_eq_data(uint8_t data[])
}
}
// 改动原因:tile1 上电瞬间尚未收到 tile0 的 mode/mic先把 mode 红脚与 PORT_4D 各 bit 拉到熄灭电平(低有效灯:输出 1 为灭),与 apply 中无混色时 mode 红通道熄灭写法一致
// 改动原因:硬件 mic/mode RGB 对调后,上电先把 mic 红脚(p_mic_mute_led_red)、mode 蓝脚(p_mode_led_blue) 与 PORT_4D 各 bit 拉到熄灭电平(低有效灯:输出 1 为灭)。
static inline void c1_panel_leds_force_all_off_hw(void)
{
p_mode_led_red <: 1;
p_mic_mute_led_red <: 1;
p_leds <: 0xF;
p_mic_mute_led_blue <: 1;
p_mode_led_blue <: 1;
}
// 改动原因c1_mode 与灯索引一致1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(R+G)DNR=蓝(p_mic_mute_led_blue)
// 改动原因c1_mode 与灯索引一致1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_leds bit2/3 + p_mode_led_blue),不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(p_mic_mute_led_red+R+bit0绿)DNR=蓝(p_leds bit1)
// 两者同开=橙+蓝混合,两者均关=全灯。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow)
{
@@ -2021,16 +2022,16 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
mode_blue = 0;
}
// 改动原因:硬件LED为低电平点亮1灯/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新。
// 改动原因p_mic_mute_led_blue 由 mic_blue 驱动DNR开且非静音时亮输出0=亮)。
p_mode_led_red <: (mode_red ? 0 : 1);
// 改动原因:硬件 mic/mode RGB 对调后,低四位 bit0~3 分别为 mic mute绿、mic mute蓝、mode红、mode绿,统一刷新。
// 改动原因p_mic_mute_led_red 由 mic_red 驱动,静音/变声时亮输出0=亮)DNR 蓝灯改由 p_leds bit1 驱动
p_mic_mute_led_red <: (mic_red ? 0 : 1);
led_shadow &= ~0xF;
led_shadow |= (mode_green ? 0x0 : 0x1);
led_shadow |= (mode_blue ? 0x0 : 0x2);
led_shadow |= (mic_red ? 0x0 : 0x4);
led_shadow |= (mic_green ? 0x0 : 0x8);
led_shadow |= (mic_green ? 0x0 : 0x1);
led_shadow |= (mic_blue ? 0x0 : 0x2);
led_shadow |= (mode_red ? 0x0 : 0x4);
led_shadow |= (mode_green ? 0x0 : 0x8);
p_leds <: led_shadow;
p_mic_mute_led_blue <: (mic_blue ? 0 : 1);
p_mode_led_blue <: (mode_blue ? 0 : 1);
}
void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl)
@@ -2039,9 +2040,9 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl)
unsigned led_shadow = 0xF;
unsigned mode_led_color_idx = 1;
unsigned mic_mute_switch = 1;
// 改动原因:变声/美声开时 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
// 改动原因:变声/美声开时 p_mic_mute_led_red + p_leds bit0 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
unsigned mic_voice_fx_on = 0;
// 改动原因AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
// 改动原因AI通话降噪DNR开时点亮 p_leds bit1 mic mute 蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
unsigned mic_dnr_on = 0;
c1_panel_leds_force_all_off_hw();

View File

@@ -11,10 +11,10 @@ interface c1_led_ctrl_if {
// 改动原因:与 c1_mode 同值下发 tile11=灭 2=蓝 3=绿 4=橙 5=紫(灯索引即 mode
void set_mode_led_color(unsigned color_idx);
void set_mic_mute_state(unsigned mute_switch); // mute_switch: 0=静音(亮红), 1=非静音(灭红)
// 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区非0=bit2 红 + bit3 绿(橙)0=仅按静音规则驱动 bit2、bit3 熄灭。
// 改动原因:硬件 mic/mode RGB 对调后,变声/美声开时 tile1 点亮 mic 区p_mic_mute_led_red 红 + p_leds bit0 绿(橙);关时仅按静音规则驱动 mic 区熄灭。
// 改动原因:参数名不能用 xC 保留字 onon tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。
void set_mic_voice_fx(unsigned voice_fx_enabled);
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR)开时点亮p_mic_mute_led_blue蓝灯;
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR),开时点亮 p_leds bit1 mic mute 蓝灯;
// 与变声同时开时橙+蓝混合静音优先静音时所有mic灯被红灯取代。断电需保存。
void set_mic_dnr_state(unsigned dnr_enabled);
};

View File

@@ -83,11 +83,12 @@ unsigned g_update_led = 0x0;
// CODEC I2C lines
on tile[0]: port p_scl = PORT_I2C_SCL;
on tile[0]: port p_sda = PORT_I2C_SDA;
on tile[0]: in port p_button = XS1_PORT_8D; //bit 4: mode button, bit 5: volume down button, bit 6: mic mute button, bit 7: volume up button
// 改动原因:硬件上 mic mute 与 mode 按键对调bit4=mic mute、bit6=mode与 C1_KEY_*_MASK 一致)。
on tile[0]: in port p_button = XS1_PORT_8D; //bit 4: mic mute button, bit 5: volume down button, bit 6: mode button, bit 7: volume up button
on tile[1]: out port p_mode_led_red = XS1_PORT_1F;
on tile[1]: out port p_leds = XS1_PORT_4D; //bit 0: mode led green, bit 1: mode led blue, bit 2: mic mute led red, bit 3: mic mute led green
on tile[1]: out port p_mic_mute_led_blue = XS1_PORT_1G;
on tile[1]: out port p_mic_mute_led_red = XS1_PORT_1F;
on tile[1]: out port p_leds = XS1_PORT_4D; //bit 0: mic mute led green, bit 1: mic mute led blue, bit 2: mode led red, bit 3: mode led green
on tile[1]: out port p_mode_led_blue = XS1_PORT_1G;
timer tm;
#define SE_DELAY (2000000000) //20s delay
@@ -99,9 +100,10 @@ timer tm;
#define EQ_SYNC_DELAY (50000000) //500ms delay for EQ parameter sync
// 改动原因C1四个实体按键全部接在XS1_PORT_8D的bit4-bit7统一定义位掩码避免在按键状态机中直接使用魔数。
#define C1_KEY_MODE_MASK 0x10
// 改动原因:硬件 mic mute 与 mode 按键对调,掩码与 bit4/bit6 接线一致。
#define C1_KEY_MODE_MASK 0x40
#define C1_KEY_VOL_DOWN_MASK 0x20
#define C1_KEY_MIC_MUTE_MASK 0x40
#define C1_KEY_MIC_MUTE_MASK 0x10
#define C1_KEY_VOL_UP_MASK 0x80
// 改动原因g_dac_vol在C1中按NAU88C22 DAC音量寄存器值保存限制在现有dac_volume注释对应的-66dB~0dB范围内。
@@ -1971,16 +1973,16 @@ void send_eq_data(uint8_t data[])
}
}
// 改动原因:tile1 上电瞬间尚未收到 tile0 的 mode/mic先把 mode 红脚与 PORT_4D 各 bit 拉到熄灭电平(低有效灯:输出 1 为灭),与 apply 中无混色时 mode 红通道熄灭写法一致
// 改动原因:硬件 mic/mode RGB 对调后,上电先把 mic 红脚(p_mic_mute_led_red)、mode 蓝脚(p_mode_led_blue) 与 PORT_4D 各 bit 拉到熄灭电平(低有效灯:输出 1 为灭)。
static inline void c1_panel_leds_force_all_off_hw(void)
{
p_mode_led_red <: 1;
p_mic_mute_led_red <: 1;
p_leds <: 0xF;
p_mic_mute_led_blue <: 1;
p_mode_led_blue <: 1;
}
// 改动原因c1_mode 与灯索引一致1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1),不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(R+G)DNR=蓝(p_mic_mute_led_blue)
// 改动原因c1_mode 与灯索引一致1=灯 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_leds bit2/3 + p_mode_led_blue),不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(p_mic_mute_led_red+R+bit0绿)DNR=蓝(p_leds bit1)
// 两者同开=橙+蓝混合,两者均关=全灯。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow)
{
@@ -2024,16 +2026,16 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
mode_blue = 0;
}
// 改动原因:硬件LED为低电平点亮1灯/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿,统一刷新。
// 改动原因p_mic_mute_led_blue 由 mic_blue 驱动DNR开且非静音时亮输出0=亮)。
p_mode_led_red <: (mode_red ? 0 : 1);
// 改动原因:硬件 mic/mode RGB 对调后,低四位 bit0~3 分别为 mic mute绿、mic mute蓝、mode红、mode绿,统一刷新。
// 改动原因p_mic_mute_led_red 由 mic_red 驱动,静音/变声时亮输出0=亮)DNR 蓝灯改由 p_leds bit1 驱动
p_mic_mute_led_red <: (mic_red ? 0 : 1);
led_shadow &= ~0xF;
led_shadow |= (mode_green ? 0x0 : 0x1);
led_shadow |= (mode_blue ? 0x0 : 0x2);
led_shadow |= (mic_red ? 0x0 : 0x4);
led_shadow |= (mic_green ? 0x0 : 0x8);
led_shadow |= (mic_green ? 0x0 : 0x1);
led_shadow |= (mic_blue ? 0x0 : 0x2);
led_shadow |= (mode_red ? 0x0 : 0x4);
led_shadow |= (mode_green ? 0x0 : 0x8);
p_leds <: led_shadow;
p_mic_mute_led_blue <: (mic_blue ? 0 : 1);
p_mode_led_blue <: (mode_blue ? 0 : 1);
}
void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_eq_data)
@@ -2042,9 +2044,9 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_
unsigned led_shadow = 0xF;
unsigned mode_led_color_idx = 1;
unsigned mic_mute_switch = 1;
// 改动原因:变声/美声开时 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
// 改动原因:变声/美声开时 p_mic_mute_led_red + p_leds bit0 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
unsigned mic_voice_fx_on = 0;
// 改动原因AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
// 改动原因AI通话降噪DNR开时点亮 p_leds bit1 mic mute 蓝灯;与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
unsigned mic_dnr_on = 0;
c1_panel_leds_force_all_off_hw();

View File

@@ -180,6 +180,7 @@ void flash_opt_unlock(void)
{
debug_printf("Not Winbond flash (DID: %02x), skip unlock\n", did[0]);
flash_opt_disable_ports();
swlock_release(&flash_lock);
return;
}
@@ -190,11 +191,11 @@ void flash_opt_unlock(void)
Mask: 0x7C (0111 1100) */
flash_cmd_opt(READ_STATUS_REG_COMMAND, cmd, 0, data, 1);
sr1 = data[0];
if (sr1 & 0x7C)
if (sr1 != 0)
{
debug_printf("Unlock SR1: %02x -> %02x\n", sr1, sr1 & ~0x7C);
flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0);
data[0] = sr1 & ~0x7C;
debug_printf("Unlock SR1: %02x -> %02x\n", sr1, 0);
flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, data, 0);
data[0] = 0;
flash_cmd_opt(WRITE_STATUS_REG1_COMMAND, data, 1, cmd, 0);
delay_milliseconds(10); /* 等待写入完成 */
}
@@ -204,25 +205,54 @@ void flash_opt_unlock(void)
Mask: 0x40 (0100 0000) */
flash_cmd_opt(READ_STATUS_REG2_COMMAND, cmd, 0, data, 1);
sr2 = data[0];
if ((sr2 & 0x40) || ((sr2 & 0x2) == 0))
if (sr2 != 0x2)
{
debug_printf("Unlock SR2: %02x -> %02x\n", sr2, (sr2 & ~0x40) | 0x2);
debug_printf("Unlock SR2: %02x -> %02x\n", sr2, 0x2);
flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0);
data[0] = (sr2 & ~0x40) | 0x2;
data[0] = 0x2;
flash_cmd_opt(WRITE_STATUS_REG2_COMMAND, data, 1, cmd, 0);
delay_milliseconds(10);
}
/* Reason: 解锁 Status Register 3。
参考 flash_api_ext.c 逻辑,清除 Bit 2 (WPS)
Mask: 0x04 (0000 0100) */
/* Reason: 解锁 Status Register 3。*/
unsigned write_sr3 = 0;
flash_cmd_opt(READ_STATUS_REG3_COMMAND, cmd, 0, data, 1);
sr3 = data[0];
if (sr3 & 0x04)
if ((did[0] == 0xEF) && (sr3 != 0x60))
{
debug_printf("Unlock SR3: %02x -> %02x\n", sr3, sr3 & ~0x04);
flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0);
data[0] = sr3 & ~0x04;
data[0] = 0x60;
write_sr3 = 1;
}
else if (((did[0] == 0xC8) || ((did[0] == 0x85) && (did[1] == 0x60))) && (sr3 != 0x20))
{
data[0] = 0x20;
}
else if ((did[0] == 0x0b) && (did[1] == 0x40) && (sr3 != 0x40))
{
data[0] = 0x40;
write_sr3 = 1;
}
else if ((did[0] == 0x5e) && (sr3 != 0x10))
{
data[0] = 0x10;
write_sr3 = 1;
}
else if ((did[0] == 0x85) && (did[1] == 0x20) && (sr3 != 0x0))
{
data[0] = 0x00;
write_sr3 = 1;
}
else if (sr3 != 0)
{
data[0] = 0;
write_sr3 = 1;
}
if (write_sr3 == 1)
{
debug_printf("Unlock SR3: %02x -> %02x\n", sr3, data[0]);
flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, data, 0);
flash_cmd_opt(WRITE_STATUS_REG3_COMMAND, data, 1, cmd, 0);
delay_milliseconds(10);
}

View File

@@ -10,10 +10,10 @@ interface c1_led_ctrl_if {
// 改动原因:与 c1_mode 同值下发 tile11=灭 2=蓝 3=绿 4=橙 5=紫(灯索引即 mode
void set_mode_led_color(unsigned color_idx);
void set_mic_mute_state(unsigned mute_switch); // mute_switch: 0=静音(亮红), 1=非静音(灭红)
// 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区非0=bit2 红 + bit3 绿(橙)0=仅按静音规则驱动 bit2、bit3 熄灭。
// 改动原因:硬件 mic/mode RGB 对调后,变声/美声开时 tile1 点亮 mic 区p_mic_mute_led_red 红 + p_leds bit0 绿(橙);关时仅按静音规则驱动 mic 区熄灭。
// 改动原因:参数名不能用 xC 保留字 onon tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。
void set_mic_voice_fx(unsigned voice_fx_enabled);
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR)开时点亮p_mic_mute_led_blue蓝灯;
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR),开时点亮 p_leds bit1 mic mute 蓝灯;
// 与变声同时开时橙+蓝混合静音优先静音时所有mic灯被红灯取代。断电需保存。
void set_mic_dnr_state(unsigned dnr_enabled);
};