【Linux-MISC设备】
目录
- 1. MISC设备
- 2. MISC蜂鸣器实验
1. MISC设备
- MISC设备的主设备号为10.
- MISC设备会自动创建cdev,不需要再手动创建。
- MISC设备是基于platform的.
MISC驱动的编写的核心就是初始化miscdevice结构体变量,然后用misc_register函数向内核注册,然后使用misc_deregister函数删除注册.
- 如果设置MISC结构体中的minor是255的话是自动分配设备号。
2. MISC蜂鸣器实验
- 设备树添加
beep{compatible = "alientek,beep";pinctrl-names = "default";pinctrl-0 = <&pinctrl_beep>;beep-gpios=<&gpio5 1 GPIO_ACTIVE_HIGH>;status = "okay";};
- 驱动文件编写
驱动编写的思路就是先写paltform平台模板,随后就是关于MISC设备模板流程,最后就是自己设备信息的添加,例如节点信息,gpio号等等.
#define MISCBEEP_NAME "miscbeep"
#define MISCBEEP_MINOR 144
#define BEEPON 1
#define BEEPOFF 0
//添加设备的信息,注意这里是用户自定义的结构体,里面的信息是自主要添加的
struct miscbeep_dev {struct device_node *nd;int beep_gpio;
};
struct miscbeep_dev miscbeep;
//fops文件操作函数
static int miscbeep_release(struct inode *inode, struct file *file)
{printk("Close ok\r\n");return 0;
}
//fops文件操作函数
static int miscbeep_open(struct inode *inode, struct file *file)
{printk("Open ok\r\n");file->private_data = &miscbeep;return 0;
}
//fops文件操作函数
static ssize_t miscbeep_write(struct file *file, const char __user *buffer,size_t count, loff_t *pos)
{int ret = 0;unsigned char databuf[1];struct miscbeep_dev *dev=file->private_data;ret = copy_from_user(databuf,buffer,count);if(ret<0){return -EINVAL;}if(databuf[0]==BEEPON){gpio_set_value(dev->beep_gpio,0);}if(databuf[0]==BEEPOFF){gpio_set_value(dev->beep_gpio,1);}return 0;
}
//fops文件操作函数集
static struct file_operations miscbeep_fops = {.owner = THIS_MODULE,.open = miscbeep_open,.write = miscbeep_write,.release = miscbeep_release,};
//将要注册的设备,包含必要的信息例如设备号,名字,文件操作合集,
//注意这里的结构体是内核定义的
static struct miscdevice beep_miscdev = {.minor = MISCBEEP_MINOR,.name = MISCBEEP_NAME,.fops = &miscbeep_fops,
};
//paltform平台设备与驱动匹配成功后执行的函数
static int miscbeep_probe(struct platform_device *dev)
{int ret = 0;/*1.初始化蜂鸣器IO*/miscbeep.nd = dev->dev.of_node;miscbeep.beep_gpio = of_get_named_gpio(miscbeep.nd,"beep-gpios",0);if(miscbeep.beep_gpio < 0){ret = -EINVAL;goto fail_findgpio;}ret = gpio_request(miscbeep.beep_gpio,"beep-gpio");if(ret){printk("cant't request %d gpio",miscbeep.beep_gpio);ret = -EINVAL;goto fail_findgpio;}ret = gpio_direction_output(miscbeep.beep_gpio,1);/*输出高电平*/if(ret<0){goto fail_setoutput;}/*2.MISC驱动注册*/ret = misc_register(&beep_miscdev);if(ret<0){goto fail_setoutput;}return 0;
fail_setoutput:gpio_free(miscbeep.beep_gpio);
fail_findgpio:return ret;
}//paltform平台设备与驱动匹配成功后,移除驱动后要执行的函数
static int miscbeep_remove(struct platform_device *dev)
{gpio_set_value(miscbeep.beep_gpio,1);gpio_free(miscbeep.beep_gpio);misc_deregister(&beep_miscdev);return 0;
}
/*paltform匹配表*/
static const struct of_device_id beep_of_match[]={{.compatible = "alientek,beep",},{/**/}
};
//paltform平台设备驱动定义结构体
static struct platform_driver miscbeep_driver = {.driver = {.name = "imx6ull-beep",.of_match_table = beep_of_match,/*设备树匹配表*/},.probe = miscbeep_probe,.remove = miscbeep_remove,
};
/*驱动入口和出口函数*/
static int __init miscbeep_init(void)
{return platform_driver_register(&miscbeep_driver);
}
static void __exit miscbeep_exit(void)
{platform_driver_unregister(&miscbeep_driver);
}
module_init(miscbeep_init);
module_exit(miscbeep_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WYJ");
相关文章:
【Linux-MISC设备】
目录 1. MISC设备2. MISC蜂鸣器实验 1. MISC设备 MISC设备的主设备号为10.MISC设备会自动创建cdev,不需要再手动创建。MISC设备是基于platform的. MISC驱动的编写的核心就是初始化miscdevice结构体变量,然后用misc_register函数向内核注册,…...
【随笔】VRRP+MSTP
虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP) 设计采用主备模式,将VRRP组内多个路由设备都映射为一个虚拟路由设备。 一个VRRP组中只能由一台处于主控角色的路由器,可以有一个或多个备份角色的路由器。…...
vue 动态增删行,并form表单校验(附v2\v3)
Vue3 组件用的 ant 可以换成你们用,主要是form校验 前端代码 <a-formref"formRef":model"formData":label-col-props"{ span: 5 }":wrapper-col-props"{ span: 17 }"><a-row><a-form-itemlabel"角色…...
计算机网络的基本概念
IP地址(Internet Protocol Address)是指在计算机网络中每个设备的唯一标识符。它用于区分不同设备并在网络中进行数据包的路由。我们平常所使用的IP地址主要版本: IPv4 格式: 由四个整数(0到255)组成,以点…...
Python 爬虫项目实战三:GitHub 用户信息抓取与分析
一、项目背景 爬虫技术不仅限于获取网页内容,还可以用于获取和分析特定网站的用户信息。本文将演示如何使用Python编写爬虫程序,从GitHub网站抓取用户信息,并进行简单的数据分析。 二、环境准备 在开始之前,请确保你已经安装了…...
xtrabackup搭建MySQL 8.0 主从复制
xtrabackup搭建MySQL 8.0 主从复制 安装MySQL 8.0.37安装xtrabackupGTIDs初始化从库参考:GTID概述GTID相较与传统复制的优势GTID自身存在哪些限制GTID工作原理简单介绍如何开启GTID复制GTID与传统模式建立复制时候语句的不同点传统复制GTID复制 GTID同步状态简单解析…...
Java程序员接单分享
作为一名Java程序员,这阵子通过承接些小型项目,我顺利跨过了月薪破万的门槛。这些项目虽小,却如同磨刀石般,让我在实战中发现了自身技术栈的棱角与不足,尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…...
【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习
个人主页→VON 收录专栏→鸿蒙开发小型案例总结 基础语法部分会发布于github 和 gitee上面 前言 本系列可能是博客首发,鸿蒙开发星河版是一个全新的版本,由于参考视频较少鸿蒙开发不被重视导致csdn上面并没有全套的学习路线,…...
C语言----计算开机时间
计算开机时间 实例说明 编程实现计算开机时间,要求在每次开始计算开机时间时都能接着上次记录的结果向下记录。 实现过程: 1. 在TC中创建一个C文件。 2. 引用头文件,代码如下: #include <stdio.h> 3. 定义结构体time,用来…...
批发行业进销存-登录适配 android 横竖屏幕 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
一、横竖屏切换的意义 以下是移动端横屏竖屏可切换在进销存中的一些重要应用: a、数据录入与查看 在录入商品信息、库存数量等大量数据时,横屏模式可以提供更宽阔的输入区域,减少输入错误。例如,在输入长串的商品编码或详细的商…...
js功能(1)
1、readonly 应用于元素:readonly 可以应用于 <input> 和 <textarea> 元素。 用户界面表现:当元素设置为 readonly 时,用户不能更改输入框中的值,但可以选中和复制文本,且表单包含该输入字段的值可以被提交…...
微信小程序乡村医疗系统,源码、部署+讲解
目录 摘 要 Abstract 1 绪论 1.1 研究背景及意义 1.2 研究现状 1.3 研究内容 2 相关技术介绍 2.1 Java 语言 2.2 MySQL 数据库 2.3 Spring Boot 框架 2.4 B/S 结构 2.5 微信小程序 3 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术可行性…...
完美解决pip命令版本冲突导致对应版本模块包无法安装的问题
解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中,我们首先需要安装相关依赖文件( path/to/your/requirements.txt) -extra-index-url https://down…...
5.1-软件工程基础知识-软件工程概述
软件工程诞生原因 了解 早期的软件:主要是指采用个体工作方式实现的程序。第一次软件危机:20世纪60年代中期 典型表现有软件质量低下、项目无法如期完成、项目严重超支等因为软件而导致的重大事故时有发生。 软件工程的诞生:1968年在NATO会…...
极简聊天室-websocket版
再写一个极简聊天室的websocket版,在本例中,websocket仅用于服务器向客户端传输信息,客户端向服务器发送信息是传统的http post方式,用axios来实现的,当然websocket本身是支持双向通信,主要是为了方便跟前面…...
QT学生管理系统 开发文档
目录 第一章 UI界面设计与开发 登录界面 主界面 UI美化 第二章 数据库设计与开发 数据库设计 连接数据库 数据库功能设计 sql语句设计 查询所有学生数量 查询第几页学生数据 删除学生 修改学生信息 清空学生表 添加单个用户 删除单个用户 修改用户权限 查询所有用户…...
【五大海内外高校支持】2024年数字经济与计算机科学国际学术会议(DECS2024)
大会官网:www.icdecs.net 大会时间:2024年9月20-22日 大会地点:中国-厦门 截稿日期:详情见官网 支持单位 马来西亚理工大学 北京科技大学经济管理学院 南京信息工程大学 马来西亚敦胡先翁大学 大会嘉宾 大会主席 罗航…...
VS项目打包成lib库并使用
一、新建一个静态库项目 一般要把项目设为Release模式 二、添加文件 将所需要打包的头文件、源文件添加到该静态库项目中 三、生成项目 生成成功后即可在Release文件夹出现找到相应的.lib文件 四、使用静态库 将静态库文件复制到项目文件夹中,然后在项目属性设…...
社交巨头与去中心化:解析Facebook在区块链的角色
区块链技术的兴起为多个行业带来了变革,而社交平台也正在经历这一波技术浪潮。作为全球最大的社交网络之一,Facebook(现名Meta Platforms)在区块链领域的探索展示了其如何应对去中心化趋势的挑战,并利用这一技术推动自…...
MyBatis(学习记录)
一、ORM ORM是“对象关系映射”(Object-Relational Mapping)的缩写。这是一种编程技术,用于将对象模型与关系型数据库系统之间的数据进行转换。在面向对象的编程语言中,数据通常以对象的形式表示;而在关系型数据库中&a…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
