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驱动注册相关推荐

  1. Linux驱动开发——串口设备驱动

    Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...

  2. 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统

    剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...

  3. Linux嵌入式驱动开发02——驱动编译到内核

    文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...

  4. STM32MP157驱动开发——SPI驱动

    STM32MP157驱动开发--SPI驱动 一.简介 1.SPI介绍 2.STM32MP1 SPI介绍 3. ICM-20608 简介 4.Linux下的SPI框架 二.驱动开发 1)IO 的 pin ...

  5. linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写

    摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...

  6. Linux 设备驱动开发思想 —— 驱动分层与驱动分离

    前面我们学习I2C.USB.SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是: 1.XXX 设备驱动 2.XXX 核心层 3.XXX 主机控制器驱动 而需要我们编 ...

  7. linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动

    无根之木不活,无基之楼不立,无论是学习哪个领域知识,基础是重中之重. 针对学习linux驱动,我们来仔细谈谈: 个人认为C语言和数据结构就是重中之重!Linux系统最优秀的地方就在于内核.无论是进程调 ...

  8. I.MX6ULL ARM驱动开发---网络设备驱动框架

    引言   网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能.前面我们已经讲过了字符设备驱动和块设备驱动,本章我们就来学习一下 li ...

  9. windows 驱动开发入门——驱动中的数据结构

    最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...

最新文章

  1. 关于蹭网的一点点感想
  2. 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
  3. Node.js Domain 模块
  4. vscode初次配置
  5. 浅谈的数据库设计原则-之账户体系的分析
  6. php小插件,PHPStrom中一些我收藏的小插件
  7. (附源码)spring boot网上购物平台 毕业设计 141422
  8. 软件安装教程1——Neo4j下载与安装
  9. DBSCAN聚类算法实用案例
  10. Python分析《武林外传》 -----转载
  11. Android Framework 的整体建构
  12. 数码相框(四、使用freetype库实现矢量字体显示)
  13. 西南大学计算机学院读博咋样,专硕想读博士,难吗?北大学长如是说!
  14. 华为mate20参数表_华为的mate20系列参数对比,该选择什么一目了然
  15. Yann LeCun,牛人也!
  16. 浙江科技学院计算机专业录取分数线,浙江科技学院2015年艺术类专业录取分数线...
  17. oracle列转行求和,Oracle行转列和列转行
  18. PS 画笔 取消 圆角
  19. 如何在execl中制作列与列错开的表格?
  20. KCP 协议与源码分析(一)

热门文章

  1. USDTPAY支付通道全行业可接入,安全稳定无痕快捷
  2. Linux下提示命令找不到:bash:command not found
  3. echarts折线图拐点样式图案
  4. [转]速度与激情:雷军和小米手机的三国杀
  5. 特征选择:概述与方法
  6. 一个大学生的自我反思
  7. 柔性塑料漆的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 量化交易 米筐 单因子有效性分析
  9. 今天开始学Java 明明想在学校中请一些同学一起做一项问卷调查
  10. 【新年flag】追光而行的全新救赎——来自大一新生的心声