丝滑的在RT-Smart用户态运行LVGL

部署运行你感兴趣的模型镜像

开发流程


1、RT-Smart 环境搭建

下载 RT-Smart 用户态应用代码:

1git clone https://github.com/RT-Thread/userapps.git

进入到 userapps 目录,克隆 RT-Thread rt-smart 分支

1git clone -b rt-smart https://gitee.com/rtthread/rt-thread.git

更详细环境配置请移步到—> RT-Thread-优雅の在D1S上运行RT-Smart

「Rb君」,公众号:RTThread物联网操作系统优雅的在D1S上运行RT-Smart

2、配置工具链

在 userapps/tools 目录下运行 get_toolchain.py 的脚本,会下载对应的工具链并展开到 userapps/tools/gun_gcc 目录。后面的工具链名称可以是 arm | riscv64。

这里以手上的 D1s 为例,D1s 是 RISCV-64 架构的,所以输入下面的命令:

1python3 get_toolchain.py riscv64

在 userapps 目录下,运行 smart-env.sh 配置工具链路径,目前支持的参数可以是 arm | riscv64

1source smart-env.sh riscv64

3、获取 lvgl 主线代码

进入到 userapps 目录,新建 media 文件夹来存放 lvgl 相关的代码,克隆 lvgl 主线代码到本地

1git clone https://github.com/lvgl/lvgl.git

4、内核驱动实现

显示部分:

这部分我们可以参考 qemu-vexpress-a9 中 drv_clcd.c 的实现方法。在用户态,要是想获取并操作 lcd,驱动至少需要实现:drv_clcd_init + drv_clcd_control 两个 ops 函数。

drv_clcd_control 中,我们需要对以下几种 cmd 进行处理:

  • RTGRAPHIC_CTRL_RECT_UPDATE:通知更新图形设备

  • RTGRAPHIC_CTRL_GET_INFO:获取 LCD 的基本信息,包括像素像素格式,分辨率等

  • FBIOGET_FSCREENINFO:获取 FrameBuffer 设备的固定参数信息。固定参数信息使用 struct fb_fix_screeninfo 结构体来描述

  • FBIOGET_VSCREENINFO:获取 LCD 的可变参数信息,包括屏幕的像素,尺寸等信息

触摸部分:

用户态要是想获取触摸芯片的坐标,底层驱动至少需要实现 touch_ops 的:probe + init + read_point,即探测,初始化,读取触摸设备的函数。

5、用户态接口对接

用户态目录结构如下,需要在 media/lvgl/ 目录下新建名为 lv_rtt_port 、packages 等文件夹。

1lvgl
 2
 3├── lv_rtt_port
 4
 5│   ├── SConscript
 6
 7│   ├── lv_conf.h
 8
 9│   ├── lv_port_disp.c
10
11│   └── lv_port_indev.c
12
13├── packages
14
15│   ├── LVGL-latest
16
17│   ├── lv_music_demo-latest
18
19│   └── SConscript
20
21├── SConscript
22
23├── SConstruct
24
25├── pkg_config.h
  • lv_rtt_port 是移植的关键部分对接程序,包括了显示,触摸接口,主要需要我们自己编写。

  • LVGL-latest 从 https://github.com/lvgl/lvgl上获取最新代码,不需要修改。

  • lv_music_demo-latest 是 lvgl 的 音乐播放器 demo,从 https://github.com/RT-Thread-packages/lv_demo_music.git 获取最新代码,不需要修改。

  • lv_conf.h 文件由 lvgl目录中的 lvgl_conf_template.h 修改而来。配置如下,具体可以按照自己的屏幕参数修改。

1#define LV_COLOR_16_SWAP    1
 2
 3#define LV_COLOR_DEPTH      32
 4
 5#define LV_USE_PERF_MONITOR 1
 6
 7/* music player demo */
 8
 9#define LV_USE_DEMO_RTT_MUSIC       1
10
11#define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1
12
13#define LV_FONT_MONTSERRAT_12       1
14
15#define LV_FONT_MONTSERRAT_16       1
16
17#define LV_COLOR_SCREEN_TRANSP      1

5.1、显示接口

核心是在 lv_rtt_port 中,而具体需要关注的文件就是 lv_port_disp.c 文件,触摸我们可以先不急着加,先将显示接口对接上。

在 RT-Thread 中,主要通过 rt_device_xxx 来操作 LCD 设备,首先通过 rt_device_find 函数查找 lcd 设备,找到设备后可以通过 device 句柄来操作 lcd 设备。

