Compare commits

...

4 Commits

Author SHA1 Message Date
e29e8de8fc 完成,等待客户测试反馈 2026-08-22 17:21:15 +08:00
b499020541 根据需求excel表格修改,修改完成,等待测试 2026-07-25 20:48:18 +08:00
a1a4fb183b 完成功能,等待测试 2026-07-20 00:22:24 +08:00
d428b715b0 完成CS8406驱动 2026-07-15 10:31:33 +08:00
61 changed files with 67878 additions and 104529 deletions

Binary file not shown.

View File

@ -0,0 +1,36 @@
import json
import xlrd
path = r"E:\RD\Kaotings\KT25-1015_AC695x_SDK310\Doc\音频板开发需求 20260725.xls"
book = xlrd.open_workbook(path, formatting_info=True)
result = {"sheets": []}
for sheet in book.sheets():
rows = []
for r in range(sheet.nrows):
cells = []
for c in range(sheet.ncols):
value = sheet.cell_value(r, c)
if value not in ("", None):
cells.append({"cell": xlrd.formula.cellname(r, c), "value": value})
if cells:
rows.append(cells)
result["sheets"].append(
{
"name": sheet.name,
"nrows": sheet.nrows,
"ncols": sheet.ncols,
"merged": [
{
"range": (
f"{xlrd.formula.cellname(rlo, clo)}:"
f"{xlrd.formula.cellname(rhi - 1, chi - 1)}"
)
}
for rlo, rhi, clo, chi in sheet.merged_cells
],
"nonempty_rows": rows,
}
)
print(json.dumps(result, ensure_ascii=False, indent=2))

BIN
.codex_tmp/pdf_page1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

3
.gitattributes vendored Normal file
View File

@ -0,0 +1,3 @@
# Windows CMD requires CRLF for batch files
*.bat text eol=crlf
*.cmd text eol=crlf

View File

@ -100,6 +100,7 @@
"${workspaceFolder}/apps/common/include", "${workspaceFolder}/apps/common/include",
"${workspaceFolder}/apps/common/config/include", "${workspaceFolder}/apps/common/config/include",
"${workspaceFolder}/apps/soundbox/board/br23", "${workspaceFolder}/apps/soundbox/board/br23",
"${workspaceFolder}/apps/kaotings",
"${workspaceFolder}/cpu/br23", "${workspaceFolder}/cpu/br23",
"${workspaceFolder}/cpu/br23/audio_common", "${workspaceFolder}/cpu/br23/audio_common",
"${workspaceFolder}/cpu/br23/audio_dec", "${workspaceFolder}/cpu/br23/audio_dec",

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"board_ac695x_demo_cfg.h": "c"
}
}

104
Doc/_req_dump.txt Normal file
View File

@ -0,0 +1,104 @@
=== SHEET: 总表 rows=92 cols=1 ===
音频板需求
一、 主控芯片要求从SD卡、U盘读取文件MP3、WAV等格式解码U盘自动升级固件立体声DAC输出IIS输出用于光纤数字音频输出AD按键多路I/O口。
硬件需要修改处1 按键带灯的应为PH端子、
2灯带的端子为2P XH。
3光纤看到有割焊盘。
4灯带的正负极反了。第4通道的灯带亮了半小时左右现在一直不亮了。
20260717 样机先按这个功能调试。
1. 音频文件按照播放顺序命名如00\01\02\03\04\05\06\07\08\09\10\11...............如果不命名也应能播放(按照系统默认的识别顺序)。
2 按键K1/K2/K3/K4对应音频输出通道CH1/CH2/CH3/CH4。每个通道包括一个光纤输出和一个3.5mm音频输出。
3. 上电后待机,此时不播放,所有按键灯同时闪烁(每秒钟闪亮一下,具体参考我发的视频效果)。此为待机状态。
4. 按K1键开始播放00CH1输出声音其他通道无声。K1按键灯及两个音量按键灯长亮其它按键灯不亮。待机时下按另外3个通道按键是同样的功能对应通道输出
5. 如果不操作,播放完当前歌曲后恢复待机状态(所有灯也要恢复)。
6. 在播放过程中,按下另一通道按键,则切换到另一通道输出(歌曲接着播放),按键灯跟着变过去。
7. 在播放过程中再按一次当前播放通道按键则播放下一曲01。依此类推可播放多首歌曲按文件命名顺序00-01-02-03…-00循环
8. 音量0-30格开机后默认音量值23每按一次VOL+键+1格最大音量可调到30每按一次音量-键-1格最小可调到2保留一点微弱的声音。音量不记忆即每次返回待机后再次按键播放时恢复默认音量23。
9. LED灯条输出与音频输出通道一致即哪个通道输出声音就哪个灯条亮其它不亮。待机时不亮。
以下功能备用------------------------------------------------------------------------------------
二、软件、功能开发时以这个为默认因为可能会有变动最好能有些做成配置文件的形式来改变功能。我们以前做过一款产品将不同的功能分配到了不同的按键比如定义了40个不同的功能分配了40个按键只需要在配置里重新定义这个物理按键是什么功能就实现了相对自由的调节功能比如K1,可以配置成是播放也可以配置成是VOL+,或者是其它功能,只用改配置文件,功能就变了,再比如,是闪灯还是长亮,这些都能配置)
1. 开发时应考虑所有按键功能、播放逻辑、按键灯及LED灯条、音量调节这些都要可以通过固件更改并用U盘对PCBA进行固件升级。PCBA固件升级完成后应有提示所有按键灯忽明忽暗变化。
2. 音频文件一般按照播放顺序命名如00\01\02如果不命名也应能播放。
3. 按键K1/K2/K3/K4对应音频输出通道CH1/CH2/CH3/CH4。每个通道包括一个光纤输出和一个3.5mm音频输出。
4. 上电后待机此时不播放所有按键灯同时闪烁每秒钟亮20ms具体看调试效果
5. 按K1键开始播放00CH1输出声音其他通道无声。K1按键灯及两个音量按键灯长亮其它按键灯闪。待机时下按另外3个通道按键是同样的功能对应通道输出
6. 如果不操作,播放完当前歌曲后恢复待机状态(所有灯也要恢复)。
7. 在播放过程中,按下另一通道按键,则切换到另一通道输出(歌曲接着播放),按键灯跟着变过去。
8. 在播放过程中再按一次当前播放通道按键则播放下一曲。依此类推可播放多首歌曲按文件命名顺序00-01-02-03…-00循环
9. 音量0-30格开机后默认音量值23每按一次音量+键+1格最大音量可调到30每按一次音量-键-1格最小可调到3保留一点微弱的声音。音量不记忆即每次返回待机后再次按键播放时为默认音量23。
10. LED灯条与音频输出通道一致即哪个通道输出声音就哪个灯条长亮其它不亮。
LED灯带用2脚插座。
二、 基本功能举例:这一栏是可能的应用,最好能跟前面的功能进行综合,结合配置文件,以后能尽量的少去改动软件。
1. 上电待机所有按键灯如跑马灯闪每个按键灯按顺序依次各亮1秒循环
2. 按CH1键开始播放CH1光纤和CH1 3.5mm输出声音其他通道无声。CH1按键灯闪每秒钟亮20毫秒其它按键灯长亮。待机时下按另外3个通道按键是同样的功能对应通道输出
3. 播放过程中,按下另一通道按键,则切换到另一通道输出(歌曲接着播放),所有按键灯跟着变。
4. 播放过程中再按一次当前播放通道按键,停止播放(不是暂停,而是回到待机)。所有灯恢复待机状态。
5. 播放完一首歌,恢复待机(所有灯也要恢复)。
6. 音量默认70最大100最小20。播放过程中按VOL+/VOL-键可调整音量,每按一次+/-10每次待机后恢复默认音量。具体音量设置要根据实际情况测试后确定可固件更改。
7. 比如默认播放00文件里面还有010203040506这样00是默认文件如果要点播放时按1按键播放01 2播放过程中如果只是切换通道时比如开始按的CH2键播放的02文件再按CH3,播放的还是02文件但通道是03通道 3如果不是播放过程中按CH3就是播放03文件.
8. 因为客人的按键功能可能有很多种选择,能否做成配置文件的方式,尽量减少不同客人对按键差异的改动。
参考板子:
=== SHEET: 版本1 rows=26 cols=16 ===
版本号/校验码 | 日期 | 序号 | 需求编号与需求ID对应 | 模块/功能 | 原始要求与需求ID对应 | 当前问题/反馈 | 本次修改内容 | 修改人 | 验证状态 | 差异/备注说明 | ⚠️ 待测试 | ✅ 通过 | 🛠️ 待修改 | 🔒 已归档 | 🚨 特急
V1.0 | 20260718.0 | 1.0 | AID-001 | 文件排序 | 音频文件按照播放顺序命名如00\01\02\03\04\05\06\07\08\09\10\11...............如果不命名也应能播放(按照系统默认的识别顺序) | 没有命名的文件在待机状态按按键播放会出错比如同一个文件取名为00可以播放取名为AA按键播放时报错。 但下一曲功能放到这个文件时,是可以播放的。 | 🛠️ 待修改
V1.0 | 20260718.0 | 2.0 | AID-002 | 按键功能 | 按键K1/K2/K3/K4对应音频输出通道CH1/CH2/CH3/CH4。每个通道包括一个光纤输出和一个3.5mm音频同时输出。 | K1与K4交换K2与K3交换灯条要按下图的顺序调整过来。 | 🛠️ 待修改
V1.0 | 20260718.0 | 3.0 | AID-003 | 待机状态 | 上电后待机,此时不播放,所有按键灯同时闪烁(每秒钟闪亮一下,具体参考我发的视频效果)。此为待机状态。 | 按键灯没有同时闪烁闪烁速度可以参考IC边的指示灯。 | 🛠️ 待修改
V1.0 | 20260718.0 | 4.0 | AID-004 | 按键功能 | 按K1键开始播放00CH1输出声音其他通道无声。K1按键灯及两个音量按键灯长亮其它按键灯不亮。待机时下按另外3个通道按键是同样的功能对应通道输出。例按K2也是播放00文件CH2出声其它通道无声K2按键灯及两个音量按键灯长亮其它按键灯不亮。 | 播放完进入待机状态后再按K1-K4任意按键时应该播放00文件现在功能不对 | 🛠️ 待修改
V1.0 | 20260718.0 | 5.0 | AID-005 | 功能 | 如果不操作,播放完当前歌曲后恢复待机状态(所有灯也要恢复)。 | 按键灯没有同时闪烁 | 🛠️ 待修改
V1.0 | 20260718.0 | 6.0 | AID-006 | 按键功能 | 在播放过程中,按下另一通道按键,则切换到另一通道输出(歌曲正常播放,只变通道),按键灯跟着通道变过去。 比如在播放00文件时现在通道是CH1通道,按K2按键播放的歌曲还是00文件但通道切换到CH2通道 | ✅ 通过
V1.0 | 20260718.0 | 7.0 | AID-007 | 按键功能 | 在播放过程中再按一次当前播放通道按键则播放下一曲。依此类推可播放多首歌曲按文件命名顺序00-01-02-03…-00循环。 比如在播放00文件时按K1,则播放01文件正在播放01文件时再按K1测播放02文件。 | 、 | ✅ 通过
V1.0 | 20260718.0 | 8.0 | AID-008 | 音量默认 | 音量0-30格开机后默认音量值23每按一次VOL+键+1格最大音量可调到30每按一次音量-键-1格最小可调到2保留一点微弱的声音。音量不记忆即每次返回待机后再次按键播放时恢复默认音量23。 | 没有测到功能。 | 🛠️ 待修改
V1.0 | 20260718.0 | 9.0 | AID-009 | 灯条输出 | LED灯条输出与音频输出通道一致即哪个通道输出声音就哪个灯条亮其它不亮。待机时不亮。 | 🛠️ 待修改
0.0 | 按一次增加一格音量 | 没有测到功能。 | 🛠️ 待修改
0.0 | 按一次减一格音量 | 没有测到功能 | 🛠️ 待修改
AID-010 | 播放器支持的文件MP3,WAV,FLACAPE。 | ✅ 通过
AID-011 | 板上的指示灯:慢闪待机,快闪报错,长亮播放。 | ✅ 通过
接口定义。
=== SHEET: 需求ID不能改 rows=15 cols=14 ===
版本号 | 日期 | 序号 | 需求编号 | 模块/功能 | 原始要求 | 当前问题/反馈 | 本次修改内容 | 修改人 | 验证状态 | 差异/备注说明 | ⚠️ 待验证 | ✅ 通过 | ❌ 未通过
1.0 | AID-001 | 文件排序 | 音频文件按照播放顺序命名如00\01\02\03\04\05\06\07\08\09\10\11...............如果不命名也应能播放(按照系统默认的识别顺序)
2.0 | AID-002 | 按键功能 | 按键K1/K2/K3/K4对应音频输出通道CH1/CH2/CH3/CH4。每个通道包括一个光纤输出和一个3.5mm音频同时输出。
3.0 | AID-003 | 待机状态 | 上电后待机,此时不播放,所有按键灯同时闪烁(每秒钟闪亮一下,具体参考我发的视频效果)。此为待机状态。
4.0 | AID-004 | 按键功能 | 按K1键开始播放00CH1输出声音其他通道无声。K1按键灯及两个音量按键灯长亮其它按键灯不亮。待机时下按另外3个通道按键是同样的功能对应通道输出。例按K2也是播放00文件CH2出声其它通道无声K2按键灯及两个音量按键灯长亮其它按键灯不亮。
5.0 | AID-005 | 功能 | 如果不操作,播放完当前歌曲后恢复待机状态(所有灯也要恢复)。
6.0 | AID-006 | 按键功能 | 在播放过程中,按下另一通道按键,则切换到另一通道输出(歌曲正常播放,只变通道),按键灯跟着通道变过去。 比如在播放00文件时现在通道是CH1通道,按K2按键播放的歌曲还是00文件但通道切换到CH2通道
7.0 | AID-007 | 按键功能 | 在播放过程中再按一次当前播放通道按键则播放下一曲。依此类推可播放多首歌曲按文件命名顺序00-01-02-03…-00循环。 比如在播放00文件时按K1,则播放01文件正在播放01文件时再按K1测播放02文件。
8.0 | AID-008 | 音量默认 | 音量0-30格开机后默认音量值23每按一次VOL+键+1格最大音量可调到30每按一次音量-键-1格最小可调到2保留一点微弱的声音。音量不记忆即每次返回待机后再次按键播放时恢复默认音量23。
9.0 | AID-009 | 灯条输出 | LED灯条输出与音频输出通道一致即哪个通道输出声音就哪个灯条亮其它不亮。待机时不亮。
VL+ 按键 | 按一次增加一格音量
VL- 按键 | 按一次减一格音量
AID-010 | 播放器支持的文件MP3,WAV,FLACAPE。
AID-011 | 板上的指示灯:慢闪待机,快闪报错,长亮播放。
升级文件放U盘根目录下上电时USB升级升级完成后快闪5次

