Linux下的misc设备驱动

文章目录

  • 前言
  • 一、misc是什么?
  • 二、调用API
    • 1.注册
    • 2.注销
  • 三、驱动框架
  • 总结


前言

misc设备即杂项设备,Linux系统中类似按键、触摸屏都有专门框架处理,类似adc、蜂鸣器等设备无法明确其属于什么类型,一般就归属于杂项设备,按misc驱动框架编写驱动程序。


一、misc是什么?

所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。为了解决字符设备驱动的不断增加。MISC设备会自动创建cdev,我们需要向Linux注册一个miscdevice设备,是一个结构体,定义在文件 include/linux/miscdevice.h 中:

struct miscdevice {int minor; // 次设备号const char *name; // 设备名字	/dev目录下生成设备文件const struct file_operations *fops; // 设备操作函数集合struct list_head list;struct device *parent;struct device *this_device;const struct attribute_group **groups;const char *nodename;umode_t mode;
};次设备号也可以用宏进行动态分配:MISC_DYNAMIC_MINOR	
也可以在 include/linux/miscdevice.h 中选,也可以自己定义,只要没被使用

在这里插入图片描述

二、调用API

1.注册

函数如下:

int misc_register(struct miscdevice * misc)misc:要注册的 MISC 设备。
返回值: 负数,失败; 0,成功

可以代替以前字符驱动的这些步骤:

	alloc_chrdev_region(); /* 申请设备号 */cdev_init(); /* 初始化 cdev */cdev_add(); /* 添加 cdev */class_create(); /* 创建类 */device_create(); /* 创建设备 */

2.注销

函数如下:

int misc_deregister(struct miscdevice *misc)misc:要注销的 MISC 设备。
返回值: 负数,失败; 0,成功。

可以代替以前字符驱动的这些步骤:

	cdev_del(); /* 删除 cdev */unregister_chrdev_region(); /* 注销设备号 */device_destroy(); /* 删除设备 */class_destroy(); /* 删除类 */

三、驱动框架

下面展示一个基本的misc驱动框架示例

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/uaccess.h>struct myled_data {struct miscdevice mdev;int gpio;
};struct myled_data myled;int led_open (struct inode *a, struct file *b)
{return 0;
}ssize_t led_write(struct file *a, const char __user *b, size_t c, loff_t *d)
{char buf[5] = {0};int ret = 0;ret = copy_from_user(buf,b,c);if(ret < 0){printk("misc led failed to copy_from_user\n");return -EFAULT;}if(buf[0] == 0)gpio_set_value(myled.gpio,0);elsegpio_set_value(myled.gpio,1);return ret;
}struct file_operations fop = 
{.owner = THIS_MODULE,.open = led_open,.write = led_write,
};int led_probe(struct platform_device *pdev)
{int ret = 0;myled.gpio = of_get_named_gpio(pdev->dev.of_node,"led-gpio",0);ret = devm_gpio_request(&pdev->dev,myled.gpio,"LED GPIO");if(ret){dev_err(&pdev->dev,"devm_gpio_request failed !\n");return ret;}gpio_direction_output(myled.gpio,0);myled.mdev.name = "misc_led";myled.mdev.minor = MISC_DYNAMIC_MINOR;	//动态分配myled.mdev.fops = &fop;return misc_register(&myled.mdev);
}int led_exit(struct platform_device *pdev)
{misc_deregister(&myled.mdev);return 0;
}struct of_device_id led_of_match[] = {{.compatible = "misc_led"},
};struct platform_driver myled_driver = 
{.driver = {.name = "zynq_misc_led",.of_match_table = led_of_match,},.probe = led_probe,.remove = led_exit,
};module_platform_driver(myled_driver);MODULE_AUTHOR("LZW");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MISC DRIVER BASE ON MISC FRAMEWORK");

编写完ko成功加载后,即可在应用层像操作字符设备节点一样,进行open,read,write等操作。


总结

以上就是今天要讲的内容,本文简单介绍了misc设备驱动的编写及使用,制作不易,多多包涵。

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

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

相关文章

Sqli-labs合集之环境搭建

Sqli-labs的搭建 搭建第一个SQL注入学习靶场环境&#xff1a; 软件&#xff1a;sqli-labs 安装过程&#xff1a; 1.源码地址&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based.&#xff1b; 2.将压缩包解压到phpst…

非线性系列(三)—— 非线性求解器算法分类

1. 总体认知 CAE中的非线性方程组求解主要依赖牛顿法&#xff08;及牛顿法的变体&#xff09;&#xff0c;步骤如下 以线搜索方法为例&#xff0c;流程如下: 2. 方法分类 适用范围大类小类描述牛顿法雅可比矩阵难获取拟牛顿法 Broyden&#xff08;Secant method&#xff09;、…

