手把手教你写Linux设备驱动---input子系统(四)--电容屏驱动ft5x06编写(一)(基于友善之臂4412开发板)

简介: 这一节,我们将从零开始写tiny4412的触摸屏驱动ft5x06,写这节博客之前,先了解下需要什么知识:1、i2c驱动相关的知识2、输入子系统3、中断4、工作队列关于i2c驱动相关的知识,在后期的博文里会专门写几篇博文来进行总结,这里就不再说i2c相关的知识,我们先知道怎么用就行了。

这一节,我们将从零开始写tiny4412的触摸屏驱动ft5x06,写这节博客之前,先了解下需要什么知识:

1、i2c驱动相关的知识

2、输入子系统

3、中断

4、工作队列

关于i2c驱动相关的知识,在后期的博文里会专门写几篇博文来进行总结,这里就不再说i2c相关的知识,我们先知道怎么用就行了。

首先,我在ts.h构造了一个ts_info_st结构体,用来存放触摸屏的中断线,x坐标,y坐标,压力值。

用ts_st构造了该触摸屏的设备结构体。


我们还是直接看点实际的东西,上代码:

ts.h

#ifndef __TS_H
#define __TH_H

struct ts_info_st {
	int irq ; 
	int xres ; 
	int yres ; 
	int pressure ;
};

//I2c_transfer 读写设备--->可能睡眠--->用工作队列
struct ts_st {
	int x ;         //坐标
	int y ; 
	int irq ;       //中断
	int xres ; 
	int yres ; 
	int pressure ; //触摸力度
	struct work_struct work ;  //用于创建工作队列用
	struct i2c_client *client ; //用于i2c
	struct input_dev *dev ;    //用于输入子系统
};
#endif
ts_drv.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/workqueue.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include "ts.h"

struct ts_st *ts ; 
struct ts_info_st *pdata ;
//一旦有中断,就会在串口终端打印中断号
irqreturn_t  ts_handler(int irq , void *data)
{
	printk("ts touch !\n");
	printk("irq : %d\n",irq);
	return IRQ_HANDLED ;

}

//匹配成功就会调用probe函数
int ts_probe(struct i2c_client *client , const struct i2c_device_id *id)
{
	int ret ;
	printk("probe\n");
	//从i2c的client获取设备相关的数据保存到pdata里
	pdata = client->dev.platform_data ;
	ts = kzalloc(sizeof(*ts),GFP_KERNEL);
	if(!ts){
		return -ENOMEM ; 
	}
	//给ts指针赋值	
	printk("malloc success!\n");
	ts->client = client ;    
	ts->irq = pdata->irq ;   //获取中断号
	ts->xres = pdata->xres ; //获取x坐标
	ts->yres = pdata->yres ; //获取y坐标
	ts->pressure = pdata->pressure ; 
	//申请输入设备
	ts->dev = input_allocate_device();
	if(!ts->dev){
		ret = -ENOMEM ;
		goto alloc_input_error ; 
	}
	ts->dev->name = client->name ; //"myts"-->board_info_
	ts->dev->phys = "xxxxx" ; 
	ts->dev->uniq = "20170506" ; 
	ts->dev->id.bustype = BUS_I2C ;
	ts->dev->id.vendor = 10010; 
	ts->dev->id.product = 10111 ;
	ts->dev->id.version = 1 ;
        //以上赋值是表示注册设备以后的信息,可以通过cat /proc/bus/input查看
	//注册input事件	
	ret = input_register_device(ts->dev);
	if(ret){
		goto register_input_error ;
	}
	//注册中断-->中断下降沿
	ret = request_irq(ts->irq , ts_handler , IRQF_TRIGGER_FALLING , client->name , ts) ;
        if(ret){
		goto irq_erro ;
	}	
	printk("register irq success!\n");
	return ret ;
	
	register_input_error:
	input_free_device(ts->dev);
	
	alloc_input_error:
	kfree(ts);	

	irq_erro :
	input_unregister_device(ts->dev);
	free_irq(ts->irq,&ts);
	kfree(ts);
}

//i2c的id_table
struct i2c_device_id id_table[] = {
	{"myts",123}, 
	{"herts","456"},
	{},
};


//实现i2c驱动操作结构体
struct i2c_driver ts_drv = {
	
	.probe = ts_probe , 
	.driver = {
		.name = "myts",
	},
	.id_table = id_table ,
};


static int __init hello_init(void)
{
    printk("Hello, kenerl installed for YYXXXXXXXXXX20170423!\n");
    int ret ;
    ret = i2c_add_driver(&ts_drv); //添加一个i2c驱动
    if(ret != 0){
		printk("i2c add driver fair!\n"); 
		i2c_del_driver(&ts_drv); //删除一个i2c驱动
		return -1 ;
    }
    printk("i2c_add  driver success!\n");
    return 0;
}

static void __exit hello_cleanup(void)
{
    printk("Good-bye, removed!\n");
    i2c_del_driver(&ts_drv);
}

module_init(hello_init);
module_exit(hello_cleanup);
MODULE_LICENSE("GPL");

编写Makefile,这里我们在外面写一个用驱动就可以加载的模块:

obj-m	+= ts_drv.o

ROOTFS = .
KERNEL_SRC	= /work/android-5.0.2/kernel

all:
	make -C $(KERNEL_SRC) M=`pwd` modules

clean:
	make -C $(KERNEL_SRC) M=`pwd` clean
	rm -rf app

install:
	make -C $(KERNEL_SRC) M=`pwd` modules_install INSTALL_MOD_PATH=$(ROOTFS)

app:
	arm-linux-gcc app.c -o app
写完驱动后,在当前目录下执行make:


然后,我们通过adb push命令,将该ko放入android根文件系统的system目录下。

如果你的系统的分区没有设置成可读可写,还需要在当前目录下执行:adb remount就可以了。

接下来,执行adb push  ts_drv.ko   /system


然后切换到我的minicom终端,此时Android系统已经启动,我切换到system目录下,执行insmod ts_drv.ko后,然后手点击触摸屏,就会有驱动信息弹出来,做这个步骤之前,要把友善提供的内核里的写好的触摸屏驱动给卸载掉,否则不会成功,请注意。

我们看到,触摸屏的时候,中断服务程序就会被调用,打印出中断号。

下一节,我们将进一步完善这个触摸屏驱动程序。





目录
相关文章
|
12天前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
44 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
2月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
3月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
172 0
|
5月前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
158 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
6月前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化、简单化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权内容与执行内容,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行细节工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
6月前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
7月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
1612 0
|
12月前
|
Linux 网络安全 虚拟化
适用于Linux的Windows子系统(WSL1)的安装与使用记录
并放到启动文件夹,就可以开机自动启动了。
1283 0
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
4241 2