前言
恩智浦“FRDM-MCXN947”評測活動由安富利和與非網協同舉辦。本篇內容由與非網用戶發布,已獲轉載許可。原文可在與非網(eefocus)工程師社區查看。
背景
上一期【用戶測評(七):移植LVGL跑benchmark】已經實現了觸摸屏的觸摸效果,但是沒有接入到LVGL,現在開干。
LVGL移植觸摸屏詳解
01對應的輸入設備文件
LVGL接入輸入設備,可以參考其自帶的示例,即examples/porting/lv_port_indev_template.c文件和對應的頭文件。咱們先把這兩個文件拷貝出來,放到bsp/lvgl_port/目錄下,并重命名為lv_port_indev.c和lv_port_indev.h。
02修改lv_port_indev.c/.h
這兩個文件都使用#if 0括了起來,需要改成#if 1使能,然后包含正確的頭文件,如下圖所示,僅包含lv_port_indev.h和touch.h文件即可。

03關鍵函數lv_port_indev_init()
文件lv_port_indev.c文件中的lv_port_indev_init()函數非常關鍵,從它注冊輸入設備到LVGL。它支持的輸入設備有多種類型:
最常見的是觸摸屏LV_INDEV_TYPE_POINTER
鼠標,對應LV_INDEV_TYPE_MOUSE
鍵盤,對應LV_INDEV_TYPE_KEYPAD
編碼器,對應LV_INDEV_TYPE_ENCODER
按鍵,對應LV_INDEV_TYPE_BUTTON
這里只需要關注觸摸屏,其他的全部用#if 0括起來。
最終lv_port_indev_init()函數簡化如下:
voidlv_port_indev_init(void)
{
staticlv_indev_drv_t indev_drv;
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad if you have*/
touchpad_init();
/*Register a touchpad input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type=LV_INDEV_TYPE_POINTER;
indev_drv.read_cb= touchpad_read;
indev_touchpad =lv_indev_drv_register(&indev_drv);
}
從這個代碼片段看出,我們只需要實現touchpad_init()和touchpad_read()函數即可。
04touchpad_init()
這個函數的實現非常簡單,調用我們之間寫好的觸摸屏初始化函數TP_Init()即可。
staticvoidtouchpad_init(void) { /*Your code comes here*/ //NOTE:觸摸屏已經在別的地方初始化了 TP_Init(); }
05touchpad_read()
這個函數是LVGL提供的模版函數,我們不用做什么改動,只需要實現其中的touchpad_is_pressed()和touchpad_get_xy()即可。
從下面代碼可以看出,touchpad_is_pressed()只需要調用TP_Scan(),如果有觸摸則發回非0值即可,如果沒有觸摸則返回0,最終touchpad_is_pressed()返回邏輯值。
而touchpad_get_xy()更簡單,直接調用TP_Get_XY()返回最近一次觸摸的坐標即可。
/*Will be called by the library to read the touchpad*/ staticvoidtouchpad_read(lv_indev_drv_t* indev_drv,lv_indev_data_t* data) { staticlv_coord_tlast_x =0; staticlv_coord_tlast_y =0; /*Save the pressed coordinates and the state*/ if(touchpad_is_pressed()) { touchpad_get_xy(&last_x, &last_y); data->state =LV_INDEV_STATE_PR; } else{ data->state =LV_INDEV_STATE_REL; } /*Set the last pressed coordinates*/ data->point.x = last_x; data->point.y = last_y; } /*Return true is the touchpad is pressed*/ staticbooltouchpad_is_pressed(void) { /*Your code comes here*/ //TODO:從這里開始一次掃描,獲取觸摸屏狀態 if(TP_Scan()) { returntrue; } returnfalse; } /*Get the x and y coordinates if the touchpad is pressed*/ staticvoidtouchpad_get_xy(lv_coord_t* x,lv_coord_t* y) { /*Your code comes here*/ TP_Get_XY((uint16_t*)x, (uint16_t*)y); }
演示
運行LVGL幾個示例程序,比之前的屏幕模組廠商的示例程序絲滑多了。主要是LVGL刷屏采用了DMA,比逐個打點方式快多了。
-
恩智浦
+關注
關注
14文章
6095瀏覽量
147140 -
觸摸屏
+關注
關注
42文章
2459瀏覽量
121954 -
移植
+關注
關注
1文章
414瀏覽量
29388 -
函數
+關注
關注
3文章
4417瀏覽量
67499 -
LVGL
+關注
關注
2文章
124瀏覽量
4552
原文標題:用戶測評(八):LVGL移植觸摸屏
文章出處:【微信號:AvnetAsia,微信公眾號:安富利】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
恩智浦MCX N23的官方評估板FRDM-MCXN236詳解
在恩智浦FRDM-MCXN947開發板部署DeepSeek大語言模型
FRDM-MCXN947的純Linux命令行環境搭建
關于將Flash寫入FRDM-MCXN947的問題求解
FRDM-MCXN947在初始化lpI2C時, I2C無法正常工作怎么解決?
富昌電子推薦兩款恩智浦的MCX A和MCX N系列微控制器
基于Label CIFAR10 image on FRDM-MCXN947例程實現鞋和帽子的識別
使用恩智浦FRDM-MCXN947開發板LVGL移植觸摸屏
評論