当前位置: 首页 > web >正文

TSC2007触摸驱动实验(一)

代码:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/i2c.h>
#include <linux/gpio.h>
#include<linux/of_gpio.h>
#include<linux/interrupt.h>
#include<linux/of_irq.h>
#include <linux/input.h>
#include<linux/delay.h>int irq;
static struct input_dev *tsc2007_dev;
static struct device_node *tsc2007_device_node;
static struct i2c_client *tsc2007_client;
static int tsc2007_read_reg(u8 reg_addr);
static void tsc2007_write_reg(u8 reg_addr,u8 data,u8 len);static void tsc2007_write_reg(u8 reg_addr,u8 data,u8 len)
{u8 buff[256];struct i2c_msg msgs[]={[0]={.addr=tsc2007_client->addr,.flags=0,.len=len+1,.buf=buff,}};buff[0]=reg_addr;memcpy(&buff[1],&data,len);i2c_transfer(tsc2007_client->adapter,msgs,1);
}
static int tsc2007_read_reg(u8 reg_addr)
{u8 data;struct i2c_msg msgs[]={[0]={.addr=tsc2007_client->addr,.flags=0,.len=sizeof(reg_addr),.buf=&reg_addr,},[1]={.addr=tsc2007_client->addr,.flags=1,.len=sizeof(data),.buf=&data,},};i2c_transfer(tsc2007_client->adapter,msgs,2);return data;
}
static const struct i2c_device_id tsc2007_id_ts[]=
{{"xxx",0},{}
};
static const struct of_device_id tsc2007_id[]=
{{.compatible = "ti,tsc2007",0},{}
};
static irqreturn_t tsc2007_handler(int irq,void *args)
{printk("This is tsc2007_handler\n");return IRQ_HANDLED;
}
int tsc2007_probe(struct i2c_client *client,const struct i2c_device_id *id)
{int ret;int tsc2007_irq_gpio;int tsc2007_reset_gpio;printk("This is tsc2007_probe\n");tsc2007_client=client;tsc2007_device_node=of_find_node_by_path("/soc/aips-bus@02100000/i2c@021a4000/tsc2007@48");if(tsc2007_device_node==NULL){printk("of_find_node_by_path is error\n");return -1;}printk("tsc2007_device_node is %s\n",tsc2007_device_node->name);tsc2007_irq_gpio=of_get_named_gpio(tsc2007_device_node,"gpios",0);if(tsc2007_irq_gpio<0){printk("tsc2007_irq_gpio of_get_named_gpio is error\n");return -2;}/*tsc2007_reset_gpio=of_get_named_gpio(tsc2007_device_node,"reset-gpios",0);if(tsc2007_reset_gpio<0){printk("tsc2007_reset_gpio of_get_named_gpio is error\n");return -3;}*/printk("tsc2007_irq_gpio is %d\n",tsc2007_irq_gpio);//printk("tsc2007_reset_gpio is %d\n",tsc2007_reset_gpio);gpio_free(tsc2007_irq_gpio);ret=gpio_request(tsc2007_irq_gpio,"irq_gpio");if(ret<0){printk("gpio_request is error\n");return -4;}gpio_free(tsc2007_reset_gpio);ret=gpio_request(tsc2007_reset_gpio,"reset_gpio");if(ret<0){printk("tsc2007_reset_gpio_request is error\n");return -5;}gpio_direction_input(tsc2007_irq_gpio);gpio_direction_output(tsc2007_reset_gpio,0);msleep(5);gpio_set_value(tsc2007_reset_gpio,1);irq=gpio_to_irq(tsc2007_irq_gpio);ret=request_irq(irq,tsc2007_handler,IRQ_TYPE_EDGE_FALLING|IRQF_ONESHOT,"tsc2007_irq",NULL);if(ret<0){printk("request_irq is error\n");goto error_request_irq;}tsc2007_dev=input_allocate_device();tsc2007_dev->name="tsc2007_input_test";__set_bit(EV_KEY,tsc2007_dev->evbit);__set_bit(EV_ABS,tsc2007_dev->evbit);__set_bit(BTN_TOUCH,tsc2007_dev->evbit);input_set_abs_params(tsc2007_dev,ABS_X,0,256,0,0);input_set_abs_params(tsc2007_dev,ABS_Y,0,200,0,0);input_set_abs_params(tsc2007_dev,ABS_PRESSURE,0,255,0,0);input_register_device(tsc2007_dev);if(ret<0){printk("input_register_device is error\n");goto error_input_register;}//ret=tsc2007_read_reg(0xd0);//printk("ret is %#x\n",ret);return 0;error_request_irq:free_irq(irq,NULL);return ret;
error_input_register:input_free_device(tsc2007_dev);return ret;
}
int tsc2007_remove(struct i2c_client *i2c_client)
{return 0;
}
static struct i2c_driver tsc2007_driver=
{.driver={.owner=THIS_MODULE,.name="tsc2007_test",.of_match_table=tsc2007_id},.probe=tsc2007_probe,.remove=tsc2007_remove,.id_table=tsc2007_id_ts};
static tsc2007_driver_init(void)
{int ret;ret=i2c_add_driver(&tsc2007_driver);if(ret<0){printk("i2c_add_driver is error\n");return ret;}printk("This is tsc2007_driver_init\n");return 0;
}
static void tsc2007_driver_exit(void)
{free_irq(irq,NULL);input_free_device(tsc2007_dev);i2c_del_driver(&tsc2007_driver);printk("This is tsc2007_driver_exit\n");
}
module_init(tsc2007_driver_init);
module_exit(tsc2007_driver_exit);
MODULE_LICENSE("GPL");

运行效果:

触摸屏幕:

http://www.xdnf.cn/news/8956.html

相关文章:

  • Java 8到Java 24:核心特性介绍
  • 动态工作空间:目标数据结构为源数据
  • FreeRTOS--消息队列
  • RocketMQ核心特性与最佳实践
  • 微前端qiankun - 应用之间的通信
  • 车载软件架构 -AUTOSAR Vector SIP简介
  • 线程池配置经验总结
  • 解决Visual Studio报“IntelliSense不可用,需设置TRACEDESIGNTIME = true“问题
  • 获取点击点所在区域所能容纳最大连续空白矩形面积及顶点坐标需求分析及相关解决方案
  • 【linux】全志tina分区表挂载的脚本路径
  • 绩效管理缺乏数据支持,如何提高客观性?
  • 【AI论文】QuickVideo:通过系统算法协同设计实现实时长视频理解
  • 《数据密集型应用系统设计》笔记
  • BAT32G113 发送互补PWM
  • 【位运算】比特位计数
  • 海外仓系统 选浩方WMS一款体验更好的海外仓管理系统
  • 2025年—最新ComfyUI_修复面部与手部
  • 《爱的艺术》
  • 升级Win11后VMware虚拟机屏幕调整问题
  • Redis分布式锁浅谈
  • 打羽毛球tips
  • leetcode2025. 分割数组的最多方案数-hard
  • ESP32-S3 学习笔记(2)-屏幕驱动和lvgl移植
  • 【MySQL系列】数据库死锁问题
  • TDK PC95铁氧体隔磁片的技术要求
  • uniapp中懒加载图片组件的封装与应用
  • 【Qt】QCustomPlot相关
  • 网络段、主机段、子网掩码
  • Python 学习日记 day26
  • 蓝桥杯178 全球变暖