1
0

3 Коммитууд d12b5d9360 ... 6967758f53

Эзэн SHA1 Мессеж Огноо
  caihoucong 6967758f53 完成大致的基本功能,硬件跑通 3 сар өмнө
  caihoucong 8389b0da38 解决时钟的操作和添加三击play进入DUT模式 3 сар өмнө
  caihoucong da2ecad966 BT模式下的按键有效,并且解决数码管点亮问题 3 сар өмнө
100 өөрчлөгдсөн 7941 нэмэгдсэн , 6530 устгасан
  1. 15 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_audio.c
  2. 3 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_audio.h
  3. 30 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_bt.c
  4. 36 1
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_fmrx.c
  5. 4 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_fmrx.h
  6. 5 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_i2c.c
  7. 27 3
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_key.c
  8. 1 1
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_key.h
  9. 89 1
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_sys.c
  10. 1 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_sys.h
  11. 198 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/hlw_bt.c
  12. 22 0
      sdk_560x_01x_s2256_20241227/app/platform/bsp/hlw_bt.h
  13. 23 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func.c
  14. 7 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_bt.c
  15. 65 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_fmrx.c
  16. 35 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_hlw.c
  17. 32 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_hlw.h
  18. 75 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_idle.c
  19. 3 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_lowpwr.c
  20. 579 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_qn8035.c
  21. 151 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/func_qn8035.h
  22. 3 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/sfunc_bt_call.c
  23. 3 0
      sdk_560x_01x_s2256_20241227/app/platform/functions/sfunc_bt_ring.c
  24. 1 1
      sdk_560x_01x_s2256_20241227/app/platform/header/config_extra.h
  25. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/AB5602D_YinWo_TD009(ikF-FM听力蓝牙耳机)_CHC_EN_DUT_TEST_(00009167_41242146).prd
  26. 21 21
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/Settings/Boombox.setting
  27. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.bin
  28. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.dcf
  29. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.rv32
  30. 6512 6502
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/map.txt
  31. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/res.bin
  32. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/res/poweron.mp3
  33. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_audio.o
  34. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_aux.o
  35. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_bpap.o
  36. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_bt.o
  37. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_charge.o
  38. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_cm.o
  39. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_dac.o
  40. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_dump_buf_huart.o
  41. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_eq.o
  42. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_eq_table.o
  43. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fmrx.o
  44. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fmtx.o
  45. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fs.o
  46. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_hdmi.o
  47. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_hdmi_cec_msg.o
  48. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_huart_audio.o
  49. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2c.o
  50. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s.o
  51. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s_ta5711.o
  52. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s_wm8978.o
  53. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iap.o
  54. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_id3_tag.o
  55. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iic_putchar.o
  56. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iis_ext.o
  57. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_ir.o
  58. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_karaok.o
  59. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_key.o
  60. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_led.o
  61. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_map.o
  62. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_music.o
  63. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_param.o
  64. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_piano.o
  65. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_port_init.o
  66. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_record.o
  67. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spiflash1.o
  68. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spiflash1_music_bin.o
  69. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spp.o
  70. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_sys.o
  71. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_tkey.o
  72. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_uart.o
  73. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/hlw_bt.o
  74. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func.o
  75. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_aux.o
  76. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt.o
  77. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt_dut.o
  78. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt_hid.o
  79. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_clock.o
  80. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_exspiflash_music.o
  81. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_fmrx.o
  82. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_hdmi.o
  83. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_hlw.o
  84. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_huart.o
  85. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_i2s.o
  86. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_idle.o
  87. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_lowpwr.o
  88. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_music.o
  89. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_qn8035.o
  90. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_spdif.o
  91. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_speaker.o
  92. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_tom_cat.o
  93. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_uart_upd.o
  94. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_update.o
  95. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_usbdev.o
  96. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_call.o
  97. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_ota.o
  98. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_ring.o
  99. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_record.o
  100. BIN
      sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_record_play.o

+ 15 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_audio.c

@@ -46,6 +46,10 @@ void tom_cat_sdadc_process(u8 *ptr, u32 samples, int ch_mode);
     #define karaok_sdadc_callback   sdadc_dummy
 #endif
 
+#if FMRX_QN8035_EN
+#define fmrx_sdadc_callback     fmrx_sdadc_process
+#endif // FMRX_QN8035_EN
+
 
 //AUX analog gain -42DB~+3DB
 //MIC analog gain: 0~13(共14级), step 3DB (3db ~ +42db)
@@ -59,6 +63,9 @@ const sdadc_cfg_t rec_cfg_tbl[] = {
     {MIC_CHANNEL_CFG,   SPR_44100,  (12 << 6),   ADC2SRC_EN,     0,      256,    karaok_sdadc_callback},         /* KARAOK  */
     {MIC_CHANNEL_CFG,   SPR_44100,  (12 << 6),   ADC2DAC_EN,     0,      128,    mic_trim_sdadc_callback},
     {MIC_CHANNEL_CFG,   SPR_16000,  (12 << 6),   ADC2DAC_EN,     0,      256,    tom_cat_sdadc_callback},
+#if FMRX_QN8035_EN
+    {FMRX_CHANNEL_CFG, SPR_44100,   (2 << 6),    ADC2DAC_EN,     0,      256,    fmrx_sdadc_callback},
+#endif // FMRX_QN8035_EN
 };
 
 const u8 btmic_ch_tbl[] = {0, CH_MIC_PF2, CH_MIC_PF3};
@@ -76,6 +83,14 @@ void audio_path_init(u8 path_idx)
     }
 #endif // FUNC_AUX_EN
 
