盈鹏飞嵌入式最近发布的基于全志A527/T527的开发板-STK-X527,以下演示内容在开发板上运行通过,以下是盈鹏飞嵌入式STK-X527开发板的简要介绍:
产品功能:
产品特性 :
- 采用Allwinner公司Cortex-A55八核A527/T527处理器,运行最高速度为2.0GHZ(T527最高1.8GHZ);
- 支持Mali-G57 MC1 GPU,支持OpenGL ES 3.2/2.0/1.0, Valkan 1.1,OpenCL 2.0
- 支持4K/25fps H.264视频编码,支持4K/15fps MJPEG编码;
- 多格式4K/60fps视频解码 (H.265,H.264,VC-1, MPEG-1/2/4, VP8) ;
- 支持双屏异显;支持EDP 1.3,分辨率最高2.5K@60fps和4K@30fps;支持HDMI 2.0B, 分辨率最高4K@60fps;支持LVDS,分辨率最高1920x1080@60fps;支持MIPI DSI,分辨率最高2.5K@60fps(与LVDS复用);
- 支持1-4G Bytes LPDDR4X SDRAM;
- 支持EMMC 8G-64G大容量电子盘,可启动;
- 支持1路USB 3.0(与M.2接口复用);支持3路USB2.0 HOST和一路OTG(TYPE-C接口);
- 支持2路I2C(其中一路支持掉电唤醒)、2路PWM(应用于背光);
- 支持双路千兆以太网;
- 支持3G/4G通信;
- 支持2路UART(TTL)、支持1路RS485、支持双路CAN BUS(2.0B);
- 支持MIPI CSI - 2*4-lane/4*2-lane/ 4+2*2-lane;
- 支持M.2 SSD存储(仅支持PCIE X1;与USB 3.0接口复用);
- 操作系统的支持,可预装Android13/LINUX 5.15/Ubuntu 22.04;
- 尺寸为146X119MM
Mali硬件四大架构介绍:
Mali的四大架构之一:Utgard
第一代微架构Utgard(北欧神话人物:乌特加德)。这一代架构出来的比较早,主要是图形加速IP。可以追溯到2007年的mali-200。不过最让人惊讶的是mali-4xx系列,现在很多电视芯片都还在用这个IP。比如小米的智能电视,还有很多是mali-4xx系列的。
Utgard这一代vertex shader和fragment shader是分离的,arm官方支持的Opengl ES也只维护到2.0。所以Opengl ES 3.0及其以上要求的app是跑不了的。并且OpenCL在这一代中也是不支持的,因为这一代主打图形计算,不怎么支持通用计算。
移动端的GPU主要以基于tile的计算为主,mali的全系列(截止目前)都是基于tile的计算。基于tile的计算可以简单的认为,在进行计算的时候一张图会被划分成若干张小矩形,每个矩形可以认为是一个tile,然后对一个tile进行同时计算。
主要系列有:mali-200, mali-400, mali-450, mali-470
Mali的四大架构之二:Midgard
第二代微架构Midgard(北欧神话人物:米德加德)。Midgard这一代GPU开始属于同一着色器的架构,也就是上面说的vertex shader和fragment shader已经统一在一起了,相当于同一个shader计算单元可以处理多种着色器。当然也开始支持计算通用计算。特别是对OpenCL的支持,对通用计算有了很大的支持。OpenGLES 3.1虽然引入了compute shader,但是说起通用计算,OpenCL显然更加专业。
这个架构是基于128bit向量的,所以在编程的时候往往用4个float编程了能最大发挥其性能。当然,编译器也会把某些可以进行优化的计算合并成向量进行计算,不过最好在编码阶段自行优化。编译器编译的优化比较难以去把握。当然,也不建议用大于128bit的方式进行编程,最终需要编译器拆成多个数的运算,且每个数的位宽最大为128bit,如果编译器优化不好,反而会导致性能下降。
主要系列有:mali-t6xx, mali-t7xx, mali-t8xx
Mali的四大架构之三:Bifrost
第三代微架构Bifrost(北欧神话中连接天宫和大地的:彩虹桥)。由于这一代产品基本在2016年后发布的了,而OpenGLES在2016年后基本稳定了,所以相对于Midgard来说,在大方向上图形计算这块也没有多大的需要调整。
在Bifrost(Bifrost上更像是SIMT的模式,这里用SIMT表述也是我从多个文档资料推敲出来的)上会先把向量拆成标量,然后每个线程跑多维向量的第一维,因此对于三维向量 vec3向量最快只需要3个cycle,对于思维向量vec4最快只需要4个cycle。这里用了最快这个表述是因为并不是所有的指令都是单个cycle的。
当然,虽然bifrost架构是标量运算的,这是针对32bit的位宽来说的,如果是16bit位宽的计算,一个线程是可以在一个cycle内处理一个vec2的16bit数据的。因此在编程的时候,如果是8bit或者16bit的数据,用于应该考虑如何组织代码使得更有效的组合运算,例如16bit位宽的情况,尽量是用vec2,8bit位宽的尽量用vec4。
对于Bifrost,例如G76,一个shader core可以同时运行几十个线程,,从mali的资料显示,shader core一般由三个部分组成,ALU,L/S,TEXTURE三个主要模块。在G76上是8-wide wrap的,一般设置为3个ALU。(其余的型号可能不一样,例如G51/G72是4-wide wrap的,G72同样是3个ALU;G52跟G76一样,不过G52可配置成2个ALU的)
对于AI加速方面,部门系列也有一些指令修改,例如G52和G76都引入了int8 dot指令,该指令针对神经卷积网络的运算做了优化。
主要系列有:mali-g31, mali-g51, mali-g71, mali-g52, mali-g72, mali-g76
Mali的四大架构之四:Valhall
第四代微架构Valhall是2019年第二季度推出来的。该系列的是基于超标量实现的。对于G77,使用的时16-wide的wrap,单个shader core集成两个计算引擎。
主要系列有:mali-g57, mali-g77
GPU 驱动一般分为两部分:一小部分在 Linux 内核中,另外一大部分在 userspace,在 usercapce 的部分向下操作内核中的驱动,向上对应用层提供标准的 OpenGL 接口,这样各种图形显示相关的应用才能通过标准的 OpenGL API 进行图形渲染加速。
但是 mali GPU IP 提供商 Arm 公司只开放了内核部分驱动,而且这部分驱动还没有按照 linux kernel 的规范以 Drm 的框架去实现,所以它无法被 linux mainline 接受,还有一个更重要的部分,usersapce 部分,Arm 没有开源,只是以库的形式提供给购买了 mali GPU 授权的 SOC 厂商,比如 Rockchip,Amlogic。而且这套代码主要是为 Android 系统设计的,对 Debian、Ubuntu 这种系统的兼容性也不好。
如果想跑 mainline 的内核,基本就没法使用 GPU 加速了,这也是为什么我们目前看到的大部分开发板如果搭载了 mainline 内核,基本都不会有 GPU 加速功能,或者直接就不开图形显示功能。
有黑客们逆向了 Arm 发布的二进制库,然后重写了针对 Arm mali gpu 的开源驱动,最终在 Linux 5.2 发布的时候合并到了 mainline 中:针对 Mali-400/Mali-450 的驱动叫做 lima,针对 Mali-T6xx / Mali-T7xx / Mali-T8xx GPU 和 GXX 系列的叫做 panfrost。Usersacpe 部分的开源库叫做 mesa,对 mali gpu 的支持从 mesa 19.2 开始。
WESTON相关介绍
Weston是Wayland显示服务器协议的参考实现,同时也是Wayland的轻量级、示范性合成器
(compositor),通常用于展示Wayland的功能和测试用途。AW Buildroot SDK的显示服务默认使用Weston9.0.0drm后端。
T527 TINA SDK配置方式
Buildroot SDK中Weston的配置方式有以下几种:
启动参数
即启动 Weston 时命令所带参数,如–tty=1 或者–xwayland,位于/etc/init.d/S40weston,对应
SDK代码中位置为:
buildroot/buildroot‑202205/package/weston/resources/S40weston
weston.ini 配置文件
位于/etc/xdg/weston/weston.ini及/etc/xdg/weston/weston.ini.d/下的.ini文件,对应 SDK代码
中位置为:
buildroot/buildroot‑202205/package/weston/resources/xdg/weston/weston.ini
具体可以参考:https://fossies.org/linux/weston/man/weston.ini.man
weston 使能
要在 Buildroot 中使用 weston,请检查以下配置是否打开,这里有两种搭配方式来选择 Open‑GLES提供方,一种是Mali ddk+Valhall驱动,另一种是Mesa3D+Panfrost驱动。可通过如下命令来打开/关闭/保存相关宏:
#打开内核配置菜单
./build.sh menuconfig
#保存内核配置
./build.sh saveconfig
#打开buildroot配置菜单
./build.sh buildroot_menuconfig
#保存buildroot配置
./build.sh buildroot_saveconfig
Mali ddk+Valhall驱动
内核配置:
CONFIG_AW_GPU_TYPE=mali g57
buildroot 配置:
BR2_PACKAGE_WESTON=y
BR2_PACKAGE_WESTON_DEFAULT_DRM=y
BR2_PACKAGE_WESTON_DEMO_CLIENTS=y
BR2_PACKAGE_SUNXI_MALI_VALHALL=y
#上面默认开启的合成器(compositor)是drm,用户可以根据实际使用场景来更改,还有如下选项:
BR2_PACKAGE_WESTON_FBDEV
BR2_PACKAGE_WESTON_X11
#若想支持xayland特性,需要额外打开如下宏,并且在启动weston时加上 xwayland选项:
BR2_PACKAGE_XORG7=y
BR2_PACKAGE_XWAYLAND=y
BR2_PACKAGE_WESTON_XWAYLAND=y
Mesa3D+Panfrost驱动
内核配置
CONFIG_AW_DRM_PANFROST=y
CONFIG_AW_GPU_TYPE=NONE
buildroot配置:
#关闭BR2_PACKAGE_SUNXI_MALI_VALHALL
BR2_PACKAGE_WESTON=y
BR2_PACKAGE_WESTON_DEFAULT_DRM=y
BR2_PACKAGE_WESTON_DEMO_CLIENTS=y
#上面默认开启的合成器(compositor)是drm,用户可以根据实际使用场景来更改,还有如下选项:
BR2_PACKAGE_WESTON_FBDEV
BR2_PACKAGE_WESTON_X11
#若想支持xayland特性,需要额外打开如下宏,并且在启动weston时加上 xwayland选项:
BR2_PACKAGE_XORG7=y
BR2_PACKAGE_XWAYLAND=y
BR2_PACKAGE_WESTON_XWAYLAND=y
BR2_PACKAGE_LIBGLVND=y
BR2_PACKAGE_MESA3D=y
BR2_PACKAGE_MESA3D_NEW_VER=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST=y
BR2_PACKAGE_MESA3D_OPENGL_EGL=y
BR2_PACKAGE_MESA3D_OPENGL_ES=y
启动方式
自动启动
Buildroot在开启了weston之后,默认会增加weston的启动脚本,在文件系统开机之后自动运行
weston,具体可参考:
#SDK路径
buildroot/buildroot 202205/package/weston/resources/S40weston
#终端文件系统路径
/etc/init.d/S40weston
该脚本创建了基本的运行环境,然后启动weston,同时支持Xwayland,使得在weston下可以运行x的应用。
手动启动
手动启动方式可以参考S40weston脚本,导出基本环境变量,然后运行weston即可:
export XDG_RUNTIME_DIR="/tmp/wayland"
mkdir /tmp/wayland
chmod 0700 /tmp/wayland/
mkdir p /tmp/.X11 unix
weston backend=drm backend.so tty=1 xwayland &
具体配置
屏幕区分
Weston使用output(head) name区分屏幕设备。具体信息获取:
- 通过Weston启动log:
[00:09:17.145] DRM: head 'LVDS 1' found, connector 133 is connected
- 通过weston‑info工具查询:
# weston info
......
interface: 'zxdg_output_manager_v1', version: 2, name: 4
xdg_output_v1
output: 16
name: 'LVDS 1'
logical_x: 0, logical_y: 0
logical_width: 1280, logical_height: 800
......
鼠标样式及大小
Weston支持在weston.ini配置文件的shell段设置鼠标样式和大小,如:
[shell]
#Buildroot SDK支持comix/obsidian/xcursor/xcursor transparent等鼠标主题包,需要选中
对应的包,可以参考如下位置来
设置:
#ls /usr/share/cursors/xorg x11
#ComixCursors Black ComixCursors Slim Black ComixCursors Slim White
#ComixCursors Blue ComixCursors Slim Blue ComixCursors White
#ComixCursors Green ComixCursors Slim Green Obsidian
#ComixCursors Orange ComixCursors Slim Orange
#ComixCursors Red ComixCursors Slim Red
cursor theme=ComixCursors Orange
cursor size=24
状态栏相关配置
Weston支持在weston.ini配置文件的shell段设置状态栏的背景色、位置、缩放,以及在
launcher段设置快捷启动程序,如:
[shell]
#颜色格式为ARGB8888
# 0xffff0000 红
# 0xff00ff00 绿
# 0xff0000ff 蓝
# 0x00ffffff 完全透明
panel color=0xffff0000
#状态栏位置,可以设置为top|bottom|left|right|none,none为禁止
panel position=bottom
panel scale=4 # 缩放为4倍
[launcher]
#图标路径,用户根据实际情况放在喜欢的路径
icon=/usr/share/icons/utilities terminal.png
#快捷启动命令
path=/usr/bin/weston terminal
背景配置
Weston支持在weston.ini配置文件的shell段设置背景图案、颜色,如
[shell]
# 背景图案(壁纸)绝对路径 ,用户根据实际情况放在喜欢的路径
background image=/etc/xdg/weston/background.png
#可以设置为centered|scale|scale crop|tile
background type=tile
#颜色格式为ARGB8888,未设置背景图案时生效
background color=0xffff0000
待机及锁屏配置
Weston的超时待机时长可以在启动参数中配置,也可以在weston.ini的core段配置,如:
# idle time=0为禁止待机,单位为秒
weston backend=drm backend.so tty=1 idle time=0
或者
[core]
#20秒无操作后待机
idle time=20
Weston的锁屏可以在weston.ini的shell段配置,如:
[shell]
#禁止锁屏
locking=false
#解锁按钮图案,用户根据实际情况放在喜欢的路径
lockscreen icon=/usr/share/icons/lock.png
#锁屏界面背景,用户根据实际情况放在喜欢的路径
lockscreen=/usr/share/backgrounds/house.jpg
屏幕方向配置
Weston的屏幕显示方向可以在weston.ini的output段配置,如:
[output]
#根据实际环境填写,参考《屏幕区分》章节
name=LVDS 1
#可配置为normal|rotate 90|rotate 180|rotate 270|flipped|flipped 90|flipped 180|fli
pped 270
transform=rotate 90
分辨率及缩放配置
Weston的屏幕分辨率及缩放可以在weston.ini的output段配置,如:
[output]
name=LVDS 1
#需为屏幕支持的有效分辨率
mode=1280x800
#需为整数倍数,支持应用内部实现缩放
scale=2