本文来源电子发烧友社区,作者:zealsoft, 帖子地址:https://bbs.elecfans.com/jishu_2307845_1_1.html
感谢“电子发烧友网”和飞凌嵌入式公司提供了本次OKA40i-C开发板的评测机会。上次我们介绍了视频监控的测试,今天来介绍一下轻量级图形界面库LVGL的移植与测评。
感谢“电子发烧友网”和飞凌嵌入式公司提供了本次OKA40i-C开发板的评测机会。上次我们介绍了视频监控的测试,今天来介绍一下轻量级图形界面库LVGL的移植与测评。
一、LVGL源代码下载
OKA40i开发板官方提供了Qt作为图形界面开发工具。不过对于简单的用户界面程序,Qt有点杀鸡用牛刀的意思。今天介绍一下轻量级的图形界面库LVGL。LVGL的项目作者是来自匈牙利首都布达佩斯的 Gábor Kiss-Vámosi。它自带着接近三十多种小组件,动画和操作非常流畅,同时配置要求很低,再加上开源和免费,使得它迅速流行起来,AliOSThings甚至把它作为默认的图形界面库。
在LVGL的github网站上可以下载源代码(https://github.com/lvgl/),在LVGL的官方仓库中包括lv_port_linux_frame_buffer,它包括了在Linux下移植所需要的所有代码。这个仓库会链接到lvgl和lv_drivers两个仓库,所以一定要用gitclone的方式下载,不要采用打包成zip的方式。lv_demos这仓库是不需要的,因为例程已经都包括在lvgl仓库里面了。如果github下载太慢,可以使用gitee的镜像:https://gitee.com/mculover666/lv_port_linux_frame_buffer.git。
二、配置LVGL
1、修改makefile
需要从makefile中删除-Wshift-negative-value这个编译选项,因为我们的编译器不支持,同时加上-std=c99这个选项,因为程序在for循环中使用了C99语法。下面是修改前后的编译选项对比。
2、修改lvgl源代码
由于我们的编译器不支持PRIX32这个常量的定义,需要修改lvglsrcdrawswlv_draw_sw_letter.c文件,将其中一句log注释掉:
也可以把这句改为:
- LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+X%", letter);
3、修改内存相关选项
LVGL默认是使用基于TLSF 的内存管理算法,不过它开的缓冲区对于我们的屏幕而言显然太小了,需要修改lv_conf.h中的定义LV_MEM_CUSTOM 为 1,否则运行时会崩溃。定义LV_MEM_CUSTOM 为 1表示采用标准C语言的分配内存函数。
4、显示设置
显示输出方面我们还是通过HDMI接口输出到智能电视。LVGL支持通过直接访问显示缓冲区(framebuffer)和SDL等多种方式进行输出。我们此次通过framebuffer输出,而且我们的输出设备是dev/fb0,所以我们不需要修改任何配置,默认配置(lv_drv_conf.h)如下:
4、增加鼠标支持
输入采用USB鼠标。使用下面的命令可以看到当前系统有哪些输入设备:
- cat /proc/bus/input/devices
输出结果如下:
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ths"P: Phys=sunxiths/input0S: Sysfs=/devices/virtual/input/input0U: Uniq=H: Handlers=event0B: PROP=0B: EV=9B: ABS=100 0I: Bus=0019 Vendor=0001 Product=0001 Version=0100N: Name="sunxi-keyboard"P: Phys=sunxikbd/input0S: Sysfs=/devices/virtual/input/input1U: Uniq=H: Handlers=kbd event1B: PROP=0B: EV=3B: KEY=40040 0 0 10000000I: Bus=0019 Vendor=0001 Product=0001 Version=0100N: Name="sunxi-keypad"P: Phys=Keypad/input2S: Sysfs=/devices/virtual/input/kp0U: Uniq=H: Handlers=sysrq kbd event2B: PROP=0B: EV=3B: KEY=ffffffff fffffffeI: Bus=0019 Vendor=0001 Product=0001 Version=0100N: Name="axp22-powerkey"P: Phys=m1kbd/input2U: Uniq=H: Handlers=kbd event3B: PROP=0B: EV=7B: KEY=100000 0 0 0B: REL=0I: Bus=0003 Vendor=2717 Product=5016 Version=0110N: Name="MOSART Semi. Mi Wireless Mouse Lite"P: Phys=usb-sunxi-ohci-1/input0S: Sysfs=/devices/soc.0/1c1c000.ohci2-controller/usb4/4-1/4-1:1.0/input/input4U: Uniq=H: Handlers=sysrq kbd event4B: PROP=0B: EV=120013B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffeB: MSC=10B: LED=7I: Bus=0003 Vendor=2717 Product=5016 Version=0110N: Name="MOSART Semi. Mi Wireless Mouse Lite"P: Phys=usb-sunxi-ohci-1/input1S: Sysfs=/devices/soc.0/1c1c000.ohci2-controller/usb4/4-1/4-1:1.1/input/input5U: Uniq=H: Handlers=kbd mouse0 event5B: PROP=0B: EV=10001fB: KEY=3007f 0 0 0 0 483ffff 17aff32d bf544446 0 0 1f0001 120f93 8b17c000 677bfa d941dfed 9ed680 4400 0 10000002B: REL=1c3B: ABS=1f01 0B: MSC=10
由于我们在开发板的两个USB口都曾经使用过USB鼠标,所以我们看到两个USB鼠标设备,分别对应event4和event5。我们可以用evtest命令测试到底哪个设备是当前使用的。OKA40i开发板上包括了evtest,可以进行输入设备的测试。经过测试,我们发现event5对应的设备是我们目前连接的鼠标。
# evtestNo device specified, trying to scan all of /dev/input/event*Available devices:/dev/input/event0: sunxi-ths/dev/input/event1: sunxi-keyboard/dev/input/event2: sunxi-keypad/dev/input/event3: axp22-powerkey/dev/input/event4: MOSART Semi. Mi Wireless Mouse Lite/dev/input/event5: MOSART Semi. Mi Wireless Mouse LiteSelect the device event number [0-5]: 5Input driver version is 1.0.1Input device ID: bus 0x3 vendor 0x2717 product 0x5016 version 0x110Input device name: "MOSART Semi. Mi Wireless Mouse Lite"Supported events:Event type 0 (EV_SYN)Event type 1 (EV_KEY)Event code 1 (KEY_ESC)Event code 28 (KEY_ENTER)Event code 74 (KEY_KPMINUS)……Event code 592 (KEY_BRIGHTNESS_MIN)Event code 593 (KEY_BRIGHTNESS_MAX)Event type 2 (EV_REL)Event code 0 (REL_X)Event code 1 (REL_Y)Event code 6 (REL_HWHEEL)Event code 7 (REL_DIAL)Event code 8 (REL_WHEEL)Event type 3 (EV_ABS)Event code 32 (ABS_VOLUME)Value 0Min 0Max 896Event code 40 (ABS_MISC)Value 0Min 0Max 255Event code 41 (?)Value 0Min 0Max 255Event code 42 (?)Value 0Min 0Max 255Event code 43 (?)Value 0Min 0Max 255Event code 44 (?)Value 0Min 0Max 255Event type 4 (EV_MSC)Event code 4 (MSC_SCAN)Key repeat handling:Repeat type 20 (EV_REP)Repeat code 0 (REP_DELAY)Value 400Repeat code 1 (REP_PERIOD)Value 80Properties:Testing ... (interrupt to exit)Event: time 1664272853.352702, type 2 (EV_REL), code 0 (REL_X), value 32Event: time 1664272853.352702, type 2 (EV_REL), code 1 (REL_Y), value -19Event: time 1664272853.352702, -------------- SYN_REPORT ------------Event: time 1664272853.368699, type 2 (EV_REL), code 0 (REL_X), value 12Event: time 1664272853.368699, type 2 (EV_REL), code 1 (REL_Y), value -14Event: time 1664272853.368699, -------------- SYN_REPORT ------------Event: time 1664272853.372717, type 2 (EV_REL), code 0 (REL_X), value 3Event: time 1664272853.372717, type 2 (EV_REL), code 1 (REL_Y), value -8Event: time 1664272853.372717, -------------- SYN_REPORT ------------Event: time 1664272853.384737, type 2 (EV_REL), code 0 (REL_X), value -9Event: time 1664272853.384737, type 2 (EV_REL), code 1 (REL_Y), value 1Event: time 1664272853.384737, -------------- SYN_REPORT ------------Event: time 1664272853.388724, type 2 (EV_REL), code 0 (REL_X), value -9Event: time 1664272853.388724, type 2 (EV_REL), code 1 (REL_Y), value 7Event: time 1664272853.388724, -------------- SYN_REPORT ------------Event: time 1664272853.400736, type 2 (EV_REL), code 0 (REL_X), value -8Event: time 1664272853.400736, type 2 (EV_REL), code 1 (REL_Y), value 14Event: time 1664272853.400736, -------------- SYN_REPORT ------------
修改lv_drv_conf.h中EVDEV所对应的设备名为:"/dev/input/event5"。这样鼠标就可以正常工作了。
5、修改main.c
在main.c根据自己使用的屏幕修改分辨率:
-
disp_drv.hor_res = 1980; // 原来是800
disp_drv.ver_res = 1080; // 原来是480
一、编译与测试
1、Widgets示例
要使用LVGL的官方测试例Widgets,首先确保lv_conf.h中的定义的LV_USE_DEMO_WIDGETS,然后确认在main.c中调用了lv_demo_widgets()。
2、Benchmark示例
LVGL的官方测试例Benchmark可以用来测试显示性能。
完整的测试结果如下:
LVGL v8.3.0Benchmark (in csv format)Weighted FPS: 69Opa. speed: 88%Rectangle,105Rectangle + opa,54Rectangle rounded,96Rectangle rounded + opa,53Circle,60Circle + opa,28Border,134Border + opa,132Border rounded,139Border rounded + opa,130Circle border,55Circle border + opa,50Border top,144Border top + opa,144Border left,133Border left + opa,138Border top + left,140Border top + left + opa,137Border left + right,145Border left + right + opa,133Border top + bottom,143Border top + bottom + opa,144Shadow small,63Shadow small + opa,59Shadow small offset,64Shadow small offset + opa,55Shadow large,38Shadow large + opa,36Shadow large offset,36Shadow large offset + opa,36Image RGB,45Image RGB + opa,29Image ARGB,35Image ARGB + opa,31Image chorma keyed,41Image chorma keyed + opa,31Image indexed,25Image indexed + opa,22Image alpha only,27Image alpha only + opa,23Image RGB recolor,30Image RGB recolor + opa,22Image ARGB recolor,25Image ARGB recolor + opa,22Image chorma keyed recolor,26Image chorma keyed recolor + opa,22Image indexed recolor,20Image indexed recolor + opa,18Image RGB rotate,35Image RGB rotate + opa,21Image RGB rotate anti aliased,11Image RGB rotate anti aliased + opa,10Image ARGB rotate,33Image ARGB rotate + opa,27Image ARGB rotate anti aliased,10Image ARGB rotate anti aliased + opa,9Image RGB zoom,57Image RGB zoom + opa,35Image RGB zoom anti aliased,16Image RGB zoom anti aliased + opa,14Image ARGB zoom,47Image ARGB zoom + opa,39Image ARGB zoom anti aliased,13Image ARGB zoom anti aliased + opa,12Text small,157Text small + opa,154Text medium,151Text medium + opa,155Text large,158Text large + opa,154Text small compressed,0Text small compressed + opa,0Text medium compressed,0Text medium compressed + opa,0Text large compressed,0Text large compressed + opa,0Line,75Line + opa,76Arc think,53Arc think + opa,53Arc thick,52Arc thick + opa,50Substr. rectangle,6Substr. rectangle + opa,0Substr. border,0Substr. border + opa,0Substr. shadow,0Substr. shadow + opa,0Substr. image,0Substr. image + opa,0Substr. line,2Substr. line + opa,1Substr. arc,49Substr. arc + opa,50Substr. text,4Substr. text + opa,4
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
飞凌
+关注
关注
0文章
134浏览量
16112
发布评论请先 登录
相关推荐
【飞凌嵌入式OK3588J-C开发板体验】OK3588J-C开发板开箱评测
很高兴收到飞凌嵌入式提供的OK3588J-C开发板,这是瑞芯微最新的8K旗舰8核SOC,非常适合用来做机器视觉,AI,语音识别,图像处理。
下面来看看OK3588J-
发表于 12-04 15:23
【飞凌嵌入式OK527N-C开发板体验】- 1. 开箱
周三左右就收到了快递,一直忙其他的事情,没时间弄这个,就拖到周末了。
首先发个开箱贴,记录下。
外包装,盒子比想象的要大不少。
附带飞凌的产品手册,里面有很多飞凌的
发表于 07-11 21:24
【飞凌嵌入式OK527N-C开发板体验】- 开箱
周三左右就收到了快递,一直忙其他的事情,没时间弄这个,就拖到周末了。
首先发个开箱贴,记录下。
外包装,盒子比想象的要大不少。
附带飞凌的产品手册,里面有很多飞凌的
发表于 06-30 23:04
如何在飞凌嵌入式T113-i开发板的Buildroot中移植MQTT协议?
新功能。本篇文章,小编就以在Buildroot移植MQTT协议为例为大家介绍。
配置文件介绍
首先了解一下在Buildroot中移植功能时涉及到的配置文件。
查看飞凌嵌入式OK113
发表于 02-04 11:27
如何在飞凌嵌入式T113-i开发板的Buildroot中移植MQTT协议?
飞凌嵌入式OK113i-S开发板上市一段时间以来收获了很多关注,也成为了许多客户项目选型的优质之选。在实际的项目开发中,工程师朋友们可能会需
飞凌嵌入式全志T113-i开发板的休眠及唤醒操作
飞凌嵌入式OK113i-S开发板支持两种休眠方式:freeze和mem。这两种方式可以通过/sys/power/state文件节点进行操作,用户可以通过在该文件节点写入freeze或m
发表于 01-17 09:29
【飞凌 OK113i-C 全志T113-i开发板】WiFi和以太网络的使用
WiFi和以太网络的使用飞凌这块t113-t开发板,板载了一块WiFi+蓝牙的模块,以及千兆一台网络,出厂已经支持了WiFi驱动,且在之前的实验中已经打开了wifi模块的功能,并手动扫描链接了AP
发表于 12-27 09:57
评论