+#if FMRX_QN8035_EN
+    if (path_idx == AUDIO_PATH_FM)
+    {
+        memcpy(&cfg, &rec_cfg_tbl[AUDIO_PATH_FM], sizeof(sdadc_cfg_t));
+        cfg.gain = ((u16)FMRX_AUX_ANL_GAIN << 5);
+    }
+#endif // FMRX_QN8035_EN
+
     if (path_idx == AUDIO_PATH_BTMIC || path_idx == AUDIO_PATH_KARAOK) {
         if (path_idx == AUDIO_PATH_BTMIC) {
             if (sys_cb.hfp_karaok_en) {

+ 3 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_audio.h

@@ -8,6 +8,9 @@
 #define AUDIO_PATH_KARAOK          4
 #define AUDIO_PATH_MICTRIM         5
 #define AUDIO_PATH_TOM_CAT         6
+#if FMRX_QN8035_EN
+#define AUDIO_PATH_FM              7
+#endif // FMRX_QN8035_EN
 
 void audio_path_init(u8 path_idx);
 void audio_path_exit(u8 path_idx);

+ 30 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_bt.c

@@ -1,5 +1,9 @@
 #include "include.h"
 #include "api.h"
+#if HLW_UI
+#include "hlw_bt.h"
+#include "func_hlw.h"
+#endif // HLW_UI
 
 
 void bt_new_name_init(void);
@@ -160,6 +164,9 @@ uint bsp_bt_get_hfp_vol(uint hfp_vol)
 
 void bt_emit_notice(uint evt, u32 param)
 {
+#if HLW_UI
+    printf("%s evt %d\n", __func__, evt);
+#endif // HLW_UI
     switch(evt) {
     case BT_NOTICE_INIT_FINISH:
         print_btrf_sfr();
@@ -174,11 +181,28 @@ void bt_emit_notice(uint evt, u32 param)
 #else
         bt_connect(BT_POWER_UP_RECONNECT_TIMES);
 #endif
+#if HLW_UI
+        hlw_bt_init();
+#endif // HLW_UI
 #endif
         break;
 
+#if HLW_UI
+    case BT_NOTICE_CONNECT_START:
+        hlw_bt_start_reconnect_handle();
+        break;
+
+    case BT_NOTICE_CONNECT_FAIL:
+        hlw_bt_reconnect_fail_handle();
+        break;
+#endif // HLW_UI
+
     case BT_NOTICE_DISCONNECT:
          printf("BT_NOTICE_DISCONNECT\n");
+#if HLW_UI
+        hlw_cb.disconnect_reason = ((u8 *)param)[0];
+        hlw_bt_disconnected_handle();
+#endif // HLW_UI
 #if LED_MATRIX_HUART_TX
         huart_tx_mode(3);
 #endif
@@ -188,6 +212,9 @@ void bt_emit_notice(uint evt, u32 param)
         break;
     case BT_NOTICE_CONNECTED:
          printf("BT_NOTICE_CONNECTED\n");
+#if HLW_UI
+         hlw_bt_connected_handle();
+#endif // HLW_UI
 #if LED_MATRIX_HUART_TX
         huart_tx_mode(4);
 #endif
@@ -205,6 +232,9 @@ void bt_emit_notice(uint evt, u32 param)
 
     case BT_NOTICE_LOSTCONNECT:
         printf("BT_NOTICE_LOSTCONNECT\n");
+#if HLW_UI
+        hlw_bt_disconnect_linkloss_handle();
+#endif // HLW_UI
         break;
 
 //    case BT_NOTICE_INCOMING:

+ 36 - 1
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_fmrx.c

@@ -4,9 +4,11 @@
 AT(.com_text.fmrx.isr)
 void fmrx_tmr1ms_isr(void)
 {
+#if !FMRX_QN8035_EN
     if (func_cb.sta == FUNC_FMRX) {
         fmrx_dac_sync();
     }
+#endif // FMRX_QN8035_EN
 }
 
 AT(.text.bsp.fmrx)
@@ -173,17 +175,21 @@ u8 fmrx_auto_narrow_filter(void)
 AT(.text.bsp.fmrx)
 void fmrx_threshold_init(void)
 {
+#if FMRX_QN8035_EN
     fmrx_thd.r_val = FMRX_THRESHOLD_VAL;
     fmrx_thd.z_val = FMRX_THRESHOLD_Z;
     fmrx_thd.fz_val = FMRX_THRESHOLD_FZ;
     fmrx_thd.d_val = FMRX_THRESHOLD_D;
+#endif // FMRX_QN8035_EN
 }
 
 AT(.text.bsp.fmrx)
 void bsp_fmrx_init(void)
 {
     printf("%s\n", __func__);
-
+#if FMRX_QN8035_EN
+    qn8035_init();
+#else
     fmrx_power_on(FMRX_THRESHOLD_VAL);
 #if FMRX_REC_EN
     rec_src.spr = SPR_44100;
@@ -198,32 +204,53 @@ void bsp_fmrx_init(void)
     rec_src.source_start = fmrx_rec_start;
     rec_src.source_stop  = fmrx_rec_stop;
 #endif
+#endif // FMRX_QN8035_EN
 }
 
 
 AT(.text.bsp.fmrx)
 void bsp_fmrx_exit(void)
 {
+#if FMRX_QN8035_EN
+    qn8035_off();
+#else
     fmrx_power_off();
+#endif // FMRX_QN8035_EN
+}
+
+AT(.text.bsp.fmrx)
+void bsp_fmrx_set_volume(u8 vol)
+{
+#if FMRX_QN8035_EN
+    qn8035_set_vol(vol);
+#endif
 }
 
 
 AT(.text.bsp.fmrx)
 void bsp_fmrx_set_freq(u16 freq)
 {
+#if FMRX_QN8035_EN
+    qnd8035_set_freq(freq);
+#else
     fmrx_set_freq(freq);
     fmrx_set_audio_channel_dual(FMRX_AUDIO_CHANNEL);  //FFM输出声道选则,一般单声道比双声道噪音会小些  //0 Mono  //1 Dual
     if (xcfg_cb.fmrx_cs_filter_fixed) {
         //若指标测试时发射机调制深度加大,FM收到后有失真,可以继续加大cs_filter值即可减少失真, 但也要留意,cs_filter值越大,理论上引入的噪声越多。
         fmrx_set_cs_filter(xcfg_cb.fmrx_cs_filter_sel);
     }
+#endif // FMRX_QN8035_EN
 }
 
 
 AT(.text.bsp.fmrx)
 u8 bsp_fmrx_check_freq(u16 freq)
 {
+#if FMRX_QN8035_EN
+    return qn8035_seek(freq);
+#else
     return fmrx_check_freq(freq);
+#endif // FMRX_QN8035_EN
 }
 
 AT(.text.bsp.fmrx)
@@ -236,5 +263,13 @@ void bsp_fmrx_logger_out(void)
     fmrx_logger_out();
 }
 
+#if FMRX_QN8035_EN
+AT(.text.bsp.fmrx)
+void fmrx_sdadc_process(u8 *ptr, u32 samples, int ch_mode)
+{
+    sdadc_pcm_2_dac(ptr, samples, ch_mode);
+}
+#endif // FMRX_QN8035_EN
+
 #endif // FUNC_FMRX_EN
 

+ 4 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_fmrx.h

@@ -21,4 +21,8 @@ void fmrx_test_channel_switch(u8 dir);
 #endif
 
 
+#if FMRX_QN8035_EN
+void fmrx_sdadc_process(u8 *ptr, u32 samples, int ch_mode);
+#endif // FMRX_QN8035_EN
+
 #endif // _BSP_FMRX_H

+ 5 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_i2c.c

@@ -1,4 +1,5 @@
 #include "include.h"
+#include "func_hlw.h"
 
 #if I2C_EN
 //AT(.text.bsp.i2c)
@@ -63,6 +64,7 @@ void bsp_i2c_start(void)
         delay_us(5);
     }
 #endif // I2C_MUX_SD_EN
+    hlw_cb.linein_test_en = false;
 
     I2C_SDA_SCL_OUT();
     I2C_SDA_SCL_H();
@@ -82,6 +84,9 @@ void bsp_i2c_stop(void)
     I2C_SCL_H();
     bsp_i2c_delay();
     I2C_SDA_H();
+
+    hlw_cb.linein_test_en = true;
+    I2C_SDA_IN();
 }
 
 //tx 1byte

+ 27 - 3
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_key.c

@@ -1,4 +1,7 @@
 #include "include.h"
+#if HLW_UI
+#include "func_hlw.h"
+#endif // HLW_UI
 
 #define VBG_VOLTAGE          sys_trim.vbg
 
@@ -227,7 +230,9 @@ static u8 get_pwrkey(void)
     if ((!xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON)) {
         return NO_KEY;
     }
-
+#if HLW_UI
+    //printf("key_val 0x%x\n", key_val);
+#endif // HLW_UI
     if (key_val > 0xff) {
         key_val = 0xff;
     }
@@ -492,7 +497,7 @@ void power_on_check(void)
     u32 pwron_press_nms;
     u32 rtccon9 = RTCCON9;                          //wakeup pending
 //    u32 rtccon10 = RTCCON10;
-//    printf("power_on_check: %08x, %08x\n", rtccon9, rtccon10);
+    printf("power_on_check: %08x\n", rtccon9);
 
     RTCCON9 = 0x3ff;                                //Clr pending
     RTCCON10 = 0x7ff;                               //Clr pending
@@ -504,7 +509,7 @@ void power_on_check(void)
         }
         return;                                     //长按PWRKEY 10S复位后直接开机。
     }
-
+#if !HLW_UI
     if (rtccon9 & BIT(0)) {
         printf("alarm wakeup\n");
 #if PWR_RC_32K_EN
@@ -519,6 +524,15 @@ void power_on_check(void)
 #endif // PWR_RC_32K_EN
         return;
     }
+#endif // HLW_UI
+
+#if HLW_UI
+    if(rtccon9 & BIT(3))
+    {
+        hlw_cb.charge_poweron_flag = true;
+        return;
+    }
+#endif // HLW_UI
 
 #if USER_PWRKEY
     int up_cnt = 0, ticks = 0;
@@ -537,6 +551,13 @@ void power_on_check(void)
     if (is_powron_frist_enable(rtccon9)) {
         return;
     }
+#if 0
+    if(linein_detect_init_hlw())
+    {
+        printf("linein poweroff\n");
+        goto __poweroff;
+    }
+#endif // 0
 
     while (1) {
         WDT_CLR();
@@ -581,6 +602,7 @@ void power_on_check(void)
 #endif // LINEIN_2_PWRDOWN_EN
 
 #if CHARGE_EN
+#if !HLW_UI
         if (xcfg_cb.charge_en) {
 			charge_cnt++;
 			if ((charge_cnt % 20) == 0) {
@@ -596,6 +618,7 @@ void power_on_check(void)
                 sfunc_pwrdown(0);
             }
         }
+#endif // HLW_UI
 #endif // CHARGE_EN
 
         if (sys_cb.poweron_flag) {
@@ -622,6 +645,7 @@ __pwron:
                     if ((!SOFT_POWER_ON_OFF) || ((!xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON))) {
                         goto __pwron;       //没有软开关机功能,直接开机。
                     }
+__poweroff:
                     saradc_exit(adc_cb.channel);
                     sfunc_pwrdown(1);
                 }

+ 1 - 1
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_key.h

@@ -426,7 +426,7 @@ extern adc_cb_t adc_cb;
 
 extern const adkey_tbl_t adkey_table[];
 extern const adkey_tbl_t adkey2_table[];
-extern const adkey_tbl_t pwrkey_table[6];
+extern const adkey_tbl_t pwrkey_table[7];
 extern const u8 key_config_table[];
 
 void io_key_init(void);

+ 89 - 1
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_sys.c

@@ -1,4 +1,7 @@
 #include "include.h"
+#if HLW_UI
+#include "func_hlw.h"
+#endif // HLW_UI
 
 extern u32 __comm_start, __comm_end;
 extern u32 __bss_size, __bss_end, __bss_start;
@@ -309,6 +312,39 @@ void linein_detect(void)
 }
 #endif // LINEIN_DETECT_EN
 
+#if HLW_UI
+u8 linein_detect_init_hlw(void)
+{
+    //return 0;
+    I2C_SDA_IN();
+    delay_5ms(10);
+    printf("I2C_SDA_IS_H() %d\n", I2C_SDA_IS_H());
+    if(!I2C_SDA_IS_H())
+    {
+        return 1;
+    }
+
+    return 0;
+}
+
+AT(.com_text.detect)
+void linein_detect_hlw(void)
+{
+    if(hlw_cb.linein_test_en)
+    {
+        //printf("I2C_SDA_IS_H() %d\n", I2C_SDA_IS_H());
+        if(!I2C_SDA_IS_H())
+        {
+            if(func_cb.sta != FUNC_IDLE)
+            {
+                sys_cb.pwrdwn_tone_en = 1;
+                func_cb.sta = FUNC_PWROFF;
+            }
+        }
+    }
+}
+#endif // HLW_UI
+
 #if EARPHONE_DETECT_EN
 AT(.com_text.detect)
 void earphone_detect(void)
@@ -401,7 +437,7 @@ void pwrkey_2_hw_pwroff_detect(void)
 #endif // PWRKEY_2_HW_PWRON
 
 
-#define DAC_FIFIO_CHECK          0   
+#define DAC_FIFIO_CHECK          0
 
 #if DAC_FIFIO_CHECK
 AT(.com_text.str_dbg)
@@ -534,6 +570,20 @@ void usr_tmr5ms_isr(void)
 #if DAC_DNR_EN
         dac_dnr_detect();
 #endif // DAC_DNR_EN
+        linein_detect_hlw();
+#if CHARGE_EN
+        if (xcfg_cb.charge_en)
+        {
+            if (CHARGE_DC_IN()) {
+                if (sys_cb.dc_in_filter < 10) {
+                    sys_cb.dc_in_filter++;
+                }
+            } else {
+                sys_cb.dc_in_filter = 0;
+            }
+        }
+#endif // CHARGE_EN
+
     } else {
         //dac_pcm_pow_calc 需要避免和 dac_dnr_detect 在同一时间调用 (两个函数用到同一硬件模块),否则能量值不准
         //dac_pcm_pow_calc 可以在这里调用,硬件计算能量,很快,us级别
@@ -585,6 +635,9 @@ void usr_tmr5ms_isr(void)
             f_tom.rec_time_ms += 100;
         }
 #endif
