Skip to main content

windows副屏

以开发板PD_AD102_APUS_V1.0为例说明

一 基础配置

以ad102p_nand_5.10_defconfig配置为例

1.1 LCD

添加外设屏幕及背光配置

1

lcd供电采用设备电源管理"GPIO-POWER0",因为触摸屏供电也用到这个io,防止io被重复申请

2

背光采用pwm控制

3

pwm驱动

12

1.2 fb配置

默认采用多fb叠加直通输出

4

fb配置建议fb0,强制最底层,解码播放缓冲帧数为0就行,节省内存,若后续要添加ui,增加fb叠加,配置1帧

5

1.3 h264 解码选项

6

解码依赖的分包

10

1.4 h264解码驱动

进入kernel目录,配置h264解码驱动

bhu@bhu-PC:~/work/kernel/kernel$ make menuconfig

11

1.5 jpeg解码选项

7

1.6 jpeg解码驱动

13

1.7 usb display相关配置

usb显示相关demo,一个是仅显示,另一个带触摸,默认显示在fb0

14

usb display kernel相关驱动

bhu@bhu-PC:~/ad101/kernel/kernel$ make menuconfig

15

二 内存分配

2.1 rmem

说明:rmem的内存由libhardware2的rmem相关接口进行调用申请, 主要提供给一些需要申请大内存的驱动或场景使用

本文主要是lcd驱动及jpeg解码

配置方法:位于bootloader/uboot-x2000/boards.cfg中配置, 在所用uboot配置的options里加上RMEM_MB=XXX

以ad102p_nand_5.10_defconfig配置为例

bhu@bhu-PC:~/work/build$ grep -nr "uboot" configs/ad102p_nand_5.10_defconfig
3:APP_uboot_toolchain_dir=../tools/toolchains/mips-xburst2-gcc1210-glibc238
4:APP_uboot_dir=../bootloader/uboot-x2000
5:APP_uboot_config=ad102p_base_xImage_sfc_nand //uboot配置
bhu@bhu-PC:~/work/build$ grep -nr "ad102p_base_xImage_sfc_nand" ../bootloader/uboot-x2000/boards.cfg //uboot配置的rmem
954:ad102p_base_xImage_sfc_nand mips xburst2 ad100_base ingenic ad100 ad100_base:AD102P_DDR,SPL_SFC_NAND,MTD_SFCNAND,SPL_OS_BOOT,SPL_PARAMS_FIXER,RMEM_MB=8

iconfig配置:需要选中两个,第一个是驱动的选项,第二个是驱动对应的调用

8

9

查看:烧录进入板子后可通过cat /proc/cmdline查看配置的rmem

计算方法:以下是lcd需要内存,实际使用应该尽量往高一点计算

lcd为720p的屏幕, 并且fb只配置一层, 然后为0个buffer时

(720 ×1280 × 4) × 0 = 0 (lcd的内存是按ARGB的32位申请的,因此需要乘4)

h264解码需要预留缓存

计算方法:解码720p的视频,需要预留2帧NV12 缓存

frame_size = 1280 × 720 × 3 / 2 × 2= 2764800

jpeg解码需要输入源和输出源

输入 1280 × 720 = 921600 (jpeg图片最大按宽 * 高计算)

输出 1280 × 720 × 3 / 2= 1382400 (demo默认是nv12,可修改输出格式)

总大小为 921600 + 1382400 = 2304000

2.2 reserved_memory

说明:reserved_memory是kernel里配置的, 由设备树上分配的一项预留内存, 通常用于内核里驱动的内存使用

不同于RMEM, 该段内存主要用于给h264解码内存使用, h264解码是一个相对独立且内存消耗较大的驱动

单独用此功能分配内存可以更好的管理内存分配, 并且避免在使用内存较频繁之后产生内存碎片, 申请不到编解码所需要的连续内存导致错误

配置方法:位于kernel/kernel/module_drivers/dts-stage下对应的dts文件, 通过增加下述字段使用

dts文件查询, 以ad102p_nand_5.10_defconfig为例

bhu@bhu-PC:~/work/build$ grep -nr "kernel" configs/ad102p_nand_5.10_defconfig
6:APP_kernel_dir=../kernel/kernel
7:APP_kernel_config=ad102p_module_base_linux_sfc_nand_defconfig //kernel配置
9:# APP_kernel_dtb is not set
bhu@bhu-PC:~/work/build$ grep -nr "dts" ../kernel/kernel/arch/mips/configs/ad102p_module_base_linux_sfc_nand_defconfig
246:CONFIG_DT_AD100_MODULE_BASE_DTS_FILE="ad102p_module_base.dts" //dts文件

解码内存计算说明


reserved-memory 大小说明:(需要的最小值)

