打印
[RISC-V MCU 应用开发]

全志RISC-V D1s芯片 如何在Tina下进行显示旋转?

[复制链接]
3043|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
神棍地海棠|  楼主 | 2022-11-21 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 问题背景


目前显示多基于横屏的情况设计布局, UI, 图片, 视频等显示. 而常用到的MIPI屏大多都是竖屏, 为避免重新调整布局, 显示提供了竖屏旋转成横屏的显示方式, 节省客户开发时间.

显示旋转有硬件G2D旋转方式, 软件算法旋转方式, 可根据自己的方案屏情况, 测试对比两种方式选择使用, 主要评估内存占用, 时间效率, 旋转效果.

  • 显示驱动旋转framebuffer配置


1.由于此前公版默认在modules.mk屏蔽了屏旋转相关配置, 如果你的版本是禁用旋转的, 需要把相关配置去掉.

```
路径:target/allwinner/f133-common/modules.mk

```

屏蔽以下3个相关选项:

<p>```</p><p>CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE</p><p>
</p><p>CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT</p><p>
</p><p>CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT</p><p>```</p>

修改后的代码如下:

<p>```</p><p>.....</p><p>$(eval $(call KernelPackage,net-rtl8821cs))</p><p>
</p><p>define KernelPackage/sunxi-disp</p><p>  SUBMENU:=$(VIDEO_MENU)</p><p>  TITLE:=sunxi-disp support</p><p>  KCONFIG:=\</p><p><span style="white-space:pre">        </span>  CONFIG_DISP2_SUNXI=m \</p><p><span style="white-space:pre">        </span>  #CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE=y \</p><p><span style="white-space:pre">        </span>  #CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT=n \</p><p><span style="white-space:pre">        </span>  #CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT=y \</p><p><span style="white-space:pre">        </span>  CONFIG_DISP2_SUNXI_BOOT_COLORBAR=n \</p><p><span style="white-space:pre">        </span>  CONFIG_DISP2_SUNXI_DEBUG=y \</p><p><span style="white-space:pre">        </span>  CONFIG_DISP2_SUNXI_COMPOSER=n \</p><p><span style="white-space:pre">        </span>  CONFIG_DISP2_SUNXI_SUPPORT_SMBL=y \</p><p>
</p><p>.....</p><p>```</p>

2.硬件旋转需要确保G2D驱动已经使能

<p>```</p><p>make kernel_menuconfig</p><p><span style="white-space:pre">        </span>Device Drivers  ---></p><p><span style="white-space:pre">                </span><*> SUNXI G2D Driver</p><p><span style="white-space:pre">                </span>[*]   sunxi g2d mixer module</p><p><span style="white-space:pre">                </span>[*]   sunxi g2d rotate module</p><p>```</p>

3.打开显示驱动旋转支持

<p>```</p><p>make kernel_menuconfig</p><p><span style="white-space:pre">        </span>Device Drivers  ---></p><p><span style="white-space:pre">                </span>Graphics support  ---> </p><p><span style="white-space:pre">                        </span>Frame buffer Devices  ---></p><p><span style="white-space:pre">                                </span> Video support for sunxi  ---></p><p><span style="white-space:pre">                                </span> <span style="white-space:pre">        </span>DISP2 Framebuffer rotation support (Disable rotation)  ---></p><p><span style="white-space:pre">                                </span> <span style="white-space:pre">                </span> ( ) Disable rotation</p><p><span style="white-space:pre">                                                </span> ( ) Software rotation support  <span style="white-space:pre">        </span>(不要选这个,方案未支持)</p><p><span style="white-space:pre">                                                </span> (X) Hardware(G2D) rotation support (选择G2D旋转)</p><p>```</p>

4.dts配置

board.dts 和 uboot-board.dts同步修改.

<p>```</p><p>&disp{</p><p>    .....</p><p>    disp_rotation_used       = <1>;/* 使能旋转功能 */</p><p>    degree0                  = <3>; /* X:screen index; 0:0 degree; 1:90 degree; 3:270 degree */</p><p>    fb0_width                = <1280>;/*fb 的长宽交换*/</p><p>    fb0_height               = <800>;</p><p>    .....</p><p>};</p><p>```</p>