+#if HLW_UI
+        hlw_bt_disconnect_count_process();
+#endif // HLW_UI
     }
 
     //500ms timer process
@@ -873,6 +926,11 @@ static void bsp_var_init(void)
     sys_cb.sleep_en = 0;
     sys_cb.lpwr_warning_times = LPWR_WARING_TIMES;
     sfunc_bt_call_flag = 0;
+    sys_cb.dc_in_filter = 0;
+
+#if HLW_UI
+    hlw_func_var_init();
+#endif // HLW_UI
 
     key_var_init();
     plugin_var_init();
@@ -1309,8 +1367,17 @@ void bsp_sys_init(void)
 
     /// enable user timer for display & dac
     sys_set_tmr_enable(1, 1);
+
+#if HLW_UI
+    if(!hlw_cb.charge_poweron_flag)
+#endif // HLW_UI
+    {
     led_power_up();
     gui_display(DISP_POWERON);
+#if FMRX_QN8035_EN
+    qn8035_is_online();
+#endif // FMRX_QN8035_EN
+    }
 
     bt_init();
     if (xcfg_cb.spk_mute_en * LOUDSPEAKER_MUTE_EN) {
@@ -1344,7 +1411,12 @@ void bsp_sys_init(void)
     if (SD_INSERT_EXCEPTION_RESET && is_sd_insert_reset()) {
         printf("sd insert exception reset, NO need to play power_on.mp3\n");
     } else {
+#if HLW_UI
+        if(!hlw_cb.charge_poweron_flag)
+#endif // HLW_UI
+        {
         mp3_res_play(RES_BUF_POWERON_MP3, RES_LEN_POWERON_MP3);
+        }
     }
 
 #endif // WARNING_POWER_ON
@@ -1388,6 +1460,22 @@ void bsp_sys_init(void)
             } else
 #endif
                 func_cb.sta = FUNC_BT;
+#if HLW_UI
+                printf("hlw_cb.charge_poweron_flag %d\n", hlw_cb.charge_poweron_flag);
+                if(hlw_cb.charge_poweron_flag)
+                {
+                    func_cb.sta = FUNC_IDLE;
+                    if (!CHARGE_DC_IN())
+                    {
+                        func_cb.sta = FUNC_PWROFF;
+                    }
+                }
+
+                if(func_cb.sta != FUNC_IDLE)
+                {
+                    hlw_cb.linein_test_en = true;
+                }
+#endif // HLW_UI
             }
         }
     }

+ 1 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/bsp_sys.h

@@ -98,6 +98,7 @@ volatile u8  pwrdwn_hw_flag;    //模拟硬开关,关机标志
     u32 pwroff_rtcclk;          //校准时得到的平均RC频率,提供给下一次校准使用
     u32 pwroff_rtccnt;          //记录软关机时的rtccnt值,用于算出软关机到开机变化的rtccnt值
 #endif
+    u8 dc_in_filter;
 } sys_cb_t;
 extern sys_cb_t sys_cb;
 extern volatile int micl2gnd_flag;

+ 198 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/hlw_bt.c

@@ -0,0 +1,198 @@
+#include "include.h"
+#include "api.h"
+#include "hlw_bt.h"
+#include "func_hlw.h"
+
+#if HLW_UI
+
+#define HLW_BT_TRACE_EN                1
+
+#if HLW_BT_TRACE_EN
+#define TRACE(...)              printf(__VA_ARGS__)
+#define TRACE_R(...)            print_r(__VA_ARGS__)
+#else
+#define TRACE(...)
+#define TRACE_R(...)
+#endif
+
+void hlw_bt_init(void)
+{
+    u8 pairlist_exist_flag = bt_nor_get_link_info(NULL);
+
+    TRACE("%s scan_status %d\n", __func__, pairlist_exist_flag);
+
+    if(pairlist_exist_flag)
+    {
+        //hlw_bt_mode_set(0x02);
+    }
+    else
+    {
+        hlw_bt_mode_set(0x03);
+    }
+}
+
+/*
+param : scan status
+set bt mode,    0:不可见不可连   2:可连不可见   3:可见可连
+*/
+void hlw_bt_mode_set(u8 scan_status)
+{
+    TRACE("%s scan_status %d\n", __func__, scan_status);
+    bt_set_scan_do(scan_status);
+}
+
+
+void hlw_bt_enter_pairmode_handle(void)
+{
+    TRACE("%s\n", __func__);
+    hlw_bt_mode_set(0x03);
+}
+
+void hlw_bt_start_reconnect_handle(void)
+{
+    hlw_cb.reconnect_flag = true;
+
+    if(hlw_cb.reconnect_count < 2)
+    {
+        hlw_cb.reconnect_count++;
+    }
+
+    TRACE("%s recon flag %d cnt %d\n", __func__, hlw_cb.reconnect_flag, hlw_cb.reconnect_count);
+}
+
+
+void hlw_bt_reconnect_fail_handle(void)
+{
+    if(hlw_cb.reconnect_count > 0)
+    {
+        hlw_cb.reconnect_count--;
+    }
+
+    if(hlw_cb.reconnect_count == 0)
+    {
+        hlw_cb.reconnect_flag = false;
+    }
+
+    TRACE("%s flag %d\n", __func__, hlw_cb.reconnect_flag);
+
+    if(!hlw_cb.reconnect_flag)
+    {
+        hlw_bt_enter_pairmode_handle();
+    }
+}
+
+
+void hlw_bt_connected_handle(void)
+{
+    if(hlw_cb.reconnect_count > 0)
+    {
+        hlw_cb.reconnect_count--;
+    }
+
+    if(hlw_cb.reconnect_count == 0)
+    {
+        hlw_cb.reconnect_flag = false;
+    }
+
+#if BT_2ACL_EN
+    if(hlw_cb.curr_connect_cnt < 2)
+    {
+        hlw_cb.curr_connect_cnt++;
+    }
+
+    if(hlw_cb.curr_connect_cnt == 2)
+    {
+        hlw_bt_mode_set(0x02);
+    }
+    else
+    {
+        hlw_bt_mode_set(0x00);
+    }
+#else
+    hlw_cb.curr_connect_cnt = 1;
+    hlw_bt_mode_set(0x00);
+#endif // BT_2ACL_EN
+    TRACE("%s con num %d\n", __func__, hlw_cb.curr_connect_cnt);
+}
+
+void hlw_bt_disconnected_handle(void)
+{
+    hlw_cb.disconnect_flag = 1;
+    hlw_cb.disconnect_count = 0;
+
+    if(hlw_cb.curr_connect_cnt > 0)
+    {
+        hlw_cb.curr_connect_cnt--;
+    }
+    TRACE("%s con num %d reson %d\n", __func__, hlw_cb.curr_connect_cnt, hlw_cb.disconnect_reason);
+}
+
+void hlw_bt_disconnect_linkloss_handle(void)
+{
+    hlw_cb.disconnect_flag = 2;
+    hlw_cb.disconnect_count = 0;
+    TRACE("%s con num %d\n", __func__, hlw_cb.curr_connect_cnt);
+}
+
+AT(.com_text.detect)
+void hlw_bt_disconnect_count_process(void)
+{
+    if(hlw_cb.disconnect_flag == 1)
+    {
+        if(++hlw_cb.disconnect_count >= 2)
+        {
+            hlw_cb.disconnect_flag = 2;
+            hlw_cb.disconnect_count = 0;
+        }
+    }
+}
+
+void hlw_bt_disconnect_process_do(void)
+{
+    hlw_cb.disconnect_flag = 0;
+
+    TRACE("%s con num %d dis reason %d\n", __func__, hlw_cb.curr_connect_cnt, hlw_cb.disconnect_reason);
+
+#if BT_2ACL_EN
+    if(hlw_cb.curr_connect_cnt == 1)
+    {
+        hlw_bt_mode_set(0x02);
+    }
+    else if(hlw_cb.curr_connect_cnt == 0)
+    {
+        if(hlw_cb.disconnect_reason == 0x08)
+        {
+            hlw_bt_mode_set(0x02);
+        }
+        else
+        {
+            hlw_bt_mode_set(0x03);
+        }
+    }
+#else
+    if(hlw_cb.disconnect_reason == 0x08)
+    {
+        hlw_bt_mode_set(0x02);
+    }
+    else
+    {
+        hlw_bt_mode_set(0x03);
+    }
+#endif
+
+    hlw_cb.disconnect_reason = 0x00;
+}
+
+
+void hlw_bt_disconnect_process(void)
+{
+    if(hlw_cb.disconnect_flag != 2)
+    {
+        return;
+    }
+
+    hlw_bt_disconnect_process_do();
+}
+
+
+#endif // HLW_UI

+ 22 - 0
sdk_560x_01x_s2256_20241227/app/platform/bsp/hlw_bt.h

@@ -0,0 +1,22 @@
+#ifndef _HLW_BT_H
+#define _HLW_BT_H
+
+
+
+#if HLW_UI
+void hlw_bt_init(void);
+void hlw_bt_mode_set(u8 scan_status);
+void hlw_bt_enter_pairmode_handle(void);
+void hlw_bt_start_reconnect_handle(void);
+void hlw_bt_reconnect_fail_handle(void);
+void hlw_bt_connected_handle(void);
+void hlw_bt_disconnected_handle(void);
+void hlw_bt_disconnect_count_process(void);
+void hlw_bt_disconnect_process_do(void);
+void hlw_bt_disconnect_process(void);
+void hlw_bt_disconnect_linkloss_handle(void);
+#endif // HLW_UI
+
+
+
+#endif //_HLW_BT_H

+ 23 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func.c