例如:1080p, 参考帧为(ref_frame_count)4 帧,没有 B 帧的视频解码,需要预留的内存大小:
dec_mem:
frame_size = 1920 * 1088 * 3 / 2 = 3133440; //h264解码宽高需要16位对齐,所以1080按1088计算
mb_size = (1920 / 16) * (1088 / 16) * 136 = 1109760 //固定计算公式
dec_mem = (ref_frame_count + 1) * (frame_size + mb_size) + 其他结构体 + 码流缓存 //其他结构体固定大小,码流缓存按最大1MB计算
= (4 + 1) * 4243200 + 360448 + 1048576
= 21.5M
同理算出720p需要内存为 = 10.3M
ps:
1.计算出来的内存为极限值,并且只对于h264解码,需要多预留
2.此为使用libhardware2 接口内存计算方式,若使用ffmpeg以ffmpeg实际使用为准
3.要想降低使用内存,则需要h264编码只采用 1 帧参考帧,这样1080p只需要 9.4M
4.ref_frame_count 可以使用 cmd_h264_parse 命令查看

dts 文件解码内存添加

/ {
compatible = "ingenic,ad100";
/*chosen {
bootargs = "console=ttyS0,115200 mem=128M@0x0ip=off init=/linuxrc ubi.mtd=2 root=ubi0:rootfs ubi.mtd=3 rootfstype=ubifs rw flashtype=nand";
};*/

/*
reserved_mem@0x5000000: 对应预留内存地址起始位置为0x5000000
reg = <0x05000000 0x2000000>: 分别对应起始位置为0x05000000, 大小为0x2000000
配置的凭据以此芯片ad102为例, 内存总大小为128M, 即总大小为0x8000000
ad102通用对应的uboot配置里设置了RMEM_MB=16, 因此总地址的后16M会被RMEM占用, 则剩余内存大小为0x7000000
由此当我们分配32M预留内存给reserved_memory时, 起始地址则为0x7000000-0x2000000 = 0x5000000, 大小为0x2000000
如果需要改变此区域大小, 需要同时修改起始地址和大小(reserved_mem@0x5000000 和 reg = <0x05000000 0x2000000> 的地址需要一起修改)
需要用到该地址申请内存的驱动, 需要加上 memory-region=<&reserved_memory>; 详细参考下面 felix 等的用法
*/

reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges = <>;

reserved_memory: reserved_mem@0x5000000{
compatible = "shared-dma-pool";
reg = <0x05000000 0x2000000>;
};
};
};

/* 加上 memory-region=<&reserved_memory>; 表示会用上方设置的预留内存地址和大小作为内存申请 */
&felix {
status = "okay";
memory-region=<&reserved_memory>;
};

三 验证

整体编译

bhu@bhu-PC:~/work/build$ make ad102p_nand_5.10_defconfig
bhu@bhu-PC:~/work/build$ make

将工程目录doc/开发使用说明/USB使用说明文档/设备/USB_DISPLAY下的gadget_display_hid_one_finger_touch.sh及gadget_display.sh文件放到开发板下

将开发板连接windows电脑

# /etc/init.d/S90adb stop                    //有打开adb及mtp等功能的先关掉
sh: write error: No such device
[ 14.076835] unloading
/
[ 14.159124] ffs_data_put(): freeing

# /usr/data/gadget_display.sh start //执行脚本
start USB Display Device
Creating the USB gadget...
Setting Device Descriptor...
Setting English strings...
Creating Config...
Creating functions...
[ 23.161814] dwc2 13500000.otg: bound driver configfs-gadget
# using /dev/fb0 /dev/g_display0 131072
[ 23.315979] dwc2 13500000.otg: new device is high-speed
[ 23.349694] dwc2 13500000.otg: new address 3
[ 23.586323] configfs-gadget gadget: Using interface 0
bpp_byte 2, fb_fmt 1
Enable h264 function
[ 24.419859] max available: 31457280
[ 24.420161] min available: 31227904
[ 24.420492] min available: 31096832
[ 24.420773] h264_decode_init done!
[ 24.421028] Create instance [0]@e2a01789 m2m_ctx=266a8d68
[ 24.421394] 13300000.felix vcodec [0]
[ 24.421668] tmp_w 1920 tmp_h 1080, w 1920 h 1080
[ 24.421990] tmp_w 1920 tmp_h 1080, w 1920 h 1080
width 1920 height 1080
display_enable 1
[ 24.851514] min available: 29990912
[ 24.851761] min available: 28942336
[ 24.852001] min available: 26853376
[ 24.852238] min available: 25808896
[ 24.881025] min available: 25743360

windows电脑需要安装对应驱动,安装完成后,windows电脑内容将显示在开发板上