Compare commits
4 Commits
main
...
至尚联AC6951-
| Author | SHA1 | Date | |
|---|---|---|---|
| e29e8de8fc | |||
| b499020541 | |||
| a1a4fb183b | |||
| d428b715b0 |
BIN
.codex_tmp/audio_requirements.pdf
Normal file
BIN
.codex_tmp/audio_requirements.pdf
Normal file
Binary file not shown.
36
.codex_tmp/inspect_audio_requirements.py
Normal file
36
.codex_tmp/inspect_audio_requirements.py
Normal 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
BIN
.codex_tmp/pdf_page1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Windows CMD requires CRLF for batch files
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
1
.vscode/c_cpp_properties.json
vendored
1
.vscode/c_cpp_properties.json
vendored
@ -100,6 +100,7 @@
|
||||
"${workspaceFolder}/apps/common/include",
|
||||
"${workspaceFolder}/apps/common/config/include",
|
||||
"${workspaceFolder}/apps/soundbox/board/br23",
|
||||
"${workspaceFolder}/apps/kaotings",
|
||||
"${workspaceFolder}/cpu/br23",
|
||||
"${workspaceFolder}/cpu/br23/audio_common",
|
||||
"${workspaceFolder}/cpu/br23/audio_dec",
|
||||
|
||||
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"board_ac695x_demo_cfg.h": "c"
|
||||
}
|
||||
}
|
||||
104
Doc/_req_dump.txt
Normal file
104
Doc/_req_dump.txt
Normal 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键,开始播放00,CH1输出声音,其他通道无声。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键,开始播放00,CH1输出声音,其他通道无声。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文件,里面还有01,02,03,04,05,06,这样,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键,开始播放00,CH1输出声音,其他通道无声。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,FLAC,APE。 | ✅ 通过
|
||||
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键,开始播放00,CH1输出声音,其他通道无声。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,FLAC,APE。
|
||||
AID-011 | 板上的指示灯:慢闪待机,快闪报错,长亮播放。
|
||||
升级文件放U盘根目录下,上电时USB升级,升级完成后,快闪5次,
|
||||
BIN
Doc/音频板开发需求 20260725.xls
Normal file
BIN
Doc/音频板开发需求 20260725.xls
Normal file
Binary file not shown.
244
Doc/音频板开发需求对照与实现状态.md
Normal file
244
Doc/音频板开发需求对照与实现状态.md
Normal 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~CH4(CS8406 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~~CH4;K1↔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(音量键)
|
||||
|
||||
- K5(VOL+):`app_task_put_key_msg(KEY_VOL_UP)`
|
||||
- K6(VOL-):音量 > 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 同步慢闪(约 1s),LED_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 跟踪表为准。*
|
||||
3
Makefile
3
Makefile
@ -76,6 +76,7 @@ CFLAGS := \
|
||||
-Wno-shift-negative-value \
|
||||
-Wundef \
|
||||
-fms-extensions \
|
||||
-w \
|
||||
|
||||
|
||||
# 宏定义
|
||||
@ -196,6 +197,7 @@ INCLUDES := \
|
||||
-Iapps/common/usb \
|
||||
-Iapps/common/usb/device \
|
||||
-Iapps/common/usb/host \
|
||||
-Iapps/kaotings \
|
||||
-Iapps/soundbox/smartbox \
|
||||
-Iapps/soundbox/smartbox/bt_manage/bt_trans_data \
|
||||
-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_demo.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/key_table/adkey_table.c \
|
||||
apps/soundbox/board/br23/board_ac6083a/key_table/iokey_table.c \
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
#include "update/update.h"
|
||||
#include "update/update_loader_download.h"
|
||||
#include "app_config.h"
|
||||
#include "kt.h"
|
||||
|
||||
#if defined(CONFIG_SD_UPDATE_ENABLE) || defined(CONFIG_USB_UPDATE_ENABLE)
|
||||
#define DEV_UPDATE_EN 1
|
||||
@ -296,6 +297,9 @@ u16 dev_update_check(char *logo)
|
||||
return UPDATA_DEV_ERR;
|
||||
}
|
||||
|
||||
/* 升级开始:SYS_LED 快闪 + 播 TONE_SUP(四通道全开) */
|
||||
//kt_update_start_remind();
|
||||
|
||||
#if(USER_UART_UPDATE_ENABLE) && (UART_UPDATE_ROLE == UART_UPDATE_MASTER)
|
||||
uart_update_send_update_ready(update_path);
|
||||
while (get_uart_update_sta()) {
|
||||
|
||||
@ -15,9 +15,9 @@ struct key_driver_para adkey_scan_para = {
|
||||
.scan_time = 10, //按键扫描频率, 单位: ms
|
||||
.last_key = NO_KEY, //上一次get_value按键值, 初始化为NO_KEY;
|
||||
.filter_time = 2, //按键消抖延时;
|
||||
.long_time = 75, //按键判定长按数量
|
||||
.hold_time = (75 + 15), //按键判定HOLD数量
|
||||
.click_delay_time = 20, //按键被抬起后等待连击延时数量
|
||||
.long_time = 50, //按键判定长按数量
|
||||
.hold_time = (50 + 10), //按键判定HOLD数量
|
||||
.click_delay_time = 10, //按键被抬起后等待连击延时数量
|
||||
.key_type = KEY_DRIVER_TYPE_AD,
|
||||
.get_value = ad_get_key_value,
|
||||
};
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
#endif
|
||||
#else
|
||||
#ifndef ALL_KEY_EVENT_CLICK_ONLY
|
||||
#define ALL_KEY_EVENT_CLICK_ONLY 0 //是否全部按键只响应单击事件
|
||||
#define ALL_KEY_EVENT_CLICK_ONLY 1 //是否全部按键只响应单击事件
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@ -56,8 +56,8 @@ extern void usb_sie_close_all(void);
|
||||
#include "audio_config.h"
|
||||
#endif
|
||||
|
||||
#ifdef UPDATE_LED_REMIND
|
||||
#include "asm/pwm_led.h"
|
||||
#if defined(UPDATE_LED_REMIND) || defined(UPDATE_VOICE_REMIND)
|
||||
#include "kt.h"
|
||||
#endif
|
||||
|
||||
#define DEVICE_UPDATE_KEY_ERR BIT(30)
|
||||
@ -122,8 +122,8 @@ bool device_is_first_start()
|
||||
void led_update_start(void)
|
||||
{
|
||||
#ifdef UPDATE_LED_REMIND
|
||||
puts("led_update_start\n");
|
||||
pwm_led_mode_set(PWM_LED_ALL_OFF);
|
||||
//puts("led_update_start\n");
|
||||
//kt_update_led_start();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -131,7 +131,7 @@ void led_update_finish(void)
|
||||
{
|
||||
#ifdef UPDATE_LED_REMIND
|
||||
puts("led_update_finish\n");
|
||||
pwm_led_mode_set(PWM_LED0_LED1_FAST_FLASH);
|
||||
//kt_update_led_finish();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -161,7 +161,6 @@ int update_result_deal()
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
u8 key_voice_cnt = 0;
|
||||
u16 result = 0;
|
||||
result = (g_updata_flag & 0xffff);
|
||||
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) {
|
||||
return 0;
|
||||
}
|
||||
#ifdef UPDATE_VOICE_REMIND
|
||||
#endif
|
||||
|
||||
if (result == UPDATA_SUCC) {
|
||||
#if(JL_EARPHONE_APP_EN && RCSP_UPDATE_EN)
|
||||
u8 clear_update_flag = 0;
|
||||
@ -184,48 +182,13 @@ int update_result_deal()
|
||||
#if(JL_SMART_BOX_EXTRA_FLASH_OPT && RCSP_UPDATE_EN)
|
||||
smartbox_eflash_update_flag_set(0);
|
||||
smartbox_eflash_flag_set(0);
|
||||
#endif
|
||||
#ifdef UPDATE_LED_REMIND
|
||||
led_update_finish();
|
||||
#endif
|
||||
}
|
||||
|
||||
extern u8 get_max_sys_vol(void);
|
||||
while (1) {
|
||||
wdt_clear();
|
||||
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);
|
||||
}
|
||||
#if defined(UPDATE_VOICE_REMIND) || defined(UPDATE_LED_REMIND)
|
||||
/* 升级完成:播 TONE_EUP(四通道全开),并恢复 SYS_LED 正常功能 */
|
||||
//kt_update_finish_remind(result);
|
||||
#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;
|
||||
}
|
||||
|
||||
762
apps/kaotings/kt.c
Normal file
762
apps/kaotings/kt.c
Normal 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_idx:NN.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
73
apps/kaotings/kt.h
Normal 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
|
||||
@ -151,8 +151,8 @@ SD1_PLATFORM_DATA_BEGIN(sd1_data)
|
||||
#elif (TCFG_SD1_DET_MODE == SD_CLK_DECT)
|
||||
.detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0:低电平检测到卡。 1:高电平检测到卡
|
||||
.detect_func = sdmmc_1_clk_detect,//库函数,需要detect_io_level元素作为参数。可以自行重写一个检测函数,在线返回1,不在线返回0,即可。
|
||||
.power = sd_set_power,//库函数,使用SDPG引脚。可以自行重写其他的SD卡电源控制函数,传入0:关电源。传入1,开电源。如果电源硬件已固定不可控,则该函数无效,可以填NULL
|
||||
/* .power = NULL, */
|
||||
//.power = sd_set_power,//库函数,使用SDPG引脚。可以自行重写其他的SD卡电源控制函数,传入0:关电源。传入1,开电源。如果电源硬件已固定不可控,则该函数无效,可以填NULL
|
||||
.power = NULL, /* */
|
||||
#else
|
||||
.detect_func = sdmmc_cmd_detect,
|
||||
.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 = ALINK1_PORTA, //MCLK:PB0 SCLK:PC0 LRCK:PC1 CH0:PC2 CH1:PC3 CH2:PC4 CH3:PC5 */
|
||||
.ch_cfg[0].enable = 1,
|
||||
.ch_cfg[1].enable = 1,
|
||||
.ch_cfg[1].enable = 0,
|
||||
.mode = ALINK_MD_IIS,
|
||||
#if TCFG_IIS_MODE
|
||||
.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 */
|
||||
.mic_ldo_vsel = 2,
|
||||
/*MIC电容隔直模式使用内部mic偏置(PC7)*/
|
||||
.mic_bias_inside = 1,
|
||||
.mic_bias_inside = 0,
|
||||
/*保持内部mic偏置输出*/
|
||||
.mic_bias_keep = 0,
|
||||
};
|
||||
@ -798,7 +798,7 @@ struct port_wakeup port0 = {
|
||||
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.attribute = BLUETOOTH_RESUME, //保留参数
|
||||
.iomap = IO_PORTA_10, //唤醒口选择
|
||||
.iomap = IO_PORTB_01, //唤醒口选择
|
||||
};
|
||||
|
||||
/* RTC PR0 PR1 唤醒 */
|
||||
|
||||
@ -25,13 +25,13 @@
|
||||
//*********************************************************************************//
|
||||
// app 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_APP_BT_EN 1
|
||||
#define TCFG_APP_BT_EN 0
|
||||
#define TCFG_APP_MUSIC_EN 1
|
||||
#define TCFG_APP_LINEIN_EN 1
|
||||
#define TCFG_APP_FM_EN 1
|
||||
#define TCFG_APP_PC_EN 1
|
||||
#define TCFG_APP_RTC_EN 1
|
||||
#define TCFG_APP_RECORD_EN 1
|
||||
#define TCFG_APP_LINEIN_EN 0
|
||||
#define TCFG_APP_FM_EN 0
|
||||
#define TCFG_APP_PC_EN 0
|
||||
#define TCFG_APP_RTC_EN 0
|
||||
#define TCFG_APP_RECORD_EN 0
|
||||
#define TCFG_APP_SPDIF_EN 0
|
||||
//*********************************************************************************//
|
||||
// PCM_DEBUG调试配置 //
|
||||
@ -44,7 +44,7 @@
|
||||
//*********************************************************************************//
|
||||
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
|
||||
#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 //串口波特率配置
|
||||
|
||||
//*********************************************************************************//
|
||||
@ -65,7 +65,7 @@
|
||||
//*********************************************************************************//
|
||||
// 硬件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
|
||||
//B组IO: DI: PC3 DO: PC5 CLK: PC4
|
||||
#define TCFG_HW_SPI1_PORT 'A'
|
||||
@ -73,7 +73,7 @@
|
||||
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
|
||||
#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
|
||||
//B组IO: DI: PA13 DO: DM CLK: DP
|
||||
#define TCFG_HW_SPI2_PORT 'A'
|
||||
@ -118,7 +118,7 @@
|
||||
#define SD_CMD_DECT 0
|
||||
#define SD_CLK_DECT 1
|
||||
#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
|
||||
//B组IO: CMD:PB10 CLK:PB9 DAT0:PB8 DAT1:PB6 DAT2:PB5 DAT3:PB4
|
||||
#define TCFG_SD0_PORTS 'B'
|
||||
@ -128,10 +128,10 @@
|
||||
#define TCFG_SD0_DET_IO_LEVEL 0//IO检查,0:低电平检测到卡。 1:高电平(外部电源)检测到卡。 2:高电平(SD卡电源)检测到卡。
|
||||
#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
|
||||
//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_DET_MODE SD_CLK_DECT
|
||||
#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_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
|
||||
|
||||
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_01 //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_LED_IO_REUSE DISABLE_THIS_MOUDLE //ADKEY 和 LED IO复用,led只能设置蓝灯显示
|
||||
#define TCFG_ADKEY_PORT IO_PORTA_10 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA10
|
||||
#define TCFG_ADKEY_PORT IO_PORTB_01 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PB1
|
||||
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
|
||||
|
||||
#if TCFG_ADKEY_EXTERN_UP_ENABLE
|
||||
@ -240,15 +239,15 @@
|
||||
|
||||
//必须从小到大填电阻,没有则同VDDIO,填0x3ffL
|
||||
#define TCFG_ADKEY_AD0 (0) //0R
|
||||
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
|
||||
#define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k
|
||||
#define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k
|
||||
#define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
|
||||
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
|
||||
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
|
||||
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
|
||||
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
|
||||
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
|
||||
#define TCFG_ADKEY_AD1 (0x3ffL * 47 / (47 + R_UP)) //3k
|
||||
#define TCFG_ADKEY_AD2 (0x3ffL * 100 / (100 + R_UP)) //6.2k
|
||||
#define TCFG_ADKEY_AD3 (0x3ffL * 220 / (220 + R_UP)) //9.1k
|
||||
#define TCFG_ADKEY_AD4 (0x3ffL * 470 / (470 + R_UP)) //15k
|
||||
#define TCFG_ADKEY_AD5 (0x3ffL * 1000 / (1000 + R_UP)) //24k
|
||||
#define TCFG_ADKEY_AD6 (0x3ffL) //33k
|
||||
#define TCFG_ADKEY_AD7 (0x3ffL) //51k
|
||||
#define TCFG_ADKEY_AD8 (0x3ffL) //100k
|
||||
#define TCFG_ADKEY_AD9 (0x3ffL) //220k
|
||||
#define TCFG_ADKEY_VDDIO (0x3ffL)
|
||||
|
||||
#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_DAC_IIS 6
|
||||
#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 AUDIO_OUTPUT_AUTOMUTE 0//ENABLE
|
||||
@ -470,9 +469,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// UI 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_UI_ENABLE ENABLE_THIS_MOUDLE //UI总开关
|
||||
#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE ENABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
#define TCFG_UI_ENABLE DISABLE_THIS_MOUDLE //UI总开关
|
||||
//#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE DISABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
// #define TCFG_UI_LCD_SEG3X9_ENABLE ENABLE_THIS_MOUDLE //UI使用LCD段码屏显示
|
||||
// #define TCFG_LCD_ST7735S_ENABLE ENABLE_THIS_MOUDLE
|
||||
// #define TCFG_LCD_ST7789VW_ENABLE ENABLE_THIS_MOUDLE
|
||||
@ -505,7 +504,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// EQ配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_EQ_ENABLE 1 //支持EQ功能,EQ总使能
|
||||
#define TCFG_EQ_ENABLE 0 //支持EQ功能,EQ总使能
|
||||
#if TCFG_EQ_ENABLE
|
||||
#define TCFG_BT_MUSIC_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位宽数据
|
||||
#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
|
||||
|
||||
#if TCFG_DRC_ENABLE
|
||||
@ -661,7 +660,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
// 系统配置 //
|
||||
//*********************************************************************************//
|
||||
#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 TWFG_APP_POWERON_IGNORE_DEV 4000//上电忽略挂载设备,0时不忽略,非0则n毫秒忽略
|
||||
|
||||
@ -677,8 +676,8 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_USER_EMITTER_ENABLE 0 //emitter功能使能
|
||||
#define TCFG_BT_SNIFF_ENABLE 0 //bt sniff 功能使能
|
||||
|
||||
#define USER_SUPPORT_PROFILE_SPP 1
|
||||
#define USER_SUPPORT_PROFILE_HFP 1
|
||||
#define USER_SUPPORT_PROFILE_SPP 0
|
||||
#define USER_SUPPORT_PROFILE_HFP 0
|
||||
#define USER_SUPPORT_PROFILE_A2DP 1
|
||||
#define USER_SUPPORT_PROFILE_AVCTP 1
|
||||
#define USER_SUPPORT_PROFILE_HID 1
|
||||
@ -698,12 +697,12 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#endif
|
||||
|
||||
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
|
||||
#define BT_PHONE_NUMBER 1 //是否播放来电报号
|
||||
#define BT_PHONE_NUMBER 0 //是否播放来电报号
|
||||
#define BT_SYNC_PHONE_RING 0 //是否TWS同步播放来电铃声
|
||||
#define BT_SUPPORT_DISPLAY_BAT 1 //是否使能电量检测
|
||||
#define BT_SUPPORT_MUSIC_VOL_SYNC 1 //是否使能音量同步
|
||||
#define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
|
||||
#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)
|
||||
#define TCFG_DEC2TWS_ENABLE 1 // 本地解码转发
|
||||
@ -758,13 +757,13 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_DEC_G729_ENABLE ENABLE
|
||||
#define TCFG_DEC_MP3_ENABLE ENABLE
|
||||
#define TCFG_DEC_WMA_ENABLE ENABLE
|
||||
#define TCFG_DEC_WAV_ENABLE ENABLE
|
||||
#define TCFG_DEC_FLAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_APE_ENABLE ENABLE
|
||||
#define TCFG_DEC_M4A_ENABLE ENABLE
|
||||
#define TCFG_DEC_ALAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_AMR_ENABLE ENABLE
|
||||
#define TCFG_DEC_DTS_ENABLE ENABLE
|
||||
#define TCFG_DEC_WAV_ENABLE 1
|
||||
#define TCFG_DEC_FLAC_ENABLE 1
|
||||
#define TCFG_DEC_APE_ENABLE 1
|
||||
#define TCFG_DEC_M4A_ENABLE 0
|
||||
#define TCFG_DEC_ALAC_ENABLE 0
|
||||
#define TCFG_DEC_AMR_ENABLE 0
|
||||
#define TCFG_DEC_DTS_ENABLE 0
|
||||
#define TCFG_DEC_G726_ENABLE DISABLE
|
||||
#define TCFG_DEC_MIDI_ENABLE DISABLE
|
||||
#define TCFG_DEC_MTY_ENABLE DISABLE
|
||||
@ -869,9 +868,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_ENC_CVSD_ENABLE ENABLE
|
||||
#define TCFG_ENC_MSBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_G726_ENABLE ENABLE
|
||||
#define TCFG_ENC_MP3_ENABLE ENABLE
|
||||
#define TCFG_ENC_ADPCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_PCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_MP3_ENABLE 0
|
||||
#define TCFG_ENC_ADPCM_ENABLE 0
|
||||
#define TCFG_ENC_PCM_ENABLE 0
|
||||
#define TCFG_ENC_SBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_OPUS_ENABLE DISABLE
|
||||
#define TCFG_ENC_SPEEX_ENABLE DISABLE
|
||||
|
||||
@ -12,22 +12,22 @@
|
||||
const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
//单击 //长按 //hold //抬起 //双击 //三击
|
||||
[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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
//单击 //长按 //hold //抬起 //双击 //三击
|
||||
[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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
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] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "app_charge.h"
|
||||
#include "chgbox_ctrl.h"
|
||||
#include "update_loader_download.h"
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
extern void setup_arch();
|
||||
@ -103,12 +104,13 @@ static void app_init()
|
||||
|
||||
board_init();
|
||||
|
||||
kt_boot_init();
|
||||
|
||||
do_initcall();
|
||||
|
||||
do_module_initcall();
|
||||
do_late_initcall();
|
||||
|
||||
|
||||
audio_enc_init();
|
||||
audio_dec_init();
|
||||
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
#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
|
||||
|
||||
|
||||
@ -172,6 +172,12 @@ enum {
|
||||
KEY_IR_NUM_8,
|
||||
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_TAKE_PICTURE,
|
||||
|
||||
@ -94,6 +94,9 @@ enum {
|
||||
#define TONE_RECORD TONE_RES_ROOT_PATH"tone/record.*"
|
||||
#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
|
||||
#undef TONE_POWER_ON
|
||||
#undef TONE_POWER_OFF
|
||||
|
||||
@ -186,7 +186,7 @@ int app_common_key_msg_deal(struct sys_event *event)
|
||||
break;
|
||||
|
||||
case KEY_VOL_UP:
|
||||
log_info("COMMON KEY_VOL_UP\n");
|
||||
printf("COMMON KEY_VOL_UP\n");
|
||||
if (!tone_get_status()) {
|
||||
app_audio_volume_up(1);
|
||||
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;
|
||||
|
||||
case KEY_VOL_DOWN:
|
||||
log_info("COMMON KEY_VOL_DOWN\n");
|
||||
printf("COMMON KEY_VOL_DOWN\n");
|
||||
app_audio_volume_down(1);
|
||||
printf("common vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
|
||||
#if (TCFG_DEC2TWS_ENABLE)
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
#include "clock_cfg.h"
|
||||
#include "system/fs/fs.h"
|
||||
#include "user_api/app_status_api.h"
|
||||
#include "kt.h"
|
||||
|
||||
/*************************************************************
|
||||
此文件函数主要是music模式按键处理和事件处理
|
||||
@ -48,13 +49,15 @@
|
||||
static u8 music_idle_flag = 1;
|
||||
|
||||
/// 模式参数结构体
|
||||
struct __music_task_parm {
|
||||
struct __music_task_parm
|
||||
{
|
||||
u8 type;
|
||||
int val;
|
||||
};
|
||||
|
||||
/// music模式控制结构体
|
||||
struct __music {
|
||||
struct __music
|
||||
{
|
||||
struct __music_task_parm task_parm;
|
||||
u16 file_err_counter; // 错误文件统计
|
||||
u8 file_play_direct; // 0:下一曲, 1:上一曲
|
||||
@ -69,20 +72,21 @@ struct __music music_hdl;
|
||||
|
||||
static struct __breakpoint *breakpoint = NULL;
|
||||
|
||||
|
||||
static void music_player_play_start(void);
|
||||
|
||||
/// 设备提示音使能
|
||||
#define MUSIC_DEVICE_TONE_EN 0
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
struct __dev_tone {
|
||||
struct __dev_tone
|
||||
{
|
||||
char *logo;
|
||||
char *phy_logo;
|
||||
char *tone_path;
|
||||
u16 index;
|
||||
};
|
||||
|
||||
enum {
|
||||
enum
|
||||
{
|
||||
/// 0x1000起始为了不要跟提示音的IDEX_TONE_重叠了
|
||||
DEVICE_INDEX_UDISK = 0x1000,
|
||||
DEVICE_INDEX_UDISK_REC,
|
||||
@ -102,17 +106,21 @@ const struct __dev_tone device_tone[] = {
|
||||
static void music_tone_play_end_callback(void *priv, int flag);
|
||||
int music_device_tone_play(char *logo)
|
||||
{
|
||||
if (logo == NULL) {
|
||||
if (logo == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
printf("__this->device_tone_dev = %s, logo =%s\n", __this->device_tone_dev, logo);
|
||||
char *phy_logo = dev_manager_get_phy_logo(dev_manager_find_spec(logo, 0));
|
||||
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0)) {
|
||||
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0))
|
||||
{
|
||||
log_i("[%s, %d]the same phy dev, no need device tone!!\n", logo, __LINE__);
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
|
||||
if (strcmp(device_tone[i].logo, logo) == 0) {
|
||||
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
|
||||
{
|
||||
if (strcmp(device_tone[i].logo, logo) == 0)
|
||||
{
|
||||
log_i("[%s, %d]device_tone play \n", logo, __LINE__);
|
||||
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
|
||||
memcpy(__this->device_tone_dev, device_tone[i].phy_logo, strlen(device_tone[i].phy_logo));
|
||||
@ -125,8 +133,6 @@ int music_device_tone_play(char *logo)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if TCFG_LFN_EN
|
||||
static u8 music_file_name[128] = {0}; // 长文件名
|
||||
u16 music_file_name_len = 0;
|
||||
@ -137,7 +143,8 @@ u16 music_file_name_len = 0;
|
||||
|
||||
const char *music_file_get_cur_name(int *len, int *is_unicode)
|
||||
{
|
||||
if (music_file_name[0] == '\\' && music_file_name[1] == 'U') {
|
||||
if (music_file_name[0] == '\\' && music_file_name[1] == 'U')
|
||||
{
|
||||
*is_unicode = 1;
|
||||
*len = music_file_name_len - 2;
|
||||
return (const char *)(music_file_name + 2);
|
||||
@ -147,26 +154,28 @@ const char *music_file_get_cur_name(int *len, int *is_unicode)
|
||||
return (const char *)music_file_name;
|
||||
}
|
||||
|
||||
|
||||
static void music_set_dev_sync_mode(char *logo, u8 mode)
|
||||
{
|
||||
if (logo) {
|
||||
if (logo)
|
||||
{
|
||||
struct imount *mount_hdl = NULL;
|
||||
u8 async_mode = mode;
|
||||
|
||||
if ((!memcmp(logo, "udisk0", strlen("udisk0")))
|
||||
|| (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec")))) {
|
||||
if ((!memcmp(logo, "udisk0", strlen("udisk0"))) || (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec"))))
|
||||
{
|
||||
struct file_dec_hdl *dec = get_file_dec_hdl();
|
||||
if (dec) {
|
||||
if (dec)
|
||||
{
|
||||
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec(logo, 0));
|
||||
if (mount_hdl) {
|
||||
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE
|
||||
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC
|
||||
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS
|
||||
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV) {
|
||||
if (mount_hdl)
|
||||
{
|
||||
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV)
|
||||
{
|
||||
/// 指定解码格式开启该功能
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 不指定的解码格式不开启
|
||||
async_mode = 0;
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
|
||||
@ -174,10 +183,13 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
|
||||
printf("udisk, set usb ASYNC = %d\n", async_mode);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不是udisk, 如果udisk在线, 将udisk设置成非AYSNC_MODE
|
||||
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec("udisk0", 0));
|
||||
if (mount_hdl) {
|
||||
if (mount_hdl)
|
||||
{
|
||||
async_mode = 0;
|
||||
printf("not udisk, set usb ASYNC = 0\n");
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
|
||||
@ -186,7 +198,6 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 解码成功回调
|
||||
@param priv:私有参数, parm:暂时未用
|
||||
@ -213,19 +224,21 @@ static void music_player_play_success(void *priv, int parm)
|
||||
log_i("file indir = %d\n", music_player_get_fileindir_number());
|
||||
music_file_name_len = fget_name(music_player_get_file_hdl(), music_file_name, sizeof(music_file_name));
|
||||
int unicode = 0;
|
||||
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U')) {
|
||||
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U'))
|
||||
{
|
||||
unicode = 1;
|
||||
music_file_name_len -= 2;
|
||||
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name + 2, music_file_name_len, unicode);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name, music_file_name_len, unicode);
|
||||
}
|
||||
log_i("\n");
|
||||
|
||||
|
||||
|
||||
/// save breakpoint, 只保存文件信息
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 0) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 0) == true)
|
||||
{
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
|
||||
@ -236,7 +249,6 @@ static void music_player_play_success(void *priv, int parm)
|
||||
/// smartbox info update
|
||||
SMARTBOX_UPDATE(MUSIC_FUNCTION_MASK,
|
||||
BIT(MUSIC_INFO_ATTR_STATUS) | BIT(MUSIC_INFO_ATTR_FILE_NAME) | BIT(MUSIC_INFO_ATTR_FILE_PLAY_MODE));
|
||||
|
||||
}
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 解码结束回调处理
|
||||
@ -281,35 +293,44 @@ static int music_player_scandisk_break(void)
|
||||
char *logo = NULL;
|
||||
char *evt_logo = NULL;
|
||||
app_task_get_msg(msg, ARRAY_SIZE(msg), 0);
|
||||
switch (msg[0]) {
|
||||
switch (msg[0])
|
||||
{
|
||||
case APP_MSG_SYS_EVENT:
|
||||
event = (struct sys_event *)(&msg[1]);
|
||||
switch (event->type) {
|
||||
switch (event->type)
|
||||
{
|
||||
case SYS_DEVICE_EVENT:
|
||||
switch ((u32)event->arg) {
|
||||
switch ((u32)event->arg)
|
||||
{
|
||||
case DRIVER_EVENT_FROM_SD0:
|
||||
case DRIVER_EVENT_FROM_SD1:
|
||||
case DRIVER_EVENT_FROM_SD2:
|
||||
evt_logo = (char *)event->u.dev.value;
|
||||
case DEVICE_EVENT_FROM_OTG:
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
|
||||
{
|
||||
evt_logo = (char *)"udisk0";
|
||||
}
|
||||
/// 设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
|
||||
int str_len = 0;
|
||||
logo = music_player_get_phy_dev(&str_len);
|
||||
/// 响应设备插拔打断
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT)
|
||||
{
|
||||
log_i("__func__ = %s logo=%s evt_logo=%s %d\n", __FUNCTION__, logo, evt_logo, str_len);
|
||||
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
|
||||
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
|
||||
{
|
||||
/// 相同的设备才响应
|
||||
__this->scandisk_break = 1;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 响应新设备上线
|
||||
__this->scandisk_break = 1;
|
||||
}
|
||||
if (__this->scandisk_break == 0) {
|
||||
if (__this->scandisk_break == 0)
|
||||
{
|
||||
log_i("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
|
||||
dev_status_event_filter(event);
|
||||
log_i("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
|
||||
@ -318,12 +339,14 @@ static int music_player_scandisk_break(void)
|
||||
}
|
||||
break;
|
||||
case SYS_BT_EVENT:
|
||||
if (bt_background_event_handler_filter(event)) {
|
||||
if (bt_background_event_handler_filter(event))
|
||||
{
|
||||
__this->scandisk_break = 1;
|
||||
}
|
||||
break;
|
||||
case SYS_KEY_EVENT:
|
||||
switch (event->u.key.event) {
|
||||
switch (event->u.key.event)
|
||||
{
|
||||
case KEY_CHANGE_MODE:
|
||||
/// 响应切换模式事件
|
||||
__this->scandisk_break = 1;
|
||||
@ -331,7 +354,8 @@ static int music_player_scandisk_break(void)
|
||||
// 其他按键case 在这里增加
|
||||
}
|
||||
/// 因为TWS转发sys_event_notify需要用原始的按键序号, 未经过按键表处理, 所以这里要特殊处理
|
||||
if (__this->scandisk_break) {
|
||||
if (__this->scandisk_break)
|
||||
{
|
||||
app_task_put_key_msg(event->u.key.event, (int)event->u.key.value);
|
||||
printf("key break scan!!");
|
||||
return 1;
|
||||
@ -340,12 +364,15 @@ static int music_player_scandisk_break(void)
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (__this->scandisk_break) {
|
||||
if (__this->scandisk_break)
|
||||
{
|
||||
/// 查询到需要打断的事件, 返回1, 并且重新推送一次该事件,跑主循环处理流程
|
||||
sys_event_notify(event);
|
||||
printf("scandisk_break!!!!!!\n");
|
||||
return 1;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -361,11 +388,13 @@ static void scan_enter(struct __dev *dev)
|
||||
{
|
||||
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
|
||||
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
|
||||
if (mount_hdl) {
|
||||
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|
||||
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
|
||||
if (mount_hdl)
|
||||
{
|
||||
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
|
||||
{
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_GET_SPEED, (u32)&__this->old_speed); // 获取sd速度
|
||||
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) { //设定速度大于获取的才加速
|
||||
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
|
||||
{ // 设定速度大于获取的才加速
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, SD_BAUD_RATE_CHANGE_WHEN_SCAN);
|
||||
}
|
||||
}
|
||||
@ -378,10 +407,12 @@ static void scan_exit(struct __dev *dev)
|
||||
{
|
||||
#ifdef SD_BAUD_RATE_CHANGE_WHEN_SCAN
|
||||
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
|
||||
if (mount_hdl) {
|
||||
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|
||||
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
|
||||
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) {
|
||||
if (mount_hdl)
|
||||
{
|
||||
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
|
||||
{
|
||||
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
|
||||
{
|
||||
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, __this->old_speed); // 恢复原速
|
||||
}
|
||||
}
|
||||
@ -408,15 +439,16 @@ static void music_tone_play_end_callback(void *priv, int flag)
|
||||
u32 index = (u32)priv;
|
||||
char *logo = NULL;
|
||||
|
||||
if (APP_MUSIC_TASK != app_get_curr_task()) {
|
||||
if (APP_MUSIC_TASK != app_get_curr_task())
|
||||
{
|
||||
log_error("tone callback task out \n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (index) {
|
||||
switch (index)
|
||||
{
|
||||
case IDEX_TONE_MUSIC:
|
||||
///提示音播放结束, 启动播放器播放
|
||||
music_player_play_start();
|
||||
/// 进入 music 后不自动播放,保持静默
|
||||
break;
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
case DEVICE_INDEX_UDISK:
|
||||
@ -425,8 +457,10 @@ static void music_tone_play_end_callback(void *priv, int flag)
|
||||
case DEVICE_INDEX_SD0_REC:
|
||||
case DEVICE_INDEX_SD1:
|
||||
case DEVICE_INDEX_SD1_REC:
|
||||
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
|
||||
if (index == device_tone[i].index) {
|
||||
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
|
||||
{
|
||||
if (index == device_tone[i].index)
|
||||
{
|
||||
logo = device_tone[i].logo;
|
||||
break;
|
||||
}
|
||||
@ -439,7 +473,6 @@ static void music_tone_play_end_callback(void *priv, int flag)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式解码错误处理
|
||||
@param err:错误码,详细错误码描述请看MUSIC_PLAYER错误码表枚举
|
||||
@ -451,15 +484,18 @@ void music_player_err_deal(int err)
|
||||
{
|
||||
u16 msg = KEY_NULL;
|
||||
char *logo = NULL;
|
||||
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL) {
|
||||
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL)
|
||||
{
|
||||
__this->file_err_counter = 0; /// 清除错误文件累计
|
||||
}
|
||||
|
||||
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC) {
|
||||
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC)
|
||||
{
|
||||
log_e("music player err = %d\n", err);
|
||||
}
|
||||
|
||||
switch (err) {
|
||||
switch (err)
|
||||
{
|
||||
case MUSIC_PLAYER_SUCC:
|
||||
__this->file_err_counter = 0;
|
||||
break;
|
||||
@ -470,35 +506,48 @@ void music_player_err_deal(int err)
|
||||
msg = KEY_MUSIC_PLAYER_QUIT; // 退出音乐模式
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_DECODE_FAIL:
|
||||
if (__this->file_err_counter >= music_player_get_file_total()) {
|
||||
if (__this->file_err_counter >= music_player_get_file_total())
|
||||
{
|
||||
__this->file_err_counter = 0;
|
||||
dev_manager_set_valid_by_logo(music_player_get_dev_cur(), 0); /// 将设备设置为无效设备
|
||||
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;///所有文件都是错误的, 切换到下一个设备
|
||||
if (dev_manager_get_total(1) == 0)
|
||||
{ // 参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
/// 无设备时留在 music 空闲,等待插卡
|
||||
}
|
||||
} else {
|
||||
else
|
||||
{
|
||||
/// 不自动切设备播放
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
__this->file_err_counter++;
|
||||
if (__this->file_play_direct == 0) {
|
||||
if (__this->file_play_direct == 0)
|
||||
{
|
||||
msg = KEY_MUSIC_NEXT; // 播放下一曲
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = KEY_MUSIC_PREV; // 播放上一曲
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
|
||||
log_e("MUSIC_PLAYER_ERR_DEV_NOFOUND \n");
|
||||
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_PLAYER_START;///没有找到指定设备, 播放之前的活动设备
|
||||
if (dev_manager_get_total(1) == 0)
|
||||
{ // 参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
/// 无设备时留在 music 空闲,等待插卡
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 不自动切设备播放
|
||||
}
|
||||
break;
|
||||
|
||||
case MUSIC_PLAYER_ERR_FSCAN:
|
||||
/// 需要结合music_player_scandisk_break中处理的标志位处理
|
||||
if (__this->scandisk_break) {
|
||||
if (__this->scandisk_break)
|
||||
{
|
||||
__this->scandisk_break = 0;
|
||||
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
|
||||
break;
|
||||
@ -507,53 +556,68 @@ void music_player_err_deal(int err)
|
||||
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
|
||||
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
|
||||
logo = music_player_get_dev_cur();
|
||||
if (dev_manager_online_check_by_logo(logo, 1)) {
|
||||
if (dev_manager_online_check_by_logo(logo, 1))
|
||||
{
|
||||
/// 如果错误失败在线, 并且是播放过程中产生的,先记录下断点
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
|
||||
{
|
||||
music_player_stop(0); // 先停止,防止下一步操作VM卡顿
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
if (err == MUSIC_PLAYER_ERR_FSCAN) {
|
||||
if (err == MUSIC_PLAYER_ERR_FSCAN)
|
||||
{
|
||||
dev_manager_set_valid_by_logo(logo, 0); /// 将设备设置为无效设备
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// 针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
|
||||
dev_manager_unmount(logo);
|
||||
}
|
||||
}
|
||||
if (dev_manager_get_total(1) == 0) {
|
||||
if (dev_manager_get_total(1) == 0)
|
||||
{
|
||||
app_status_handler(APP_STATUS_MUSIC_QUIT);
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;///切换设备
|
||||
/// 无设备时留在 music 空闲,等待插卡
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 不自动切设备播放
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
|
||||
/// 查找文件有扫盘的可能,也需要结合music_player_scandisk_break中处理的标志位处理
|
||||
if (__this->scandisk_break) {
|
||||
if (__this->scandisk_break)
|
||||
{
|
||||
__this->scandisk_break = 0;
|
||||
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
|
||||
break;
|
||||
}
|
||||
case MUSIC_PLAYER_ERR_PARM:
|
||||
logo = music_player_get_dev_cur();
|
||||
if (dev_manager_online_check_by_logo(logo, 1)) {
|
||||
if (music_player_get_file_total()) {
|
||||
if (dev_manager_online_check_by_logo(logo, 1))
|
||||
{
|
||||
if (music_player_get_file_total())
|
||||
{
|
||||
msg = KEY_MUSIC_PLAYER_PLAY_FIRST; /// 有文件,播放第一个文件
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev_manager_get_total(1) == 0) {
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;
|
||||
if (dev_manager_get_total(1) == 0)
|
||||
{
|
||||
/// 无设备时留在 music 空闲,等待插卡
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 不自动切设备播放
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_FILE_READ: // 文件读错误
|
||||
msg = KEY_MUSIC_NEXT; // 播放下一曲
|
||||
break;
|
||||
}
|
||||
if (msg != KEY_NULL) {
|
||||
if (msg != KEY_NULL)
|
||||
{
|
||||
app_task_put_key_msg(msg, 0);
|
||||
}
|
||||
}
|
||||
@ -579,42 +643,86 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
|
||||
log_i("music task msg = %d\n", msg[0]);
|
||||
|
||||
switch (msg[0]) {
|
||||
switch (msg[0])
|
||||
{
|
||||
case KEY_MUSIC_DEVICE_TONE_END:
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
logo = (char *)msg[1];
|
||||
log_i("KEY_MUSIC_DEVICE_TONE_END %s\n", logo);
|
||||
if (logo) {
|
||||
if (true == breakpoint_vm_read(breakpoint, logo)) {
|
||||
if (logo)
|
||||
{
|
||||
if (true == breakpoint_vm_read(breakpoint, logo))
|
||||
{
|
||||
err = music_player_play_by_breakpoint(logo, breakpoint);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
err = music_player_play_first_file(logo);
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case KEY_USER_KEY_1:
|
||||
printf("KEY_USER_KEY_1\n");
|
||||
err = kt_key_event_handler(KEY_USER_KEY_1);
|
||||
break;
|
||||
case KEY_USER_KEY_2:
|
||||
printf("KEY_USER_KEY_2\n");
|
||||
err = kt_key_event_handler(KEY_USER_KEY_2);
|
||||
break;
|
||||
case KEY_USER_KEY_3:
|
||||
printf("KEY_USER_KEY_3\n");
|
||||
err = kt_key_event_handler(KEY_USER_KEY_3);
|
||||
break;
|
||||
case KEY_USER_KEY_4:
|
||||
printf("KEY_USER_KEY_4\n");
|
||||
err = kt_key_event_handler(KEY_USER_KEY_4);
|
||||
break;
|
||||
case KEY_USER_KEY_5:
|
||||
printf("KEY_USER_KEY_5\n");
|
||||
/* 音量+:灯态由 kt LED 状态机统一处理(播放常亮 / 待机同步慢闪) */
|
||||
err = kt_key_event_handler(KEY_USER_KEY_5);
|
||||
break;
|
||||
case KEY_USER_KEY_6:
|
||||
printf("KEY_USER_KEY_6\n");
|
||||
/* 音量-:灯态由 kt LED 状态机统一处理(播放常亮 / 待机同步慢闪) */
|
||||
err = kt_key_event_handler(KEY_USER_KEY_6);
|
||||
break;
|
||||
case KEY_MUSIC_PLAYER_START:
|
||||
log_i("KEY_MUSIC_PLAYER_START !!\n");
|
||||
app_status_handler(APP_STATUS_MUSIC_PLAY);
|
||||
/// 断点播放活动设备
|
||||
logo = dev_manager_get_logo(dev_manager_find_active(1));
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
|
||||
if (music_player_get_dev_cur() && logo) {
|
||||
if (logo == NULL)
|
||||
{
|
||||
log_w("no play device, stay in music idle\n");
|
||||
break;
|
||||
}
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
|
||||
{
|
||||
if (music_player_get_dev_cur() && logo)
|
||||
{
|
||||
/// 播放的设备跟当前活动的设备是同一个设备,不处理
|
||||
if (0 == strcmp(logo, music_player_get_dev_cur())) {
|
||||
if (0 == strcmp(logo, music_player_get_dev_cur()))
|
||||
{
|
||||
log_w("the same dev!!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
if (music_device_tone_play(logo) == true) {
|
||||
if (music_device_tone_play(logo) == true)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (true == breakpoint_vm_read(breakpoint, logo)) {
|
||||
if (true == breakpoint_vm_read(breakpoint, logo))
|
||||
{
|
||||
err = music_player_play_by_breakpoint(logo, breakpoint);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
err = music_player_play_first_file(logo);
|
||||
}
|
||||
break;
|
||||
@ -626,27 +734,41 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
/// 结束消息处理
|
||||
case KEY_MUSIC_PLAYER_END:
|
||||
log_i("KEY_MUSIC_PLAYER_END\n");
|
||||
if (kt_music_play_end_handler()) {
|
||||
/// 按键指定文件播放结束:关通道,不自动下一曲
|
||||
err = MUSIC_PLAYER_ERR_NULL;
|
||||
break;
|
||||
}
|
||||
err = music_player_end_deal(msg[1]);
|
||||
break;
|
||||
// 播放器解码错误处理
|
||||
case KEY_MUSIC_PLAYER_DEC_ERR:
|
||||
if (kt_music_play_end_handler()) {
|
||||
err = MUSIC_PLAYER_ERR_NULL;
|
||||
break;
|
||||
}
|
||||
err = music_player_decode_err_deal(msg[1]);
|
||||
break;
|
||||
/// 播放执行类消息
|
||||
case KEY_MUSIC_PP:
|
||||
log_i("KEY_MUSIC_PP\n");
|
||||
logo = music_player_get_dev_cur();
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
|
||||
{
|
||||
music_set_dev_sync_mode(logo, 0);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
music_set_dev_sync_mode(logo, 1);
|
||||
|
||||
}
|
||||
err = music_player_pp();
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
|
||||
{
|
||||
app_status_handler(APP_STATUS_MUSIC_PLAY);
|
||||
ui_update_status(STATUS_MUSIC_PLAY);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
app_status_handler(APP_STATUS_MUSIC_PP);
|
||||
ui_update_status(STATUS_MUSIC_PAUSE);
|
||||
/* tone_play_by_path(tone_table[IDEX_TONE_MAX_VOL],1); */
|
||||
@ -688,22 +810,28 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
auto_next_dev = ((msg[0] == KEY_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
|
||||
logo = music_player_get_dev_next(auto_next_dev);
|
||||
printf("next dev = %s\n", logo);
|
||||
if (logo == NULL) { ///找不到下一个设备,不响应设备切换
|
||||
if (logo == NULL)
|
||||
{ /// 找不到下一个设备,不响应设备切换
|
||||
break;
|
||||
}
|
||||
/// 切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
|
||||
{
|
||||
music_player_stop(0); // 先停止,防止下一步操作VM卡顿
|
||||
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
|
||||
}
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
if (music_device_tone_play(logo) == true) {
|
||||
if (music_device_tone_play(logo) == true)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (true == breakpoint_vm_read(breakpoint, logo)) {
|
||||
if (true == breakpoint_vm_read(breakpoint, logo))
|
||||
{
|
||||
err = music_player_play_by_breakpoint(logo, breakpoint);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
err = music_player_play_first_file(logo);
|
||||
}
|
||||
break;
|
||||
@ -711,12 +839,16 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
log_i("KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH\n");
|
||||
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
|
||||
/// 尝试保存断点
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
|
||||
{
|
||||
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
|
||||
}
|
||||
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev())) {
|
||||
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev()))
|
||||
{
|
||||
err = music_player_play_record_folder(NULL, breakpoint);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
err = music_player_play_record_folder(NULL, NULL);
|
||||
}
|
||||
#endif // TCFG_RECORD_FOLDER_DEV_ENABLE
|
||||
@ -736,7 +868,6 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
err = music_player_play_by_path((char *)"udisk0", "/sin.wav"); /// this is a demo
|
||||
break;
|
||||
|
||||
|
||||
/// 非播放执行类消息
|
||||
case KEY_MUSIC_FF:
|
||||
log_i("KEY_MUSIC_FF\n");
|
||||
@ -751,7 +882,8 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
case KEY_MUSIC_CHANGE_REPEAT:
|
||||
log_i("KEY_MUSIC_CHANGE_REPEAT\n");
|
||||
mode = music_player_change_repeat_mode();
|
||||
if (mode > 0) {
|
||||
if (mode > 0)
|
||||
{
|
||||
UI_SHOW_MENU(MENU_MUSIC_REPEATMODE, 1000, mode, NULL);
|
||||
}
|
||||
break;
|
||||
@ -768,7 +900,6 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/// 错误处理
|
||||
music_player_err_deal(err);
|
||||
/// smartbox info update
|
||||
@ -778,7 +909,6 @@ static int music_key_event_opr(struct sys_event *event)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 设备事件响应接口
|
||||
@param 无
|
||||
@ -791,42 +921,48 @@ static int music_sys_event_handler(struct sys_event *event)
|
||||
int err = 0;
|
||||
char *logo = NULL;
|
||||
char *evt_logo = NULL;
|
||||
switch (event->type) {
|
||||
switch (event->type)
|
||||
{
|
||||
case SYS_KEY_EVENT:
|
||||
return music_key_event_opr(event);
|
||||
case SYS_DEVICE_EVENT:
|
||||
switch ((u32)event->arg) {
|
||||
switch ((u32)event->arg)
|
||||
{
|
||||
case DRIVER_EVENT_FROM_SD0:
|
||||
case DRIVER_EVENT_FROM_SD1:
|
||||
case DRIVER_EVENT_FROM_SD2:
|
||||
evt_logo = (char *)event->u.dev.value;
|
||||
case DEVICE_EVENT_FROM_OTG:
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
|
||||
{
|
||||
evt_logo = (char *)"udisk0";
|
||||
}
|
||||
int str_len = 0;
|
||||
logo = music_player_get_phy_dev(&str_len);
|
||||
log_i("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT) {
|
||||
if (logo == NULL) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT)
|
||||
{
|
||||
if (logo == NULL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
|
||||
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
|
||||
{
|
||||
/// 相同的设备才响应
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
|
||||
{
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
|
||||
///停止解码,防止设备掉线后还继续使用
|
||||
/// 停止解码,防止设备掉线后还继续使用;不自动切到其他设备播放
|
||||
music_player_stop(1);
|
||||
///重新选择活动设备播放
|
||||
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);//卸载了设备再执行
|
||||
log_i("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
|
||||
kt_music_play_end_handler();
|
||||
log_i("dev out, stay idle (no auto play)\n");
|
||||
}
|
||||
} else {
|
||||
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN == 0)
|
||||
music_task_dev_online_start();
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/// 设备上线不自动播放
|
||||
}
|
||||
break;
|
||||
default: // switch((u32)event->arg)
|
||||
@ -865,7 +1001,8 @@ void music_task_set_parm(u8 type, int val)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_player_play_start(void)
|
||||
{
|
||||
switch (__this->task_parm.type) {
|
||||
switch (__this->task_parm.type)
|
||||
{
|
||||
case MUSIC_TASK_START_BY_NORMAL:
|
||||
log_i("MUSIC_TASK_START_BY_NORMAL\n");
|
||||
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
|
||||
@ -881,34 +1018,16 @@ static void music_player_play_start(void)
|
||||
/// 提示音播放失败,直接推送KEY_MUSIC_PLAYER_START启动播放
|
||||
}
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式新设备上线处理
|
||||
@param 无
|
||||
@return
|
||||
@note
|
||||
@note 插卡/插U盘不上线自动播放,由按键/业务自行触发
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void music_task_dev_online_start(void)
|
||||
{
|
||||
u8 save = 0;
|
||||
char *logo = music_player_get_dev_cur();
|
||||
if (logo && breakpoint) {
|
||||
///新设备上线, 先记录当前设备断点, 然后播放活动设备
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
save = 1;
|
||||
//这里不要直接记忆断点, 解码停了之后再记忆
|
||||
//breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
}
|
||||
///停止解码,播放新活动设备
|
||||
music_player_stop(1);
|
||||
if (save && breakpoint) {
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
|
||||
log_i("KEY_MUSIC_PLAYER_START AFTER MOUNT\n");
|
||||
//先挂载了设备再执行
|
||||
log_i("dev online, stay idle (no auto play)\n");
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
@ -937,7 +1056,6 @@ static void music_task_start()
|
||||
/// 按键使能
|
||||
sys_key_event_enable();
|
||||
|
||||
|
||||
/// 播放器初始化
|
||||
struct __player_parm parm = {0};
|
||||
parm.cb = &music_player_callback;
|
||||
@ -963,7 +1081,8 @@ static void music_task_close()
|
||||
UI_HIDE_CURR_WINDOW();
|
||||
tone_play_stop_by_path(tone_table[IDEX_TONE_MUSIC]); // 停止播放提示音
|
||||
char *logo = music_player_get_dev_cur();
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
|
||||
{
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
|
||||
@ -982,16 +1101,13 @@ static void music_task_close()
|
||||
/**@brief music 在线检测 切换模式判断使用
|
||||
@param 无
|
||||
@return 1 设备在线 0 设备不在线
|
||||
@note
|
||||
@note 无 SD/U盘时也允许进入 music,等待插卡后播放
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int music_app_check(void)
|
||||
{
|
||||
if (dev_manager_get_total(1)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 主任务
|
||||
@ -1005,36 +1121,24 @@ void app_music_task()
|
||||
int res;
|
||||
int msg[32];
|
||||
music_task_start();
|
||||
/// 进入 music 后不自动播放(有无介质均静默),由按键/业务自行触发播放
|
||||
|
||||
#if (MUSIC_DEVICE_TONE_EN)
|
||||
music_player_play_start();
|
||||
#else
|
||||
#if TCFG_DEC2TWS_ENABLE
|
||||
extern void set_tws_background_connected_flag(u8 flag);
|
||||
extern u8 get_tws_background_connected_flag();
|
||||
if (get_tws_background_connected_flag()) { //不播放提示音
|
||||
music_player_play_start();
|
||||
set_tws_background_connected_flag(0);
|
||||
} else
|
||||
#endif
|
||||
while (1)
|
||||
{
|
||||
tone_play_with_callback_by_name(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
while (1) {
|
||||
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
|
||||
switch (msg[0]) {
|
||||
switch (msg[0])
|
||||
{
|
||||
case APP_MSG_SYS_EVENT:
|
||||
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
|
||||
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false)
|
||||
{
|
||||
app_default_event_deal((struct sys_event *)(&msg[1]));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (app_task_exitting()) {
|
||||
if (app_task_exitting())
|
||||
{
|
||||
music_task_close();
|
||||
return;
|
||||
}
|
||||
@ -1054,10 +1158,6 @@ REGISTER_LP_TARGET(music_lp_target) = {
|
||||
|
||||
void app_music_task()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@ -227,7 +227,7 @@ static void poweroff_app_start()
|
||||
int ret = false;
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
UI_SHOW_WINDOW(ID_WINDOW_POWER_OFF);
|
||||
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
|
||||
/* 音量不记忆:关机不写 CFG_MUSIC_VOL */
|
||||
os_taskq_flush();
|
||||
|
||||
#if (CONFIG_TWS_POWEROFF_SAME_TIME)
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
#include "ui/ui_api.h"
|
||||
#include "app_task.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
@ -61,8 +62,14 @@ static int power_on_init(void)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
|
||||
app_task_switch_to(APP_MUSIC_TASK);
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
#if TCFG_APP_BT_EN
|
||||
app_task_switch_to(APP_BT_TASK);
|
||||
app_task_switch_to(APP_MUSIC_TASK);
|
||||
#else
|
||||
|
||||
#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);//如果带检测,设备不在线,则不跳转 */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@ -130,6 +138,8 @@ void app_poweron_task()
|
||||
{
|
||||
int msg[32];
|
||||
|
||||
kt_init();
|
||||
|
||||
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);
|
||||
|
||||
@ -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();
|
||||
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();
|
||||
}
|
||||
/*
|
||||
*************************************************************
|
||||
*
|
||||
* audio volume save —— 音量不记忆,关闭 VM 写入
|
||||
*
|
||||
*************************************************************
|
||||
*/
|
||||
|
||||
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;
|
||||
#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;
|
||||
if (iis_digvol_last) {
|
||||
audio_dig_vol_set(iis_digvol_last, AUDIO_DIG_VOL_ALL_CH, gain_l);
|
||||
|
||||
@ -75,7 +75,7 @@
|
||||
TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF)
|
||||
#define MAX_ANA_VOL (21)
|
||||
#else
|
||||
#define MAX_ANA_VOL (28)
|
||||
#define MAX_ANA_VOL (30)
|
||||
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
||||
|
||||
#define MAX_COM_VOL (22) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list)
|
||||
@ -96,7 +96,7 @@
|
||||
#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_SIN_VOL 17
|
||||
|
||||
|
||||
@ -1280,7 +1280,7 @@ static void esco_audio_res_close(void)
|
||||
bt_esco_dec->dec.start = 0;
|
||||
bt_esco_dec->dec.enc_start = 0;
|
||||
#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)
|
||||
audio_aec_close();
|
||||
esco_enc_close();
|
||||
@ -1571,7 +1571,7 @@ static int esco_dec_start()
|
||||
|
||||
err = audio_aec_init(dec->dec.sample_rate);
|
||||
#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)
|
||||
if (err) {
|
||||
log_i("audio_aec_init failed:%d", err);
|
||||
|
||||
@ -42,28 +42,6 @@ flac_decoder
|
||||
|
||||
|
||||
ape_decoder
|
||||
|
||||
|
||||
|
||||
m4a_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
alac_decoder
|
||||
|
||||
|
||||
|
||||
amr_decoder
|
||||
|
||||
|
||||
|
||||
dts_decoder
|
||||
|
||||
|
||||
|
||||
g729_decoder
|
||||
wav_decoder
|
||||
cvsd_encoder
|
||||
@ -74,19 +52,11 @@ msbc_encoder
|
||||
|
||||
|
||||
|
||||
mp3_encoder
|
||||
|
||||
|
||||
|
||||
|
||||
g726_encoder
|
||||
|
||||
|
||||
|
||||
adpcm_encoder
|
||||
|
||||
|
||||
|
||||
pcm_encoder
|
||||
sbc_encoder
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
File diff suppressed because one or more lines are too long
1
cpu/br23/tools/download/standard/KTS_AC690x_5458.key
Normal file
1
cpu/br23/tools/download/standard/KTS_AC690x_5458.key
Normal file
@ -0,0 +1 @@
|
||||
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d
|
||||
Binary file not shown.
@ -13,13 +13,13 @@ copy ..\..\ota_all.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
|
||||
::-reboot 2500
|
||||
|
||||
|
||||
|
||||
@rem 删除临时文件-format all
|
||||
@rem 删锟斤拷锟斤拷时锟侥硷拷-format all
|
||||
if exist *.mp3 del *.mp3
|
||||
if exist *.PIX del *.PIX
|
||||
if exist *.TAB del *.TAB
|
||||
@ -28,13 +28,13 @@ if exist *.sty del *.sty
|
||||
|
||||
|
||||
|
||||
@rem 生成固件升级文件
|
||||
@rem 锟斤拷锟缴固硷拷锟斤拷锟斤拷锟侥硷拷
|
||||
copy ota_all.bin ota.bin
|
||||
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw
|
||||
copy ota_nor.bin ota.bin
|
||||
..\..\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_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
|
||||
|
||||
|
||||
@REM 生成配置文件升级文件
|
||||
@REM 锟斤拷锟斤拷锟斤拷锟斤拷锟侥硷拷锟斤拷锟斤拷锟侥硷拷
|
||||
::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg
|
||||
|
||||
::IF EXIST jl_696x.bin del jl_696x.bin
|
||||
|
||||
|
||||
@rem 常用命令说明
|
||||
@rem -format vm //擦除VM 区域
|
||||
@rem -format cfg //擦除BT CFG 区域
|
||||
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector(第一个参数为16进制或10进制都可,第二个参数必须是10进制)
|
||||
@rem 锟斤拷锟斤拷锟斤拷锟斤拷说锟斤拷
|
||||
@rem -format vm //锟斤拷锟斤拷VM 锟斤拷锟斤拷
|
||||
@rem -format cfg //锟斤拷锟斤拷BT CFG 锟斤拷锟斤拷
|
||||
@rem -format 0x3f0-2 //锟斤拷示锟接碉拷 0x3f0 锟斤拷 sector 锟斤拷始锟斤拷锟斤拷锟斤拷锟斤拷 2 锟斤拷 sector(锟斤拷一锟斤拷锟斤拷锟斤拷为16锟斤拷锟狡伙拷10锟斤拷锟狡讹拷锟缴o拷锟节讹拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷10锟斤拷锟斤拷)
|
||||
|
||||
ping /n 2 127.1>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.
BIN
cpu/br23/tools/download/standard/update_059D.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_059D.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_3B24.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_3B24.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_5E96.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_5E96.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_78AB.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_78AB.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_7C4E.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_7C4E.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_B335.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_B335.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_B6A0.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_B6A0.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_BD0B.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_BD0B.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_F392.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_F392.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_F9E6.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_F9E6.ufw
Normal file
Binary file not shown.
BIN
cpu/br23/tools/download/standard/update_FADC.ufw
Normal file
BIN
cpu/br23/tools/download/standard/update_FADC.ufw
Normal file
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
67
cpubr23toolsdownload.bat
Normal 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
BIN
tone/eup.mp3
Normal file
Binary file not shown.
BIN
tone/eup.wtg
Normal file
BIN
tone/eup.wtg
Normal file
Binary file not shown.
BIN
tone/sup.mp3
Normal file
BIN
tone/sup.mp3
Normal file
Binary file not shown.
BIN
tone/sup.wtg
Normal file
BIN
tone/sup.wtg
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user