演示
项目简介
此项目用到的是正点原子的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的分享