Framebuffer配置

Version 1.3


1. FB环境配置


1.1. 配置脚本

与FB相关的所有的配置都在project/board/i5/$BOARD_NAME/config/fbdev.ini中。

  1. 板子的目录

    /config/fbdev.ini
    
  2. 相关配置信息

    [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
    
  3. FB_BUF_ID:

    Canvas内容的ID号码,每个FB_DEVICE必须指定唯一的ID号,不得重复。

  4. FB_BUF_CNT

    多buffer配置,如果需要使用多buffer,buffer贴到divp用2张,贴到vpe用3张。

  5. FB_HWWIN_FORMAT

    GOP显示的format,在同一个GOP上的gwin必须使用同一个Format数据。
    1. 目前CHIP支持的format

    RGB565◊1、ARGB4444◊2、I8◊4、ARGB8888◊5、ARGB1555◊6.

  6. FB_WIDTH/ FB_HEIGHT

    Canvas内容的宽度/高度。

  7. FB_TIMMING_WIDTH/ FB_TIMMING_HEIGHT

    Canvas内容实际显示的宽度、高度,如果显示的宽高大于内容的宽高,硬件会自动做scaling up。请注意,实际显示的宽高必须大于内容的宽高,否则当前的硬件不支持scaling down。

  8. FB_BUF_ID0_PATH

    FB通道属性配置,ID0代表FB_BUF_ID为0的Canvas内容叠加到该通道。

  9. FB_MOD

    配置要叠加到通道的模块类型,0代表VPE,1代表DIVP。

  10. FB_CHN/FB_PORT

    配置叠加通道的channel id,port id。

    当多个fbdev,/dev/fb0.../dev/fbn配置后,每个device只能单独配置一个通道属性,而且每个通道不可以重复。

  11. 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. 编译及执行

  1. 首先全编译一边ALKAID,然后进入sdk/verify/feature/mdb。

  2. source build.sh;make clean;make

  3. 编译成功后把out/demo/app/service、out/demo/app/console、scripts/rtsp.sh拷贝到板子的同一路径下。

  4. FB如果要显示,必须先出一路rtsp流,所以开机后先执行./rtsp.sh.

  5. Vpe port0先出一路rtsp:

    图2-1 不显示Region

    图2-2 直接enter使用默认配置

    图2-3 直接enter使用默认配置

    选择port0从vpe出rtsp流,并出一路1080P\@H265。

    Portplayer打开rtsp://xx.xx.xx.xx/stream0

  6. 此时再开一路telnel,执行./console:

    选择2

  7. 执行命令显示osd

    fbinit  
    fbfillrect 300 300 200 200 0xFF00  
    fbshow 1
    

    最终显示效果:在 (300 300)的位置显示了一个200x200颜色为绿色的矩形框(背景为蓝色)。

  8. 使用命令测试单buffer刷新效率:

    FB_BUF_CNT改成1  
    fbinit  
    fbfillrecttest 100 1280 720 10 10
    

    执行后可以看到宽为10pixl的长条矩形以10pixel/100ms的速度在移动,可以看到长条矩形有tearing。

  9. 双buffer测试

    把FB_BUF_CNT改成2,若贴到VPE上则改成3,执行上述同样的指令:

    执行后可以看到宽为10pixl的长条矩形以10pixel/100ms的速度在移动,可以看到长条矩形没有tearing。