Linux驱动开发_输入子系统、触摸屏坐标上报

网友投稿 710 2022-05-29

任务1: 输入子系统

按键设备、触摸屏设备、三轴加速计设备、鼠标设备、标准键盘设备……。

输入子系统: 统一形态各异的输入设备。

输入子系统使用步骤

1.  定义某一个结构体或者动态分配某一个结构体

2.  根据结构体成员,进行初始化赋值

3.  注册输入子系统

4.  当按键按下时,再根据输入子系统核心的层的标准函数进行按键值上报。

5.  驱动卸载时,再将输入子系统注销掉。

应用读取的输入子系统标准结构体:

输入子系统上报(重定向系统标准输入):

[root@tiny4412 code]#exec 0

上报触摸屏标准坐标

触摸屏上报的值有哪些? X坐标值、Y坐标值、压力值(代表触摸屏按下或者松开)。

绝对坐标不只是触摸屏: 触摸屏驱动上报的时候,需要增加一些标志信息。

Tslib库运用

编译的步骤:

1.  解压…….

2.  生成配置文件: [root@wbyq tslib-master]# ./autogen.sh

3.  生成Makefile:

[root@wbyq tslib-master]# ./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=$PWD/tslib

4.  编译并安装

Linux驱动开发_输入子系统、触摸屏坐标上报

[root@wbyq tslib-master]# make && make install

5.  并将编译好的文件拷贝到开发板对应目录下

6.  修改etc/ts.conf文件 ,将第2行注释去掉,删除多余的空格(顶格)

7.  拷贝ts插件目录到开发板上

8.  设置tslib使用的环境变量

安装rpm后缀的安装包:

[root@wbyq Packages]# rpm -ivh <包名称>.rpm

获取系统环境变量的函数

#include

char *getenv(const char *name);

参数: const char *name :环境的名称。

返回值: 获取到环境变量里的字符串数据。

#include

#include

int main()

{

char *p=getenv("PATH");

printf("p=%s\n",p);

return 0;

}

1.  按键输入子系统方式上报编写一次

2.  触摸屏也是用输入子系统方式编写一次

3.  移植tslib库。

4.  继续做: 数码相册。

动态库处理函数

#include

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

用法示例:

handle=dlopen("lib123.so", int flag);

void (abc*)(int,int);

abc=dlsym(handle,"abc");

abc(12,45);

int main()

{

abc(12,45);

}

gcc 456.c -L/work -l123

触摸屏的驱动上报:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct i2c_client *touch_client=NULL; static struct input_dev *ft5x06_touch_dev=NULL; /*工作处理函数*/ static void tiny4412_work_func(struct work_struct *work) { /*读取触摸屏的坐标值*/ u8 buff[7]; u32 x,y; i2c_smbus_read_i2c_block_data(touch_client,0,7,buff);/*读取第一个点*/ x=(buff[3]&0xF)<<8|buff[4]; y=(buff[5]&0xF)<<8|buff[6]; if(buff[2]&0xF) /*判断是否按下*/ { input_report_abs(ft5x06_touch_dev,ABS_PRESSURE,1); input_report_key(ft5x06_touch_dev,BTN_TOUCH,1); printk("x=%d,y=%d,ABS_PRESSURE=%d\n",x,y,1); } else { input_report_abs(ft5x06_touch_dev,ABS_PRESSURE,0); input_report_key(ft5x06_touch_dev,BTN_TOUCH,0); printk("x=%d,y=%d,ABS_PRESSURE=%d\n",x,y,0); } input_report_abs(ft5x06_touch_dev,ABS_X,x); input_report_abs(ft5x06_touch_dev,ABS_Y,y); /*将输入的信息同步给事件层*/ input_sync(ft5x06_touch_dev); } /*静态声明工作队列*/ static DECLARE_WORK(touch_wq,tiny4412_work_func); /*触摸屏的中断服务函数*/ static irqreturn_t tiny4412_touch_handler(int irq, void *dev) { schedule_work(&touch_wq); /*将工作加入到一个工作队列里去*/ return IRQ_HANDLED; } static int touch_probe(struct i2c_client *client, const struct i2c_device_id *id) { u8 touch_id; printk("触摸屏驱动端匹配成功:0x%X\n",client->addr); touch_client=client; /*IIC子系统标准的读函数*/ i2c_smbus_read_i2c_block_data(client,0xA3,1,&touch_id); /*读取厂家ID*/ printk("厂家ID=%d\n",touch_id); /*动态分配一个输入子系统结构体*/ ft5x06_touch_dev=input_allocate_device(); /*设置输入子系统的功能(能力)*/ input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_X); input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_Y); input_set_capability(ft5x06_touch_dev,EV_ABS,ABS_PRESSURE); input_set_capability(ft5x06_touch_dev,EV_KEY,BTN_TOUCH); /*代表当前输入子系统上报的是触摸屏坐标*/ /*设置绝对坐标参数*/ input_set_abs_params(ft5x06_touch_dev, ABS_X, 0,800-1, 0, 0); input_set_abs_params(ft5x06_touch_dev, ABS_Y, 0,1280-1, 0, 0); input_set_abs_params(ft5x06_touch_dev, ABS_PRESSURE,0,1,0,0); /*注册输入子系统设备*/ input_register_device(ft5x06_touch_dev); /*注册中断*/ printk("client->irq中断号:%d (430)\n",client->irq); int err=request_irq(client->irq,tiny4412_touch_handler,IRQ_TYPE_EDGE_BOTH,client->name,NULL); printk("中断注册状态:%d (0表示成功)\n",err); return 0; } static int touch_remove(struct i2c_client *client) { printk("触摸屏驱动端卸载成功!\n"); /*释放中断号*/ free_irq(client->irq,NULL); /*注销输入子系统设备*/ input_unregister_device(ft5x06_touch_dev); /*注销动态分配的结构体*/ input_free_device(ft5x06_touch_dev); return 0; } static struct i2c_device_id touch_id[]= { {"tiny4412_ft5x06",0}, {} }; static struct i2c_driver touch_driver= { .probe=touch_probe, .remove=touch_remove, .driver= { .name="touch_drv", }, .id_table=touch_id }; static int __init tiny4412_touch_init(void) { /*1. 注册IIC子系统驱动端*/ i2c_add_driver(&touch_driver); return 0; } static void __exit tiny4412_touch_exit(void) { /*2. 注销IIC子系统驱动端*/ i2c_del_driver(&touch_driver); } module_init(tiny4412_touch_init); module_exit(tiny4412_touch_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("tiny4412 wbyq");

Linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Java】IO流的混乱关系,看得我直呼绝绝子
下一篇:一张900w的数据表,怎么把原先要花费17s执行的SQL优化到300ms?
相关文章