ft6236 触摸屏驱动
在目录下amp\a53_linux\drv\extdrv\touchpad\ft6236下可以看到ft6236.c的文件
1. init函数
static int __init ft_init(void)
{
int ret = 0;
hi_gpio_groupbit_info stIntInfo;
hi_gpio_groupbit_info stRstInfo;
stIntInfo.group_num = INT_GPIO_CHIP;
stIntInfo.bit_num = INT_GPIO_OFFSET;
stIntInfo.value = 0;
stRstInfo.group_num = RST_GPIO_CHIP;
stRstInfo.bit_num = RST_GPIO_OFFSET;
stRstInfo.value = 1;
ret = i2cdev_init();
if (ret)
{
dev_err(NULL, " i2cdev_init fail!\n");
goto error_end;
}
hi_gpio_set_dir(&stIntInfo);
hi_gpio_set_dir(&stRstInfo);
ret = ft_reset(&stRstInfo);
if (ret)
{
dev_err(NULL, " ft_reset fail!\n");
goto error_end;
}
ret = devinput_init();
if (ret)
{
dev_err(NULL, " devinput_init fail!\n");
goto error_end;
}
return 0;
error_end:
return -1;
}
INT_GPIO_CHIP和INT_GPIO_OFFSET都是在宏定义
#elif (defined(BOARD_DEMB) && (defined(HI3556AV100) || defined(HI3519AV100)))下定义的
#define RST_GPIO_CHIP (2)
#define RST_GPIO_OFFSET (6)
#define INT_GPIO_CHIP (2)
#define INT_GPIO_OFFSET (5)
这些管脚可以在这里《Hi3556AV100 Demo 单板使用指南.pdf》中看到,分别得出触摸屏的中断和复位管脚
1.1 对触摸屏进行复位
static int ft_reset(hi_gpio_groupbit_info* pstRstInfo)
{
pstRstInfo->value = 1;
hi_gpio_write_bit(pstRstInfo);
pstRstInfo->value = 0;
hi_gpio_write_bit(pstRstInfo);
msleep(5);
pstRstInfo->value = 1;
hi_gpio_write_bit(pstRstInfo);
return 0;
}
对触摸屏进行复位;
1.2 input系统初始化
static int devinput_init(void)
{
int error = 0;
/* 1. distribution a "input_dev" structure */
ft_ts_dev = input_allocate_device();
if (ft_ts_dev == NULL)
{
printk(" func:%s line:%d \r\n", __FUNCTION__, __LINE__);
return -1;
}
ft_ts_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
set_bit(EV_SYN, ft_ts_dev->evbit);
set_bit(EV_KEY, ft_ts_dev->evbit);
set_bit(EV_ABS, ft_ts_dev->evbit);
set_bit(INPUT_PROP_DIRECT, ft_ts_dev->propbit);
input_set_abs_params(ft_ts_dev, ABS_MT_POSITION_X, 0 , FT_SCREEN_WIDTH_NUM, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_POSITION_Y, 0, FT_SCREEN_HEIGHT_NUM, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_TOUCH_MAJOR,
0, 0xff, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_PRESSURE,
0, 0xff, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_TRACKING_ID,
0, 0xff, 0, 0);
error = input_mt_init_slots(ft_ts_dev, FT_MAX_TOUCH_POINTS,
INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
if (error)
{ return error; }
ft_ts_dev->name = "ft";
ft_ts_dev->id.bustype = BUS_I2C;
error = input_register_device(ft_ts_dev);
if (error)
{
dev_err(NULL, "failed to register input device: %d\n", error);
return error;
}
/**request_threaded_irq(unsigned int irq,irq_handler_t handler,irq_handler_t thread_fn,unsigned long irqflags,const char * devname,void * dev_id)*/
error = fts_irq_register();
if(error)
{
dev_err(NULL, "failed to register input device: %d\n", error);
return error;
}
/**Clear INT*/
touch_set_reg(0x045f241C, 0x20);
return 0;
}
- set_bit()告诉input输入子系统支持哪些按键
evbit:
事件类型(包括EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)
propbit:
set_bit(INPUT_PROP_DIRECT,dev->propbit);//表明设备的坐标直接和屏幕坐标向对应
- input_set_abs_params
给设备的input_dev结构体初始化,这些input_dev如果想被当成多点屏处理的话,只需要给input_dev额外增加以下几个参数:
input_set_abs_params(ft_ts_dev, ABS_MT_POSITION_X, 0 , FT_SCREEN_WIDTH_NUM, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_POSITION_Y, 0, FT_SCREEN_HEIGHT_NUM, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_TOUCH_MAJOR,
0, 0xff, 0, 0);
//相当于单点屏的ABX_PRESSURE
input_set_abs_params(ft_ts_dev, ABS_MT_PRESSURE,
0, 0xff, 0, 0);
input_set_abs_params(ft_ts_dev, ABS_MT_TRACKING_ID,
0, 0xff, 0, 0);
//确定第几手指来上报的数据
input_set_abs_params(idev, ABS_X, -64, 64, 4, 0);
对于X轴范围是-64到+64,数据误差是-4到+4,中心平滑位置是0
- input_mt_init_slots
报告最大支持的点数
- input_register_device
注册input子系统
- 通过注册中断管脚
fts_irq_register注册中断
2. 中断函数处理
static irqreturn_t ftint_irq(int irq, void *data)
{
int i;
bool act;
struct input_dev* input = ft_ts_dev;
ts_event event;
int ret = touch_event_handler(&event);
if(ret)
printk( "\n buffer_read failed \n");
if(event.point_num != 0)
{
for(i = 0; i < event.touch_point; i++)
{
input_mt_slot(input, i);
act = (event.au8_touch_event[i] == FT_EVENT_PRESS_DOWN || event.au8_touch_event[i] == FT_EVENT_CONTACT);
input_mt_report_slot_state(input, MT_TOOL_FINGER, act);
if (!act)
continue;
input_report_abs(input, ABS_MT_POSITION_X, event.au16_x[i]);
input_report_abs(input, ABS_MT_POSITION_Y, event.au16_y[i]);
}
}
input_mt_sync_frame(input);
input_sync(input);
return IRQ_HANDLED;
}
- touch_event_handler函数
ret = hi_i2c_read(0x0, buf, FT_MAX_BUFUSED_NUM);
在这里,使用了hi_i2c_read,在文件i2cdev.c中,注意i2c_board_info的一般是8位从地址;
一般来说,触摸屏有固件的,然后每一个固件都代表类似的协议,由于我们没有相应的协议,所以按照下面的来看:
for (i = 0; i < FT_MAX_TOUCH_POINTS; i++)
{
event->touch_point++;
/**Notice the array bound !!*/
/* 获取x坐标 */
event->au16_x[i] =
(s16) (buf[FT_TOUCH_X_H_POS + 6 * i] & 0x0F) << 8 | (s16) buf[FT_TOUCH_X_L_POS + 6 * i];
/* 获取y坐标 */
event->au16_y[i] =
(s16) (buf[FT_TOUCH_Y_H_POS + 6 * i] & 0x0F) << 8 | (s16) buf[FT_TOUCH_Y_L_POS + 6 * i];
/* 按下,松开,触摸 */
event->au8_touch_event[i] =
buf[FT_TOUCH_EVENT_POS + 6 * i] >> 6;
event->au8_finger_id[i] =
(buf[FT_TOUCH_FINGER_POS + 6 * i]) >> 4;
/**pressure and area not used !!*/
#if 0
event->area[i] =
(buf[FT_TOUCH_AREA_POS + 6 * i]) >> 4;
event->pressure[i] =
(s16) buf[FTS_TOUCH_PRE_POS + 6 * i];
if (0 == event->area[i])
event->area[i] = 0x09;
if (0 == event->pressure[i])
event->pressure[i] = 0x3f;
#endif
if ((event->au8_touch_event[i]==0 || event->au8_touch_event[i]==2)&&(event->point_num==0))
{
printk("abnormal touch data from fw");
return -1;
}
}
- 中断函数:
static irqreturn_t ftint_irq(int irq, void *data)
{
int i;
bool act;
struct input_dev* input = ft_ts_dev;
ts_event event;
int ret = touch_event_handler(&event);
if(ret)
printk( "\n buffer_read failed \n");
if(event.point_num != 0)
{
for(i = 0; i < event.touch_point; i++)
{
input_mt_slot(input, i);
act = (event.au8_touch_event[i] == FT_EVENT_PRESS_DOWN || event.au8_touch_event[i] == FT_EVENT_CONTACT);
input_mt_report_slot_state(input, MT_TOOL_FINGER, act);
if (!act)
continue;
input_report_abs(input, ABS_MT_POSITION_X, event.au16_x[i]);
input_report_abs(input, ABS_MT_POSITION_Y, event.au16_y[i]);
}
}
input_mt_sync_frame(input);
input_sync(input);
return IRQ_HANDLED;
}
ft6236 触摸屏驱动的更多相关文章
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-1 工程及程序构架介绍
视频简介: 该视频由银杏科技有限公司基于iCore3应用开发平台推出,包含 触摸屏驱动工程文件的介绍与程序构架的介绍等. 源视频包下载地址: http://pan.baidu.com/s/1dFz ...
- ARM-Linux驱动-触摸屏驱动分析
出处:http://blog.csdn.net/geekcome/article/details/6580981 硬件平台:FL2440 内核版本:2.6.28 主机平台:Ubuntu 11.04 内 ...
- S3C2440触摸屏驱动实例开发讲解
出处:http://www.embeddedlinux.org.cn/html/yingjianqudong/ 一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--6 ...
- mini2440触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
- AM335x(TQ335x)学习笔记——触摸屏驱动编写
前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...
- linux 触摸屏驱动
目录 linux 触摸屏驱动 输入子系统怎么写? 触摸屏事件 事件分类 事件设置 硬件配置 设计思路 完整程序 测试 ts_lib 使用 问题小结 title: linux 触摸屏驱动 tags: l ...
- 【Linux高级驱动】触摸屏驱动的移植
触摸屏驱动的移植 流程 注意:看框架图 1.添加input.c组件 Device Drivers ---> Input device support ---> Generic inp ...
- Linux学习: 触摸屏驱动
一.Linux输入子系统的结构: 二.触摸屏驱动代码: s3c_ts.c #include <linux/errno.h> #include <linux/kernel.h> ...
- i2c触摸屏驱动文件的实现
转自:http://blog.chinaunix.net/uid-29507718-id-4314013.html Linux下I2C接口触摸屏驱动分析 分类: LINUX linux下触摸屏驱动的 ...
随机推荐
- Python日期计算
Python源代码如下: # -*- coding: UTF-8 -*- """ 简述:要求输入某年某月某日 提问:求判断输入日期是当年中的第几天? Python解题思路 ...
- 19-Docker 镜像小结
本节我们对 Docker 镜像做个小结. 这一部分我们首先讨论了镜像的分层结构,然后学习了如何构建镜像,最后实践使用 Docker Hub 和本地 registry. 下面是镜像的常用操作子命令: i ...
- String类型中 "=="和"equals"比较的差别
String类型中 "=="和"equals"比较的差别 先说明一下String类型的变量的创建方式 在创建新的String类型的变量时,首先会在缓冲区查找是否 ...
- python配置yaml
我们在做自动化的过程中无论是接口自动化还是UI自动化都会存在很多数据,我们对于自动化中如何存放这些数据也是很重要一点,如果写在代码里的话,每次更换数据就有点繁琐,我们可以通过一个文件存放这些数据,然后 ...
- Python函数名做参数,闭包,装饰器
简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...
- 0day2安全——笔记2
第二章 内存的不同用途 windows应用—>编译连接—>PE文件—>进程 进程使用的内存 1.代码区:储存着被装入执行的二进制机器代码,处理器会到这个区域取指和执行 2.数据区:用 ...
- windows下配置ngnix服务器经常出现503问题解决办法
自己网站在windows server2008下安装的ngnix,然后配置php,网站访问流量并不大,但是经常出现503问题.经过查看ngnix服务器错误日志,发现: (10061: No conne ...
- 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)
点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...
- CF582E Boolean Function(DP,状态压缩,FMT)
简单题. 我第二道自己做出来的 2900 没毛病,我没切过 2800 的题 lqy:"CF 评分 2800 是中等难度" 我活个啥劲啊 为了方便(同时压缩状态个数),先建出表达式树 ...
- C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
系列目录 [已更新最新开发文章,点击查看详细] 一个三维模型中可能包含对应多张二维图纸列表,本篇主要介绍如何获取模型文件对应的图纸列表. 请求地址:GET https://api.bimfac ...