@@ -151,6 +151,16 @@ void func_process(void)
     }
 #endif // CHARGE_EN
 
+#if CHARGE_EN
+    if (xcfg_cb.charge_en) {
+        if (CHARGE_DC_IN() && (sys_cb.dc_in_filter == 10))
+        {
+            sys_cb.dc_in_filter = 10 + 1;
+            func_cb.sta = FUNC_IDLE;
+        }
+    }
+#endif // CHARGE_EN
+
 #if SYS_KARAOK_EN
     karaok_process();
 #endif
@@ -168,13 +178,23 @@ void func_process(void)
 AT(.text.func.msg)
 void func_message(u16 msg)
 {
+#if 0//HLW_UI
+    if(msg != 0)
+    {
+        printf("msg 0x%x\n", msg);
+    }
+#endif // HLW_UI
+
     switch (msg) {
         case KL_NEXT_VOL_UP:
         case KH_NEXT_VOL_UP:
+#if !HLW_UI
         case KL_VOL_UP:
         case KH_VOL_UP:
+#endif // HLW_UI
             sys_cb.maxvol_fade = 1;
         case KU_VOL_UP_NEXT:
+        case KD_VOL_UP_NEXT:
         case KU_VOL_UP:
         case KU_VOL_NEXT_PREV:
             if(bsp_bt_hid_vol_change(HID_KEY_VOL_UP)){
@@ -212,9 +232,12 @@ void func_message(u16 msg)
         case KL_PREV_VOL_DOWN:
         case KH_PREV_VOL_DOWN:
         case KU_VOL_DOWN_PREV:
+        case KD_VOL_DOWN_PREV:
         case KU_VOL_DOWN:
+#if !HLW_UI
         case KL_VOL_DOWN:
         case KH_VOL_DOWN:
+#endif // HLW_UI
             if(bsp_bt_hid_vol_change(HID_KEY_VOL_DOWN)){
                 printf("HID vol down\n");
             }else{

+ 7 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_bt.c

@@ -298,6 +298,9 @@ void func_bt_disp_status(void)
     uint status = bt_get_disp_status();
 
     if(f_bt.disp_status != status) {
+#if HLW_UI
+        printf("%s bt status cur %d  old %d\n", __func__, status, f_bt.disp_status);
+#endif // HLW_UI
         f_bt.disp_status = status;
         f_bt.sta_update = 1;
         if(!bt_is_connected()) {
@@ -434,6 +437,10 @@ void func_bt_process(void)
     if(sleep_process(bt_is_sleep)) {
         f_bt.disp_status = 0xff;
     }
+
+#if HLW_UI
+    hlw_bt_disconnect_process();
+#endif // HLW_UI
 }
 
 AT(.text.func.bt)

+ 65 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_fmrx.c

@@ -1,6 +1,9 @@
 #include "include.h"
 #include "func.h"
 #include "func_fmrx.h"
+#if HLW_UI
+#include "func_hlw.h"
+#endif // HLW_UI
 
 fmrx_cb_t fmrx_cb AT(.buf.fmrx.cb);
 
@@ -38,12 +41,20 @@ void func_fmrx_mp3_res_play(u32 addr, u32 len)
     if (fmrx_cb.sta == FMRX_PAUSE) {
         mp3_res_play(addr, len);
     } else {
+#if FMRX_QN8035_EN
+        bsp_aux_stop(FMRX_CHANNEL_CFG, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#else
         dac_fade_out();
         dac_fade_wait();
         fmrx_digital_stop();
+#endif // FMRX_QN8035_EN
         mp3_res_play(addr, len);
+#if FMRX_QN8035_EN
+        bsp_aux_start(FMRX_CHANNEL_CFG, FMRX_AUX_ANL_GAIN, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#else
         fmrx_digital_start();
         dac_fade_in();
+#endif // FMRX_QN8035_EN
     }
 }
 
@@ -52,14 +63,22 @@ AT(.text.func.fmrx)
 void func_fmrx_pause_play(void)
 {
     if (fmrx_cb.sta == FMRX_PLAY) {
+#if FMRX_QN8035_EN
+        bsp_aux_stop(FMRX_CHANNEL_CFG, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#else
         dac_fade_out();
         dac_fade_wait();
         fmrx_digital_stop();
+#endif // FMRX_QN8035_EN
         fmrx_cb.sta = FMRX_PAUSE;
         led_idle();
     } else if (fmrx_cb.sta == FMRX_PAUSE) {
+#if FMRX_QN8035_EN
+        bsp_aux_start(FMRX_CHANNEL_CFG, FMRX_AUX_ANL_GAIN, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#else
         fmrx_digital_start();
         dac_fade_in();
+#endif
         fmrx_cb.sta = FMRX_PLAY;
         led_fm_play();
     }
@@ -104,7 +123,18 @@ u16 get_ch_freq(u8 ch)
 AT(.text.func.fmrx)
 void reset_fm_cb(void)
 {
+#if HLW_UI
+    if(hlw_cb.search_freq_type == FM_SEARCH_MIN_MAX)
+    {
+        fmrx_cb.freq = FM_FREQ_MIN;
+    }
+    else if(hlw_cb.search_freq_type == FM_SEARCH_MAX_MIN)
+    {
+        fmrx_cb.freq = FM_FREQ_MAX;
+    }
+#else
     fmrx_cb.freq = FM_FREQ_MIN;
+#endif // HLW_UI
     fmrx_cb.ch_cnt = 0;
     fmrx_cb.ch_cur = 1;
     memset(fmrx_cb.buf, 0, 26);
@@ -312,10 +342,27 @@ void func_fmrx_process(void)
                 dac_fade_out();
                 plugin_fm_seek_continue();
             }
+#if HLW_UI
+            if(hlw_cb.search_freq_type == FM_SEARCH_MIN_MAX)
+            {
+                fmrx_cb.freq += 10;
+                if (fmrx_cb.freq > FM_FREQ_MAX) {
+                    fmrx_cb.sta = FMRX_SEEK_STOP;
+                }
+            }
+            else if(hlw_cb.search_freq_type == FM_SEARCH_MAX_MIN)
+            {
+                fmrx_cb.freq -= 10;
+                if (fmrx_cb.freq < FM_FREQ_MIN) {
+                    fmrx_cb.sta = FMRX_SEEK_STOP;
+                }
+            }
+#else
             fmrx_cb.freq += 10;
             if (fmrx_cb.freq > FM_FREQ_MAX) {
                 fmrx_cb.sta = FMRX_SEEK_STOP;
             }
+#endif // HLW_UI
             break;
 
         case FMRX_SEEK_STOP:
@@ -370,6 +417,21 @@ void func_fmrx_enter(void)
 #endif
 
     MEMCON &= ~0x3ff;                   // ram & rom memory always work
+
+#if FMRX_QN8035_EN
+    WDT_CLR();
+    #if (FMRX_CLOCK == FM_USE_IO_32KHZ_CLK)
+    FUNCMCON0 = 0x0f;
+    sys_clk_output(3, FMRX_CLKOMAP);
+    #elif (FMRX_CLOCK == FM_USE_IO_12MHZ_CLK)
+    FUNCMCON0 = 0x0f;
+    sys_clk_output(4, FMRX_CLKOMAP);
+    #endif
+
+    bsp_fmrx_set_volume(16);
+    bsp_aux_start(FMRX_CHANNEL_CFG, FMRX_AUX_ANL_GAIN, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#endif // FMRX_QN8035_EN
+
     led_fm_play();
 
     fmrx_cb.sta = FMRX_PLAY;
@@ -386,6 +448,9 @@ void func_fmrx_enter(void)
 AT(.text.func.fmrx)
 void func_fmrx_exit(void)
 {
+#if FMRX_QN8035_EN
+    bsp_aux_stop(FMRX_CHANNEL_CFG, ((u8)FMRX_2_SDADC_EN << 7) | AUDIO_PATH_FM);
+#endif
     dac_fade_out();
     func_fmrx_exit_display();
     if (fmrx_cb.sta > FMRX_IDLE) {

+ 35 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_hlw.c

@@ -0,0 +1,35 @@
+#include "include.h"
+#include "func_hlw.h"
+
+#if HLW_UI
+
+
+
+
+#define HLW_FUNC_TRACE_EN                1
+
+#if HLW_FUNC_TRACE_EN
+#define TRACE(...)              printf(__VA_ARGS__)
+#define TRACE_R(...)            print_r(__VA_ARGS__)
+#else
+#define TRACE(...)
+#define TRACE_R(...)
+#endif
+
+
+hlw_cb_t hlw_cb AT(.buf.hlw_cb);
+
+void hlw_func_var_init(void)
+{
+    hlw_cb.reconnect_flag = false;
+    hlw_cb.reconnect_count = 0;
+    hlw_cb.curr_connect_cnt = 0;
+    hlw_cb.disconnect_flag = 0;
+    hlw_cb.disconnect_count = 0;
+    hlw_cb.disconnect_reason = 0;
+
+    hlw_cb.search_freq_type = FM_SEARCH_MIN_MAX;
+    hlw_cb.charge_poweron_flag = false;
+    hlw_cb.linein_test_en = false;
+}
+#endif // HLW_UI

+ 32 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_hlw.h

@@ -0,0 +1,32 @@
+#ifndef _FUNC_HLW_H
+#define _FUNC_HLW_H
+
+#if HLW_UI
+
+typedef struct {
+    u8 reconnect_flag;
+    u8 reconnect_count;
+    u8 curr_connect_cnt;
+    u8 disconnect_flag;
+    u8 disconnect_count;
+    u8 disconnect_reason;
+
+    u8 search_freq_type;
+    u8 charge_poweron_flag;
+    u8 linein_test_en;
+}hlw_cb_t;
+
+
+extern hlw_cb_t hlw_cb;
+
+
+#define FM_SEARCH_MIN_MAX       0
+#define FM_SEARCH_MAX_MIN       1
+
+
+void hlw_func_var_init(void);
+
+#endif // HLW_UI
+
+
+#endif // _FUNC_HLW_H

+ 75 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_idle.c

@@ -4,6 +4,59 @@
 
 #if FUNC_IDLE_EN
 
+
+#if HLW_UI
+AT(.text.func.idle)
+void func_idle_charge_init(void)
+{
+    GPIOBFEN &= ~BIT(1);
+    GPIOBDIR &= ~BIT(1);
+    GPIOBDE |= BIT(1);
+    //GPIOBCLR = BIT(1);
+    GPIOBSET = BIT(1);
+}
+
+AT(.text.func.idle)
+void func_idle_charge_enable_control(u8 enable_charge)
+{
+    if(enable_charge)
+    {
+        //low
+        //GPIOBCLR = BIT(1);
+        GPIOBSET = BIT(1);
+    }
+    else
+    {
+        //high
+        //GPIOBSET = BIT(1);
+        GPIOBCLR = BIT(1);
+    }
+}
+
+AT(.text.func.idle)
+void func_idle_charge_detect_init(void)
+{
+    GPIOEFEN &= ~BIT(0);
+    GPIOEDE |= BIT(0);
+    GPIOEPU  |= BIT(0);
+    GPIOEDIR |= BIT(0);
+}
+
+AT(.text.func.idle)
+u8 func_idle_charge_detect_process(void)
+{
+    if(GPIOE & BIT(0))
+    {
+        return 1;
+    }
+
+    return 0;
+}
+
+
+#endif // HLW_UI
+
+
 AT(.text.func.idle)
 void func_idle_process(void)
 {
@@ -18,6 +71,13 @@ static void func_idle_enter(void)
     }
 #endif
     led_idle();
+#if HLW_UI
+    gui_display(DISP_IDLE);
+    func_idle_charge_init();
+    func_idle_charge_enable_control(true);
+    func_idle_charge_detect_init();
+    delay_5ms(20);
+#endif // HLW_UI
 }
 
 static void func_idle_exit(void)
@@ -36,6 +96,21 @@ void func_idle(void)
         func_idle_process();
         func_idle_message(msg_dequeue());
         func_idle_display();
+#if HLW_UI
+        if(func_idle_charge_detect_process())
+        {
+            printf("full bat poweroff\n");
+            func_cb.sta = FUNC_PWROFF;
+            break;
+        }
+
+        if(!CHARGE_DC_IN())
+        {
+            printf("5V ba diao\n");
+            func_cb.sta = FUNC_PWROFF;
+            break;
+        }
+#endif // HLW_UI
     }
 
     func_idle_exit();

+ 3 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_lowpwr.c

@@ -624,6 +624,9 @@ void func_pwroff(int pwroff_tone_en)
 {
     printf("%s\n", __func__);
     led_power_down();
+#if HLW_UI
+    gui_display(DISP_OFF);
+#endif // HLW_UI
 #if WARNING_POWER_OFF
     if (SOFT_POWER_ON_OFF) {
         if (pwroff_tone_en == 1) {

+ 579 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_qn8035.c

@@ -0,0 +1,579 @@
+#include "include.h"
+#include "func_qn8035.h"
+
+#if HLW_UI
+
+
+
+
+#define HLW_FUNC_TRACE_EN                1
+
+#if HLW_FUNC_TRACE_EN
+#define TRACE(...)              printf(__VA_ARGS__)
+#define TRACE_R(...)            print_r(__VA_ARGS__)
+#else
+#define TRACE(...)
+#define TRACE_R(...)
+#endif
+
+
+#if FMRX_QN8035_EN
+
+
+u8  qnd_PreNoiseFloor = 40;
+u32 osc_setup_ticks;
+
+AT(.text.qn8035)
+static u8 QND_ReadReg(u8 adr)
+{
+   	u8 rdat;
+
+    bsp_i2c_start();
+    bsp_i2c_tx_byte(0x20);
+    bsp_i2c_rx_ack();
+    bsp_i2c_tx_byte(adr);
+    bsp_i2c_rx_ack();
+    bsp_i2c_stop();
+    delay_us(60);
+
+    bsp_i2c_start();
+    bsp_i2c_tx_byte(0x21);
+    bsp_i2c_rx_ack();
+    rdat = bsp_i2c_rx_byte();
+    bsp_i2c_tx_nack();
+    bsp_i2c_stop();
+    delay_us(60);
+
+    return rdat;
+}
+
+AT(.text.qn8035)
+static void QND_WriteReg(u8 adr, u8 value)
+{
+    bsp_i2c_start();
+    bsp_i2c_tx_byte(0x20);
+    bsp_i2c_rx_ack();
+    bsp_i2c_tx_byte(adr);
+    bsp_i2c_rx_ack();
+    bsp_i2c_tx_byte(value);
+    bsp_i2c_rx_ack();
+    bsp_i2c_stop();
+    delay_us(60);
+}
+
+AT(.text.qn8035)
+static u16 FREQ2CHREG(u16 freq)
+{
+    return 	(freq - 6000) / 5;
+}
+
+AT(.text.qn8035)
+static void QNF_SetMute(u8 On)
+{
+    QND_WriteReg(REG_DAC, On?0x1B:0x10);
+}
+
+/**********************************************************************
+u8 QNF_SetCh(u16 freq)
+**********************************************************************
+Description: set channel frequency
+
+Parameters:
+    freq:  channel frequency to be set
+Return Value:
+    1: success
+**********************************************************************/
+#if USING_VALID_CH
+AT(.text.qn8035)
+static void QNF_SetCh(u16 freq)
+{
+    u8 temp;
+
+	freq = FREQ2CHREG(freq);
+	//writing lower 8 bits of CCA channel start index
+	QND_WriteReg(CH_START, (u8)freq);
+	//writing lower 8 bits of CCA channel stop index
+	QND_WriteReg(CH_STOP, (u8)freq);
+	//writing lower 8 bits of channel index
+	QND_WriteReg(CH, (u8)freq);
+	//writing higher bits of CCA channel start,stop and step index
+	temp = (u8) ((freq >> 8) & CH_CH);
+	temp |= ((u8)(freq >> 6) & CH_CH_START);
+	temp |= ((u8) (freq >> 4) & CH_CH_STOP);
+	temp |= QND_STEP_CONSTANT;
+	QND_WriteReg(CH_STEP, temp);
+}
+#else
+AT(.text.qn8035)
+static void QNF_SetCh(u16 start, u16 stop, u8 step)
+{
+    u8 temp;
+
+	start = FREQ2CHREG(start);
+	stop = FREQ2CHREG(stop);
+	//writing lower 8 bits of CCA channel start index
+	QND_WriteReg(CH_START, (u8)start);
+	//writing lower 8 bits of CCA channel stop index
+	QND_WriteReg(CH_STOP, (u8)stop);
+	//writing lower 8 bits of channel index
+	QND_WriteReg(CH, (u8)start);
+	//writing higher bits of CCA channel start,stop and step index
+	temp = (u8) ((start >> 8) & CH_CH);
+	temp |= ((u8)(start >> 6) & CH_CH_START);
+	temp |= ((u8) (stop >> 4) & CH_CH_STOP);
+	temp |= (step << 6);
+	QND_WriteReg(CH_STEP, temp);
+}
+#endif // USING_VALID_CH
+
+/**********************************************************************
+void QND_Init()
+**********************************************************************
+Description: Initialize device to make it ready to have all functionality ready for use.
+
+Parameters:
+    None
+Return Value:
+    1: Device is ready to use.
+    0: Device is not ready to serve function.
+**********************************************************************/
+AT(.text.qn8035)
+void qn8035_xosc_setup(void)
+{
+#if (FMRX_CLOCK == FM_USE_CRYSTAL)
+    QND_WriteReg(0x00, 0x81);
+    delay_5ms(5);
+
+    QNF_SetMute(1);
+    QND_WriteReg(0x58, 0x93);           //mod PLL setting
+
+    osc_setup_ticks = tick_get();       //qn8075,使用独立晶振时,等待起振时间需要2S
+#endif
+}
+
+AT(.text.qn8035)
+void qn8035_init(void)
+{
+#if ((FMRX_CLOCK == FM_USE_CRYSTAL_32K) || (FMRX_CLOCK == FM_USE_CRYSTAL_12M))
+    ///qn8075,使用独立晶振时,等待起振时间需要2S
+    while (!tick_check_expire(osc_setup_ticks, 2000)) {
+        delay_5ms(2);
+        WDT_CLR();
+    }
+#endif
+
+    QND_WriteReg(0x00, 0x81);
+    delay_ms(2);
+
+#if (FMRX_CLOCK == FM_USE_IO_32KHZ_CLK)
+    QND_WriteReg(0x01, QND_DIGITAL_CLOCK);   //方波
+#elif (FMRX_CLOCK == FM_SHARE_CRYSTAL_32KHz)
+    QND_WriteReg(0x01, QND_SINE_WAVE_CLOCK); //正弦波
+#elif ((FMRX_CLOCK == FM_USE_CRYSTAL_32K) || (FMRX_CLOCK == FM_USE_CRYSTAL_12M))
+    QNF_SetMute(1);
+    QND_WriteReg(0x58, 0x93);//mod PLL setting
+    delay_5ms(25);
+    QND_WriteReg(XTAL_DIV0, QND_XTAL_DIV0);//01
+    QND_WriteReg(XTAL_DIV1, QND_XTAL_DIV1);//08
+    QND_WriteReg(XTAL_DIV2, QND_XTAL_DIV2);//5c
+#endif
+
+    QND_WriteReg(0x54, 0x47);//mod PLL setting
+    //select SNR as filter3,SM step is 2db
+    QND_WriteReg(0x19, 0xc4);
+    QND_WriteReg(0x40,0x70);	//set SNR as SM,SNC,HCC MPX   /////没有
+    QND_WriteReg(0x33, 0x9c);//9e;//set HCC and SM Hystersis 5db
+    QND_WriteReg(0x2d, 0xD6);//notch filter threshold adjusting
+    QND_WriteReg(0x43, 0x10);//notch filter threshold enable
+    QND_WriteReg(0x47,0x39);
+    //enter receiver mode directly
+    QND_WriteReg(0x00, 0x11);
+    //Enable the channel condition filter3 adaptation,Let ccfilter3 adjust freely
+    QND_WriteReg(0x1D,0xA9);
+    QND_WriteReg(0x4f, 0x40);//dsiable auto tuning
+    QND_WriteReg(0x34,SMSTART_VAL); ///set SMSTART
+    QND_WriteReg(0x35,SNCSTART_VAL); ///set SNCSTART
+    QND_WriteReg(0x36,HCCSTART_VAL); ///set HCCSTART
+    QNF_SetMute(1);
+}
+
+/************************************************************************
+void QND_RXConfigAudio(u8 optiontype, u8 option )
+*************************************************************************
+Description: config audio
+Parameters:
+  optiontype: option
+    QND_CONFIG_MONO; ‘option’control mono, 0: stereo receive mode ,1: mono receiver mode
+    QND_CONFIG_MUTE; ‘option’control mute, 0:mute disable,1:mute enable
+    QND_CONFIG_VOLUME: 'option' control the volume gain,range : 0~47(-47db~0db)
+
+Return Value:
+    none
+**********************************************************************/
+AT(.text.qn8035)
+static void QND_RXConfigAudio(u8 option)
+{
+    u8 regVal;
+
+    regVal = QND_ReadReg(VOL_CTL);
+	regVal = (regVal & 0xC0) | (option / 6) | ((5-option%6)<<3);
+	QND_WriteReg(VOL_CTL, regVal);
+}
+
+/*----------------------------------------------------------------------------*/
+/**@brief FM模块QN8035设置音量
+   @param volume 音量值
+   @return 无
+   @note 音量范围0~15
+*/
+/*----------------------------------------------------------------------------*/
+AT(.text.qn8035)
+void qn8035_set_vol(u8 volume)
+{
+    volume = volume*3;
+    if(volume > 47) {
+        volume = 47;    //qn8035 volume range is from 0~47
+    }
+    QND_RXConfigAudio(volume);
+
+    if(volume == 0) {
+        QNF_SetMute(1);
+    } else {
+        QNF_SetMute(0);
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+/**@brief FM模块QN8035关闭
+   @param 无
+   @return 无
+   @note
+*/
+/*----------------------------------------------------------------------------*/
+AT(.text.qn8035)
+void qn8035_off(void)
+{
+    QND_WriteReg(0x00, 0x01);
+    delay_5ms(4);
+
+    QND_WriteReg(0x00, 0x01);
+    delay_5ms(2);
+
+    QND_WriteReg(0x00, 0x01);
+    delay_5ms(2);
+}
+
+
+/**********************************************************************
+void qnd8035_set_freq(u16 freq)
+**********************************************************************
+Description: Tune to the specific channel. call QND_SetSysMode() before
+call this function
+Parameters:
+ch
+Set the frequency (10kHz) to be tuned,
+eg: 101.30MHz will be set to 10130.
+Return Value:
+None
+**********************************************************************/
+AT(.text.qn8035)
+void qnd8035_set_freq(u16 freq)
+{
+    u8 reg;
+
+    //increase reference PLL charge pump current.
+    QND_WriteReg(REG_REF,0x7A);
+
+    /********** QNF_RXInit ****************/
+    QND_WriteReg(0x1B,0x70);  //Let NFILT adjust freely
+    //QNF_SetRegBit(0x2C,0x3F,0x12);  ///When SNR<ccth31, ccfilt3 will work
+    //setting the threshold of Filter3 will be worked.
+    QND_WriteReg(0x2C,0x52);
+    //QNF_SetRegBit(0x1D,0x40,0x00);  ///Let ccfilter3 adjust freely
+    //QNF_SetRegBit(0x41,0x0F,0x0A);  ///Set a hcc index to trig ccfilter3's adjust
+    QND_WriteReg(0x45,0x50);        ///Set aud_thrd will affect ccfilter3's tap number
+    //QNF_SetRegBit(0x40,0x70,0x70);  ///snc/hcc/sm snr_rssi_sel; snc_start=0x40; hcc_start=0x30; sm_start=0x20
+    QND_WriteReg(0x40,0x70);
+    //QNF_SetRegBit(0x19,0x80,0x80);  ///Use SNR for ccfilter selection criterion
+    //selecting SNR as filter3 filter condition
+    //QND_WriteReg(0x19, 0xC2);
+    //QNF_SetRegBit(0x3E,0x80,0x80);  ///it is decided by programming this register
+    //QNF_SetRegBit(0x41,0xE0,0xC0);  ///DC notching High pass filter bandwidth; remove low freqency dc signals
+
+#if 1//INVERSE_IMR
+    reg = QND_ReadReg(CCA)&~0x40;
+    if((freq == 9340) || (freq == 9390) || (freq == 9530)/*||(freq == 9980)||(freq == 10480)*/) {
+        reg |= 0x40;	// inverse IMR.
+    } else {
+        reg &= ~0x40;
+    }
+    QND_WriteReg(CCA, reg);
+#endif
+    QND_WriteReg(0x41,0xCA);
+    QND_WriteReg(0x34,SMSTART_VAL);     ///set SMSTART
+    QND_WriteReg(0x35,SNCSTART_VAL);    ///set SNCSTART
+    QND_WriteReg(0x36,HCCSTART_VAL);    ///set HCCSTART
+    /********** End of QNF_RXInit ****************/
+
+    QNF_SetMute(1);
+#if USING_VALID_CH
+    QNF_SetCh(freq);
+#else
+    QNF_SetCh(freq, freq, 1);
+#endif
+    //enable CCA mode with user write into frequency
+    QND_WriteReg(0x00, 0x13);
+    //Auto tuning
+    QND_WriteReg(0x4F, 0x80);
+    reg = QND_ReadReg(0x4F);
+    reg >>= 1;
+    QND_WriteReg(0x4F, reg);
+    ///avoid the "POP" noise.
+    delay_5ms(30);  //150ms
+    ///decrease reference PLL charge pump current.
+    QND_WriteReg(REG_REF,0x70);
+    QNF_SetMute(0);
+}
+
+/***********************************************************************
+Description: scan a noise floor from 87.5M to 108M by step 200K
+Parameters:
+Return Value:
+ 1: scan a noise floor successfully.
+ 0: chip would not normally work.
+**********************************************************************/
+AT(.text.qn8035)
+static u8 QND_ScanNoiseFloor(u16 start,u16 stop)
+{
+    u8 regValue;
+    u8 qnd_NoiseFloor;
+    u8 timeOut = 100;
+
+    QND_WriteReg(CCA_SNR_TH_1,0x00);
+    QND_WriteReg(CCA_SNR_TH_2,0x05);
+    QND_WriteReg(0x40,0xf0);
+    //config CCS frequency rang by step 200KHZ
+    QNF_SetCh(start,stop,2);
+    /*
+    QND_WriteReg(CH_START,0x26);
+    QND_WriteReg(CH_STOP,0xc0);
+    QND_WriteReg(CH_STEP,0xb8);
+    */
+    //enter CCA mode,channel index is decided by internal CCA
+    QND_WriteReg(SYSTEM1,0x12);
+
+    while(1) {
+        regValue = QND_ReadReg(SYSTEM1);
+
+        //if it seeks a potential channel, the loop will be quited
+        if((regValue & CHSC) == 0) break;
+        delay_5ms(4);
+        WDT_CLR();
+        //if it was time out,chip would not normally work.
+        if((timeOut--) == 0) {
+            QND_WriteReg(0x40,0x70);
+            return 0;
+        }
+    }
+
+    QND_WriteReg(0x40,0x70);
+    delay_ms(5);
+    qnd_NoiseFloor = QND_ReadReg(0x3f);
+    if(((qnd_PreNoiseFloor-qnd_NoiseFloor) >= 2) ||((qnd_NoiseFloor-qnd_PreNoiseFloor) >= 2)) {
+        qnd_PreNoiseFloor = qnd_NoiseFloor;
+    }
+    return 1;
+}
+/***********************************************************************
+void QND_RXSetTH(u8 th)
+***********************************************************************
+Description: Setting the threshold value of automatic scan channel
+th:
+  Setting threshold for quality of channel to be searched,
+  the range of th value:CCA_SENSITIVITY_LEVEL_0 ~ CCA_SENSITIVITY_LEVEL_9
+Return Value:
+  None
+***********************************************************************/
+AT(.text.qn8035)
+static void QND_RXSetTH(u8 th)
+{
+    u8 rssi_th,cca_snr_th_1,cca_snr_th_2 = 0x05;
+    rssi_th = (qnd_PreNoiseFloor-26);//27
+    ///increase reference PLL charge pump current.
+    QND_WriteReg(REG_REF,0x7A);
+    //NFILT program is enabled
+    QND_WriteReg(0x1B,0x78);
+    //using Filter3
+    QND_WriteReg(CCA1,0x75);
+    //setting CCA IF counter error range value(256).
+    QND_WriteReg(CCA_CNT2,0x05);//
+#if PILOT_CCA
+    QND_WriteReg(PLT1,0x00);
+#endif
+    cca_snr_th_1 = 0x40;//0x00
+	//selection the time of CCA FSM wait SNR calculator to settle:20ms
+	//0x00:	    20ms(default)
+	//0x40:	    40ms
+	//0x80:	    60ms
+	//0xC0:	    100m
+	//    QNF_SetRegBit(CCA_SNR_TH_1 , 0xC0, 0x00);
+    //selection the time of CCA FSM wait RF front end and AGC to settle:20ms
+    //0x00:     10ms
+	//0x40:     20ms(default)
+    //0x80:     40ms
+	//0xC0:     60ms
+	//    QNF_SetRegBit(CCA_SNR_TH_2, 0xC0, 0x40);
+	//    QNF_SetRegBit(CCA, 30);
+       //setting CCA RSSI threshold is 30
+	//QND_WriteReg(CCA,QND_ReadReg(CCA)&0xC0|25);  // 20 ~ 30
+    cca_snr_th_2 |= 0xc0;
+    QND_WriteReg(CCA_SNR_TH_2,cca_snr_th_2);
+
+    QND_WriteReg(CCA, (QND_ReadReg(CCA) & 0xc0) | rssi_th);
+#if PILOT_CCA                             //6
+    QND_WriteReg(CCA_SNR_TH_1,cca_snr_th_1|(7 +th)); //setting SNR threshold for CCA
+#else
+    QND_WriteReg(CCA_SNR_TH_1,cca_snr_th_1|(9+th)); //setting SNR threshold for CCA
+#endif
+}
+
+/***********************************************************************
+u16 QND_RXValidCH(u16 freq, u8 step);
+***********************************************************************
+Description: to validate a ch (frequency)(if it's a valid channel)
+Freq: specific channel frequency, unit: 10Khz
+  eg: 108.00MHz will be set to 10800.
+Step:
+  FM:
+  QND_FMSTEP_100KHZ: set leap step to 100kHz
+  QND_FMSTEP_200KHZ: set leap step to 200kHz
+  QND_FMSTEP_50KHZ:  set leap step to 50kHz
+Return Value:
+  0: not a valid channel
+  other: a valid channel at this frequency
+***********************************************************************/
+AT(.text.qn8035)
+static u8 QND_RXValidCH(u16 freq)
+{
+ 	u8 regValue;
+  	u8 timeOut;
+  	u8 isValidChannelFlag;
+  	u8 readCnt,stereoCount=0;
+
+    //printf("qn8035: %d\n", freq);
+    if(freq == 8750) {
+        QND_ScanNoiseFloor(8750,8800);
+        QND_RXSetTH(0);
+    } else if( ((freq - 8810) % 200) == 0) {
+        QND_ScanNoiseFloor(freq,freq+190);
+        QND_RXSetTH(0);
+    }
+
+#if USING_VALID_CH
+  	QNF_SetCh(freq);
+#else
+    QNF_SetCh(freq,freq,1);
+#endif
+
+    //Auto tuning
+    QND_WriteReg(0x00, 0x11);
+    QND_WriteReg(0x4f, 0x80);
+    delay_5ms(4);
+    regValue = QND_ReadReg(0x4f);
+    regValue = (regValue >> 1);
+    QND_WriteReg(0x4f, regValue);
+
+  	//QNF_SetRegBit(SYSTEM1,0x03,0x02);//enter channel scan mode,channel frequency is decided by internal CCA
+  	//entering into RX mode and CCA mode,channels index decide by CCA.
+    timeOut = 20;
+
+    QND_WriteReg(0x00, 0x12);
+
+    while(1)
+    {
+        regValue = QND_ReadReg(SYSTEM1);
+        //if it seeks a potential channel, the loop will be quited
+        if((regValue & CHSC) == 0) break;
+        delay_5ms(4);
+        WDT_CLR();
+        //if it was time out,chip would not normally work.
+        if((timeOut--) == 0)
+        {
+            return 0;
+        }
+    }
+
+    //reading out the rxcca_fail flag of RXCCA status
+    //isValidChannelFlag = (QND_ReadReg(STATUS1) & RXCCA_FAIL ? 0:1) && timeOut;
+
+    isValidChannelFlag = (QND_ReadReg(STATUS1) & RXCCA_FAIL ? 0:1);
+
+    if(isValidChannelFlag)
+    {
+#if PILOT_CCA
+    	delay_5ms(2);
+    	u8 snr = QND_ReadReg(SNR);
+        if(snr> 20) {
+            return 1;
+        }
+    	for(readCnt=10;readCnt>0;readCnt--)
+    	{
+            delay_ms(5);
+      		stereoCount += ((QND_ReadReg(STATUS1) & ST_MO_RX) ? 0:1);
+      		if(stereoCount >= 3) return 1;
+    	}
+#else
+    	return 1;
+#endif
+  	}
+  	return 0;
+}
+
+AT(.text.qn8035)
+u8 qn8035_seek(u16 freq)
+{
+    QNF_SetMute(1);
+    return QND_RXValidCH(freq);//qn8035 step frequency unit is 10KHZ
+}
+
+AT(.text.qn8035)
+void qn8035_mute(void)
+{
+    QNF_SetMute(1);
+}
+
+AT(.text.qn8035)
+void qn8035_unmute(void)
+{
+    QNF_SetMute(0);
+}
+
+
+/*----------------------------------------------------------------------------*/
+/**@brief FM模块QN8035检测
+   @param 无
+   @return 检测到QN8035模块返回1,否则返回0
+   @note
+*/
+/*----------------------------------------------------------------------------*/
+AT(.text.qn8035)
+bool qn8035_is_online(void)
+{
+  	u8 temp;
+  	QND_ReadReg(0x06);
+    for(u8 i = 0; i < 3; i++) {
+        temp = QND_ReadReg(0x06) & 0xFC;
+        printf("\nqn8035 id = %02x\n",temp);
+        if (temp == CHIPID_QN8035) {
+            qn8035_xosc_setup();
+            return true;
+        }
+    }
+    return false;
+}
+
+
+#endif // FM_QN8035
+
+
+#endif // HLW_UI

+ 151 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/func_qn8035.h

@@ -0,0 +1,151 @@
+#ifndef _FUNC_QN8035_H
+#define _FUNC_QN8035_H
+
+#if HLW_UI
+#if FMRX_QN8035_EN
+
+//假台多可以打开
+#define PILOT_CCA                       1  // 0: disable stereo judgement for the country has many mono FM stations
+#define USING_VALID_CH                  0
+#define CCA_PILOT_SNR_FILTER            35
+
+
+/**********************************QN8035's clock source selection**************
+1.QN8035's default clock source is 32768HZ.
+2.setting QN8035's clock source and clock source type(like sine-wave clock or digital clock).
+3.user need to modify clock source according to actual hardware platform.
+4.clock formula,the details please refer to the QN8035's datasheet
+  XTAL_DIV = Round(Clock/32768);
+  PLL_DLT = Round((28500000*512*XTAL_DIV)/Clock)-442368
+*******************************************************************************/
+#define QND_SINE_WAVE_CLOCK             0x00    //inject sine-wave clock
+#define QND_DIGITAL_CLOCK               0x80    //inject digital clock,default is inject digital clock
+
+#if (FMRX_CLOCK == FM_USE_CRYSTAL_12M)
+//crystal clock is 12MHZ
+#define QND_XTAL_DIV0                   0x6E
+#define QND_XTAL_DIV1                   0x01
+#define QND_XTAL_DIV2                   0x54
+#else
+//crystal clock is 32768HZ
+#define QND_XTAL_DIV0                   0x01
+#define QND_XTAL_DIV1                   0x08
+#define QND_XTAL_DIV2                   0x5C
+#endif
+
+//crystal clock is 24MHZ
+//#define QND_XTAL_DIV0                   0xDC
+//#define QND_XTAL_DIV1                   0x02
+//#define QND_XTAL_DIV2                   0x54   //3
+
+
+//following is definition step
+#define QND_STEP_CONSTANT               0x40 //(QND_FSTEP_100KHZ << 6)
+#define CHIPID_QN8035                   0x84
+
+
+/*******************************************************************************
+Performance configuration
+*******************************************************************************/
+#define SMSTART_VAL                     15//10
+#define HCCSTART_VAL                    20//13
+#define SNCSTART_VAL                    51
+
+/*******************************************************************************
+limitation configuration
+*******************************************************************************/
+#define QND_READ_RSSI_DELAY             100
+#define SLEEP_TO_WAKEUP_DELAY_TIME      500
+#define CH_SETUP_DELAY_TIME             300
+/***************************************End************************************/
+
+/*******************************************************************************
+ definition register
+*******************************************************************************/
+#define SYSTEM1         				0x00
+#define CCA             				0x01
+#define SNR            					0x02
+#define RSSISIG         				0x03
+#define STATUS1         				0x04
+#define CID1            				0x05
+#define CID2            				0x06
+#define	CH								0x07
+#define	CH_START						0x08
+#define	CH_STOP							0x09
+#define	CH_STEP							0x0A
+#define	RDSD0							0x0B
+#define	RDSD1							0x0C
+#define	RDSD2							0x0D
+#define	RDSD3							0x0E
+#define	RDSD4							0x0F
+#define	RDSD5							0x10
+#define	RDSD6							0x11
+#define	RDSD7							0x12
+#define	STATUS2							0x13
+#define	VOL_CTL							0x14
+#define	XTAL_DIV0						0x15
+#define	XTAL_DIV1						0x16
+#define	XTAL_DIV2						0x17
+#define INT_CTRL						0x18
+#define SMP_HLD_THRD					0x19
+#define	RXAGC_GAIN						0x1A
+#define GAIN_SEL						0x1B
+#define	SYSTEM_CTL1						0x1C
+#define	SYSTEM_CTL2						0x1D
+#define RDSCOSTAS						0x1E
+#define REG_TEST						0x1F
+#define STATUS4							0x20
+#define	CCA1							0x27
+#define PLT1                            0X2F
+#define	PLT2                            0x30
+#define	SMSTART							0x34
+#define	SNCSTART						0x35
+#define	HCCSTART						0x36
+#define	CCA_CNT1					    0x37
+#define	CCA_CNT2					    0x38
+#define	CCA_SNR_TH_1					0x39
+#define	CCA_SNR_TH_2					0x3A
+#define NCCFIR3         				0x40
+#define REG_REF                         0x49
+#define REG_DAC							0x4C
+/***************************************End************************************/
+
+/*******************************************************************************
+ definition operation bit of register
+*******************************************************************************/
+#define CCA_CH_DIS      				0x01
+#define CHSC            				0x02
+#define RDSEN           				0x08
+#define CH_CH		    				0x03
+#define CH_CH_START     				0x0c
+#define CH_CH_STOP      				0x30
+#define STNBY_MODE           		    0x20
+#define RX_MODE         				0x10
+#define IMR             				0x40
+#define RDS_RXUPD       				0x80
+#define ST_MO_RX                        0x01
+#define STNBY_RX_MASK                   0x30
+#define RXCCA_MASK                      0x03
+#define RX_CCA                          0x02
+#define RXCCA_FAIL                      0x08
+#define RX_MONO                         0x04
+#define ICPREF                          0x0F
+/***************************************End************************************/
+
+#define QNM_GetMonoMode()               QND_ReadReg(STATUS1) & ST_MO_RX
+#define QNM_GetRssi()                   QND_ReadReg(RSSISIG)
+
+bool qn8035_is_online(void);
+void qn8035_init(void);
+void qn8035_off(void);
+void qnd8035_set_freq(u16 freq);
+u8 qn8035_seek(u16 freq);
+void qn8035_set_vol(u8 volume);
+void qn8035_unmute(void);
+void qn8035_mute(void);
+
+
+
+#endif // FM_QN8035
+#endif // HLW_UI
+#endif // _FUNC_QN8035_H

+ 3 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/sfunc_bt_call.c

@@ -519,6 +519,9 @@ void sfunc_bt_call(void)
         sfunc_bt_call_process();
         sfunc_bt_call_message(msg_dequeue());
         func_bt_display();
+#if HLW_UI
+        hlw_bt_disconnect_process();
+#endif // HLW_UI
     }
 
 #if DAC_DNR_EN

+ 3 - 0
sdk_560x_01x_s2256_20241227/app/platform/functions/sfunc_bt_ring.c

@@ -257,6 +257,9 @@ void sfunc_bt_ring(void)
         sfunc_bt_ring_process();
         sfunc_bt_ring_message(msg_dequeue());
         func_bt_display();
+#if HLW_UI
+        hlw_bt_disconnect_process();
+#endif // HLW_UI
     }
 
     sfunc_bt_ring_exit();

+ 1 - 1
sdk_560x_01x_s2256_20241227/app/platform/header/config_extra.h

@@ -278,7 +278,7 @@
 #endif // SLEEP_DAC_OFF_EN
 
 #ifndef PWRON_FRIST_BAT_EN
-#define PWRON_FRIST_BAT_EN          1
+#define PWRON_FRIST_BAT_EN          0
 #endif // PWRON_FRIST_BAT_EN
 
 #if !LED_DISP_EN

BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/AB5602D_YinWo_TD009(ikF-FM听力蓝牙耳机)_CHC_EN_DUT_TEST_(00009167_41242146).prd


+ 21 - 21
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/Settings/Boombox.setting

@@ -2,8 +2,8 @@
 <configuration>
     <appSettings>
         <add key="lang_id" value="英文" />
-        <add key="func_music_en" value="True" />
-        <add key="func_aux_en" value="True" />
+        <add key="func_music_en" value="False" />
+        <add key="func_aux_en" value="False" />
         <add key="func_fmrx_en" value="True" />
         <add key="powkey_10s_reset" value="False" />
         <add key="spk_mute_en" value="False" />
@@ -14,7 +14,7 @@
         <add key="ampabd_io_sel" value="0" />
         <add key="earphone_det_iosel" value="0" />
         <add key="sys_sleep_time" value="0" />
-        <add key="sys_off_time" value="0" />
+        <add key="sys_off_time" value="300" />
         <add key="lowpower_warning_en" value="True" />
         <add key="lpwr_warning_vbat" value="3.4V" />
         <add key="lpwr_off_vbat" value="3.1V" />
@@ -25,7 +25,7 @@
         <add key="osc_both_cap" value="0PF" />
         <add key="osci_cap" value="31" />
         <add key="osco_cap" value="31" />
-        <add key="eq_dgb_spp_en" value="False" />
+        <add key="eq_dgb_spp_en" value="True" />
         <add key="eq_dgb_uart_en" value="False" />
         <add key="eq_uart_sel" value="0" />
         <add key="vddbt_capless_en" value="True" />
@@ -39,14 +39,14 @@
         <add key="bt_call_max_gain" value="-1DB" />
         <add key="charge_en" value="True" />
         <add key="charge_trick_en" value="True" />
-        <add key="charge_dc_reset" value="True" />
-        <add key="charge_dc_not_pwron" value="True" />
-        <add key="charge_stop_curr" value="2" />
-        <add key="charge_constant_curr" value="12" />
-        <add key="charge_trickle_curr" value="2" />
-        <add key="charge_full_bled" value="3" />
-        <add key="bt_name" value="BT-BOX_560X" />
-        <add key="bt_addr_mode" value="随机地址" />
+        <add key="charge_dc_reset" value="False" />
+        <add key="charge_dc_not_pwron" value="False" />
+        <add key="charge_stop_curr" value="0" />
+        <add key="charge_constant_curr" value="0" />
+        <add key="charge_trickle_curr" value="0" />
+        <add key="charge_full_bled" value="0" />
+        <add key="bt_name" value="ikF-FM听力蓝牙耳机" />
+        <add key="bt_addr_mode" value="保持地址" />
         <add key="bt_addr" value="41:42:00:00:00:01" />
         <add key="bt_addr_start" value="41:42:00:00:00:00" />
         <add key="bt_addr_step" value="00:00:00:00:00:01" />
@@ -58,14 +58,14 @@
         <add key="rf_mix_cap" value="8" />
         <add key="rf_pa_nbias" value="4" />
         <add key="bt_rf_txpwr_recon" value="0" />
-        <add key="bt_2acl_en" value="False" />
+        <add key="bt_2acl_en" value="True" />
         <add key="bt_a2dp_en" value="True" />
         <add key="bt_a2dp_vol_ctrl_en" value="True" />
         <add key="bt_sco_en" value="True" />
         <add key="bt_hfp_private_en" value="False" />
-        <add key="bt_hfp_ring_number_en" value="True" />
-        <add key="bt_hfp_play_ios_ring_en" value="False" />
-        <add key="bt_spp_en" value="False" />
+        <add key="bt_hfp_ring_number_en" value="False" />
+        <add key="bt_hfp_play_ios_ring_en" value="True" />
+        <add key="bt_spp_en" value="True" />
         <add key="bt_hid_en" value="False" />
         <add key="bt_hid_menu_en" value="True" />
         <add key="bt_hid_discon_default_en" value="False" />
@@ -100,7 +100,7 @@
         <add key="sddet_iosel" value="21" />
         <add key="sd1det_iosel" value="0" />
         <add key="fmrx_threshold_val" value="128" />
-        <add key="aux_2_sdadc_en" value="True" />
+        <add key="aux_2_sdadc_en" value="False" />
         <add key="linein_2_pwrdown_en" value="False" />
         <add key="mode_2_aux_en" value="False" />
         <add key="aux_anl_gain" value="2" />
@@ -109,12 +109,12 @@
         <add key="auxr_sel" value="4" />
         <add key="linein_det_iosel" value="0" />
         <add key="user_pwrkey_en" value="True" />
-        <add key="user_adkey_en" value="True" />
+        <add key="user_adkey_en" value="False" />
         <add key="user_adkey2_en" value="False" />
         <add key="user_iokey_en" value="False" />
         <add key="user_adkey_mux_sdclk_en" value="False" />
         <add key="user_key_multi_press_en" value="True" />
-        <add key="double_key_time" value="1" />
+        <add key="double_key_time" value="3" />
         <add key="adkey_ch" value="ADCCH_PE7" />
         <add key="adkey2_ch" value="ADCCH_PE6" />
         <add key="pwron_press_time" value="3" />
@@ -169,7 +169,7 @@
         <add key="iokey_num3" value="MODE" />
         <add key="iokey_num4" value="HSF" />
         <add key="iokey_midkey_num" value="REPEAT" />
-        <add key="led_disp_en" value="True" />
+        <add key="led_disp_en" value="False" />
         <add key="led_pwr_en" value="False" />
         <add key="rled_lowbat_en" value="False" />
         <add key="port_2led_resless_en" value="False" />
@@ -237,6 +237,6 @@
         <add key="fmrx_d_val" value="3000" />
         <add key="fmrx_cs_filter_fixed" value="True" />
         <add key="fmrx_cs_filter_sel" value="1" />
-        <add key="fmrx_audio_ch" value="0" />
+        <add key="fmrx_audio_ch" value="1" />
     </appSettings>
 </configuration>

BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.bin


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.dcf


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/app.rv32


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 6512 - 6502
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/map.txt


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/res.bin


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/bin/res/poweron.mp3


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_audio.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_aux.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_bpap.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_bt.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_charge.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_cm.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_dac.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_dump_buf_huart.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_eq.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_eq_table.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fmrx.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fmtx.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_fs.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_hdmi.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_hdmi_cec_msg.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_huart_audio.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2c.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s_ta5711.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_i2s_wm8978.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iap.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_id3_tag.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iic_putchar.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_iis_ext.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_ir.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_karaok.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_key.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_led.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_map.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_music.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_param.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_piano.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_port_init.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_record.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spiflash1.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spiflash1_music_bin.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_spp.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_sys.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_tkey.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/bsp_uart.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/bsp/hlw_bt.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_aux.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt_dut.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_bt_hid.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_clock.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_exspiflash_music.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_fmrx.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_hdmi.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_hlw.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_huart.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_i2s.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_idle.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_lowpwr.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_music.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_qn8035.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_spdif.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_speaker.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_tom_cat.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_uart_upd.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_update.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/func_usbdev.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_call.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_ota.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_bt_ring.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_record.o


BIN
sdk_560x_01x_s2256_20241227/app/projects/standard/Output/obj/platform/functions/sfunc_record_play.o


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно