Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl

这篇具有很好参考价值的文章主要介绍了Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇文章《Melis4.0[D1s]:5.测试笔记 - 修改显示测试源码》可以通过C代码控制显示,就可以移植lvgl。目前只移植显示部分,没有按键或者触摸输入。

1.下载lvgl源码到《D1s-Melis/ekernel/drivers/hal/test/disp2》目录

我使用的源码是https://github.com/lvgl/lv_port_pc_eclipse,克隆到 《D1s-Melis/ekernel/drivers/hal/test/disp2》 目录。然后在 《D1s-Melis/ekernel/drivers/hal/test/disp2/lv_port_pc_eclipse》 目录下建立一个Makefile,把全部的C文件都包含进来编译的。这是因为lvgl的所有非必要的C文件都可以通过宏定义配置是否编译。例如lv_bmp.c里面的代码是否编译,取决于 宏定义 LV_USE_BMP
Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl
为了简单起见,很多非必要的组件我都没有包含进来,详情见 lv_conf.h(完整内容点击超链接) 。

1.1 修改Makefile

先在《disp2》目录下的Makefile(完整内容点击超链接)把子目录《disp2/lv_port_pc_eclipse》包含进来:

obj-y += lv_port_pc_eclipse/

再将《disp2/lv_port_pc_eclipse》目录下的Makefile(完整内容点击超链接)改为下面内容(节选):

obj-y += lv_main.o

obj-y += \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.o \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_argb.o \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.o \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.o \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb.o \
    lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.o \
    lvgl/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.o \
    lvgl/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.o \
    lvgl/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.o \
    lvgl/demos/benchmark/lv_demo_benchmark.o \
    ......

1.2 快速测试Makefile修改是否有效

把主函数中和硬件相关的显示,输入等初始化代码屏蔽,main改为lv_main,并把lv_main变成一个命令:

int lv_main(int argc, char **argv)
{
  //(void *)argc; /*Unused*/  //(void)argv; /*Unused*/
  printf("lv_main.");
#if   0
  /*Initialize LVGL*/
  lv_init();

  /*Create a default group for keyboard navigation*/
  lv_group_set_default(lv_group_create());

  /*Initialize the HAL (display, input devices, tick) for LVGL*/
  hal_init();
.....
#endif
  return 0;
}
static lv_disp_t * hal_init(void  )
{
#if 0
    disp_layer_cfg_def();

    static lv_disp_draw_buf_t draw_buf;

    lv_disp_draw_buf_init(&draw_buf, disp_buf1, disp_buf2, HOR_RES * VER_RES);

    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
......   
    lv_disp_drv_register(&disp_drv);
#endif
	lv_disp_t * disp = NULL;
  	return disp;
}
FINSH_FUNCTION_EXPORT_ALIAS(lv_main, lv_main, lv_main );

编译通过,烧录测试。输入help,可以看到lv_main命令,输入lv_main,打印“lv_main”:

msh />help
RT-Thread shell commands:
......
lv_main          - lv_main
......
msh />lv_main
lv_main

2.移植刷新显示内存函数dummy_flush_cb

上一篇文章《Melis4.0[D1s]:5.测试笔记 - 修改显示测试源码》的《2.disp_mem源码阅读》知道,只要往显存地址 mem = g_disp_mm[mem_id].info_base里面填写像素数据,就可以得到我们要显示的内容,把这个地址传给一个全局变量,在lvgl中使用这个全局变量即可。
于是我们在disp_mem源码所在的C文件声明一个全局变量:

uint32_t * g_p_mem_base;

把显存地址传给g_p_mem_base:

g_p_mem_base = g_disp_mm[mem_id].info_base;

Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl
有了这个地址,我们就可以编写自己的显示回调函数:
Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl

#define HOR_RES 800
#define VER_RES 480
extern  uint32_t * g_p_mem_base;
#define line_length 800 * sizeof(rt_uint32_t) / 4
static void dummy_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*Truncate the area to the screen*/
    int32_t act_x1 = area->x1 < 0 ? 0 : area->x1;
    int32_t act_y1 = area->y1 < 0 ? 0 : area->y1;
    int32_t act_x2 =        area->x2 > (int32_t)HOR_RES - 1 ? (int32_t)HOR_RES - 1 : area->x2;
    int32_t act_y2 =        area->y2 > (int32_t)VER_RES - 1 ? (int32_t)VER_RES - 1 : area->y2;

    lv_coord_t w = (act_x2 - act_x1 + 1);

    long int location = 0;

    /* 32 bit per pixel */
    uint32_t *fbp32 = (uint32_t *)g_p_mem_base;
    uint32_t y;
    for (y = act_y1; y <= act_y2; y++)
    {
        location = act_x1 + y * line_length;
        rt_memcpy(&fbp32[location], (uint32_t *)color_p, (act_x2 - act_x1 + 1) * 4);
        color_p += w;
    }   
        
    lv_disp_flush_ready(disp_drv);
}
static lv_color_t disp_buf1[HOR_RES * VER_RES];
static lv_color_t disp_buf2[HOR_RES * VER_RES];
int disp_layer_cfg_def(void);
static lv_disp_t * hal_init(void  )
{
#if 1
    disp_layer_cfg_def();

    static lv_disp_draw_buf_t draw_buf;

    lv_disp_draw_buf_init(&draw_buf, disp_buf1, disp_buf2, HOR_RES * VER_RES);

    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &draw_buf;
    disp_drv.flush_cb = dummy_flush_cb;
    disp_drv.hor_res = HOR_RES;
    disp_drv.ver_res = VER_RES;
    lv_disp_drv_register(&disp_drv);
#endif
	lv_disp_t * disp = NULL;
  return disp;
}

再make编译,通过。

3.创建一个定时器调用lvgl心跳lv_tick_inc()

Melis使用rt-thread内核,rt-thread的节拍由宏定义 CONFIG_HZ决定:

#define RT_TICK_PER_SECOND  CONFIG_HZ

CONFIG_HZ通过 命令 make menuconfig 配置:
Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl
这里是200Hz,也就是一个时钟节拍为5ms。

static rt_timer_t timer1;      
//      lv_tick_inc(5);
static lv_disp_t * hal_init(void  )
{
#if 1
    /* 创建定时器1  周期定时器 */
    timer1 = rt_timer_create("timer1", 
    						lv_tick_inc,	//	回调函数
                             5,				//	回调函数的传入参数
                             1,	//	一个时钟节拍调用一次回调函数,具体是5ms
                             RT_TIMER_FLAG_PERIODIC);
    /* 启动定时器1 */
    if (timer1 != RT_NULL)
        rt_timer_start(timer1);

    disp_layer_cfg_def();

......
#endif
	lv_disp_t * disp = NULL;
  return disp;
}

lv_timer_handler()调用间隔是10ms,而lv_tick_inc()调用间隔是5ms,这样比较合理。

4.pack打包出错:

root@SK-JNTINRTMRDZW:/home/book/D1s-Melis-master# pack
INFO: temporarily Enter pack directory: "/home/book/D1s-Melis-master/out/d1s-mq/image", will be back when terminated
INFO: copying config/boot binary/phoenix plugin files
/home/book/D1s-Melis-master/tools/phoenixplugin/Tools.fex
......
......
INFO: running the function do_finish "sys_partition_nor.bin"

partitation file Path=/home/book/D1s-Melis-master/out/d1s-mq/image/sys_partition_nor.bin
mbr_name file Path=/home/book/D1s-Melis-master/out/d1s-mq/image/sunxi_mbr_nor.fex
download_name file Path=/home/book/D1s-Melis-master/out/d1s-mq/image/dlinfo.fex