Binary file not shown.

View File

@ -0,0 +1,244 @@
# 音频板开发需求对照与实现状态
> **文档版本**V1.0
> **生成日期**2026-07-25
> **需求来源**[音频板开发需求 20260725.xls](./音频板开发需求%2020260725.xls)
> **调试基准**20260717 样机功能(以 Excel「版本1」跟踪表为准
---
## 1. 项目概述
AC695x SDK 音频板定制固件,主要实现:
- SD 卡 / U 盘读取并播放 MP3、WAV、FLAC、APE
- 4 路光纤 + 3.5mm 立体声输出(经 CS8406
- K1~K4 通道播放与切歌K5/K6 音量调节
- U 盘 OTA 升级及提示音
- 多路 LED系统灯、按键灯、灯条、音量灯
**核心代码路径**
| 模块 | 文件 |
| -------- | -------------------------------------------------------------------- |
| 主逻辑 | `apps/kaotings/kt.c`、`apps/kaotings/kt.h` |
| 按键入口 | `apps/soundbox/task_manager/music/music.c` |
| 音量默认/不记忆 | `cpu/br23/audio_config.h`、`cpu/br23/audio_common/app_audio.c` |
| U 盘升级检测 | `apps/soundbox/include/app_config.h` |
| 升级提示 | `apps/common/update/update.c`、`apps/common/dev_manager/dev_update.c` |
---
## 2. 硬件引脚定义(当前 `kt.h`
| 功能 | 引脚 | 宏定义 |
| -------------------------- | ------------------------- | ------------------------ |
| 系统指示灯 SYS_LED | PB03 | `SYS_LED_PIN` |
| 音频输出 CH1~CH4CS8406 TX EN | PB10 / PB09 / PB08 / PB07 | `AUDIO_OUT_CHANNEL1~4` |
| **按键灯** KEY_LED CH1~CH4 | PC02 / PC01 / PC00 / PA12 | `KEY_LED_OUT_CHANNEL1~4` |
| **灯条** LED_BAR CH1~CH4 | PA09 / PA10 / PB02 / PB11 | `LED_BAR_OUT_CHANNEL1~4` |
| 音量+ 灯 KUP_LED | PC03 | `KUP_LED_PIN` |
| 音量- 灯 KDOWN_LED | PB00 | `KDOWN_LED_PIN` |
| CS8406 复位 | PA06 | 代码中 `IO_PORTA_06` |
> **注意**:按键灯与灯条为两路独立输出,代码分别使用 `KEY_LED_`* 与 `LED_BAR_*`。两组引脚归属已经过实机校正。
---
## 3. 需求跟踪总表
调试基准为 Excel「版本1」表20260718状态说明
- ✅ **通过**:已验证符合需求
- 🛠️ **待修改**:已实现但与需求不符,或功能缺失
- ⚠️ **待验证**:代码已有,尚未实测确认
| 需求 ID | 模块 | 需求摘要 | 验证状态 | 实现/差异说明 |
| ----------- | ------ | ----------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------- |
| **AID-001** | 文件排序 | 按 `00/01/02…` 命名顺序播放;未命名文件也应能播放 | ⚠️ 待验证 | 空闲按键优先 `kt_play_file_idx(0)``00.`*;失败回退 `music_player_play_first_file()`,待实测非 `00` 文件及后续切歌顺序 |
| **AID-002** | 按键映射 | K1~~K4 对应 CH1~~CH4K1↔K4、K2↔K3 需交换 | ✅ 通过 | 按键、音频通道和灯条映射已实测通过 |
| **AID-003** | 待机状态 | 上电待机,所有**按键灯**同步慢闪(约 1s 一次) | ✅ 通过 | 4 路 `KEY_LED` 同步慢闪,`LED_BAR` 待机全灭 |
| **AID-004** | 按键播放 | 待机按 Kx 播 `00`,对应通道出声;当前 KEY_LED + KUP/KDOWN 常亮,其它 KEY_LED 灭 | ⚠️ 待验证 | 通道播放、当前 `KEY_LED``LED_BAR` 状态正常;`KUP_LED/KDOWN_LED` 播放时常亮效果待复测 |
| **AID-005** | 播完恢复 | 单曲播完恢复待机,所有灯恢复 | ✅ 通过 | 播完关闭通道并恢复待机灯态,实测通过 |
| **AID-006** | 播放切通道 | 播放中按其它通道键,只切输出不换曲 | ✅ 通过 | `kt_switch_channel_only()``kt_channel_outputs_on()` |
| **AID-007** | 同通道下一曲 | 播放中再按当前通道键播下一首00→01→02…循环 | ✅ 通过 | 先 `kt_play_file_idx(idx+1)`,失败再 `music_player_play_next()` |
| **AID-008** | 音量 | 2~30 格,默认 23±1不记忆 | ✅ 通过 | 默认值、上下限、±1 步进及不记忆逻辑已实测通过 |
| **AID-009** | 灯条 | 仅当前通道灯条亮,待机全灭 | ✅ 通过 | `LED_BAR` 仅当前播放通道常亮,待机全灭,实测通过 |
| **AID-010** | 格式支持 | MP3 / WAV / FLAC / APE | ✅ 通过 | SDK 播放器原生支持 |
| **AID-011** | 系统指示灯 | 慢闪待机、快闪报错、常亮播放 | ✅ 通过 | `KT_LED_IDLE/FAIL/PLAY/UPDATE` 状态机 |
| — | VOL+ | 按一次 +1 格 | ✅ 通过 | `KEY_USER_KEY_5``KEY_VOL_UP` |
| — | VOL- | 按一次 -1 格 | ✅ 通过 | `KEY_USER_KEY_6``KEY_VOL_DOWN`(最小 2 |
---
## 4. 功能逻辑说明20260717 调试版)
### 4.1 按键 K1~K4通道键
```
待机active_ch == 0
└─ 按 Kx → 播 00.*sd1 优先udisk0 次之)
→ 失败则播盘内第一首
→ 成功:开 CHx 音频 + 灯条SYS_LED 常亮
播放中active_ch != 0 且 decoding
├─ 同通道再按 → idx+1 下一曲(失败则 player next
└─ 异通道按 → 只切 AUDIO/灯条,不换曲
播完 / 拔卡 / 出错
└─ kt_music_play_end_handler()
→ 关通道、active_ch=0、music_player_stop(0)
→ 音量恢复 23、SYS_LED 慢闪
```
### 4.2 按键 K5 / K6音量键
- K5VOL+`app_task_put_key_msg(KEY_VOL_UP)`
- K6VOL-):音量 > 2 时 `KEY_VOL_DOWN`
- 灯态:播放时与当前 KEY_LED 一起常亮;待机时与其它按键灯同步慢闪(无按后单独亮 3s
### 4.3 LED 行为对照(需求 vs 当前)
| LED 类型 | 需求20260717 | 当前实现 |
| ------------ | ----------------------- | -------------- |
| SYS_LED | 待机慢闪 / 播放常亮 / 报错快闪 | ✅ 已实现 |
| KEY_LED按键灯 | 待机4 路同步慢闪;播放:当前路常亮,其它灭 | ✅ 已实现并通过 |
| LED_BAR灯条 | 播放:当前通道常亮;待机:全灭 | ✅ 已实现并通过 |
| KUP / KDOWN | 播放常亮;待机与 KEY_LED 同步慢闪 | ✅ 已实现 |
### 4.4 U 盘升级
| 阶段 | 行为 |
| ----- | -------------------------------------------------------------------------- |
| 检测 | `TCFG_DEV_UPDATE_IF_NOFILE_ENABLE = 0`,设备上线即 `dev_update_check` |
| 升级中 | `kt_update_led_start()`SYS_LED 快闪;`kt_update_start_remind()` 播 `TONE_SUP` |
| 升级完成 | 成功播 `TONE_EUP``kt_update_led_finish()` 恢复 LED |
| 提示音通路 | CS8406 RST 释放 → 4 路 AUDIO 全开 → `app_audio_output_start` → 等 START/STOP |
**已知限制**SDK `update_success_boot_check()` 在同一次开机内会拦截相同 UFW 重复升级。
---
## 5. 已修复问题记录
| 问题 | 原因 | 修复 |
| ------------------------- | -------------------------------------------- | -------------------------------------------- |
| U 盘不能升级 | `TCFG_DEV_UPDATE_IF_NOFILE_ENABLE=1` 仅无文件时检测 | 改为 `0` |
| 升级提示音偶发无声 | 异步 `tone_play` + 通道/CS8406 未就绪 | RST 时序 + 4 路全开 + 等 START/STOP |
| 播完再按键功能异常 | `active_ch=0``get_play_status()` 仍为 PLAY | 播完 `music_player_stop(0)`;判断加 `active_ch!=0` |
| `kt_voltage_all_off` 编译错误 | 函数定义顺序 | 调整函数顺序 |
| BT_LED 改名 | 需求统一为系统灯 | 全部改为 `SYS_LED` |
---
## 6. 待办事项(建议优先级)
### P0 — 待测试
1. **AID-001 文件排序**
- 验证无 `00.*` 时能否从待机播放普通命名文件,以及回退播放后的下一曲顺序
- 测试结果出来前暂不修改播放逻辑
2. **AID-004 播放灯态**
- 复测播放时当前 `KEY_LED`、`KUP_LED/KDOWN_LED` 是否持续常亮,其他 `KEY_LED` 是否熄灭
### P2 — 可选
1. 同开机重复升级测试:评估是否绕过 `update_success_boot_check`
2. 配置文件化按键/灯效(需求文档「备用功能」栏)
---
## 7. 测试检查清单
### 基本播放
- [x] 上电待机4 路 KEY_LED 同步慢闪(约 1sLED_BAR 全灭SYS_LED 慢闪
- [ ] 待机按 K1`00.*`CH1 有声K1 + KUP + KDOWN 常亮,其它 KEY_LED 灭CH1 灯条亮
- [x] 待机按 K2/K3/K4通道、按键灯和灯条对应正确
- [x] 单曲播完:恢复待机灯态,音量回到 23
- [x] 播放中按异通道:不换曲,灯条/按键灯跟随
- [x] 播放中按同通道:下一曲 00→01→02…
### 文件与通道
- [x] SD 卡 `00.mp3` 与 U 盘同时存在:优先 SD
- [x] 文件命名为 `AA.mp3`(非 00待机按键可播
- [x] K1/K4、K2/K3 物理位置与 CH 对应正确
### 音量
- [x] 默认音量 23
- [x] VOL+ 每次 +1最大 30
- [x] VOL- 每次 -1最小 2
- [x] 播完/待机后再播,音量恢复 23
### 升级
- [x] U 盘根目录放 `update.ufw`,上电可升级
- [x] 升级中 SYS_LED 快闪,播 `sup` 提示音
- [x] 升级成功播 `eup` 提示音LED 恢复
### 异常
- [x] 无 `00.*` 且无音乐文件:对应通道快闪报错
- [ ] 拔卡/拔 U 盘:停止播放,恢复待机
---
## 8. 关键代码索引
### 按键分发(`music.c`
```c
case KEY_USER_KEY_1 ~ KEY_USER_KEY_6:
err = kt_key_event_handler(key);
```
### 通道键核心(`kt.c`
- `kt_channel_key_handler()` — 空闲播 00 / 同通道 next / 异通道切换
- `kt_play_success()` / `kt_play_fail()` — 成功/失败灯态
- `kt_music_play_end_handler()` — 播完收尾
### 音量
```c
// cpu/br23/audio_config.h
#define SYS_DEFAULT_VOL 23
// kt.c
static void kt_vol_reset_default(void);
```
### 升级开关
```c
// apps/soundbox/include/app_config.h
#define TCFG_DEV_UPDATE_IF_NOFILE_ENABLE 0
```
---
## 9. 版本历史
| 版本 | 日期 | 说明 |
| ---- | ---------- | -------------------- |
| V1.0 | 2026-07-25 | 初版:需求对照、实现状态、待办与测试清单 |
---
*本文档由固件开发过程自动整理,如有需求变更请以最新 Excel 跟踪表为准。*

View File

@ -76,6 +76,7 @@ CFLAGS := \
-Wno-shift-negative-value \ -Wno-shift-negative-value \
-Wundef \ -Wundef \
-fms-extensions \ -fms-extensions \
-w \
# 宏定义 # 宏定义
@ -196,6 +197,7 @@ INCLUDES := \
-Iapps/common/usb \ -Iapps/common/usb \
-Iapps/common/usb/device \ -Iapps/common/usb/device \
-Iapps/common/usb/host \ -Iapps/common/usb/host \
-Iapps/kaotings \
-Iapps/soundbox/smartbox \ -Iapps/soundbox/smartbox \
-Iapps/soundbox/smartbox/bt_manage/bt_trans_data \ -Iapps/soundbox/smartbox/bt_manage/bt_trans_data \
-Iapps/soundbox/smartbox/bt_manage \ -Iapps/soundbox/smartbox/bt_manage \
@ -377,6 +379,7 @@ c_SRC_FILES := \
apps/soundbox/aec/br23/audio_aec.c \ apps/soundbox/aec/br23/audio_aec.c \
apps/soundbox/aec/br23/audio_aec_demo.c \ apps/soundbox/aec/br23/audio_aec_demo.c \
apps/soundbox/app_main.c \ apps/soundbox/app_main.c \
apps/kaotings/kt.c \
apps/soundbox/board/br23/board_ac6083a/board_ac6083a.c \ apps/soundbox/board/br23/board_ac6083a/board_ac6083a.c \
apps/soundbox/board/br23/board_ac6083a/key_table/adkey_table.c \ apps/soundbox/board/br23/board_ac6083a/key_table/adkey_table.c \
apps/soundbox/board/br23/board_ac6083a/key_table/iokey_table.c \ apps/soundbox/board/br23/board_ac6083a/key_table/iokey_table.c \

View File

@ -3,6 +3,7 @@
#include "update/update.h" #include "update/update.h"
#include "update/update_loader_download.h" #include "update/update_loader_download.h"
#include "app_config.h" #include "app_config.h"
#include "kt.h"
#if defined(CONFIG_SD_UPDATE_ENABLE) || defined(CONFIG_USB_UPDATE_ENABLE) #if defined(CONFIG_SD_UPDATE_ENABLE) || defined(CONFIG_USB_UPDATE_ENABLE)
#define DEV_UPDATE_EN 1 #define DEV_UPDATE_EN 1
@ -296,6 +297,9 @@ u16 dev_update_check(char *logo)
return UPDATA_DEV_ERR; return UPDATA_DEV_ERR;
} }
/* 升级开始SYS_LED 快闪 + 播 TONE_SUP四通道全开 */
//kt_update_start_remind();
#if(USER_UART_UPDATE_ENABLE) && (UART_UPDATE_ROLE == UART_UPDATE_MASTER) #if(USER_UART_UPDATE_ENABLE) && (UART_UPDATE_ROLE == UART_UPDATE_MASTER)
uart_update_send_update_ready(update_path); uart_update_send_update_ready(update_path);
while (get_uart_update_sta()) { while (get_uart_update_sta()) {

View File

@ -15,9 +15,9 @@ struct key_driver_para adkey_scan_para = {
.scan_time = 10, //按键扫描频率, 单位: ms .scan_time = 10, //按键扫描频率, 单位: ms
.last_key = NO_KEY, //上一次get_value按键值, 初始化为NO_KEY; .last_key = NO_KEY, //上一次get_value按键值, 初始化为NO_KEY;
.filter_time = 2, //按键消抖延时; .filter_time = 2, //按键消抖延时;
.long_time = 75, //按键判定长按数量 .long_time = 50, //按键判定长按数量
.hold_time = (75 + 15), //按键判定HOLD数量 .hold_time = (50 + 10), //按键判定HOLD数量
.click_delay_time = 20, //按键被抬起后等待连击延时数量 .click_delay_time = 10, //按键被抬起后等待连击延时数量
.key_type = KEY_DRIVER_TYPE_AD, .key_type = KEY_DRIVER_TYPE_AD,
.get_value = ad_get_key_value, .get_value = ad_get_key_value,
}; };

View File

@ -36,7 +36,7 @@
#endif #endif
#else #else
#ifndef ALL_KEY_EVENT_CLICK_ONLY #ifndef ALL_KEY_EVENT_CLICK_ONLY
#define ALL_KEY_EVENT_CLICK_ONLY 0 //是否全部按键只响应单击事件 #define ALL_KEY_EVENT_CLICK_ONLY 1 //是否全部按键只响应单击事件
#endif #endif
#endif #endif

View File

@ -56,8 +56,8 @@ extern void usb_sie_close_all(void);
#include "audio_config.h" #include "audio_config.h"
#endif #endif
#ifdef UPDATE_LED_REMIND #if defined(UPDATE_LED_REMIND) || defined(UPDATE_VOICE_REMIND)
#include "asm/pwm_led.h" #include "kt.h"
#endif #endif
#define DEVICE_UPDATE_KEY_ERR BIT(30) #define DEVICE_UPDATE_KEY_ERR BIT(30)
@ -122,8 +122,8 @@ bool device_is_first_start()
void led_update_start(void) void led_update_start(void)
{ {
#ifdef UPDATE_LED_REMIND #ifdef UPDATE_LED_REMIND
puts("led_update_start\n"); //puts("led_update_start\n");
pwm_led_mode_set(PWM_LED_ALL_OFF); //kt_update_led_start();
#endif #endif
} }
@ -131,7 +131,7 @@ void led_update_finish(void)
{ {
#ifdef UPDATE_LED_REMIND #ifdef UPDATE_LED_REMIND
puts("led_update_finish\n"); puts("led_update_finish\n");
pwm_led_mode_set(PWM_LED0_LED1_FAST_FLASH); //kt_update_led_finish();
#endif #endif
} }
@ -161,7 +161,6 @@ int update_result_deal()
return 0; return 0;
#endif #endif
u8 key_voice_cnt = 0;
u16 result = 0; u16 result = 0;
result = (g_updata_flag & 0xffff); result = (g_updata_flag & 0xffff);
log_info("<--------update_result_deal=0x%x %x--------->\n", result, g_updata_flag >> 16); log_info("<--------update_result_deal=0x%x %x--------->\n", result, g_updata_flag >> 16);
@ -174,8 +173,7 @@ int update_result_deal()
if (result == UPDATA_NON || 0 == result) { if (result == UPDATA_NON || 0 == result) {
return 0; return 0;
} }
#ifdef UPDATE_VOICE_REMIND
#endif
if (result == UPDATA_SUCC) { if (result == UPDATA_SUCC) {
#if(JL_EARPHONE_APP_EN && RCSP_UPDATE_EN) #if(JL_EARPHONE_APP_EN && RCSP_UPDATE_EN)
u8 clear_update_flag = 0; u8 clear_update_flag = 0;
@ -184,48 +182,13 @@ int update_result_deal()
#if(JL_SMART_BOX_EXTRA_FLASH_OPT && RCSP_UPDATE_EN) #if(JL_SMART_BOX_EXTRA_FLASH_OPT && RCSP_UPDATE_EN)
smartbox_eflash_update_flag_set(0); smartbox_eflash_update_flag_set(0);
smartbox_eflash_flag_set(0); smartbox_eflash_flag_set(0);
#endif
#ifdef UPDATE_LED_REMIND
led_update_finish();
#endif #endif
} }
extern u8 get_max_sys_vol(void); #if defined(UPDATE_VOICE_REMIND) || defined(UPDATE_LED_REMIND)
while (1) { /* 升级完成:播 TONE_EUP四通道全开并恢复 SYS_LED 正常功能 */
wdt_clear(); //kt_update_finish_remind(result);
key_voice_cnt++;
#ifdef UPDATE_VOICE_REMIND
if (result == UPDATA_SUCC) {
puts("<<<<<<UPDATA_SUCC");
app_audio_set_volume(APP_AUDIO_STATE_WTONE, get_max_sys_vol() / 2, 1);
//tone_play_index(IDEX_TONE_NORMAL, 1);
tone_play(TONE_SIN_NORMAL, 1);
/* os_time_dly(25); */
/* tone_stop(); */
//delay_2ms(500);
os_time_dly(25);
puts(">>>>>>>>>>>\n");
} else {
log_info("!!!!!!!!!!!!!!!updata waring !!!!!!!!!!!=0x%x\n", result);
app_audio_set_volume(APP_AUDIO_STATE_WTONE, get_max_sys_vol() / 2, 1);
tone_play(TONE_SIN_NORMAL, 1);
//tone_play_index(IDEX_TONE_NORMAL, 1);
/* os_time_dly(50); */
/* tone_stop(); */
os_time_dly(25);
//delay_2ms(500);
}
#endif #endif
if (key_voice_cnt > 5) {
key_voice_cnt = 0;
//delay_2ms(500);
//os_time_dly(100);
puts("enter_sys_soft_poweroff\n");
break;
//注:关机要慎重,要设置开机键
//enter_sys_soft_poweroff();
}
}
return 1; return 1;
} }

762
apps/kaotings/kt.c Normal file
View File

@ -0,0 +1,762 @@
#include "kt.h"
#include "key_event_deal.h"
#include "music_player.h"
#include "audio_config.h"
#include "tone_player.h"
#include "update.h"
enum
{
KT_LED_IDLE = 0, /* 空闲慢闪 */
KT_LED_PLAY, /* 播放常亮 */
KT_LED_FAIL, /* 播放失败快闪 */
KT_LED_UPDATE, /* 升级快闪 */
};
/* 定时器 50ms慢闪 1s灭/1s亮快闪 100ms灭/100ms亮 */
#define KT_LED_SLOW_HALF 20
#define KT_LED_FAST_HALF 2
/* 当前播的是非编号文件(如 aa.mp3下一曲直接 play_next */
#define KT_FILE_IDX_NONUM 0xFF
typedef struct _kt_var_
{
int kt_timer;
int t_cnt;
u8 led_mode;
u8 active_ch; /* 1~4 按键播放会话中, 0=无 */
u8 fail_ch; /* 处于失败快闪的通道, 0=无 */
u8 file_idx; /* 00/01/... 或 KT_FILE_IDX_NONUM */
} _kt_var;
static _kt_var kt_var;
#define __this (&kt_var)
static void kt_key_led_on(u8 ch)
{
switch (ch)
{
case 1: KEY_LED_OUT_CH1_ON(); break;
case 2: KEY_LED_OUT_CH2_ON(); break;
case 3: KEY_LED_OUT_CH3_ON(); break;
case 4: KEY_LED_OUT_CH4_ON(); break;
default: break;
}
}
static void kt_key_led_all_on(void)
{
KEY_LED_OUT_CH1_ON();
KEY_LED_OUT_CH2_ON();
KEY_LED_OUT_CH3_ON();
KEY_LED_OUT_CH4_ON();
}
static void kt_key_led_all_off(void)
{
KEY_LED_OUT_CH1_OFF();
KEY_LED_OUT_CH2_OFF();
KEY_LED_OUT_CH3_OFF();
KEY_LED_OUT_CH4_OFF();
}
static void kt_led_bar_on(u8 ch)
{
switch (ch)
{
case 1:
LED_BAR_OUT_CH1_ON();
break;
case 2:
LED_BAR_OUT_CH2_ON();
break;
case 3:
LED_BAR_OUT_CH3_ON();
break;
case 4:
LED_BAR_OUT_CH4_ON();
break;
default:
break;
}
}
static void kt_led_bar_all_off(void)
{
LED_BAR_OUT_CH1_OFF();
LED_BAR_OUT_CH2_OFF();
LED_BAR_OUT_CH3_OFF();
LED_BAR_OUT_CH4_OFF();
}
static void kt_led_set_mode(u8 mode)
{
__this->led_mode = mode;
__this->t_cnt = 0;
kt_key_led_all_off();
kt_led_bar_all_off();
KUP_LED_OFF();
KDOWN_LED_OFF();
if (mode == KT_LED_PLAY)
{
SYS_LED_ON();
kt_key_led_on(__this->active_ch);
kt_led_bar_on(__this->active_ch);
KUP_LED_ON();
KDOWN_LED_ON();
}
else
{
SYS_LED_OFF();
}
}
static void kt_clear_fail_to_idle(void)
{
if (__this->fail_ch == 0)
{
return;
}
__this->fail_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
}
static void kt_audio_all_off(void)
{
AUDIO_OUT_CH1_OFF();
AUDIO_OUT_CH2_OFF();
AUDIO_OUT_CH3_OFF();
AUDIO_OUT_CH4_OFF();
}
static void kt_audio_all_on(void)
{
AUDIO_OUT_CH1_ON();
AUDIO_OUT_CH2_ON();
AUDIO_OUT_CH3_ON();
AUDIO_OUT_CH4_ON();
}
/* 升级提示音需要四路音频输出同时打开LED 仍由状态机控制。 */
static void kt_all_channels_on(void)
{
kt_audio_all_on();
}
static void kt_all_channels_off(void)
{
kt_audio_all_off();
}
/* CS8406 复位释放,保证 IIS 通路稳定 */
static void kt_cs8406_reset_release(void)
{
gpio_set_direction(IO_PORTA_06, 0);
gpio_set_output_value(IO_PORTA_06, 0);
os_time_dly(5); /* ~50ms 保持复位 */
gpio_set_output_value(IO_PORTA_06, 1);
os_time_dly(30); /* ~300ms 等待芯片就绪 */
}
static void kt_channel_drive_off(u8 ch)
{
switch (ch)
{
case 1: AUDIO_OUT_CH1_OFF(); break;
case 2: AUDIO_OUT_CH2_OFF(); break;
case 3: AUDIO_OUT_CH3_OFF(); break;
case 4: AUDIO_OUT_CH4_OFF(); break;
default: break;
}
}
/* 音频通道互斥切换;灯光由 kt_led_set_mode() 统一处理。 */
static void kt_channel_outputs_on(u8 ch)
{
kt_audio_all_off();
switch (ch)
{
case 1: AUDIO_OUT_CH1_ON(); break;
case 2: AUDIO_OUT_CH2_ON(); break;
case 3: AUDIO_OUT_CH3_ON(); break;
case 4: AUDIO_OUT_CH4_ON(); break;
default: break;
}
}
static void kt_gpio_out_init(u32 pin)
{
gpio_set_pull_down(pin, 0);
gpio_set_pull_up(pin, 0);
gpio_set_hd0(pin, 0);
gpio_set_direction(pin, 0);
gpio_set_output_value(pin, 0);
}
void kt_boot_init(void)
{
// CS8406 RST
gpio_set_pull_down(IO_PORTA_06, 0);
gpio_set_pull_up(IO_PORTA_06, 0);
gpio_set_direction(IO_PORTA_06, 0);
gpio_set_output_value(IO_PORTA_06, 0);
// iis 双绑引脚高阻化
gpio_set_pull_down(IO_PORTA_01, 0);
gpio_set_pull_up(IO_PORTA_01, 0);
gpio_set_direction(IO_PORTA_01, 1);
gpio_set_die(IO_PORTA_01, 1);
gpio_set_pull_down(IO_PORTA_05, 0);
gpio_set_pull_up(IO_PORTA_05, 0);
gpio_set_direction(IO_PORTA_05, 1);
gpio_set_die(IO_PORTA_05, 1);
// CS8406 TX EN
kt_gpio_out_init(AUDIO_OUT_CHANNEL1);
kt_gpio_out_init(AUDIO_OUT_CHANNEL2);
kt_gpio_out_init(AUDIO_OUT_CHANNEL3);
kt_gpio_out_init(AUDIO_OUT_CHANNEL4);
// key led output
kt_gpio_out_init(KEY_LED_OUT_CHANNEL1);
kt_gpio_out_init(KEY_LED_OUT_CHANNEL2);
kt_gpio_out_init(KEY_LED_OUT_CHANNEL3);
kt_gpio_out_init(KEY_LED_OUT_CHANNEL4);
// led bar output
kt_gpio_out_init(LED_BAR_OUT_CHANNEL1);
kt_gpio_out_init(LED_BAR_OUT_CHANNEL2);
kt_gpio_out_init(LED_BAR_OUT_CHANNEL3);
kt_gpio_out_init(LED_BAR_OUT_CHANNEL4);
// vol key led output
kt_gpio_out_init(KUP_LED_PIN);
kt_gpio_out_init(KDOWN_LED_PIN);
// sys led
kt_gpio_out_init(SYS_LED_PIN);
}
static void timer_cb(void *priv)
{
u8 half;
u8 on;
(void)priv;
if (__this->led_mode == KT_LED_PLAY)
{
SYS_LED_ON();
kt_key_led_all_off();
kt_key_led_on(__this->active_ch);
kt_led_bar_all_off();
kt_led_bar_on(__this->active_ch);
KUP_LED_ON();
KDOWN_LED_ON();
return;
}
half = (__this->led_mode == KT_LED_FAIL || __this->led_mode == KT_LED_UPDATE)
? KT_LED_FAST_HALF
: KT_LED_SLOW_HALF;
__this->t_cnt++;
if (__this->t_cnt <= half)
{
on = 0;
}
else if (__this->t_cnt <= (half * 2))
{
on = 1;
}
else
{
__this->t_cnt = 0;
on = 0;
}
kt_led_bar_all_off();
if (on)
{
SYS_LED_ON();
if (__this->led_mode == KT_LED_IDLE)
{
/* 待机K1~K4 与音量灯同步慢闪 */
kt_key_led_all_on();
KUP_LED_ON();
KDOWN_LED_ON();
}
else if (__this->led_mode == KT_LED_FAIL)
{
/* 失败:仅对应通道 KEY_LED + SYS 快闪,音量灯保持灭 */
kt_key_led_on(__this->fail_ch);
KUP_LED_OFF();
KDOWN_LED_OFF();
}
else
{
/* 升级等SYS 快闪,按键灯全亮忽明忽暗时由 UPDATE 模式另控 */
KUP_LED_OFF();
KDOWN_LED_OFF();
}
}
else
{
SYS_LED_OFF();
kt_key_led_all_off();
KUP_LED_OFF();
KDOWN_LED_OFF();
}
}
static void start_time_base(u32 time_base_ms)
{
if (__this->kt_timer)
{
sys_timer_del(__this->kt_timer);
}
__this->t_cnt = 0;
__this->kt_timer = sys_timer_add(NULL, timer_cb, time_base_ms);
}
/* 音量不记忆:空闲时固定恢复为 SYS_DEFAULT_VOL */
static void kt_vol_reset_default(void)
{
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, SYS_DEFAULT_VOL, 1);
printf("kt vol reset to %d\n", SYS_DEFAULT_VOL);
}
static void kt_update_play_tone(const char *name)
{
int err;
u32 t;
extern u8 get_max_sys_vol(void);
tone_play_stop();
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
music_player_stop(0);
os_time_dly(5);
}
kt_cs8406_reset_release();
kt_all_channels_on();
app_audio_output_start();
app_audio_state_switch(APP_AUDIO_STATE_WTONE, get_max_sys_vol());
app_audio_set_volume(APP_AUDIO_STATE_WTONE, get_max_sys_vol(), 1);
printf("kt_update_play_tone: %s\n", name);
err = tone_play(name, 1);
printf("kt_update_play_tone err=%d\n", err);
/* 等 DAC 真正启动后再判 START避免 dec 已置位但无声 */
for (t = 0; t < 100; t++)
{
wdt_clear();
if (tone_get_dec_status() == TONE_START)
{
break;
}
os_time_dly(1);
}
printf("kt_tone wait_start=%d dec=%d get=%d\n",
t, tone_get_dec_status(), tone_get_status());
if (tone_get_dec_status() == TONE_START)
{
for (t = 0; t < 1500; t++)
{
wdt_clear();
if (tone_get_dec_status() != TONE_START)
{
break;
}
os_time_dly(1);
}
printf("kt_tone wait_end=%d\n", t);
os_time_dly(20); /* 播完后稍留,避免尾音被截断 */
}
else
{
printf("kt_tone start fail, keep ch on for a while\n");
os_time_dly(200);
}
kt_all_channels_off();
}
/* void kt_update_led_start(void)
{
printf("kt_update_led_start\n");
if (!__this->kt_timer)
{
start_time_base(50);
}
kt_led_set_mode(KT_LED_UPDATE);
} */
/* void kt_update_led_finish(void)
{
printf("kt_update_led_finish\n");
//升级结束:恢复 SYS_LED 正常空闲慢闪
__this->fail_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
} */
/* void kt_update_start_remind(void)
{
printf("kt_update_start_remind\n");
kt_update_led_start();
kt_update_play_tone(TONE_SUP);
} */
/* void kt_update_finish_remind(u16 result)
{
printf("kt_update_finish_remind result=0x%x\n", result);
if (result == UPDATA_SUCC)
{
kt_update_play_tone(TONE_EUP);
}
kt_update_led_finish();
} */
void kt_init(void)
{
printf("kt_init\n");
__this->active_ch = 0;
__this->fail_ch = 0;
__this->file_idx = 0;
kt_led_set_mode(KT_LED_IDLE);
// CS8406 RST
gpio_set_output_value(IO_PORTA_06, 1);
/* 默认关闭各音频通道,按键播放时再打开对应通道 */
kt_audio_all_off();
kt_key_led_all_off();
kt_led_bar_all_off();
KUP_LED_OFF();
KDOWN_LED_OFF();
kt_vol_reset_default();
start_time_base(50);
printf("kt_init end\n");
}
/* 播放结束/出错/拔卡:关闭音频输出,恢复待机灯态和默认音量 */
int kt_music_play_end_handler(void)
{
if (__this->active_ch == 0)
{
return 0;
}
printf("kt_music_play_end_handler ch=%d\n", __this->active_ch);
kt_channel_drive_off(__this->active_ch);
__this->active_ch = 0;
__this->fail_ch = 0;
/* 必须停解码,否则 get_play_status 仍为 PLAY下次按键会误判 */
music_player_stop(0);
kt_led_set_mode(KT_LED_IDLE);
kt_vol_reset_default();
return 1;
}
static int kt_try_play_path(const char *path)
{
int err;
err = music_player_play_by_path((char *)"sd1", path);
if (err != MUSIC_PLAYER_SUCC)
{
err = music_player_play_by_path((char *)"udisk0", path);
}
return err;
}
static int kt_try_play_first_file(void)
{
int err;
err = music_player_play_first_file((char *)"sd1");
if (err != MUSIC_PLAYER_SUCC)
{
err = music_player_play_first_file((char *)"udisk0");
}
return err;
}
static int kt_play_file_idx(u8 idx)
{
char path[16];
sprintf(path, "/%02d.*", idx);
printf("kt_play_file_idx %s\n", path);
return kt_try_play_path(path);
}
/*
*
* play_by_path stop(1) fsn play_next
*/
static int kt_numbered_exists(u8 idx)
{
static const char *const roots[] = {
"storage/sd1/C/",
"storage/udisk0/C/",
};
static const char *const exts[] = {
"mp3", "MP3", "wav", "WAV", "wma", "WMA",
"flac", "FLA", "ape", "APE", "m4a", "M4A",
};
char path[64];
FILE *fp;
u8 r, e;
for (r = 0; r < ARRAY_SIZE(roots); r++)
{
for (e = 0; e < ARRAY_SIZE(exts); e++)
{
sprintf(path, "%s%02d.%s", roots[r], idx, exts[e]);
fp = fopen(path, "r");
if (fp)
{
fclose(fp);
return 1;
}
}
}
return 0;
}
/* 根据当前播放文件名同步 file_idxNN.xxx → 序号,否则 NONUM */
static u8 kt_file_idx_from_cur(void)
{
u8 name[64];
u8 *p;
int len;
FILE *fp = music_player_get_file_hdl();
if (!fp)
{
return KT_FILE_IDX_NONUM;
}
len = fget_name(fp, name, sizeof(name));
if (len < 3)
{
return KT_FILE_IDX_NONUM;
}
p = name;
if ((p[0] == '\\') && (p[1] == 'U'))
{
p += 2;
if (len < 5)
{
return KT_FILE_IDX_NONUM;
}
}
if ((p[0] >= '0') && (p[0] <= '9') &&
(p[1] >= '0') && (p[1] <= '9') &&
(p[2] == '.'))
{
return (u8)((p[0] - '0') * 10 + (p[1] - '0'));
}
return KT_FILE_IDX_NONUM;
}
static void kt_play_success(u8 ch)
{
printf("kt_play_success ch=%d\n", ch);
kt_channel_outputs_on(ch);
__this->active_ch = ch;
__this->fail_ch = 0;
kt_led_set_mode(KT_LED_PLAY);
}
static void kt_play_fail(u8 ch)
{
printf("kt_play_fail ch=%d\n", ch);
/* 失败SYS_LED 与对应 KEY_LED 快闪LED_BAR 和音量灯保持熄灭 */
kt_audio_all_off();
kt_key_led_all_off();
kt_led_bar_all_off();
__this->active_ch = 0;
__this->fail_ch = ch;
kt_led_set_mode(KT_LED_FAIL);
}
static void kt_switch_channel_only(u8 ch)
{
printf("kt_switch_channel_only ch=%d\n", ch);
/* 正在播放其它通道:只切音频输出,不改变当前歌曲 */
kt_channel_outputs_on(ch);
__this->active_ch = ch;
__this->fail_ch = 0;
printf("kt_switch_channel_only fail_ch=%d\n", __this->fail_ch);
kt_led_set_mode(KT_LED_PLAY);
}
static int kt_channel_key_handler(u8 ch)
{
int err;
u8 playing;
/* 若之前有通道错误,先恢复为慢闪 */
printf("kt_channel_key_handler ch=%d\n", ch);
kt_clear_fail_to_idle();
playing = (music_player_get_play_status() == FILE_DEC_STATUS_PLAY);
printf("kt_channel_key_handler playing=%d active_ch=%d\n", playing, __this->active_ch);
/* 仅 KT 会话在播active_ch!=0才走同通道 next / 异通道切换;
* active_ch=0便 */
if (playing && (__this->active_ch != 0))
{
if (__this->active_ch == ch)
{
/*
*
* 1) idx+1 exists fsn
* 2) play_next aa.mp3
* 3) play_next 00
*/
u8 from_nonum = (__this->file_idx == KT_FILE_IDX_NONUM);
if (!from_nonum)
{
u8 next_idx = __this->file_idx + 1;
printf("kt_channel_key_handler same ch next_idx=%d\n", next_idx);
if (kt_numbered_exists(next_idx))
{
err = kt_play_file_idx(next_idx);
if (err == MUSIC_PLAYER_SUCC)
{
__this->file_idx = next_idx;
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
}
else
{
printf("kt_channel_key_handler no more numbered, play_next\n");
}
}
err = music_player_play_next();
if (err == MUSIC_PLAYER_SUCC)
{
u8 idx = kt_file_idx_from_cur();
/* 刚从非编号区绕回编号文件:统一回到 00 */
if (from_nonum && (idx != KT_FILE_IDX_NONUM))
{
printf("kt_channel_key_handler nonum done, wrap to 00\n");
if (idx == 0)
{
__this->file_idx = 0;
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
err = kt_play_file_idx(0);
if (err == MUSIC_PLAYER_SUCC)
{
__this->file_idx = 0;
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
}
else
{
__this->file_idx = idx;
printf("kt_channel_key_handler play_next ok file_idx=%d\n", __this->file_idx);
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
}
/* play_next 失败:回绕 00需求保证存在 */
printf("kt_channel_key_handler wrap to 00\n");
err = kt_play_file_idx(0);
if (err == MUSIC_PLAYER_SUCC)
{
__this->file_idx = 0;
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
kt_play_fail(ch);
return MUSIC_PLAYER_ERR_NULL;
}
/* 正在播放但不是当前通道:只切换音频和对应灯态 */
printf("kt_channel_key_handler switch ch only %d->%d\n", __this->active_ch, ch);
kt_switch_channel_only(ch);
return MUSIC_PLAYER_SUCC;
}
/* 空闲(或播完残留状态):从 00.* 开始 */
if (playing) {
music_player_stop(0);
}
__this->file_idx = 0;
err = kt_play_file_idx(0);
if (err == MUSIC_PLAYER_SUCC)
{
printf("kt_channel_key_handler idle play 00 ch=%d\n", ch);
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
/* 00.* 不存在:回退播放 sd1/udisk0 第一首 */
err = kt_try_play_first_file();
if (err == MUSIC_PLAYER_SUCC)
{
__this->file_idx = kt_file_idx_from_cur();
printf("kt_channel_key_handler idle play first ch=%d file_idx=%d\n",
ch, __this->file_idx);
kt_play_success(ch);
return MUSIC_PLAYER_SUCC;
}
printf("kt_channel_key_handler kt_play_fail ch=%d\n", ch);
kt_play_fail(ch);
return MUSIC_PLAYER_ERR_NULL;
}
static int kt_vol_key_handler(u16 key)
{
if (key == KEY_USER_KEY_5)
{
/* 音量+KUP/KDOWN 灯不单独闪 3s跟随 PLAY/IDLE 状态机 */
app_task_put_key_msg(KEY_VOL_UP, 0);
printf("kt vol+ %d\n", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
}
else
{
/* 音量-;下限 2 */
if (app_audio_get_volume(APP_AUDIO_STATE_MUSIC) > 2)
{
app_task_put_key_msg(KEY_VOL_DOWN, 0);
}
printf("kt vol- %d\n", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
}
return MUSIC_PLAYER_ERR_NULL;
}
/*
* KEY1~4 00.* next
* KEY_LED + KUP/KDOWN
* KEY5/6
*/
int kt_key_event_handler(u16 key)
{
u8 ch;
if (key == KEY_USER_KEY_5 || key == KEY_USER_KEY_6)
{
return kt_vol_key_handler(key);
}
if (key < KEY_USER_KEY_1 || key > KEY_USER_KEY_4)
{
return MUSIC_PLAYER_ERR_NULL;
}
ch = (u8)(key - KEY_USER_KEY_1 + 1);
printf("kt_key_event_handler key=%d ch=%d\n", key, ch);
return kt_channel_key_handler(ch);
}

73
apps/kaotings/kt.h Normal file
View File

@ -0,0 +1,73 @@
#ifndef __KT_H__
#define __KT_H__
#include "system/includes.h"
#define SYS_LED_PIN IO_PORTB_03
#define SYS_LED_ON() (gpio_set_output_value(SYS_LED_PIN,1))
#define SYS_LED_OFF() (gpio_set_output_value(SYS_LED_PIN,0))
/* 音频输出通道 1-4*/
#define AUDIO_OUT_CHANNEL4 IO_PORTB_07
#define AUDIO_OUT_CHANNEL3 IO_PORTB_08
#define AUDIO_OUT_CHANNEL2 IO_PORTB_09
#define AUDIO_OUT_CHANNEL1 IO_PORTB_10
#define AUDIO_OUT_CH1_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL1,1))
#define AUDIO_OUT_CH2_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL2,1))
#define AUDIO_OUT_CH3_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL3,1))
#define AUDIO_OUT_CH4_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL4,1))
#define AUDIO_OUT_CH1_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL1,0))
#define AUDIO_OUT_CH2_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL2,0))
#define AUDIO_OUT_CH3_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL3,0))
#define AUDIO_OUT_CH4_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL4,0))
/* 播放按键LED输出通道 1-4*/
#define KEY_LED_OUT_CHANNEL4 IO_PORTA_12
#define KEY_LED_OUT_CHANNEL3 IO_PORTC_00
#define KEY_LED_OUT_CHANNEL2 IO_PORTC_01
#define KEY_LED_OUT_CHANNEL1 IO_PORTC_02
#define KEY_LED_OUT_CH1_ON() (gpio_set_output_value(KEY_LED_OUT_CHANNEL1,1))
#define KEY_LED_OUT_CH2_ON() (gpio_set_output_value(KEY_LED_OUT_CHANNEL2,1))
#define KEY_LED_OUT_CH3_ON() (gpio_set_output_value(KEY_LED_OUT_CHANNEL3,1))
#define KEY_LED_OUT_CH4_ON() (gpio_set_output_value(KEY_LED_OUT_CHANNEL4,1))
#define KEY_LED_OUT_CH1_OFF() (gpio_set_output_value(KEY_LED_OUT_CHANNEL1,0))
#define KEY_LED_OUT_CH2_OFF() (gpio_set_output_value(KEY_LED_OUT_CHANNEL2,0))
#define KEY_LED_OUT_CH3_OFF() (gpio_set_output_value(KEY_LED_OUT_CHANNEL3,0))
#define KEY_LED_OUT_CH4_OFF() (gpio_set_output_value(KEY_LED_OUT_CHANNEL4,0))
/* 灯条输出通道 1-4*/
#define LED_BAR_OUT_CHANNEL4 IO_PORTA_09
#define LED_BAR_OUT_CHANNEL3 IO_PORTA_10
#define LED_BAR_OUT_CHANNEL2 IO_PORTB_02
#define LED_BAR_OUT_CHANNEL1 IO_PORTB_11
#define LED_BAR_OUT_CH1_ON() (gpio_set_output_value(LED_BAR_OUT_CHANNEL1,1))
#define LED_BAR_OUT_CH2_ON() (gpio_set_output_value(LED_BAR_OUT_CHANNEL2,1))
#define LED_BAR_OUT_CH3_ON() (gpio_set_output_value(LED_BAR_OUT_CHANNEL3,1))
#define LED_BAR_OUT_CH4_ON() (gpio_set_output_value(LED_BAR_OUT_CHANNEL4,1))
#define LED_BAR_OUT_CH1_OFF() (gpio_set_output_value(LED_BAR_OUT_CHANNEL1,0))
#define LED_BAR_OUT_CH2_OFF() (gpio_set_output_value(LED_BAR_OUT_CHANNEL2,0))
#define LED_BAR_OUT_CH3_OFF() (gpio_set_output_value(LED_BAR_OUT_CHANNEL3,0))
#define LED_BAR_OUT_CH4_OFF() (gpio_set_output_value(LED_BAR_OUT_CHANNEL4,0))
/* 音量按键LED输出通道 2个*/
#define KDOWN_LED_PIN IO_PORTB_00
#define KUP_LED_PIN IO_PORTC_03
#define KDOWN_LED_ON() (gpio_set_output_value(KDOWN_LED_PIN,1))
#define KUP_LED_ON() (gpio_set_output_value(KUP_LED_PIN,1))
#define KDOWN_LED_OFF() (gpio_set_output_value(KDOWN_LED_PIN,0))
#define KUP_LED_OFF() (gpio_set_output_value(KUP_LED_PIN,0))
// tx rst PA6
// tx audio status PA7
int kt_key_event_handler(u16 key);
int kt_music_play_end_handler(void);
void kt_boot_init(void);
void kt_init(void);
/* SD/U盘升级提示SYS_LED 快闪 + 提示音(四通道全开) */
//void kt_update_led_start(void);
//void kt_update_led_finish(void);
//void kt_update_start_remind(void);
//void kt_update_finish_remind(u16 result);
#endif

View File

@ -151,8 +151,8 @@ SD1_PLATFORM_DATA_BEGIN(sd1_data)
#elif (TCFG_SD1_DET_MODE == SD_CLK_DECT) #elif (TCFG_SD1_DET_MODE == SD_CLK_DECT)
.detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡 .detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_1_clk_detect,//库函数需要detect_io_level元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。 .detect_func = sdmmc_1_clk_detect,//库函数需要detect_io_level元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL //.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */ .power = NULL, /* */
#else #else
.detect_func = sdmmc_cmd_detect, .detect_func = sdmmc_cmd_detect,
.power = NULL,//cmd检测需要全程供电建议用硬件固定电源。当然可以自行写其他的SD卡电源控制函数传入0关电源。传入1开电源。 .power = NULL,//cmd检测需要全程供电建议用硬件固定电源。当然可以自行写其他的SD卡电源控制函数传入0关电源。传入1开电源。
@ -186,7 +186,7 @@ ALINK_PARM alink0_param = {
/* .port_select = ALINK0_PORTB, //MCLK:PA15 SCLK:PA9 LRCK:PA10 CH0:PA11 CH1:PA12 CH2:PA13 CH3:PA14 */ /* .port_select = ALINK0_PORTB, //MCLK:PA15 SCLK:PA9 LRCK:PA10 CH0:PA11 CH1:PA12 CH2:PA13 CH3:PA14 */
/* .port_select = ALINK1_PORTA, //MCLK:PB0 SCLK:PC0 LRCK:PC1 CH0:PC2 CH1:PC3 CH2:PC4 CH3:PC5 */ /* .port_select = ALINK1_PORTA, //MCLK:PB0 SCLK:PC0 LRCK:PC1 CH0:PC2 CH1:PC3 CH2:PC4 CH3:PC5 */
.ch_cfg[0].enable = 1, .ch_cfg[0].enable = 1,
.ch_cfg[1].enable = 1, .ch_cfg[1].enable = 0,
.mode = ALINK_MD_IIS, .mode = ALINK_MD_IIS,
#if TCFG_IIS_MODE #if TCFG_IIS_MODE
.role = ALINK_ROLE_SLAVE, .role = ALINK_ROLE_SLAVE,
@ -259,7 +259,7 @@ struct adc_platform_data adc_data = {
0:2.3v 1:2.5v 2:2.7v 3:3.0v */ 0:2.3v 1:2.5v 2:2.7v 3:3.0v */
.mic_ldo_vsel = 2, .mic_ldo_vsel = 2,
/*MIC电容隔直模式使用内部mic偏置(PC7)*/ /*MIC电容隔直模式使用内部mic偏置(PC7)*/
.mic_bias_inside = 1, .mic_bias_inside = 0,
/*保持内部mic偏置输出*/ /*保持内部mic偏置输出*/
.mic_bias_keep = 0, .mic_bias_keep = 0,
}; };
@ -798,7 +798,7 @@ struct port_wakeup port0 = {
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能 .pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
.attribute = BLUETOOTH_RESUME, //保留参数 .attribute = BLUETOOTH_RESUME, //保留参数
.iomap = IO_PORTA_10, //唤醒口选择 .iomap = IO_PORTB_01, //唤醒口选择
}; };
/* RTC PR0 PR1 唤醒 */ /* RTC PR0 PR1 唤醒 */

View File

@ -25,13 +25,13 @@
//*********************************************************************************// //*********************************************************************************//
// app 配置 // // app 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_APP_BT_EN 1 #define TCFG_APP_BT_EN 0
#define TCFG_APP_MUSIC_EN 1 #define TCFG_APP_MUSIC_EN 1
#define TCFG_APP_LINEIN_EN 1 #define TCFG_APP_LINEIN_EN 0
#define TCFG_APP_FM_EN 1 #define TCFG_APP_FM_EN 0
#define TCFG_APP_PC_EN 1 #define TCFG_APP_PC_EN 0
#define TCFG_APP_RTC_EN 1 #define TCFG_APP_RTC_EN 0
#define TCFG_APP_RECORD_EN 1 #define TCFG_APP_RECORD_EN 0
#define TCFG_APP_SPDIF_EN 0 #define TCFG_APP_SPDIF_EN 0
//*********************************************************************************// //*********************************************************************************//
// PCM_DEBUG调试配置 // // PCM_DEBUG调试配置 //
@ -44,7 +44,7 @@
//*********************************************************************************// //*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能 #define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT #define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT
#define TCFG_UART0_TX_PORT IO_PORTA_05 //串口发送脚配置 #define TCFG_UART0_TX_PORT IO_PORTC_04 //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置 #define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
//*********************************************************************************// //*********************************************************************************//
@ -65,7 +65,7 @@
//*********************************************************************************// //*********************************************************************************//
// 硬件SPI 配置 // // 硬件SPI 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE #define TCFG_HW_SPI1_ENABLE DISABLE_THIS_MOUDLE
//A组IO: DI: PB2 DO: PB1 CLK: PB0 //A组IO: DI: PB2 DO: PB1 CLK: PB0
//B组IO: DI: PC3 DO: PC5 CLK: PC4 //B组IO: DI: PC3 DO: PC5 CLK: PC4
#define TCFG_HW_SPI1_PORT 'A' #define TCFG_HW_SPI1_PORT 'A'
@ -73,7 +73,7 @@
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT #define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER #define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
#define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE #define TCFG_HW_SPI2_ENABLE DISABLE_THIS_MOUDLE
//A组IO: DI: PB8 DO: PB10 CLK: PB9 //A组IO: DI: PB8 DO: PB10 CLK: PB9
//B组IO: DI: PA13 DO: DM CLK: DP //B组IO: DI: PA13 DO: DM CLK: DP
#define TCFG_HW_SPI2_PORT 'A' #define TCFG_HW_SPI2_PORT 'A'
@ -84,7 +84,7 @@
//*********************************************************************************// //*********************************************************************************//
// FLASH 配置 // // FLASH 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE #define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_NANDFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE #define TCFG_NANDFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_FLASH_DEV_SPI_HW_NUM 1// 1: SPI1 2: SPI2 #define TCFG_FLASH_DEV_SPI_HW_NUM 1// 1: SPI1 2: SPI2
#define TCFG_FLASH_DEV_SPI_CS_PORT IO_PORTA_03 #define TCFG_FLASH_DEV_SPI_CS_PORT IO_PORTA_03
@ -118,7 +118,7 @@
#define SD_CMD_DECT 0 #define SD_CMD_DECT 0
#define SD_CLK_DECT 1 #define SD_CLK_DECT 1
#define SD_IO_DECT 2 #define SD_IO_DECT 2
#define TCFG_SD0_ENABLE ENABLE_THIS_MOUDLE #define TCFG_SD0_ENABLE DISABLE_THIS_MOUDLE
//A组IO: CMD:PA9 CLK:PA10 DAT0:PA5 DAT1:PA6 DAT2:PA7 DAT3:PA8 //A组IO: CMD:PA9 CLK:PA10 DAT0:PA5 DAT1:PA6 DAT2:PA7 DAT3:PA8
//B组IO: CMD:PB10 CLK:PB9 DAT0:PB8 DAT1:PB6 DAT2:PB5 DAT3:PB4 //B组IO: CMD:PB10 CLK:PB9 DAT0:PB8 DAT1:PB6 DAT2:PB5 DAT3:PB4
#define TCFG_SD0_PORTS 'B' #define TCFG_SD0_PORTS 'B'
@ -128,10 +128,10 @@
#define TCFG_SD0_DET_IO_LEVEL 0//IO检查0低电平检测到卡。 1高电平(外部电源)检测到卡。 2高电平(SD卡电源)检测到卡。 #define TCFG_SD0_DET_IO_LEVEL 0//IO检查0低电平检测到卡。 1高电平(外部电源)检测到卡。 2高电平(SD卡电源)检测到卡。
#define TCFG_SD0_CLK (3000000*4L) #define TCFG_SD0_CLK (3000000*4L)
#define TCFG_SD1_ENABLE DISABLE_THIS_MOUDLE #define TCFG_SD1_ENABLE ENABLE_THIS_MOUDLE
//A组IO: CMD:PC4 CLK:PC5 DAT0:PC3 DAT1:PC2 DAT2:PC1 DAT3:PC0 //A组IO: CMD:PC4 CLK:PC5 DAT0:PC3 DAT1:PC2 DAT2:PC1 DAT3:PC0
//B组IO: CMD:PB5 CLK:PB6 DAT0:PB4 DAT1:PB8 DAT2:PB9 DAT3:PB10 //B组IO: CMD:PB5 CLK:PB6 DAT0:PB4 DAT1:PB8 DAT2:PB9 DAT3:PB10
#define TCFG_SD1_PORTS 'A' #define TCFG_SD1_PORTS 'B'
#define TCFG_SD1_DAT_MODE 1 #define TCFG_SD1_DAT_MODE 1
#define TCFG_SD1_DET_MODE SD_CLK_DECT #define TCFG_SD1_DET_MODE SD_CLK_DECT
#define TCFG_SD1_DET_IO IO_PORT_DM//当SD_DET_MODE为2时有效 #define TCFG_SD1_DET_IO IO_PORT_DM//当SD_DET_MODE为2时有效
@ -214,7 +214,6 @@
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能IO按键 #define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能IO按键
#define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO #define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_01 //IO按键端口 #define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_01 //IO按键端口
#define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO #define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
@ -228,8 +227,8 @@
//*********************************************************************************// //*********************************************************************************//
#define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE//是否使能AD按键 #define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE//是否使能AD按键
#define TCFG_ADKEY_LED_IO_REUSE DISABLE_THIS_MOUDLE //ADKEY 和 LED IO复用led只能设置蓝灯显示 #define TCFG_ADKEY_LED_IO_REUSE DISABLE_THIS_MOUDLE //ADKEY 和 LED IO复用led只能设置蓝灯显示
#define TCFG_ADKEY_PORT IO_PORTA_10 //AD按键端口(需要注意选择的IO口是否支持AD功能) #define TCFG_ADKEY_PORT IO_PORTB_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA10 #define TCFG_ADKEY_AD_CHANNEL AD_CH_PB1
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉 #define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
#if TCFG_ADKEY_EXTERN_UP_ENABLE #if TCFG_ADKEY_EXTERN_UP_ENABLE
@ -240,15 +239,15 @@
//必须从小到大填电阻没有则同VDDIO,填0x3ffL //必须从小到大填电阻没有则同VDDIO,填0x3ffL
#define TCFG_ADKEY_AD0 (0) //0R #define TCFG_ADKEY_AD0 (0) //0R
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k #define TCFG_ADKEY_AD1 (0x3ffL * 47 / (47 + R_UP)) //3k
#define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k #define TCFG_ADKEY_AD2 (0x3ffL * 100 / (100 + R_UP)) //6.2k
#define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k #define TCFG_ADKEY_AD3 (0x3ffL * 220 / (220 + R_UP)) //9.1k
#define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k #define TCFG_ADKEY_AD4 (0x3ffL * 470 / (470 + R_UP)) //15k
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k #define TCFG_ADKEY_AD5 (0x3ffL * 1000 / (1000 + R_UP)) //24k
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k #define TCFG_ADKEY_AD6 (0x3ffL) //33k
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k #define TCFG_ADKEY_AD7 (0x3ffL) //51k
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k #define TCFG_ADKEY_AD8 (0x3ffL) //100k
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k #define TCFG_ADKEY_AD9 (0x3ffL) //220k
#define TCFG_ADKEY_VDDIO (0x3ffL) #define TCFG_ADKEY_VDDIO (0x3ffL)
#define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2) #define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2)
@ -392,7 +391,7 @@ DAC硬件上的连接方式,可选的配置:
#define AUDIO_OUTPUT_WAY_BT 5 // bt emitter #define AUDIO_OUTPUT_WAY_BT 5 // bt emitter
#define AUDIO_OUTPUT_WAY_DAC_IIS 6 #define AUDIO_OUTPUT_WAY_DAC_IIS 6
#define AUDIO_OUTPUT_WAY_DONGLE 7 #define AUDIO_OUTPUT_WAY_DONGLE 7
#define AUDIO_OUTPUT_WAY AUDIO_OUTPUT_WAY_DAC #define AUDIO_OUTPUT_WAY AUDIO_OUTPUT_WAY_DAC_IIS
#define LINEIN_INPUT_WAY LINEIN_INPUT_WAY_ADC //LINEIN_INPUT_WAY_ANALOG #define LINEIN_INPUT_WAY LINEIN_INPUT_WAY_ADC //LINEIN_INPUT_WAY_ANALOG
#define AUDIO_OUTPUT_AUTOMUTE 0//ENABLE #define AUDIO_OUTPUT_AUTOMUTE 0//ENABLE
@ -470,9 +469,9 @@ DAC硬件上的连接方式,可选的配置:
//*********************************************************************************// //*********************************************************************************//
// UI 配置 // // UI 配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_UI_ENABLE ENABLE_THIS_MOUDLE //UI总开关 #define TCFG_UI_ENABLE DISABLE_THIS_MOUDLE //UI总开关
#define CONFIG_UI_STYLE STYLE_JL_LED7 //#define CONFIG_UI_STYLE STYLE_JL_LED7
#define TCFG_UI_LED7_ENABLE ENABLE_THIS_MOUDLE //UI使用LED7显示 #define TCFG_UI_LED7_ENABLE DISABLE_THIS_MOUDLE //UI使用LED7显示
// #define TCFG_UI_LCD_SEG3X9_ENABLE ENABLE_THIS_MOUDLE //UI使用LCD段码屏显示 // #define TCFG_UI_LCD_SEG3X9_ENABLE ENABLE_THIS_MOUDLE //UI使用LCD段码屏显示
// #define TCFG_LCD_ST7735S_ENABLE ENABLE_THIS_MOUDLE // #define TCFG_LCD_ST7735S_ENABLE ENABLE_THIS_MOUDLE
// #define TCFG_LCD_ST7789VW_ENABLE ENABLE_THIS_MOUDLE // #define TCFG_LCD_ST7789VW_ENABLE ENABLE_THIS_MOUDLE
@ -505,7 +504,7 @@ DAC硬件上的连接方式,可选的配置:
//*********************************************************************************// //*********************************************************************************//
// EQ配置 // // EQ配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_EQ_ENABLE 1 //支持EQ功能,EQ总使能 #define TCFG_EQ_ENABLE 0 //支持EQ功能,EQ总使能
#if TCFG_EQ_ENABLE #if TCFG_EQ_ENABLE
#define TCFG_BT_MUSIC_EQ_ENABLE 1 //支持蓝牙音乐EQ #define TCFG_BT_MUSIC_EQ_ENABLE 1 //支持蓝牙音乐EQ
#define TCFG_PHONE_EQ_ENABLE 1 //支持通话近端EQ #define TCFG_PHONE_EQ_ENABLE 1 //支持通话近端EQ
@ -522,7 +521,7 @@ DAC硬件上的连接方式,可选的配置:
#define TCFG_DYNAMIC_EQ_ENABLE 0 //动态eq使能接在eq后需输入32bit位宽数据 #define TCFG_DYNAMIC_EQ_ENABLE 0 //动态eq使能接在eq后需输入32bit位宽数据
#endif//TCFG_EQ_ENABLE #endif//TCFG_EQ_ENABLE
#define TCFG_DRC_ENABLE 1 //DRC 总使能 #define TCFG_DRC_ENABLE 0 //DRC 总使能
#define TCFG_AUDIO_MDRC_ENABLE 0 //多带drc使能 0:关闭多带drc 1使能多带drc 2使能多带drc 并且 多带drc后再做一次全带的drc #define TCFG_AUDIO_MDRC_ENABLE 0 //多带drc使能 0:关闭多带drc 1使能多带drc 2使能多带drc 并且 多带drc后再做一次全带的drc
#if TCFG_DRC_ENABLE #if TCFG_DRC_ENABLE
@ -661,7 +660,7 @@ DAC硬件上的连接方式,可选的配置:
// 系统配置 // // 系统配置 //
//*********************************************************************************// //*********************************************************************************//
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间 #define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
#define TCFG_SYS_LVD_EN 1 //电量检测使能 #define TCFG_SYS_LVD_EN 0 //电量检测使能
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置 #define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
#define TWFG_APP_POWERON_IGNORE_DEV 4000//上电忽略挂载设备0时不忽略非0则n毫秒忽略 #define TWFG_APP_POWERON_IGNORE_DEV 4000//上电忽略挂载设备0时不忽略非0则n毫秒忽略
@ -677,8 +676,8 @@ DAC硬件上的连接方式,可选的配置:
#define TCFG_USER_EMITTER_ENABLE 0 //emitter功能使能 #define TCFG_USER_EMITTER_ENABLE 0 //emitter功能使能
#define TCFG_BT_SNIFF_ENABLE 0 //bt sniff 功能使能 #define TCFG_BT_SNIFF_ENABLE 0 //bt sniff 功能使能
#define USER_SUPPORT_PROFILE_SPP 1 #define USER_SUPPORT_PROFILE_SPP 0
#define USER_SUPPORT_PROFILE_HFP 1 #define USER_SUPPORT_PROFILE_HFP 0
#define USER_SUPPORT_PROFILE_A2DP 1 #define USER_SUPPORT_PROFILE_A2DP 1
#define USER_SUPPORT_PROFILE_AVCTP 1 #define USER_SUPPORT_PROFILE_AVCTP 1
#define USER_SUPPORT_PROFILE_HID 1 #define USER_SUPPORT_PROFILE_HID 1
@ -698,12 +697,12 @@ DAC硬件上的连接方式,可选的配置:
#endif #endif
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声 #define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
#define BT_PHONE_NUMBER 1 //是否播放来电报号 #define BT_PHONE_NUMBER 0 //是否播放来电报号
#define BT_SYNC_PHONE_RING 0 //是否TWS同步播放来电铃声 #define BT_SYNC_PHONE_RING 0 //是否TWS同步播放来电铃声
#define BT_SUPPORT_DISPLAY_BAT 1 //是否使能电量检测 #define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
#define BT_SUPPORT_MUSIC_VOL_SYNC 1 //是否使能音量同步 #define BT_SUPPORT_MUSIC_VOL_SYNC 0 //是否使能音量同步
#define TCFG_BLUETOOTH_BACK_MODE 1 //后台模式 #define TCFG_BLUETOOTH_BACK_MODE 0 //后台模式
#if (TCFG_USER_TWS_ENABLE && TCFG_BLUETOOTH_BACK_MODE) && (TCFG_BT_SNIFF_ENABLE==0) && defined(CONFIG_LOCAL_TWS_ENABLE) #if (TCFG_USER_TWS_ENABLE && TCFG_BLUETOOTH_BACK_MODE) && (TCFG_BT_SNIFF_ENABLE==0) && defined(CONFIG_LOCAL_TWS_ENABLE)
#define TCFG_DEC2TWS_ENABLE 1 // 本地解码转发 #define TCFG_DEC2TWS_ENABLE 1 // 本地解码转发
@ -758,13 +757,13 @@ DAC硬件上的连接方式,可选的配置:
#define TCFG_DEC_G729_ENABLE ENABLE #define TCFG_DEC_G729_ENABLE ENABLE
#define TCFG_DEC_MP3_ENABLE ENABLE #define TCFG_DEC_MP3_ENABLE ENABLE
#define TCFG_DEC_WMA_ENABLE ENABLE #define TCFG_DEC_WMA_ENABLE ENABLE
#define TCFG_DEC_WAV_ENABLE ENABLE #define TCFG_DEC_WAV_ENABLE 1
#define TCFG_DEC_FLAC_ENABLE ENABLE #define TCFG_DEC_FLAC_ENABLE 1
#define TCFG_DEC_APE_ENABLE ENABLE #define TCFG_DEC_APE_ENABLE 1
#define TCFG_DEC_M4A_ENABLE ENABLE #define TCFG_DEC_M4A_ENABLE 0
#define TCFG_DEC_ALAC_ENABLE ENABLE #define TCFG_DEC_ALAC_ENABLE 0
#define TCFG_DEC_AMR_ENABLE ENABLE #define TCFG_DEC_AMR_ENABLE 0
#define TCFG_DEC_DTS_ENABLE ENABLE #define TCFG_DEC_DTS_ENABLE 0
#define TCFG_DEC_G726_ENABLE DISABLE #define TCFG_DEC_G726_ENABLE DISABLE
#define TCFG_DEC_MIDI_ENABLE DISABLE #define TCFG_DEC_MIDI_ENABLE DISABLE
#define TCFG_DEC_MTY_ENABLE DISABLE #define TCFG_DEC_MTY_ENABLE DISABLE
@ -869,9 +868,9 @@ DAC硬件上的连接方式,可选的配置:
#define TCFG_ENC_CVSD_ENABLE ENABLE #define TCFG_ENC_CVSD_ENABLE ENABLE
#define TCFG_ENC_MSBC_ENABLE ENABLE #define TCFG_ENC_MSBC_ENABLE ENABLE
#define TCFG_ENC_G726_ENABLE ENABLE #define TCFG_ENC_G726_ENABLE ENABLE
#define TCFG_ENC_MP3_ENABLE ENABLE #define TCFG_ENC_MP3_ENABLE 0
#define TCFG_ENC_ADPCM_ENABLE ENABLE #define TCFG_ENC_ADPCM_ENABLE 0
#define TCFG_ENC_PCM_ENABLE ENABLE #define TCFG_ENC_PCM_ENABLE 0
#define TCFG_ENC_SBC_ENABLE ENABLE #define TCFG_ENC_SBC_ENABLE ENABLE
#define TCFG_ENC_OPUS_ENABLE DISABLE #define TCFG_ENC_OPUS_ENABLE DISABLE
#define TCFG_ENC_SPEEX_ENABLE DISABLE #define TCFG_ENC_SPEEX_ENABLE DISABLE

View File

@ -12,22 +12,22 @@
const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = { const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
//单击 //长按 //hold //抬起 //双击 //三击 //单击 //长按 //hold //抬起 //双击 //三击
[0] = { [0] = {
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_1, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[1] = { [1] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_2, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[2] = { [2] = {
KEY_MUSIC_PP, KEY_CALL_HANG_UP, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL KEY_USER_KEY_3, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[3] = { [3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_4, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[4] = { [4] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL KEY_USER_KEY_5, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[5] = { [5] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_ENC_START, KEY_NULL KEY_USER_KEY_6, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[6] = { [6] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
@ -129,25 +129,25 @@ const u16 linein_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
const u16 music_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = { const u16 music_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
//单击 //长按 //hold //抬起 //双击 //三击 //单击 //长按 //hold //抬起 //双击 //三击
[0] = { [0] = {
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH, KEY_NULL KEY_USER_KEY_1, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[1] = { [1] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_2, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[2] = { [2] = {
KEY_MUSIC_PP, KEY_MUSIC_CHANGE_DEV, KEY_NULL, KEY_NULL, KEY_MUSIC_CHANGE_REPEAT, KEY_NULL KEY_USER_KEY_3, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[3] = { [3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_4, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[4] = { [4] = {
KEY_MUSIC_PLAYE_PREV_FOLDER, KEY_MUSIC_FR, KEY_MUSIC_FR, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL KEY_USER_KEY_5, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[5] = { [5] = {
KEY_MUSIC_PLAYE_NEXT_FOLDER, KEY_MUSIC_FF, KEY_MUSIC_FF, KEY_NULL, KEY_NULL, KEY_NULL KEY_USER_KEY_6, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[6] = { [6] = {
KEY_MUSIC_PLAYER_AB_REPEAT_SWITCH, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
}, },
[7] = { [7] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL

View File

@ -8,6 +8,7 @@
#include "app_charge.h" #include "app_charge.h"
#include "chgbox_ctrl.h" #include "chgbox_ctrl.h"
#include "update_loader_download.h" #include "update_loader_download.h"
#include "kt.h"
extern void setup_arch(); extern void setup_arch();
@ -103,12 +104,13 @@ static void app_init()
board_init(); board_init();
kt_boot_init();
do_initcall(); do_initcall();
do_module_initcall(); do_module_initcall();
do_late_initcall(); do_late_initcall();
audio_enc_init(); audio_enc_init();
audio_dec_init(); audio_dec_init();

View File

@ -39,7 +39,7 @@
#define TCFG_AEC_ENABLE 1 #define TCFG_AEC_ENABLE 1
#define TCFG_DEV_UPDATE_IF_NOFILE_ENABLE 1 #define TCFG_DEV_UPDATE_IF_NOFILE_ENABLE 0 // 0:设备上线立即检查升级;1:仅盘内无音乐文件时才检查
#define TCFG_DEV_MANAGER_ENABLE 1 #define TCFG_DEV_MANAGER_ENABLE 1

View File

@ -172,6 +172,12 @@ enum {
KEY_IR_NUM_8, KEY_IR_NUM_8,
KEY_IR_NUM_9,//中间不允许插入 KEY_IR_NUM_9,//中间不允许插入
//在这里增加元素 //在这里增加元素
KEY_USER_KEY_1,
KEY_USER_KEY_2,
KEY_USER_KEY_3,
KEY_USER_KEY_4,
KEY_USER_KEY_5,
KEY_USER_KEY_6,
// //
KEY_HID_MODE_SWITCH, KEY_HID_MODE_SWITCH,
KEY_HID_TAKE_PICTURE, KEY_HID_TAKE_PICTURE,

View File

@ -94,6 +94,9 @@ enum {
#define TONE_RECORD TONE_RES_ROOT_PATH"tone/record.*" #define TONE_RECORD TONE_RES_ROOT_PATH"tone/record.*"
#define TONE_SPDIF TONE_RES_ROOT_PATH"tone/spdif.*" #define TONE_SPDIF TONE_RES_ROOT_PATH"tone/spdif.*"
#define TONE_SUP TONE_RES_ROOT_PATH"tone/sup.*"
#define TONE_EUP TONE_RES_ROOT_PATH"tone/eup.*"
#ifdef CONFIG_CPU_BR18 #ifdef CONFIG_CPU_BR18
#undef TONE_POWER_ON #undef TONE_POWER_ON
#undef TONE_POWER_OFF #undef TONE_POWER_OFF

View File

@ -186,7 +186,7 @@ int app_common_key_msg_deal(struct sys_event *event)
break; break;
case KEY_VOL_UP: case KEY_VOL_UP:
log_info("COMMON KEY_VOL_UP\n"); printf("COMMON KEY_VOL_UP\n");
if (!tone_get_status()) { if (!tone_get_status()) {
app_audio_volume_up(1); app_audio_volume_up(1);
printf("common vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); printf("common vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
@ -206,7 +206,7 @@ int app_common_key_msg_deal(struct sys_event *event)
break; break;
case KEY_VOL_DOWN: case KEY_VOL_DOWN:
log_info("COMMON KEY_VOL_DOWN\n"); printf("COMMON KEY_VOL_DOWN\n");
app_audio_volume_down(1); app_audio_volume_down(1);
printf("common vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); printf("common vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
#if (TCFG_DEC2TWS_ENABLE) #if (TCFG_DEC2TWS_ENABLE)

File diff suppressed because it is too large Load Diff

View File

@ -227,7 +227,7 @@ static void poweroff_app_start()
int ret = false; int ret = false;
if (app_var.goto_poweroff_flag) { if (app_var.goto_poweroff_flag) {
UI_SHOW_WINDOW(ID_WINDOW_POWER_OFF); UI_SHOW_WINDOW(ID_WINDOW_POWER_OFF);
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1); /* 音量不记忆:关机不写 CFG_MUSIC_VOL */
os_taskq_flush(); os_taskq_flush();
#if (CONFIG_TWS_POWEROFF_SAME_TIME) #if (CONFIG_TWS_POWEROFF_SAME_TIME)

View File

@ -12,6 +12,7 @@
#include "ui/ui_api.h" #include "ui/ui_api.h"
#include "app_task.h" #include "app_task.h"
#include "key_event_deal.h" #include "key_event_deal.h"
#include "kt.h"
#define LOG_TAG_CONST APP_IDLE #define LOG_TAG_CONST APP_IDLE
@ -61,8 +62,14 @@ static int power_on_init(void)
return 0; return 0;
#endif #endif
app_task_switch_to(APP_MUSIC_TASK);
#if 0
#if TCFG_APP_BT_EN #if TCFG_APP_BT_EN
app_task_switch_to(APP_BT_TASK); app_task_switch_to(APP_MUSIC_TASK);
#else #else
#if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式 #if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式
@ -75,6 +82,7 @@ static int power_on_init(void)
/* app_task_switch_to(APP_LINEIN_TASK);//如果带检测,设备不在线,则不跳转 */ /* app_task_switch_to(APP_LINEIN_TASK);//如果带检测,设备不在线,则不跳转 */
#endif #endif
#endif
#endif #endif
return 0; return 0;
@ -130,6 +138,8 @@ void app_poweron_task()
{ {
int msg[32]; int msg[32];
kt_init();
UI_SHOW_MENU(MENU_POWER_UP, 0, 0, NULL); UI_SHOW_MENU(MENU_POWER_UP, 0, 0, NULL);
int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON); int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);

View File

@ -116,30 +116,16 @@ REGISTER_UPDATE_TARGET(audio_update_target) = {
************************************************************* *************************************************************
*/ */
static void app_audio_volume_save_do(void *priv) /*
{ *************************************************************
//log_info("app_audio_volume_save_do %d\n", __this->save_vol_cnt); *
local_irq_disable(); * audio volume save VM
if (++__this->save_vol_cnt >= 5) { *
sys_timer_del(__this->save_vol_timer); *************************************************************
__this->save_vol_timer = 0; */
__this->save_vol_cnt = 0;
local_irq_enable();
log_info("VOL_SAVE\n");
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
return;
}
local_irq_enable();
}
static void app_audio_volume_change(void) static void app_audio_volume_change(void)
{ {
local_irq_disable();
__this->save_vol_cnt = 0;
if (__this->save_vol_timer == 0) {
__this->save_vol_timer = sys_timer_add(NULL, app_audio_volume_save_do, 1000);//要使用软件定时器 中断里不能操作vm
}
local_irq_enable();
} }
@ -153,7 +139,9 @@ static int audio_vol_set(u8 gain_l, u8 gain_r, u8 gain_rl, u8 gain_rr, u8 fade)
return 0; return 0;
#endif #endif
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_IIS) /* DAC+IIS 双输出时IIS 数字音量节点已在 audio_dec.c 创建AUDIO_OUTPUT_INCLUDE_IIS
* iis_digvol DAC */
#if AUDIO_OUTPUT_INCLUDE_IIS
extern void *iis_digvol_last; extern void *iis_digvol_last;
if (iis_digvol_last) { if (iis_digvol_last) {
audio_dig_vol_set(iis_digvol_last, AUDIO_DIG_VOL_ALL_CH, gain_l); audio_dig_vol_set(iis_digvol_last, AUDIO_DIG_VOL_ALL_CH, gain_l);

View File

@ -75,7 +75,7 @@
TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF) TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF)
#define MAX_ANA_VOL (21) #define MAX_ANA_VOL (21)
#else #else
#define MAX_ANA_VOL (28) #define MAX_ANA_VOL (30)
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/ #endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
#define MAX_COM_VOL (22) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list) #define MAX_COM_VOL (22) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list)
@ -96,7 +96,7 @@
#endif #endif
#define SYS_DEFAULT_VOL 0//SYS_MAX_VOL //(SYS_MAX_VOL/2) #define SYS_DEFAULT_VOL 23//SYS_MAX_VOL //(SYS_MAX_VOL/2)
#define SYS_DEFAULT_TONE_VOL 18 //(SYS_MAX_VOL) #define SYS_DEFAULT_TONE_VOL 18 //(SYS_MAX_VOL)
#define SYS_DEFAULT_SIN_VOL 17 #define SYS_DEFAULT_SIN_VOL 17

View File

@ -1280,7 +1280,7 @@ static void esco_audio_res_close(void)
bt_esco_dec->dec.start = 0; bt_esco_dec->dec.start = 0;
bt_esco_dec->dec.enc_start = 0; bt_esco_dec->dec.enc_start = 0;
#if (TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN) #if (TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN)
audio_aec_ref_src_close(); //audio_aec_ref_src_close();
#endif //(TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN) #endif //(TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN)
audio_aec_close(); audio_aec_close();
esco_enc_close(); esco_enc_close();
@ -1571,7 +1571,7 @@ static int esco_dec_start()
err = audio_aec_init(dec->dec.sample_rate); err = audio_aec_init(dec->dec.sample_rate);
#if (TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN) #if (TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN)
audio_aec_ref_src_open(); //audio_aec_ref_src_open();
#endif //(TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN) #endif //(TCFG_IIS_ENABLE && TCFG_IIS_OUTPUT_EN)
if (err) { if (err) {
log_i("audio_aec_init failed:%d", err); log_i("audio_aec_init failed:%d", err);

View File

@ -42,28 +42,6 @@ flac_decoder
ape_decoder ape_decoder
m4a_decoder
alac_decoder
amr_decoder
dts_decoder
g729_decoder g729_decoder
wav_decoder wav_decoder
cvsd_encoder cvsd_encoder
@ -74,19 +52,11 @@ msbc_encoder
mp3_encoder
g726_encoder g726_encoder
adpcm_encoder
pcm_encoder
sbc_encoder sbc_encoder

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d

View File

@ -13,13 +13,13 @@ copy ..\..\ota_all.bin .
copy ..\..\ota_nor.bin . copy ..\..\ota_nor.bin .
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1 ..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1 -key KTS_AC690x_5458.key
:: -format all :: -format all
::-reboot 2500 ::-reboot 2500
@rem 删除临时文件-format all @rem 删锟斤拷锟斤拷时锟侥硷拷-format all
if exist *.mp3 del *.mp3 if exist *.mp3 del *.mp3
if exist *.PIX del *.PIX if exist *.PIX del *.PIX
if exist *.TAB del *.TAB if exist *.TAB del *.TAB
@ -28,13 +28,13 @@ if exist *.sty del *.sty
@rem 生成固件升级文件 @rem 锟斤拷锟缴固硷拷锟斤拷锟斤拷锟侥硷拷
copy ota_all.bin ota.bin copy ota_all.bin ota.bin
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw ..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw
copy ota_nor.bin ota.bin copy ota_nor.bin ota.bin
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_nor.fw ..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_nor.fw
@rem 添加配置脚本的版本信息到 FW 文件中 @rem 锟斤拷锟斤拷锟斤拷媒疟锟斤拷陌姹撅拷锟较?锟斤拷 FW 锟侥硷拷锟斤拷
..\..\fw_add.exe -noenc -fw jl_isd_all.fw -add script.ver -out jl_isd_all.fw ..\..\fw_add.exe -noenc -fw jl_isd_all.fw -add script.ver -out jl_isd_all.fw
..\..\fw_add.exe -noenc -fw jl_isd_nor.fw -add script.ver -out jl_isd_nor.fw ..\..\fw_add.exe -noenc -fw jl_isd_nor.fw -add script.ver -out jl_isd_nor.fw
@ -48,16 +48,16 @@ copy jl_isd_all.fw jl_isd.fw
del jl_isd_all.ufw jl_isd_nor.ufw jl_isd_all.fw jl_isd_nor.fw del jl_isd_all.ufw jl_isd_nor.ufw jl_isd_all.fw jl_isd_nor.fw
@REM 生成配置文件升级文件 @REM 锟斤拷锟斤拷锟斤拷锟斤拷锟侥硷拷锟斤拷锟斤拷锟侥硷拷
::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg ::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg
::IF EXIST jl_696x.bin del jl_696x.bin ::IF EXIST jl_696x.bin del jl_696x.bin
@rem 常用命令说明 @rem 锟斤拷锟斤拷锟斤拷锟斤拷说锟斤拷
@rem -format vm //擦除VM 区域 @rem -format vm //锟斤拷锟斤拷VM 锟斤拷锟斤拷
@rem -format cfg //擦除BT CFG 区域 @rem -format cfg //锟斤拷锟斤拷BT CFG 锟斤拷锟斤拷
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector(第一个参数为16进制或10进制都可第二个参数必须是10进制) @rem -format 0x3f0-2 //锟斤拷示锟接碉拷 0x3f0 锟斤拷 sector 锟斤拷始锟斤拷锟斤拷锟斤拷锟斤拷 2 锟斤拷 sector(锟斤拷一锟斤拷锟斤拷锟斤拷为16锟斤拷锟狡伙拷10锟斤拷锟狡讹拷锟缴拷锟节讹拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷10锟斤拷锟斤拷)
ping /n 2 127.1>null ping /n 2 127.1>null
IF EXIST null del null IF EXIST null del null

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

67
cpubr23toolsdownload.bat Normal file
View File

@ -0,0 +1,67 @@
rem @echo off
@echo *****************************************************************
@echo SDK BR23
@echo *****************************************************************
@echo %date%
cd %~dp0
set OBJDUMP=C:\JL\pi32\bin\llvm-objdump.exe
set OBJCOPY=C:\JL\pi32\bin\llvm-objcopy.exe
set ELFFILE=sdk.elf
REM %OBJDUMP% -D -address-mask=0x1ffffff -print-dbg %ELFFILE% > sdk.lst
%OBJCOPY% -O binary -j .text %ELFFILE% text.bin
%OBJCOPY% -O binary -j .data %ELFFILE% data.bin
%OBJCOPY% -O binary -j .data_code %ELFFILE% data_code.bin
%OBJCOPY% -O binary -j .overlay_aec %ELFFILE% aeco.bin
%OBJCOPY% -O binary -j .overlay_wav %ELFFILE% wav.bin
%OBJCOPY% -O binary -j .overlay_ape %ELFFILE% ape.bin
%OBJCOPY% -O binary -j .overlay_flac %ELFFILE% flac.bin
%OBJCOPY% -O binary -j .overlay_m4a %ELFFILE% m4a.bin
%OBJCOPY% -O binary -j .overlay_amr %ELFFILE% amr.bin
%OBJCOPY% -O binary -j .overlay_dts %ELFFILE% dts.bin
%OBJCOPY% -O binary -j .overlay_fm %ELFFILE% fmo.bin
%OBJCOPY% -O binary -j .overlay_mp3 %ELFFILE% mp3o.bin
%OBJCOPY% -O binary -j .overlay_wma %ELFFILE% wmao.bin
remove_tailing_zeros -i aeco.bin -o aec.bin -mark ff
remove_tailing_zeros -i fmo.bin -o fm.bin -mark ff
remove_tailing_zeros -i mp3o.bin -o mp3.bin -mark ff
remove_tailing_zeros -i wmao.bin -o wma.bin -mark ff
%OBJDUMP% -section-headers -address-mask=0x1ffffff %ELFFILE%
%OBJDUMP% -t %ELFFILE% > symbol_tbl.txt
copy /b text.bin+data.bin+data_code.bin+aec.bin+wav.bin+ape.bin+flac.bin+m4a.bin+amr.bin+dts.bin+fm.bin+mp3.bin+wma.bin+bank.bin app.bin
del aeco.bin
del wav.bin
del ape.bin
del flac.bin
del m4a.bin
del amr.bin
del dts.bin
del fmo.bin
del mp3o.bin
del wmao.bin
del aec.bin
del fm.bin
del mp3.bin
del wma.bin
del data.bin
del data_code.bin
del text.bin
del *.bc
copy .\effect_file\music_base.bin eq_cfg_hw.bin
download\standard\download.bat

BIN
tone/eup.mp3 Normal file

Binary file not shown.

BIN
tone/eup.wtg Normal file

Binary file not shown.

BIN
tone/sup.mp3 Normal file

Binary file not shown.

BIN
tone/sup.wtg Normal file

Binary file not shown.