【附网盘资料--开箱即用】嵌入式Linux移植LVGL(V8)支持tslib触摸库Demo

演示

项目简介 

此项目用到的是正点原子的IMX6U开发板(阿尔法)通过移植了LVGL和tslib触摸库之后跑了其demo文件中函数lv_demo_widgets()的效果。

网上讲LVGL和tslib如何移植的文章多如牛毛,笔者能力有限,只讲讲本项目中一些需要注意和移植lvgl后修改了的一些地方。

读者完全可以在下载完笔者的项目后,自己参照网上的资料进行快速学习。

Hal和LinkSDK分别是开发板上的一些硬件配置和连接阿里云的SDK,这两部分没有用到,不需要去管它。重点关注红框中的文件。

LVGL支持tslib

makefile文件中需要包含tslib的库路径,这里简单提下,重点还是参考项目中的Makefile 

# tslib
TSLIB_DIR = /home/txj/tools/tslib
TSLIB_INC = -I$(TSLIB_DIR)/include
TSLIB_LIB = -L$(TSLIB_DIR)/lib -lts

修改lv_drivers/indev/evdev.c文件让lvgl支持tslib

/**
 * @file evdev.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include "evdev.h"
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#include <tslib.h>

/**********************
 *  STATIC VARIABLES
 **********************/
int evdev_fd;
int evdev_root_x;
int evdev_root_y;
int evdev_button;
int evdev_key_val;
struct tsdev *ts;
struct ts_sample samp;
/**
 * Initialize the evdev interface
 */
void evdev_init(void)
{
    ts = ts_setup(NULL, O_RDONLY | O_NONBLOCK);
    if (!ts)
    {
        perror("ts_setup");
        exit(1);
    }
    evdev_root_x = 0;
    evdev_root_y = 0;
    evdev_button = LV_INDEV_STATE_REL;
}

/**
 * Get the current position and state of the evdev
 * @param data store the evdev data here
 */
void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
  //当获取到触摸时将读取到的点的坐标以及状态赋值给临时变量
  while(ts_read(ts, &samp, 1) > 0)
  {
    evdev_root_x = samp.x ;
    evdev_root_y = samp.y ;
  }
  if(0 == samp.pressure)
    evdev_button = LV_INDEV_STATE_REL ;
  else
    evdev_button = LV_INDEV_STATE_PR ;
  //将变量注册到LVGL输入设备接口的环境中
  data->point.x = evdev_root_x ;
  data->point.y = evdev_root_y ;
  data->state = evdev_button ;
  //坐标限幅
  if(data->point.x < 0)
     data->point.x = 0;
  if(data->point.y < 0)
     data->point.y = 0;
  if(data->point.x >= drv->disp->driver->hor_res)
     data->point.x = drv->disp->driver->hor_res - 1;
  if(data->point.y >= drv->disp->driver->ver_res)
     data->point.y = drv->disp->driver->ver_res - 1;

    // printf("x = %d\n", data->point.x);
    // printf("y = %d\n", data->point.y);
  return ;
}

main.c

#include "app_main.h"

#define DISP_BUF_SIZE (800*480)

int main(void)
{
    printf("This is a SmartHome Demo!\n\r");
    /*LittlevGL init*/
    lv_init();

    /*Linux frame buffer device init*/
    fbdev_init();

    /*A small buffer for LittlevGL to draw the screen's content*/
    static lv_color_t buf[DISP_BUF_SIZE];

    /*Initialize a descriptor for the buffer*/
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);

    /*Initialize and register a display driver*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf   = &disp_buf;
    disp_drv.flush_cb   = fbdev_flush;
    disp_drv.hor_res    = 800;
    disp_drv.ver_res    = 480;
    lv_disp_drv_register(&disp_drv);


	/* Linux input device init */
    evdev_init();
    /* Initialize and register a display input driver */
    /* Segmentation fault:*/
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);      /*Basic initialization*/
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = evdev_read;
    lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv); 
    /* Segmentation fault:*/

    lv_demo_widgets();
    while(1) 
    {
        lv_task_handler();
        usleep(5000);
    }

    return 0;
}


/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if(start_ms == 0) {
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}

网盘链接

链接:https://pan.baidu.com/s/1tf0KXJHC8ls_5-tNMdyxwQ?pwd=nxz1  提取码:nxz1  --来自百度网盘超级会员V5的分享

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值