ERROR: dl file melis_pkg_nor.fex size too large
ERROR: filename = melis_pkg_nor.fex
ERROR: dl_file_size = 2272 sector
ERROR: part_size = 2048 sector
ERROR: update mbr file fail
ERROR: update_mbr failed

《melis_pkg_nor.fex》文件比分配的空间要大,装不下。
修改分区文件《D1s-Melis/projects/d1s-mq/configs/sys_partition_nor.fex》第44,45行:
Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl

;---------------------------------------------------------------------------------------------------------
; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串
;---------------------------------------------------------------------------------------------------------


;--------------------------------------------------------------------------------------------------
;                                   固件下载参数配置
;--------------------------------------------------------------------------------------------------
;****************************************************
;    mbr的大小, 以Kbyte为单位
;****************************************************
[mbr]
size = 16

;********************************************************************************************************
;                                              分区配置
;
;
;  partition 定义范例:
;    [partition]                ;  //表示是一个分区
;    name        = USERFS2      ; //分区名称
;    size        = 16384        ; //分区大小 单位: 扇区.分区表示个数最多2^31 * 512 = 2T
;    downloadfile = "123.fex"   ; //下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径
;    keydata     = 1            ; //私有数据分区,重新量产数据将不丢失
;    encrypt     = 1            ; //采用加密方式烧录,将提供数据加密,但损失烧录速度
;    user_type   = ?            ; //私有用法
;    verify      = 1            ; //要求量产完成后校验是否正确
;
; 注:1、name唯一, 不允许同名
;     2、name最大12个字符
;     3、size = 0, 将创建一个无大小的空分区
;     4、为了安全和效率考虑,分区大小最好保证为16M字节的整数倍
;********************************************************************************************************
[partition_start]

;[partition]
;    name         = boot
;    size         = 6656
;    downloadfile = "boot.fex"
;    user_type    = 0x8000

[partition]
    name         = bootA
    ;size         = 2048
    size         = 4096
    downloadfile = "melis_pkg_nor.fex"
    user_type    = 0x8000

;[partition]
;    name         = bootB
;    size         = 6144
;    downloadfile = "melis_pkg_nor.fex"
;    user_type    = 0x8000

;[partition]
;    name         = env
;    size         = 8
;    downloadfile = "env.fex"
;    user_type    = 0x8000

;[partition]
;    name         = env-redund
;    size         = 8
;    downloadfile = "env.fex"
;    user_type    = 0x8000

;rootfs 7616 sector in rootfs.ini make 7616*1024/512=15232 sectors for it.
[partition]
    name         = ROOTFS
    size         = 10240
    ;size         = 20336
    downloadfile = "data_udisk.fex"
    user_type    = 0x8000

[partition]
    name         = UDISK
    ;size = flash size - (boot0 + mbr) size - env - env-redund - ROOTFS
    ;8(or 16) * 1024 * 2 - 64 * 2 - 5632 - 8 - 8 - 10240
    ;size         = 20336
    ;downloadfile = "data_udisk.fex"
    user_type    = 0x8000

再次pack打包成功。烧录运行,输入lv_main命令:

msh />lv_main

Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl

5.设置开机启动

修改《startup.sh》(位于目录 D1s-Melis/projects/d1s-mq/data/UDISK/startup.sh):

echo "Execute startup script begin.............."

#insmod d:\mod\display.mod
#insmod d:\mod\orange.mod
#insmod d:\apps\desktop.mod
lv_main
echo "...............Execute startup script end"

6.源码下载

源码没有startup.shmelis_pkg_nor.fex ,这两个文件的修改比较简单。
源码链接:https://gitee.com/huangweide001/linux-d1-h-test/tree/master/disp2
源码包含了可以直接烧录的img文件 melis_d1s-mq_uart0_8Mnor_lvgl.img

7.lvgl与播放视频混合显示

请阅读下一篇文章:《Melis4.0[D1s]:9.测试cedar多媒体解码库,视频和lvgl混合显示》。文章来源地址https://www.toymoban.com/news/detail-407857.html

