基于I2C的嵌入式多点触摸屏幕驱动设计

发布时间:2024-06-14
摘要:采用了三星公司的s3c6410x处理器,通过嵌入式linux的驱动管理系统实现了对cypress7958、snapticstm1444等基于i2c总线协议的多点触摸屏幕的驱动设计。实践证明,在基于linux核心的qtopia平台以及andriod嵌入式操作系统上运行流畅,识别度与准确度很高。
引言
随着嵌入式设备的开发和推广,触摸屏作为新式输入设备已经随处可见,手机、pda、mid以及atm机等设备都已经用到了触摸屏。而科技在不断发展,触摸屏也由一开始的4线式单点电阻触摸屏发展到今天的各种多点式电容触摸屏。本文通过对以cypress7958为代表的i2c总线接口电容式多点触摸屏的研究,设计了针对linux操作系统的多点触摸的屏幕驱动,以及不运行操作系统前提下的单片机对触摸屏的驱动,取得了良好的效果。
1、研究平台介绍
1.1arm11处理器s3c6410x
s3c6410x是基于arm1176jzfs核的用于手持、移动等终端设备的通用处理器。s3c6410x是一款低功率、高性价比、高性能的用于和通用处理rsic处理器。为2.5g和3g通信服务提供了优化的硬件性能,采用64/32位的内部总线架构,融合了axi、ahb、apb总线。还有很多强大的硬件加速器,包括运动视频处理、音频处理、2d加速、显示处理和缩放。
1.2电容式多点触摸屏
电容式触摸屏在触摸屏4边均镀上狭长的电极,在导电体内形成一个低电压交流电场。在触摸屏幕时,由于人体电场,手指与导体层间会形成一个耦合电容,4边电极发出的电流会流向触点,而电流强度与手指到电极的距离成正比,位于触摸屏幕后的控制器会计算电流的比例及强弱,准确算出触摸点的位置。电容触摸屏的双玻璃不但能保护导体及感应器,更有效地防止外在环境因素对触摸屏造成影响,就算屏幕沾有污秽、尘埃或油渍,电容式触摸屏依然能准确算出触摸位置。与电阻触摸屏相对比,电容式触摸屏就是支持多点触摸的人机交互方式,普通电阻式触摸屏只能进行单一点的触控。
1.3arm工具链
本文针对arm核的单片机使用了armnonelinuxgnueabi4.3.2交叉编译链,实现对arm支持的二进制文件编译,用以成功编译armlinux2.6.28内核。
1.4移植条件
对于本文所述内容,所有支持linux操作系统运行的处理器(包括嵌入式处理器)都可以运行,而所有支持i2c总线协议的单片机也可以在不使用操作系统的前提下将触摸屏作为一种普通输入设备进行使用。
2、研究过程
图1显示了本文中针对嵌入式linux平台下的驱动软硬件结构体系。
图1驱动软硬件结构体系
2.1 i2c设备在平台部分声明
cypress7958多点触摸屏的i2c地址为0x20,在使用前需要在平台设备处进行i2c设备声明,这样才可以使linux驱动找到其对应的i2c地址进行操作。首先要声明该i2c设备结构体,代码如下:
staticstructi2c_board_infoi2c_devs1[]__initdata={
{i2c_board_info(cypress7958,0x20),},/*cypress7958touchpannelcontroller*/
};
然后在staticvoid__initsmdk6410_machine_init(void)函数中声明该i2c设备:
i2c_register_board_info(1,i2c_devs1,array_size(i2c_devs1));
2.2 cypress7958驱动部分设计
2.2.1注册和注销模块
首先建立i2c驱动结构体,cypress_7958_driver,代码如下:
staticstructi2c_drivercypress_7958_driver={
.probe=cypress_7958_probe,
.remove=cypress_7958_remove,
.id_table=cypress_7958_id,
.driver={
.name=cypress_7958_name,
},
};
然后建立_init初始化函数与_exit注销设备函数:staticint__devinitcypress_7958_ts_init(void),staticvoid__exitcypress_7958_exit(void),通过i2c_add_driver与i2c_del_driver函数进行i2c设备的注册与注销。
2.2.2触摸屏驱动入口函数的设计
由上节中声明的i2c结构体得知,在设备被检查到的时候进入staticintsynaptics_ts_probe(structi2c_client*client,conststructi2c_device_id*id)函数,在该函数中需要进行触摸屏工作模式的初始化,对作为输入设备的触摸屏驱动在linux平台下的设备名注册,同时初始化触摸事件触发时引起的中断操作。
(1)cypress7958模式初始化
作为多点触摸屏幕,cypress7958有很多相关的配置寄存器,本文中不再赘述,初始化部分仅需对屏幕是否工作在正常工作模式下进行检查,通过读取0x28地址的寄存器,如果值为0x07,则屏幕工作正常,否则返回错误值。
ret=i2c_smbus_read_byte_data(ts>client,0x28);
if(ret!=0x07){
printk(kern_err,cypressdetecterrorn);
returnret;
}
(2)输入设备名注册
创建structinput_dev结构体,通过input_allocate_device()函数进行设备名的创建,然后通过set_bit函数进行输入设备功能声明。因为是多点触摸屏,可以产生ev_syn,ev_key,btn_touch,btn_2(多点触摸),ev_abs等功能,故对之进行声明:
set_bit(ev_syn,ts>input_dev>evbit);
set_bit(ev_key,ts>input_dev>evbit);
set_bit(btn_touch,ts>input_dev>keybit);
set_bit(btn_2,ts>input_dev>keybit);
set_bit(ev_abs,ts>input_dev>evbit);
然后完成对事件的具体配置:
input_set_abs_params(ts>input_dev,abs_x,0,max_y,0,0);
input_set_abs_params(ts>input_dev,abs_y,0,max_x,0,0);
input_set_abs_params(ts>input_dev,abs_pressure,0,255,0,0);
input_set_abs_params(ts>input_dev,abs_tool_width,0,15,0,0);
input_set_abs_params(ts>input_dev,abs_hat0x,0,max_y,0,0);
input_set_abs_params(ts>input_dev,abs_hat0y,0,max_x,0,0);
input_set_abs_params(ts>input_dev,abs_mt_position_x,0,max_y,0,0);
input_set_abs_params(ts>input_dev,abs_mt_position_y,0,max_x,0,0);
input_set_abs_params(ts>input_dev,abs_mt_touch_major,0,255,0,0);
input_set_abs_params(ts>input_dev,abs_mt_width_major,0,15,0,0);
zui后通过input_register_device(ts>input_dev)函数完成对该设备名的注册。
(3)驱动事件产生中断函数初始化
cypress7958触摸屏在触摸事件产生时会在irq引脚产生一个低电平信号,将该引脚连接到gpn(15)引脚上,同时创建gpio中断函数:
s3c_gpio_cfgpin(s3c64xx_gpn(15),s3c_gpio_sfn(2));
client>irq=gpio_to_irq(s3c64xx_gpn(15));
irqflags=irqf_trigger_low;
然后通过ret=request_irq(client>irq,cypress_7958_irq_handler,irqflags,client>name,ts)进行中断函数申请。创建cypress_7958_irq_handler函数:
staticirqreturn_tcypress_7958_irq_handler(intirq,voi
上一个:零压启动通用电磁阀价格、上海电磁阀厂家、不锈钢电磁阀
下一个:0x80070022错误代码(0x80070022错误代码是什么意思)

法院立案会有案底吗
企业网站图片的优化方式
四川虎皮青椒的做法 四川虎皮青椒怎么做
黑胡椒洋葱鸡腿的做法 黑胡椒洋葱鸡腿的烹饪方法
燃气热水器故障什么
新娘头发多适合什么发型
芜湖周边自驾一日游有哪些景点
私自旷工公司解除劳动合同是合法的吗
医院过错鉴定听证程序
土地征收补偿费如何分配