Doorbell_cs2_4M
1. 简介
本工程是USB摄像头门锁的一个demo, 支持端 (BK7258设备) 到端 (手机APP端) 的演示。默认支持尚云进行网络传输。
1.1 规格
- 硬件配置:
核心板, BK7258_QFN68_8X8_V1
显示转接板, BK7258_LCD_Interface_V3.0
喇叭小板, BK_Module_Speaker_V1.1
PSRAM 4M
- 支持, UVC
参考外设, 最大支持**864 * 480** 分辨率的UVC
支持, UAC
支持, TCP局域网图传
支持, UDP局域网图传
支持, 尚云, P2P图传
- 支持, LCD RGB/MCU I8080显示
参考外设, ST7701SN, 480 * 854 RGB LCD
RGB565/RGB888
- 支持, 硬件/软件旋转
0°, 90°, 180°, 270°
支持, 板载喇叭
- 支持, MJPEG硬件解码
YUV422
- 支持, MJPEG软件解码
YUV420
支持, H264硬件解码
- 支持, OSD显示
ARGB888[PNG]
自定义字体
1.2 路径
<bk_avdk源代码路径>/projects/thirdparty/doorbell_cs2_4M
2. 框架图
请参考 框架图
3. 配置
请参考 配置
3.1 区别
doorbell_cs2_4M与doorbell_cs2_8M的区别在于, 前一个不支持DVP摄像头, 还不支持板载mic。
从8M的PSRAM大小修改为4M (非ab) 的PSRAM大小, 需要针对config文件进行修改, 文件路径为:
thirdparty/doorbell_cs2_4M/config/bk7258/config
thirdparty/doorbell_cs2_4M/config/bk7258_cp1/config
thirdparty/doorbell_cs2_4M/config/bk7258_cp2/config
以下是 doorbell_cs2_8M 与doorbell_cs2_4M 的CONFIG参数区别:
project
doorbell_cs2_8M
doorbell_cs2_4M
CONFIG_PSRAM_MEM_SLAB_USER_SIZE
102400
0
CONFIG_PSRAM_MEM_SLAB_AUDIO_SIZE
102400
51200
CONFIG_PSRAM_MEM_SLAB_ENCODE_SIZE
1433600
946176
CONFIG_PSRAM_MEM_SLAB_DISPLAY_SIZE
5701632
2490368
CONFIG_MEDIA_PSRAM_SIZE_4M
N
Y
CONFIG_BUCK_ANALOG_DISABLE
N
Y
CONFIG_PSRAM_W955D8MKY_5J
N
Y
CONFIG_PSRAM_APS6408L_O
N
N
CONFIG_CPU0_SPE_RAM_SIZE
0X56000
0X5E000
CONFIG_CPU1_APP_RAM_SIZE
0X3F000
0X38000
CONFIG_CPU2_APP_RAM_SIZE
0XB000
0XA000
CONFIG_PSRAM_HEAP_BASE
0x60700000
0x60354000
CONFIG_PSRAM_HEAP_SIZE
0x80000
0x7D000
CONFIG_PSRAM_HEAP_CPU0_BASE_ADDER
0x60700000
0x60354000
CONFIG_H264_P_FRAME_CNT
5
3
流程如下图所示:
Figure 1. doorbell_cs2_4M解码流程
Figure 2. doorbell_cs2_8M解码流程
流程上主要区别如下表:
project |
解码流程 |
doorbell_cs2_4M |
先尝试获取YUV图像, 申请成功后才继续进行解码, lcd显示完直接触发下一次获取图像流程 |
doorbell_cs2_8M |
直接解码, 获取YUV图像失败后直接将JPEG释放, 等待下一帧JPEG |
4. 演示说明
请访问 APP使用文档 查看。
演示结果:运行时会启动UVC, LCD和AUDIO, LCD显示UVC输出JPEG (864X480) 图像经过解码和旋转90°后显示到LCD(480X854)上, 解码后的YUV经过H264编码后, 经CS2云到手机上显示(864X480)。
提示
如果您没有云账号权限, 可以使用debug模式, 设置局域网TCP图传方式。
5. 代码讲解
请参考 代码讲解
6. 移植说明
对于media模块而言, 4M和8M最大的区别在于PSRAM大小配置缩小, 因此内部缓冲图像数量减少, 如下表所示;
project
YUV图像 (张)
JPEG图像 (张)
H264图像 (张)
doorbell_cs2_4M
3
4
4
doorbell_cs2_ab_4M
3
4
4
doorbell_cs2_8M
5
4
8
将8M FLASH + 8M PSRAM 修改为4M FLASH + 4M PSRAM工程按照以下步骤进行:
步骤1:
将平台代码合入;
根据patch将修改同步, patch的提交标题为”adapter for new 4+4 psram of W955D8MKY”,
共三笔提交, 注意:不包括doorbell_cs2_ab_4M工程代码的patch, 代码目录核涉及文件如下表所示:
代码目录
涉及文件
middleware
driver/pwr_clk/Kconfig
soc/bk7258/hal/sys_pm_hal.c
soc/common/hal/include/psram_hal.h
soc/common/hal/psram_hal.c
tools/build_tools
part_table_tools/otherScript/special_project_deal.py
bk_idk/components/part_table
CMakeLists.txt
part_table.mk
主要修改点如下表所示:
涉及文件
主要修改点
driver/pwr_clk/Kconfig
增加BUCK_ANALOG_DISABLE 关闭模拟域BUCK的宏控
soc/bk7258/hal/sys_pm_hal.c
配置关闭模拟域BUCK的实际代码
soc/common/hal/include/psram_hal.h
增加4M PSRAM的新配置MODE以及ID信息
soc/common/hal/psram_hal.c
增加4M PSRAM的初始化流程
CMakeLists.txt
part_table.mk
增加doorbell_cs2_4M工程
增加doorbell_cs2_4M编译信息
步骤2:
根据patch将修改同步,patch的提交标题为”PSRAM configuration for image transmission-related buffers when the size is 4M”,
共三笔提交,代码目录核涉及文件如下表所示:
代码目录
涉及文件
components
display_service/src/lcd_display_service.c
media_utils/src/psram_mem_slab.c
multimedia/comm/frame_buffer.c
multimedia/Kconfig
multimedia/pipeline/h264_encode_pipeline.c
multimedia/pipeline/jpeg_decode_pipeline.c
multimedia/pipeline/jpeg_get_pipeline.c
bk_idk/components/part_table
CMakeLists.txt
part_table.mk
projects
thirdparty/doorbell_cs2_4M/config/bk7258_cp1/config
thirdparty/doorbell_cs2_4M/config/bk7258_cp2/config
thirdparty/doorbell_cs2_4M/config/bk7258/config
thirdparty/doorbell_cs2_4M/config/bk7258/bk7258_partitions.csv
主要修改点如下表所示:
涉及文件
主要修改点
display_service/src/lcd_display_service.c
显示完成后立马获取JPEG图像
media_utils/src/psram_mem_slab.c
避免buffer循环查找
multimedia/comm/frame_buffer.c
减少内部图像缓冲数量
multimedia/Kconfig
增加CONFIG_MEDIA_PSRAM_SIZE_4M的宏控
multimedia/pipeline/h264_encode_pipeline.c
multimedia/pipeline/jpeg_decode_pipeline.c
multimedia/pipeline/jpeg_get_pipeline.c
修改pipeline流程
降低YUV图像缩减对软解码帧率的影响
CMakeLists.txt
part_table.mk
增加doorbell_cs2_4M工程
thirdparty/doorbell_cs2_4M/config/bk7258_cp1/config
thirdparty/doorbell_cs2_4M/config/bk7258_cp2/config
thirdparty/doorbell_cs2_4M/config/bk7258/config
使用CONFIG_MEDIA_PSRAM_SIZE_4M宏控
修改PSRAM分配,将USB移到CP1上运行
PSRAM具体修改见上面的表格
thirdparty/doorbell_cs2_4M/config/bk7258/bk7258_partitions.csv
修改FLASH空间分配为4M
7. Q&A
Q: psram内存分配如何调整?
A:
目前4M工程中内存分配为:
模块
buffer大小
config中宏
audio
51200
CONFIG_PSRAM_MEM_SLAB_AUDIO_SIZE
jpeg & h264
946176
CONFIG_PSRAM_MEM_SLAB_ENCODE_SIZE
yuv
2490368
CONFIG_PSRAM_MEM_SLAB_DISPLAY_SIZE
cp0 heap
0x7D000
CONFIG_PSRAM_HEAP_SIZE (bk7258)
cp1 heap
0x2F000
CONFIG_PSRAM_HEAP_SIZE (bk7258_cp1)
可以缩减的buffer:
audio模块
根据不同音频格式需要的大小不一样, 且音频仅在模块上电时初始化一次, 后续直到音频模块关闭才会释放, 可以根据需要打印出音频需要的最大buffer, 然后修改CONFIG_PSRAM_MEM_SLAB_AUDIO_SIZE宏, 最好比最大buffer大4-8K, 避免反复开关时出现异常;
jpeg & h264模块
jpeg和H264模块对应的buffer可以根据需要调整, 目前配置是4张jpeg+4张h264, 通过CONFIG_JPEG_FRAME_SIZE和CONFIG_H264_FRAME_SIZE控制图像大小; 默认是每张jpeg大小为153600, 每张h264为65536;
需要大小为 (153600 + 65536) * 4 = 0XD6000, 再加上每帧的head; 默认配置的buffer大小为0xE7000; 默认是预留了H264 size配置为81920的空间,H264太小图传不出图时可以直接调整CONFIG_H264_FRAME_SIZE; 可以根据实际情况调整jpeg和H264大小;
备注
如果后续环境复杂可能会出现jpeg大于设置的buffer或编码的H264大于设定的buffer,导致屏显/图传不出图;
yuv模块
yuv模块对应的buffer一般不会改变,设定的buffer为 (864 * 480 * 2) * 3 = 0x25F800, 再加上每帧的head;
默认配置的buffer大小为0x260000;
HEAP size
后续CP0 HEAP size 和CP1 HEAP size 根据需要进行调整;
Q: 融合buffer踩内存问题
A:
LCD_BLEND_MALLOC_SIZE需要大于融合图标的大小,融合的图标过大需要修改为psram_malloc申请;
LCD_BLEND_MALLOC_RGB_SIZE是融合小图标旋转时使用, 如果图标不需要旋转可以设置为0, 但如果需要旋转,则设置为旋转图标的最大buffer, 避免溢出;