5.旋转后framebuffer编程是需要注意,旋转后的buffer不会直接显示到屏幕上, 需要在应用刷屏的地方调用FBIOPAN_DISPLAY接口.同步旋转后的buffer到LCD上.

以修改公版旋转的GUI刷屏示例:

路径:`package/gui/littlevgl-6/lv_drivers/display/fbdev.c`

<p>```</p><p>void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p){</p><p>....</p><p>    lv_disp_flush_ready(drv);</p><p>    ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo); /*函数最后,在刷屏函数后面,调用 FBIOPAN_DISPLAY 接口*/</p><p>}</p><p>```</p>


  • 软件旋转LVGL UI配置

公版上lvgl-6上做了UI旋转算法, 软件交换打点位置达成旋转. 该做法纯软件, 不需要改动其他配置, 在原来未旋转的基础上,修改LV_UI_ROTATE_DIRECTION宏即可.

路径:lv_conf.h

<p>```</p><p>/* UI rotation:</p><p>* - 0:  no rotate</p><p>* - 1:  90°</p><p>* - 2: 180°</p><p>* - 3: 270°</p><p>*/</p><p>
</p><p>#define LV_UI_ROTATE_DIRECTION     0</p><p>```</p>

  • 视频旋转配置

视频旋转有 解码器旋转 和 G2D旋转 两种方式.

1.编码器旋转(VE),使用TPlayerSetRotate接口,注意该接口不支持LBC模式, 不支持H265视频旋转.具体请参考<Tina Linux 多媒体解码>文档.

<p>```</p><p>函数原型: int TPlayerSetRotate(TPlayer* p,TplayerVideoRotateTyperotateDegree);</p><p>功能 设置视频旋转的角度</p><p>参数 p: 通过 TPlayerCreate 函数创建的 TPlayer 指针; rotateDegree: 视频旋转的角度</p><p>返回值 成功返回 0,失败返回-1。</p><p>调用说明 这个函数需要在 TPlayerSetDataSource() 函数之前调用</p><p>```</p>

2.G2D旋转:

方式一:(1)TPlayerSetG2dRotate()接口使用G2D做旋转。该接口在TPlayerCreate()之后调用。

方式二:(2)直接在在配置文件中配置默认旋转,文件路径:

​ `package/allwinner/tina_multimedia/tplayer/configs/f133_linux_cedarx.conf`


```
<p>48 #use g2d module to rotate the video. notice:F133/R528</p><p> 49 g2d_rotate_flag = 1</p><p> 50 g2d_rotate_degree = 1</p><p>```</p>

  • 图片旋转


待支持.


使用特权

评论回复
沙发
xdqfc| | 2022-11-24 10:40 | 只看该作者
什么乱七八糟的东西都发上来。

使用特权

评论回复
板凳
GSDDDD| | 2022-11-24 20:12 | 只看该作者
本帖最后由 GSDDDD 于 2022-11-24 20:33 编辑
xdqfc 发表于 2022-11-24 10:40
什么乱七八糟的东西都发上来。

全志D1s是D1的集成64M内存版本,就是F133。

D1s是全志针对智能解码市场推出的高性价比AIoT芯片。 它使用64bit RISC-V架构的阿里平头哥C906处理器,内置了64M DDR2,支持Linux系统,同时集成了大量自研的音视频编解码相关IP,可以支持H.265,、H.264、MPEG-1/2/4、JPEG等全格式视频解码,支持ADC、DAC、I2S、PCM、DMIC、OWA等多种音频接口,可以广泛应用于智能家居面板、智能商显、工业控制、车载等产品。
立创开源:https://oshwhub.com/GloomyGhost/34e1fe88b79f49b891df150db9c34cc4
SDK下载方法:https://d1s.docs.aw-ol.com/study/study_2getsdk/
信息更新及资料汇总贴:https://bbs.aw-ol.com/topic/1257/

配套SDK
SDK百度云下载:链接:https://pan.baidu.com/s/1MF8HIJHuEG71NxOY1riBZw 提取码:awol
我不是来打广告旳,为了驱动5寸、7寸的屏幕,NUC972弄来了一片,NUC972价格偏高资料又少,又弄来了一片全志F1C100S,还可以哦,没想到我还草到了F133样片!编译环境还在搭建中,破旧电脑还真搭建起来呢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

198

帖子

0

粉丝