hid-ft260驱动学习笔记 1 - 驱动模块注册与注销

news2024/11/19 4:30:52

目录

1. ft260_driver_init初始化

1.1 tty设备

1.1.1 申请tty驱动设备

1.1.2 初始化tty驱动程序

1.1.3 注册tty设备

1.2 hid设备

2. ft260_driver_exit注销模块

3. 调试


hid-ft260.c的最底部可以看到该驱动的注册与注销接口的申明。

module_init(ft260_driver_init);
module_exit(ft260_driver_exit);

MODULE_DESCRIPTION("FTDI FT260 USB HID to I2C host bridge and TTY driver");
MODULE_AUTHOR("Michael Zaidman <michael.zaidman@gmail.com>");
MODULE_LICENSE("GPL v2");

module_init即模块注册接口,当Linux中运行lsmod或modprobe安装驱动时系统会调用这个函数。

module_exit是模块的注销接口,当Linux中运行rmmod卸载驱动时系统会调用这个函数。

MODULE_LICENSE用来指定模块许可协议,一般是GPL,这里的GPL v2表示GNU通用公共许可证第2版(GNU General Public License version 2)。这意味着该模块的源代码必须对所有用户开放,并且任何基于此模块修改或衍生的作品也必须在相同的许可证下发布,保证了软件的自由度和可获得性。这个申明一般是必须的,否则编译时会提示警告。

MODULE_AUTHOR申明作者,不是必须。

MODULE_DESCRIPTION是模块的说明,不是必须。

1. ft260_driver_init初始化

FT260可以作为UART、I2C和GPIO的设备存在,所以在初始化时注册了2个设备。

static int __init ft260_driver_init(void)
{

}

__init是注册模块时固定的写法。

1.1 tty设备

1.1.1 申请tty驱动设备

通过调用tty_alloc_driver函数,为串口通信(UART)分配一个终端(TTY)驱动。

	ft260_tty_driver = tty_alloc_driver(UART_COUNT_MAX,
		TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV);
	if (IS_ERR(ft260_tty_driver)) {
		pr_err("tty_alloc_driver failed: %d\n",
			(int)PTR_ERR(ft260_tty_driver));
		return PTR_ERR(ft260_tty_driver);
	}
  • UART_COUNT_MAX:指定最多可支持的UART设备数量。
  • TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV:这两个标志合起来表示驱动将以真实原始模式工作(不进行任何字符处理,直接传递数据)且允许动态创建设备文件。

返回的是分配好的tty驱动设备。全局变量ft260_tty_driver:

static struct tty_driver *ft260_tty_driver;

1.1.2 初始化tty驱动程序

	ft260_tty_driver->driver_name = "ft260_ser";
	ft260_tty_driver->name = "ttyFT";
	ft260_tty_driver->major = 0;
	ft260_tty_driver->minor_start = 0;
	ft260_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
	ft260_tty_driver->subtype = SERIAL_TYPE_NORMAL;
	ft260_tty_driver->init_termios = tty_std_termios;
	ft260_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
	ft260_tty_driver->init_termios.c_ispeed = 9600;
	ft260_tty_driver->init_termios.c_ospeed = 9600;
	tty_set_operations(ft260_tty_driver, &ft260_uart_ops);

这里设置了驱动程序的名称、设备名称、主设备号、从设备号类型和子类型。然后,它初始化了串口的终端属性,包括波特率、数据位、停止位、校验位等。最后,它将操作函数指针设置为ft260_uart_ops,以便在设备文件操作时调用相应的函数。

driver_name是该设备的name,无特殊设定。

name是该设备在Linux中显示的设备名称,这里配置为ttyFT,在/dev目录内就会有一个类似‘ttyFT0’的终端设备。

major是设备的主设备号,这里设置为0一般是表示该主设备号有系统分配空闲设备号。一般设置为0。

minor_start是设备的从设备号,一般为0起始。

type和subtype分别表示设备的类型和子类型。TTY_DRIVER_TYPE_SERIAL表示这是一个串口驱动程序,而SERIAL_TYPE_NORMAL表示这个串口是标准类型的串口。

init_termios设置为tty_std_termios意味着当该串口设备被打开时,它会使用默认的标准终端设置,包括输入输出速度、控制字符等配置,以确保终端能按照常见规则正确工作。

c_cflag初始化一个串口终端的控制模式。具体来说,它设置了以下参数:

  • 波特率(baud rate)为9600;
  • 数据位(data bits)为8位;
  • 奇偶校验(parity)为无;
  • 停止位(stop bits)为1位;
  • 启用读取(read)和挂断(hang up)操作;
  • 忽略modem控制线(local mode)。

c_ispeed和c_ospeed设置输入速度(c_ispeed)和输出速度(c_ospeed)为9600波特率。

最后配置操作函数指针ft260_uart_ops是串口驱动的核心部分,串口数据的读写等操作就是这个函数指针结构体实现的。

static const struct tty_operations ft260_uart_ops = {
	.open			= ft260_uart_open,
	.close			= ft260_uart_close,
	.write			= ft260_uart_write,
	.write_room		= ft260_uart_write_room,
	.chars_in_buffer	= ft260_uart_chars_in_buffer,
	.set_termios		= ft260_uart_set_termios,
	.hangup			= ft260_uart_hangup,
	.install		= ft260_uart_install,
	.cleanup		= ft260_uart_cleanup,
	.proc_show		= ft260_uart_proc_show,
	.get_icount		= ft260_uart_get_icount,
};

1.1.3 注册tty设备

	ret = tty_register_driver(ft260_tty_driver);
	if (ret) {
		pr_err("tty_register_driver failed: %d\n", ret);
		goto err_reg_driver;
	}

tty_register_driver函数用于将ft260_tty_driver注册到TTY系统中。如果注册失败,会输出错误信息并跳转到err_reg_driver标签处。

1.2 hid设备

对于GPIO和I2C,这部分属于一个非标准的hid设备,所以这里只注册为hid设备。

	ret = hid_register_driver(&ft260_driver);
	if (ret) {
		pr_err("hid_register_driver failed: %d\n", ret);
		goto err_reg_hid;
	}

hid_register_driver用于注册一个hid驱动程序,它接受一个指向ft260_driver结构体的指针作为参数,并返回一个整数值。ft260_driver是一个hid驱动结构体:

static struct hid_driver ft260_driver = {
	.name		= "ft260",
	.id_table	= ft260_devices,
	.probe		= ft260_probe,
	.remove		= ft260_remove,
	.raw_event	= ft260_raw_event,
};

这个结构体用于描述一个USB HID设备的驱动程序,具体包含了以下成员:

  • name:驱动程序的名称,此处为"ft260"。
  • id_table:指向一个设备ID列表的指针,用于匹配设备。
  • probe:指向一个函数ft260_probe的指针,该函数在设备插入时被调用,用于初始化设备。
  • remove:指向一个函数ft260_remove的指针,该函数在设备移除时被调用,用于反初始化设备。
  • raw_event:指向一个函数ft260_raw_event的指针,该函数用于处理设备的原始事件。

2. ft260_driver_exit注销模块

static void __exit ft260_driver_exit(void)
{
	hid_unregister_driver(&ft260_driver);
	tty_unregister_driver(ft260_tty_driver);
	tty_driver_kref_put(ft260_tty_driver);
}

__exit 是注销模块的标准写法。

函数中调用了hid_unregister_driver来注销hid设备驱动程序ft260_driver,调用tty_unregister_driver来注销串口驱动程序ft260_tty_driver,最后通过tty_driver_kref_put释放ft260_tty_driver的引用计数,它是和初始模块中的tty_alloc_driver成对出现的。

3. 调试

在Linux驱动模块中,不能使用printf打印信息,需要使用printk打印。在init和exit返回的位置添加打印看一下驱动安装与卸载

  • lsmod查看有没有hid-ft260
  • 命令"sudo insmod hid-ft260.ko" 安装驱动
  • 命令“cat /proc/device”查看驱动主设备号分配情况

  • 命令“sudo dmesg”查看log信息

  • 命令“sudo rmmod hid-ft260”卸载驱动
  • 命令“sudo dmesg”查看log信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nifi脚本组件ExecuteScript 的使用(一)

ExecuteScript 组件的基本使用 前面已经介绍过Nifi中基本的数据流程&#xff0c;这里介绍一下最为常用的一个组件&#xff0c;ExecuteScript processor&#xff0c;顾名思义ExecuteScript组件是一组以自定义脚本为主体的组件&#xff0c;意思就是&#xff0c;可以在该组件内部…

如何使用特殊的参数和符号来改变图像的风格、质量、比例

🪂🌹 /imagine prompt: 一朵白色的花,透明的花瓣,深如海水,晶莹剔透+露珠,8K,HD,常春藤,花卉,热带植物 --v 5 --ar 2:1 --c 80 --s 500 -v 5切换模型版本5--ar 2:1宽高比例为2:1--c 80混沌值为80--s 500样式值为500🧑🏼‍🎨Midjourney 动漫和插画风格 🌹…

Java视频点播网站

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

Redis的八种数据类型介绍

Redis 是一个高性能的键值存储&#xff0c;它支持多种丰富的数据类型。每种数据类型都有其特定的用途和底层实现。下面我将介绍 Redis 支持的主要数据类型及其背后的数据结构。 本人这里还有几篇详细的Redis用法文章&#xff0c;可以用来进阶康康&#xff01; 1. 字符串 (Stri…

Python数据分析-分子数据分析和预测

一、设计背景 分子结构设计与性质计算对研发新型高能量密度材料具有重要意义。机器学习作为一种大数据计算模型&#xff0c;可以避免复杂、危险的实验&#xff0c;大幅提高研发效率、降低设计和计算成本。本文基于机器学习的方法以及通过构建神经网络&#xff0c;实现对高能量…

网络基础:IS-IS协议

IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;是一种链路状态路由协议&#xff0c;最初由 ISO&#xff08;International Organization for Standardization&#xff09;为 CLNS&#xff08;Connectionless Network Service&#xff09;网络设计。…

TP8/6 子域名绑定应用

原www.xxx.com/admin改为admincms.xxx.com config/app.php 官方文档&#xff1a;ThinkPHP官方手册

fastadmin 如何给页面添加水印

偶然发现fastadmin框架有个水印插件&#xff0c;看起来漂亮&#xff0c;就想也实现这样的功能&#xff0c;看到需要费用。但是现成的插件需要费用&#xff0c;自己动手丰衣足食。说干就干。 1. 找到watermark.js &#xff0c;放到assets/js/ 下面 2.具体页面引入 <script…

基于单片机的粉尘检测报警防护系统研究

摘要 &#xff1a; 粉尘检测是环境保护的重要环节&#xff0c;传统的粉尘检测防护系统的预防方式较为单一。本文设计了一种基于单片机的粉尘检测报警防护系统&#xff0c;能有效地检测粉尘浓度&#xff0c;进行多种方式的报警防护&#xff0c;以保证工作人员的生命健康和安全。…

平价猫粮新选择!福派斯鲜肉猫粮,让猫咪享受美味大餐!

福派斯鲜肉猫粮&#xff0c;作为一款备受铲屎官们青睐的猫粮品牌&#xff0c;凭借其卓越的品质和高性价比&#xff0c;为众多猫主带来了健康与美味的双重享受。接下来&#xff0c;我们将从多个维度对这款猫粮进行解析&#xff0c;让各位铲屎官更加全面地了解它的魅力所在。 1️…

强大的文档编辑工具——坤Tools正式版 V0.4.4【免费的Word转PDF、PDF转Word、替换内容、转换图片、合并图片工具】

在这个信息爆炸的时代&#xff0c;我们每个人都像是一名勇敢的探险家&#xff0c;在茫茫的数据海洋中寻找着属于自己的宝藏。 软件链接&#xff1a;吾爱原创 | 全功能批量处理器&#xff0c;绿色版本&#xff01; 今天给大家带来一款功能强大的文档编辑工具——坤Tools正式版…

孙溟㠭篆刻《睡片原谅一切,醒来不问过往》

孙溟㠭篆刻《睡片原谅一切&#xff0c;醒来不问过往》 佛陀言&#xff1a;睡前原谅一切&#xff0c;醒来不问过往&#xff0c;珍惜所有不期而遇&#xff0c;看淡所有不辞而别甲辰夏溟㠭于寒舍小窗下刊。

Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测

章节内容 上一节我们完成了&#xff1a; Hive中数据导出&#xff1a;HDFSHQL操作上传内容至Hive、增删改查等操作 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&am…

KIVY 3D Rotating Monkey Head¶

3D Rotating Monkey Head — Kivy 2.3.0 documentation KIVY 3D Rotating Monkey Head kivy 3D 旋转猴子头 This example demonstrates using OpenGL to display a rotating monkey head. This includes loading a Blender OBJ file, shaders written in OpenGL’s Shading…

机器学习筑基篇,​Ubuntu 24.04 快速安装 PyCharm IDE 工具,无需激活!

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 快速安装 PyCharm IDE 工具 描述&#xff1a;虽然在之前我们安装了VScode&#xff0c;但是其对于使用Python来写大型项目以及各类配置还是比较复杂的&#xff0c;所以这里我们还是推…

docker buildx 交叉编译设置

dockerd配置文件 /etc/docker/daemon.json设置&#xff1a; rootubuntu:/etc/docker# cat daemon.json {"insecure-registries":["localhost:5000","127.0.0.1:5000","172.16.67.111:5000"],"features": {"buildkit&…

三、数据库系统(考点篇)

1、三级模式一两级映像 内模式&#xff1a;管理如何存储物理的 数据 &#xff0c;对数据的存储方式、优化、存放等。 模式&#xff1a;又称为概念模式&#xff0c; 就是我们通常使用的表这个级别 &#xff0c;根据应用、需求将物理数据划分成一 张张表。 外模式&#xff1a;…

springboot出租房租赁系统-计算机毕业设计源码80250

摘 要 随着城市化进程的不断推进&#xff0c;人口流动日益频繁&#xff0c;住房租赁需求逐渐增加。为了更好地满足人们对住房租赁服务的需求&#xff0c;本论文基于Spring Boot框架&#xff0c;设计并实现了一套出租房租赁系统。 首先&#xff0c;通过对市场需求和现有系统的调…

职升网:中级统计师是否属于中级职称?

中级统计师确实属于中级职称。 在统计专业人员的职称体系中&#xff0c;中级统计师占据了重要的位置&#xff0c;它属于中级职称范畴。这个职称体系包括初级、中级、高级和正高级四个层次&#xff0c;每个层次都对应着不同的专业技术岗位等级。初级职称只设助理级&#xff0c;…

Podman 深度解析

目录 引言Podman 的定义Podman 的架构Podman 的工作原理Podman 的应用场景Podman 在 CentOS 上的常见命令实验场景模拟总结 1. 引言 随着容器化技术的发展&#xff0c;Docker 已成为容器管理的代名词。然而&#xff0c;由于 Docker 的一些局限性&#xff0c;如需要守护进程和 …