前言
恩智浦“FRDM-MCXN947”評(píng)測(cè)活動(dòng)由安富利和與非網(wǎng)協(xié)同舉辦。本篇內(nèi)容由與非網(wǎng)用戶發(fā)布,已獲轉(zhuǎn)載許可。原文可在與非網(wǎng)(eefocus)工程師社區(qū)查看。
背景
上一期【用戶測(cè)評(píng)(七):移植LVGL跑benchmark】已經(jīng)實(shí)現(xiàn)了觸摸屏的觸摸效果,但是沒有接入到LVGL,現(xiàn)在開干。
LVGL移植觸摸屏詳解
01對(duì)應(yīng)的輸入設(shè)備文件
LVGL接入輸入設(shè)備,可以參考其自帶的示例,即examples/porting/lv_port_indev_template.c文件和對(duì)應(yīng)的頭文件。咱們先把這兩個(gè)文件拷貝出來(lái),放到bsp/lvgl_port/目錄下,并重命名為lv_port_indev.c和lv_port_indev.h。
02修改lv_port_indev.c/.h
這兩個(gè)文件都使用#if 0括了起來(lái),需要改成#if 1使能,然后包含正確的頭文件,如下圖所示,僅包含lv_port_indev.h和touch.h文件即可。
03關(guān)鍵函數(shù)lv_port_indev_init()
文件lv_port_indev.c文件中的lv_port_indev_init()函數(shù)非常關(guān)鍵,從它注冊(cè)輸入設(shè)備到LVGL。它支持的輸入設(shè)備有多種類型:
最常見的是觸摸屏LV_INDEV_TYPE_POINTER
鼠標(biāo),對(duì)應(yīng)LV_INDEV_TYPE_MOUSE
鍵盤,對(duì)應(yīng)LV_INDEV_TYPE_KEYPAD
編碼器,對(duì)應(yīng)LV_INDEV_TYPE_ENCODER
按鍵,對(duì)應(yīng)LV_INDEV_TYPE_BUTTON
這里只需要關(guān)注觸摸屏,其他的全部用#if 0括起來(lái)。
最終lv_port_indev_init()函數(shù)簡(jiǎn)化如下:
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); }
從這個(gè)代碼片段看出,我們只需要實(shí)現(xiàn)touchpad_init()和touchpad_read()函數(shù)即可。
04touchpad_init()
這個(gè)函數(shù)的實(shí)現(xiàn)非常簡(jiǎn)單,調(diào)用我們之間寫好的觸摸屏初始化函數(shù)TP_Init()即可。
staticvoidtouchpad_init(void) { /*Your code comes here*/ //NOTE:觸摸屏已經(jīng)在別的地方初始化了 TP_Init(); }
05touchpad_read()
這個(gè)函數(shù)是LVGL提供的模版函數(shù),我們不用做什么改動(dòng),只需要實(shí)現(xiàn)其中的touchpad_is_pressed()和touchpad_get_xy()即可。
從下面代碼可以看出,touchpad_is_pressed()只需要調(diào)用TP_Scan(),如果有觸摸則發(fā)回非0值即可,如果沒有觸摸則返回0,最終touchpad_is_pressed()返回邏輯值。
而touchpad_get_xy()更簡(jiǎn)單,直接調(diào)用TP_Get_XY()返回最近一次觸摸的坐標(biāo)即可。
/*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:從這里開始一次掃描,獲取觸摸屏狀態(tài) 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); }
演示
運(yùn)行LVGL幾個(gè)示例程序,比之前的屏幕模組廠商的示例程序絲滑多了。主要是LVGL刷屏采用了DMA,比逐個(gè)打點(diǎn)方式快多了。
-
恩智浦
+關(guān)注
關(guān)注
14文章
5981瀏覽量
116737 -
觸摸屏
+關(guān)注
關(guān)注
42文章
2387瀏覽量
118536 -
移植
+關(guān)注
關(guān)注
1文章
401瀏覽量
28691 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64865 -
LVGL
+關(guān)注
關(guān)注
1文章
107瀏覽量
3697
原文標(biāo)題:用戶測(cè)評(píng)(八):LVGL移植觸摸屏
文章出處:【微信號(hào):AvnetAsia,微信公眾號(hào):安富利】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
TFT適配LVGL實(shí)踐分享

恩智浦MCX N23的官方評(píng)估板FRDM-MCXN236詳解

在恩智浦FRDM-MCXN947開發(fā)板部署DeepSeek大語(yǔ)言模型

FRDM-MCXN947的純Linux命令行環(huán)境搭建
關(guān)于將Flash寫入FRDM-MCXN947的問(wèn)題求解
FRDM-MCXN947在初始化lpI2C時(shí), I2C無(wú)法正常工作怎么解決?
富昌電子推薦兩款恩智浦的MCX A和MCX N系列微控制器
《恩智浦FRDM-MCXN947開發(fā)實(shí)踐指南》上線啦

使用VSCode調(diào)試FRDM MCXN947開發(fā)板

恩智浦新品MCX N系列線下培訓(xùn)來(lái)啦!LVGL、AI等超多精彩Demo演示,快來(lái)報(bào)名吧!

基于Label CIFAR10 image on FRDM-MCXN947例程實(shí)現(xiàn)鞋和帽子的識(shí)別

使用NXP MCX-N板卡搭建環(huán)境及點(diǎn)燈

評(píng)論