Framebuffer配置
1. FB环境配置¶
1.1. 配置脚本¶
与FB相关的所有的配置都在project/board/i5/$BOARD_NAME/config/fbdev.ini
中。
-
板子的目录
/config/fbdev.ini
-
相关配置信息
[FB_DEVICE] FB_BUF_ID = 0 FB_BUF_CNT = 2 FB_HWWIN_FORMAT = 6 FB_WIDTH = 1920 FB_HEIGHT = 1080 FB_TIMMING_WIDTH = 1920 FB_TIMMING_HEIGHT = 1080 [FB_BUF_ID0_PATH] FB_MOD = 1 FB_CHN = 0 FB_PORT = 0 FB_GWIN_ID = 7
-
FB_BUF_ID:
Canvas内容的ID号码,每个FB_DEVICE必须指定唯一的ID号,不得重复。
-
FB_BUF_CNT
多buffer配置,如果需要使用多buffer,buffer贴到divp用2张,贴到vpe用3张。
-
FB_HWWIN_FORMAT
GOP显示的format,在同一个GOP上的gwin必须使用同一个Format数据。
1. 目前CHIP支持的formatRGB565◊1、ARGB4444◊2、I8◊4、ARGB8888◊5、ARGB1555◊6.
-
FB_WIDTH/ FB_HEIGHT
Canvas内容的宽度/高度。
-
FB_TIMMING_WIDTH/ FB_TIMMING_HEIGHT
Canvas内容实际显示的宽度、高度,如果显示的宽高大于内容的宽高,硬件会自动做scaling up。请注意,实际显示的宽高必须大于内容的宽高,否则当前的硬件不支持scaling down。
-
FB_BUF_ID0_PATH
FB通道属性配置,ID0代表FB_BUF_ID为0的Canvas内容叠加到该通道。
-
FB_MOD
配置要叠加到通道的模块类型,0代表VPE,1代表DIVP。
-
FB_CHN/FB_PORT
配置叠加通道的channel id,port id。
当多个fbdev,/dev/fb0.../dev/fbn配置后,每个device只能单独配置一个通道属性,而且每个通道不可以重复。
-
FB_GWIN_ID
配置使用的GWIN ID号,若与Region混合使用GWIN ID越大,显示层级越低,最大不得超过或等于硬件GWIN的个数。
1.2. 注意¶
Framebuffer和Region模块使用的是同一套底层硬件,在同一个通道上,FB和Region可以混合使用,需要注意的是,FB使用最大的GWIN ID,则FB的内容永远在最底层显示,反之则在最上层显示。多个GWIN叠加不支持ALPHA叠加效果,如果上层的Region使用了Color key不显示且有与FB重叠的部分,则重叠部分不显示。
2. Demo测试¶
2.1. 代码位置¶
测试代码使用了mdb,代码路径:sdk/verify/feature/mdb
。
目前在mdb中添加了几条FB相关的命令,fbinit/ fbfillrect/fbshow,使用这三条命令就可以实现FB画图的效果。对应代码位置:
sdk/verify/feature/mdb,/internal/src/Mdb_Integrate.cpp
这些函数都是基于FB的API实现了一层封装:
void Mdb_Integrate::FbInit(std::vector<std::string> &inStrings, std::string &strOut); void Mdb_Integrate::FbFillRect(std::vector<std::string> &inStrings, std::string &strOut); void Mdb_Integrate::FbInitMouse(std::vector<std::string> &inStrings, std::string &strOut); void Mdb_Integrate::FbSetMouse(std::vector<std::string> &inStrings, std::string &strOut); void Mdb_Integrate::FbShow(std::vector<std::string> &inStrings, std::string &strOut); void Mdb_Integrate::FbFillRectTest(std::vector<std::string> &inStrings, std::string &strOut);
2.2. 编译及执行¶
-
首先全编译一边ALKAID,然后进入sdk/verify/feature/mdb。
-
source build.sh;make clean;make
-
编译成功后把out/demo/app/service、out/demo/app/console、scripts/rtsp.sh拷贝到板子的同一路径下。
-
FB如果要显示,必须先出一路rtsp流,所以开机后先执行./rtsp.sh.
-
Vpe port0先出一路rtsp:
图2-1 不显示Region
图2-2 直接enter使用默认配置
图2-3 直接enter使用默认配置
选择port0从vpe出rtsp流,并出一路1080P\@H265。
Portplayer打开rtsp://xx.xx.xx.xx/stream0
-
此时再开一路telnel,执行./console:
选择2
-
执行命令显示osd
fbinit fbfillrect 300 300 200 200 0xFF00 fbshow 1
最终显示效果:在 (300 300)的位置显示了一个200x200颜色为绿色的矩形框(背景为蓝色)。
-
使用命令测试单buffer刷新效率:
FB_BUF_CNT改成1 fbinit fbfillrecttest 100 1280 720 10 10
执行后可以看到宽为10pixl的长条矩形以10pixel/100ms的速度在移动,可以看到长条矩形有tearing。
-
双buffer测试
把FB_BUF_CNT改成2,若贴到VPE上则改成3,执行上述同样的指令:
执行后可以看到宽为10pixl的长条矩形以10pixel/100ms的速度在移动,可以看到长条矩形没有tearing。