到了这里,关于Melis4.0[D1s]:6.mango-MQ-R基于Melis移植lvgl的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【2023unity游戏制作-mango的冒险】-7.玩法实现

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity常用API 🅰️ 让CSDN的浪漫弥漫女神节 💕 ⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随 ⭐【2023unity游戏制作-

    2024年02月10日
    浏览(36)
  • 【2023unity游戏制作-mango的冒险】-2.开始画面API制作

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :游戏制作 🎶 版本: 为 Ltp 2021年版本的unity 🎶 类型: 简单2D类冒险游戏 🎶 目的: 熟悉掌握基本unityAPI 🎶 视频教程: 【2023小白狂飙unity2D冒险类游戏制作【man

    2024年02月01日
    浏览(48)
  • 基于MySql,Redis,Mq,ES的高可用方案解析

    本文将接着前文 1w5字详细介绍分布式系统的那些技术方案 文章基础上,进行实际的案例解析  高可用对于当下的系统而言,可以说是一个硬指标,常年专注于业务开发的我们,对于高可用最直观的感觉可能就是祈祷应用不要出问题,不要报错;即便有问题,也最好不是我们

    2024年02月03日
    浏览(40)
  • 基于51单片机的MQ-5天然气监测报警系统设计

    基于51单片机的天然气监测报警系统设计 基于51单片机的MQ-5天然气监测报警系统设计 仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0008 结合实际情况,基于51单片机设计一个天然气监测报警统设计。该系统应满足的功能要求为: 实物功能: 本设计由51单片机

    2024年01月17日
    浏览(55)
  • 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)_stm32移植freertos(1)

    直接意识代码: 这是我们大脑最希望的添加代码方式,很显然他是 错的 , 两个任务之间产生了相互的影响 ,使得两个任务都执行错误,这种思想在 裸机开发 中肯定是 错的 ,但是在我们的 RTOS 中他就可以是 对的 。 任务型代码: 这是 独立的两个任务内容 ,我们只需要把

    2024年04月10日
    浏览(109)
  • 基于STM32F030驱动MQ7一氧化碳传感器

    了解一氧化碳传感器 MQ7 的驱动原理,通过配置 STM32F030 的GPIO及外设ADC和DMA,采集一氧化碳浓度数据。 MQ-7气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。采用高低温循环检测方式低温(1.5v加热)检测一氧化碳,高温(5.0v加热)清洗低温时吸附的

    2023年04月26日
    浏览(53)
  • 基于Quartus Prime平台FPGA关于VGA显示的模块化设计:VGA八种单色屏1s切换显示、横条纹、竖条纹、棋盘格显示、显示模式按键可调、数码管显示单色屏序号

    VGA(Video Graphics Array)是一种显示接口标准,它最初由IBM于1987年推出。VGA协议定义了计算机视频输出信号的格式和特性。它主要用于连接计算机和显示器之间的传输,实现图像和视频的显示。 VGA协议支持最高分辨率为640x480像素,色彩深度为16位色(即65,536种颜色)。它使用模

    2024年02月03日
    浏览(51)
  • 基于STM32和MQ-2传感器的物联网友好型烟雾报警系统

    基于STM32和MQ-2传感器的物联网友好型烟雾报警系统是一种用于检测室内烟雾并及时报警的智能设备。 本系统利用STM32微控制器作为主控制单元,通过MQ-2传感器实时监测室内烟雾浓度,并通过无线通信模块将数据传输到云端服务器,实现远程监控和报警功能。 以下是该系统的

    2024年01月15日
    浏览(63)
  • 基于嵌入式linux的OpenSSL源码移植(基于arm64)

    SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。

    2024年02月11日
    浏览(67)
  • 全志ARM926 Melis2.0系统的开发指引④

    本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。 打包固件是下载前的最后一步。系统应用程序、驱动编写完成,经过编译得到输出文件,加上各种中 间件、资源文件、配置

    2024年02月07日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包