Linux驱动开发 -- touch驱动注册
Linux i2c驱动开发 – touch 驱动
文章目录
- Linux i2c驱动开发 -- touch 驱动
- 前言
- 一、i2c 驱动框架
- 二、Linux的MODULE声明
- 1. MODULE相关声明
- 三、模块的初始化与卸载
- 1. module_init()
- 2. module_exit()
- 四、驱动注册
- 1. i2c_add_driver()介绍
- 2. i2c_add_driver参数介绍
前言
本章主要针i2c driver的注册,卸载以及probe函数的调用进行内容整理。初步学习,如有错误,还请指正。
一、i2c 驱动框架
i2c驱动包含四个部分:总线、驱动、设备、适配器。当绑定总线后注册驱动时,驱动会进入设备列表进行对目标设备进行匹配,若匹配成功,则会调用probe函数。当probe函数执行成功后,那么整个驱动就注册完成了。
那么在此之前,我们需对编写的模块进行处理。
二、Linux的MODULE声明
头文件:#include <linux/module.h>
这个头文件包含了许多符号与函数的定义,这些符号与函数多与加载模块有关。
1. MODULE相关声明
MODULE_AUTHOR("Tory"); //声明谁编写这个模块
MODULE_DESCRIPTION("TouchScreen Driver"); //概述模块内容
MODULE_DEVICE_TABLE(i2c, sth_ts_id); //申明该模块支持哪些设备,第一个参数为设备类型,第二个参数为支持的设备列表
MODULE_LICENSE("GPL"); //声明此模块的许可证,内核接受的许可证有:“GPL”,“GPLv2”,“GPL and additional rights”,“Dual BSD/GPL”,“Dual MPL/GPL”,“Proprietary”。
需要注意的是,如果未用MODULE_LICENSE申明模块的许可证时,那么内核在加载该模块时可能会报内核污染的错误(kernel tainted)。
三、模块的初始化与卸载
头文件:#include <linux/init.h>
这个头文件包含了模块初始化和清除的函数。
1. module_init()
此为模块初始化函数。包含驱动的注册、匹配及初始化。
static int __init sth_ts_init(void)
{int ret;ret = i2c_add_driver(&sth_ts_driver);return ret;
}module_init(sth_ts_init);
模块加载时( module_init() ),程序会运行被__init修饰的函数,根据源码可知,该函数需返回int型,且无形参void。
2. module_exit()
此为模块卸载函数,本章用来卸载驱动。
static void __exit sth_ts_exit(void)
{i2c_del_driver(&sth_ts_driver);
}module_eixt(sth_ts_exit);
四、驱动注册
1. i2c_add_driver()介绍
上文在说明module_init时,初始化函数中调用了Linux的驱动注册函数:i2c_add_driver(),形参为结构体类型。
追其源码:
#define i2c_add_driver(driver) \i2c_register_driver(THIS_MODULE, driver)
继续追究i2c_register_driver源码:
int i2c_register_driver(struct module *owner, struct i2c_dirver *driver)
{int res;/* can't register until after driver model init */if(unlikely(WARN_ON(!i2c_bus_type.p)))return -EAGAIN;/* add the driver to the list of i2c drivers in the driver core */driver->driver.owner = owner; //驱动模块程序的拥有者driver->driver.bus = &i2c_bus_type; //绑定总线/* When registeration returns,the driver corewill have called probe() for all match-but-unbound devices*/res = driver_register(&driver->driver);...
}
由此可知,i2c_add_register会完成绑定总线,注册驱动,匹配设备以及调用probe函数的动作。
2. i2c_add_driver参数介绍
既然注册驱动,那么形参中就需包含驱动所需的元素,而且元素包含在内核自带的i2c_driver结构体中。本次仅介绍实际所需的几个元素:
/* 下方为设备列表 */
static const struct i2c_device_id sth_ts_id[] = {{"sth",0}, //第一个参数为设备id,第二个参数为该设备的特定属性,如果没有,则默认为0{}
}/* 下方为设备匹配表,根据compatible内容匹配 */
static struct of_device_id sth_match_table[] = {{ .compatible = "sth,sth_ts", },{}
};static const struct dev_pm_ops sth_ts_pm_ops = {#if (!defined(CONFIG_FB) && !defined(CONFIG_HAS_EARLYSUSPEND)).suspend = sth_ts_suspend,.resume = sth_ts_resueme,
#endif
};static struct i2c_driver sth_ts_driver = {.probe = sth_ts_probe, //申明probe函数;.remove = sth_ts_remove, //申明注销设备的函数;.id_table = sth_ts_id, //设备列表;.driver = {.owner = THIS_MODULE, //声明驱动程序模块持有者,THIS_MODULE为内核的一个模块,表明驱动程序在此处运行。.name = sth_name, //声明驱动程序模块名称.of_match_table = sth_match_table, //进入设备树寻找.compatible,匹配设备
#if define(CONFIG_PM).pm = &sth_ts_pm_ops, //电源管理
#endif},
}
① i2c_device_id为设备列表相关结构体,其成员包含两个参数:第一个参数:设备,第二个参数:设备的特定属性,若没有则默认0即可。
② of_device_id为设备匹配相关结构体,其成员用来与dtsi文件(设备树)中的.compatible设备名进行匹配,一致则匹配成功。
③ dev_pm_ops为电源管理相关结构体,包含休眠、唤醒等机制的注册内容。除此之外,在进行设定之前需确定内核是否给底层提供接口(比如可通过相关宏定义确认:CONFIG_PM,CONFIG_FB等),如未提供,则不用进行注册。
Linux驱动开发 -- touch驱动注册相关推荐
- Linux驱动开发——串口设备驱动
Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...
- 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统
剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...
- Linux嵌入式驱动开发02——驱动编译到内核
文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...
- STM32MP157驱动开发——SPI驱动
STM32MP157驱动开发--SPI驱动 一.简介 1.SPI介绍 2.STM32MP1 SPI介绍 3. ICM-20608 简介 4.Linux下的SPI框架 二.驱动开发 1)IO 的 pin ...
- linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...
- Linux 设备驱动开发思想 —— 驱动分层与驱动分离
前面我们学习I2C.USB.SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是: 1.XXX 设备驱动 2.XXX 核心层 3.XXX 主机控制器驱动 而需要我们编 ...
- linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动
无根之木不活,无基之楼不立,无论是学习哪个领域知识,基础是重中之重. 针对学习linux驱动,我们来仔细谈谈: 个人认为C语言和数据结构就是重中之重!Linux系统最优秀的地方就在于内核.无论是进程调 ...
- I.MX6ULL ARM驱动开发---网络设备驱动框架
引言 网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能.前面我们已经讲过了字符设备驱动和块设备驱动,本章我们就来学习一下 li ...
- windows 驱动开发入门——驱动中的数据结构
最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...
最新文章
- 关于蹭网的一点点感想
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
- Node.js Domain 模块
- vscode初次配置
- 浅谈的数据库设计原则-之账户体系的分析
- php小插件,PHPStrom中一些我收藏的小插件
- (附源码)spring boot网上购物平台 毕业设计 141422
- 软件安装教程1——Neo4j下载与安装
- DBSCAN聚类算法实用案例
- Python分析《武林外传》 -----转载
- Android Framework 的整体建构
- 数码相框(四、使用freetype库实现矢量字体显示)
- 西南大学计算机学院读博咋样,专硕想读博士,难吗?北大学长如是说!
- 华为mate20参数表_华为的mate20系列参数对比,该选择什么一目了然
- Yann LeCun,牛人也!
- 浙江科技学院计算机专业录取分数线,浙江科技学院2015年艺术类专业录取分数线...
- oracle列转行求和,Oracle行转列和列转行
- PS 画笔 取消 圆角
- 如何在execl中制作列与列错开的表格?
- KCP 协议与源码分析(一)