15. Revit API: Transaction(事务)与 Failures(故障处理)

前言 UI讲完&#xff0c;回到DB这块儿。在Document那篇&#xff0c;提到增删改查操作都是在Document上&#xff0c;是对Documet进行操作。 看到“增删改查”这四个&#xff0c;想到什么了没有&#xff1f; 数据库&#xff08;DB&#xff09;嘛~话说那本经典的红皮数据库的书叫…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求&#xff1a; 1&#xff0c;DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;办公区设备10.0.…

计算机网络之广域网

广域网特点: 主要提供面向通信的服务&#xff0c;支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远&#xff0c;需要考虑的因素增多&#xff0c; 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护&#xff0c;并向全社会…

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…

DDoS攻击详解

DDoS 攻击&#xff0c;其本质是通过操控大量的傀儡主机或者被其掌控的网络设备&#xff0c;向目标系统如潮水般地发送海量的请求或数据。这种行为的目的在于竭尽全力地耗尽目标系统的网络带宽、系统资源以及服务能力&#xff0c;从而致使目标系统无法正常地为合法用户提供其所应…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址&#xff1a;从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器&#xff08;监视器&#xff09; &#xff08;1&#xff09;作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;简写语法——简单数据类型&#xff0c;直接监视 ① Watch:{ 数…

[Flink]二、Flink1.13

7. 处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API ,这也是 Flink 编程的核心。而我们知道,为了让代码有更强大的表现力和易用性, Flink 本身提供了多…

一文入门【NestJs】Controllers 控制器

Nest学习系列 ✈️一文带你入门【NestJS】 ✈️前言 流程图 Controllers 控制器主要负责处理传入请求&#xff0c;并向客户端返回响应&#xff0c;控制器可以通过路由机制来控制接收那些请求&#xff0c;通常一个Controllers种会有多个匹配路由&#xff0c;不同的路由可以知…

Spring源码二十一:Bean实例化流程四

上一篇Spring源码二十&#xff1a;Bean实例化流程三中&#xff0c;我们主要讨论了单例Bean创建对象的主要方法getSingleton的内部方法createBean&#xff0c;createBean方法中的resolveBeanClase方法与prepareMethodOverrides方法处理了lookup-method属性与repliace-method配置…

MT3046 愤怒的象棚

思路&#xff1a; a[]存愤怒值&#xff1b;b[i]存以i结尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i结尾的&#xff0c;窗口里面包含✳的最大值。 &#xff08;✳为新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ✳ 5 6 7 8 9 则ans的计算公式b3b4c4c5c6b7b8b9…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别

在当今的自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情绪识别是一个非常重要的应用场景。无论是在智能客服、社交媒体分析&#xff0c;还是在情感计算领域&#xff0c;准确地识别用户的情绪都能够极大地提升用户体验和系统的智能化水平。BERT&#xff08;Bidirec…

imx6ull/linux应用编程学习(12)CAN应用编程基础

关于裸机的can通信&#xff0c;会在其他文章发&#xff0c;这里主要讲讲linux上的can通信。 与I2C,SPI等同步通讯方式不同&#xff0c;CAN通讯是异步通讯&#xff0c;也就是没有时钟信号线来保持信号接收同步&#xff0c;也就是所说的半双工&#xff0c;无法同时发送与接收&…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习&#xff0c;话不多说&#xff0c;直接上货&#xff01;&#xff01;&#xff01; 1.第一个C程…

【Linux进阶】文件系统8——硬链接和符号连接:ln

在Linux下面的链接文件有两种&#xff0c; 一种是类似Windows的快捷方式功能的文件&#xff0c;可以让你快速地链接到目标文件&#xff08;或目录)&#xff1b;另一种则是通过文件系统的inode 链接来产生新文件名&#xff0c;而不是产生新文件&#xff0c;这种称为硬链接&…

base SAS programming学习笔记10(combine data)

1.一对一合并 基本格式如下&#xff1a; data output-data-set; set data-set1; set data-set2;(data-set1和data-set2可以是相同的数据集&#xff0c;可以添加多个set 语句来实现上述的一对一合并) run; 输出数据集结果如下&#xff1a; a.会包含所有输入数据的变量名&#x…

小米手机永久删除的照片怎么找回?这两个方法千万不要错过!

小米手机永久删除的照片怎么找回&#xff1f;身为米粉发烧党的小编又双叒叕手残了&#xff01;本来想在手机回收站中恢复一张照片&#xff0c;结果一个稀里糊涂就把照片点成了“永久删除”。于是乎难得的休班假期&#xff0c;就变成了小编恢复永久删除照片的漫漫之路。以下是小…