如何在ARM Linux下使用多点触摸屏

如何在ARM Linux下使用多点触摸屏,第1张

我在3.2内核下做的,配合Xorg 1.2.4,Xinput2,Qt5.2.1。

首先,驱动程序probe的时候要声明成多点触摸的:

input_set_abs_params(input, ABS_X, 0, pdata->x_res - 1, 0, 0)

input_set_abs_params(input, ABS_Y, 0, pdata->y_res - 1, 0, 0)

input_set_abs_params(input, ABS_MT_POSITION_X,

0, pdata->x_res - 1, 0, 0)

input_set_abs_params(input, ABS_MT_POSITION_Y,

0, pdata->y_res - 1, 0, 0)

error = input_mt_init_slots(input, MAX_SUPPORT_POINTS)

pdata是board-[mach].c里面定义的platform data,如果是3.8以上的内核,你可以用device tree。

其次,提交触摸数据的时候,要提交成多点的:

for (i = 0i <MAX_SUPPORT_POINTSi++)

{

type = posdata.touch[i].xh >>6

if (type == TOUCH_EVENT_RESERVED)

continue

x = ((posdata.touch[i].xh <<8) | (posdata.touch[i].xl)) &0x0fff

y = ((posdata.touch[i].yh <<8) | (posdata.touch[i].yl)) &0x0fff

id = (posdata.touch[i].yh >>4) &0x0f

down = (type != TOUCH_EVENT_UP)

input_mt_slot(tsdata->input, id)

input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down)

if (!down)

continue

input_report_abs(tsdata->input, ABS_MT_POSITION_X, x)

input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y)

}

input_mt_report_pointer_emulation(tsdata->input, true)

input_sync(tsdata->input)

然后,Buildroot做根文件系统的时候要选上Target packages >Libraries >Hardware handling >mtdev和Target packages >Graphic libraries and applications (graphic/text) >X.org X Window System >X11R7 Drivers >xf86-input-evdev,网上有很多文章说如何让X支持多点触摸的,那都是过去式了,现在的X和xf86-input-evdev都支持多点触摸。

最后,编译Qt开发包的时候要加上-xinput2选项,在qtbase/examples/touch里能找到触摸屏的样例代码。

linux触摸屏复位命令是Linuxreset。inuxreset命令和tset是一同个命令,用途是设定终端机的状态。这个命令会自动的从环境变数、命令列或是别的组态档决定目前终端机的型态。是linux触摸屏的复位命令。

一些显示和触摸代码(linux on arm 平台)

linux on arm 平台的一些显示和触摸功能

一、版本和平台:

代码版本:1.1

平台:linux arm开发板LCD: 800x480(宽x高),32位色深,带电容触摸屏

二、LCD 显示的过程:

定义一个数组 unsigned int virtual_lcd[480][800] 作为虚拟显存

每次显示内容,先将内容画在虚拟显存上(调用draw_xxx函数)

要显示什么就画什么,要显示几个就画几个(两次画在同一位置,新的会覆盖旧的)

全部画完之后,把虚拟显存上的东西显示出来(调用show_lcd_now函数)

三.功能

使用1.1版本可以实现如下功能:

1、 触屏返回坐标

2、划屏返回坐标和划过的距离

3、在LCD上显示文本:

语言:中文,英文

字体:仿宋,楷体,黑体,微软雅黑, 只能显示默认字体,没有粗体,斜体等

字号:支持6个字号:16 ,24, 32 ,40, 48, 56;16号既为16*16个像素点,中文是这样,英文和标点宽度可能减半,使用时请注意

4、 在LCD上显示色块(block)

5、 显示带框线的方框(box)

6、 显示带文本的按钮(button)

7、 显示bmp图(24bit, 底到上型DIB(bottom-up),应该是最常见的24bit bmp格式)

8、 按按钮时按钮反显(按下时显示另一种颜色),并触发事件(调用一个回调函数)

各功能对应的函数:

struct touch_screen_data touch_screen(void)//触屏

struct cross_screen_data cross_screen(void)//划屏

int draw_block(lcd_block * block)//画色块

int draw_box(lcd_box * box)//画方框

int draw_text(lcd_text * text )//画文本

int draw_button(lcd_button * button)//画按钮(只能画矩形按钮)

int draw_bmp(int x,int y,const char *filename)//画bmp图

int show_lcd_now(void)//将画的内容显示出来

int press_button(int num_of_button,...)//按按钮函数,可以配置按下可以配置按下按钮要做的事

四、例程

main.c中是上述函数使用方法的例程,有详述细注释。

源码lcd.c,lcd.h中也有详细注释。

测试效果:

开发板返回信息:

LCD显示效果:

五、注意

1、字库路径

使用显示文本功能,必须要把字库文件放到开发板上,

本demo默认需要将【fontlibrary文件及里面的字库文件】整体放到开发板/目录(根目录)下,

如果要放到别的路径,请到lcd.c文件中找到这句话:sprintf(filename,"/fontlibrary/%c%d.bin",text->type,text->size)去修改字库文件的路径

2、 使用时在你的工程中包含lcd.c,font.c,lcd.h,font.h 这四个文件,并一同编译

3、 本demo使用的测试图片103x100.bmp要和本demo的可执行文件放在同一个目录下


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7107839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存