1/* LCD Device Init */
 2
 3device = rt_device_find("lcd");
 4
 5RT_ASSERT(device != RT_NULL);
 6
 7if (rt_device_open(device, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
 8
 9{
10
11    rt_kprintf("open lcd devce fail\n");
12
13    return;
14
15}
16
17rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info);
18
19rt_device_control(device, FBIOGET_FSCREENINFO, &fb_info);

用户态只要获取到 framebuffer 就可以进行对 lcd 进行操作了。值得注意的是,在用户态我们不能直接使用 RTGRAPHIC_CTRL_GET_INFO 返回的 framebuffer 变量,而是需要使用 FBIOGET_FSCREENINFO 得到 smem_start (地址空间的起始地址),因为分配地址空间的起始地址与长度将会被填充到 fb_fix_screeninfo 结构的 smem_start 和 smem_len 的两个变量中。

于是,我们就可以通过向 smem_start 地址中填充颜色数据的方式让 lcd 显示各种颜色了。

5.2、触摸接口

触摸接口需要关注的文件是 lv_port_indev.c 文件,主要通过 rt_device_find 查找 touch 设备,找到设备后可以通过 device 句柄来操作 touch 设备。

1#define POINT_NUMBER 1
 2
 3static rt_device_t ts;
 4
 5static struct rt_touch_data *read_data;
 6
 7ts = rt_device_find("touch");
 8
 9rt_device_open(ts, RT_DEVICE_FLAG_INT_RX);
10
11read_data = (struct rt_touch_data *)rt_calloc(POINT_NUMBER, sizeof(struct rt_touch_data) * POINT_NUMBER);

获取坐标函数在调用 rt_device_read 函数后,入参 read_data 中就保存了坐标信息,然后传递给 LVGL 的 lv_indev_data_t 结构体中即可。

1static bool touchpad_is_pressed(void)
 2
 3{
 4
 5    if (POINT_NUMBER == rt_device_read(ts, 0, read_data, POINT_NUMBER))
 6
 7    {
 8
 9        if (read_data->event == RT_TOUCH_EVENT_MOVE)
10
11        {
12
13            /* swap x and y */
14
15            rt_uint16_t tmp_x = read_data->x_coordinate;
16
17            rt_uint16_t tmp_y = read_data->y_coordinate;
18
19            /* restore data */
20
21            last_x = tmp_x;
22
23            last_y = tmp_y;
24
25            return true;
26
27        }
28
29    }
30
31    return false;
32
33}
34
35static void touchpad_get_xy(rt_int16_t *x, rt_int16_t *y)
36
37{
38
39    *x = last_x;
40
41    *y = last_y;
42
43}
44
45static void touchpad_read(lv_indev_drv_t *indev, lv_indev_data_t *data)
46
47{
48
49    if (touchpad_is_pressed())
50
51    {
52
53        data->state = LV_INDEV_STATE_PRESSED;
54
55        touchpad_get_xy(&data->point.x, &data->point.y);
56
57    }
58
59    else
60
61    {
62
63        data->state = LV_INDEV_STATE_RELEASED;
64
65    }
66
67}

6、最终效果

这里以柿饼派M7为例,将编译出来的用户态可执行文件打包,使用 xfel 工具烧录到板子上的 EMMC 中。在串口终端输入可执行文件名称来启动用户态程序。

797afa51b54af145e1743f076c2cba45.png

最终效果如下,在屏幕分辨率为 480*272,RGB565 32位色深下,lvgl 在用户态中的帧率整体保持在 60fps,满足了使用需求。

918249a07784a111898e94a0f92b8a7e.png

7、获取资料

  • Rbb666/RT-Smart-UserAPP

https://github.com/Rbb666/RT-Smart-UserAPP

  • bsp/allwinner/d1s · RT-Thread/rt-thread

https://gitee.com/rtthread/rt-thread/tree/rt-smart/bsp/allwinner/d1s

有用的话记得点星星~

————————————————

版权声明:本文为RT-Thread论坛用户「Rb君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://club.rt-thread.org/ask/article/e8bc90918bd055eb.html


2022RDC RT-Thread开发者大会

一年一度的 RDC RT-Thread 开发者大会正式启动报名,本届大会以 " 聚势而强,乘势而上 " 为主题,并将于 2022年12月25日在上海丽昂豪生大酒店举行。

d2aace9f9bd1aaba67dd48d979343f40.png

立即扫码报名

你可以添加微信17775983565为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

71ac0f485d9e769c9b103b9b43a5f1c3.gif

爱我就给我点在看13b72e2684892b2342fce5dc41f4fd8b.gif

👇点击阅读原文报名

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl 中显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的一个回调函数的机制,将各个事件与对应的操作所绑定起来,当条时对应的条的回调函数就会被触发,那么就会执行条回调函数的内容,当动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便,与 RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本与 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值