【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…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...