当前位置: 首页 > news >正文

Linux驱动开发学习笔记6《蜂鸣器实验》

目录

一、蜂鸣器驱动原理

二、硬件原理分析

三、实验程序编写

1、 修改设备树文件

(1)添加pinctrl节点

(2)添加BEEP设备节点

(3)检查PIN 是否被其他外设使用

2、蜂鸣器驱动程序编写

3、编写测试APP

 四、运行测试


一、蜂鸣器驱动原理

        蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要2K-5K 的方波去驱动。I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作,I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如下图所示:

        有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个IO来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到I.MX6U 的GPIO 上有可能会烧毁IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。

二、硬件原理分析

        上图中通过一个PNP 型的三极管8550 来驱动蜂鸣器,通过SNVS_TAMPER1 这个IO来控制三极管Q1 的导通,当SNVS_TAMPER1 输出低电平的时候Q1 导通,相当于蜂鸣器的正极连接到DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当SNVS_TAMPER1输出高电平的时候Q1 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。

三、实验程序编写

1、 修改设备树文件

(1)添加pinctrl节点

        I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1 这个PIN,打开imx6ull-alientekemmc.dts,在iomuxc 节点的imx6ul-evk 子节点下创建一个名为“pinctrl_beep”的子节点,节点内容如下所示:

pinctrl_beep: beepgrp{fsl,pins = <MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x10B0>;};

(2)添加BEEP设备节点

        在根节点“/”下创建BEEP 节点,节点名为“beep”,节点内容如下:

beep{#address-cell = <1>;#size-cell = <1>;compatible = "atkalpha-beep";pinctrl-names = "defaults";pinctrl-0 = <&pinctrl_beep>;beep-gpio = <&gpio5 1 GPIO_ACTIVE_HIGH>;status = "okay";};

(3)检查PIN 是否被其他外设使用

        此先检查PIN 为SNVS_TAMPER1这个PIN 有没有被其他的pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查GPIO5_IO01 这个GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。

        设备树编写完成以后使用“make dtbs”命令重新编译设备树,然后使用新编译出来的imx6ull-alientek-emmc.dtb 文件启动Linux 系统。启动成功以后进入“/proc/device-tree”目录中查看“beep”节点是否存在,如果存在的话就说明设备树基本修改成功(具体还要驱动验证),结果如下图所示:

2、蜂鸣器驱动程序编写

 编写beep.c文件:

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>#define BEEP_CNT 1 //设备号个数
#define BEEP_NAME "beep" //名字
#define BEEPOFF 0 //关蜂鸣器
#define BEEPON 1 //开蜂鸣器struct beep_dev
{dev_t devid; //设备号struct cdev cdev; //cdevstruct class *class; //类struct device *device; //设备int major; //主设备号int minor; //次设备号struct device_node *nd; //设备节点int beep_gpio; //beep所使用的GPIO编号
};struct beep_dev beep; //beep设备//打开设备
static int beep_open(struct inode *inode, struct file *filp)
{filp->private_data = &beep; //设置私有数据return 0;
}//向设备写数据
static ssize_t beep_write(struct file *filp, const char __user *buf,size_t cnt, loff_t *offt)
{int retvalue;unsigned char databuf[1];unsigned char beepstat;struct beep_dev *dev = filp->private_data;retvalue = copy_from_user(databuf, buf, cnt);if(retvalue < 0){printk("kernel write failed!\r\n");return -EFAULT;}beepstat = databuf[0]; //获取状态值if(beepstat == BEEPON){gpio_set_value(dev->beep_gpio, 0); //8550三极管是PNP型,高电压截至,低电压导通}else if (beepstat == BEEPOFF){gpio_set_value(dev->beep_gpio, 1); //关闭蜂鸣器}return 0;
}//释放设备
static int beep_release(struct inode *inode, struct file *filp)
{return 0;
} //设备操作函数
static struct file_operations beep_fops = {.owner = THIS_MODULE,.open = beep_open,.write = beep_write,.release = beep_release,
};//驱动入口函数
static int __init beep_init(void)
{int ret = 0;//设置BEEP所使用的GPIO//1、获取设备节点:beepbeep.nd = of_find_node_by_path("/beep");if(beep.nd == NULL){printk("beep node not find!\r\n");return -EINVAL;}else{printk("beep node find!\r\n");}//2、获取设备树中的gpio属性,得到BEEP所使用的GPIO编号beep.beep_gpio = of_get_named_gpio(beep.nd, "beep-gpio", 0);if (beep.beep_gpio < 0){printk("can't get beep-gpio");return -EINVAL;}printk("led-gpio num = %d\r\n", beep.beep_gpio);  //3、设置GPIO5_IO01为输出,并且输出高点平,默认关闭BEEPret = gpio_direction_output(beep.beep_gpio, 1);if(ret < 0){printk("can't set gpio!\r\n");}//注册字符设备驱动//1、创建设备号if(beep.major)//定义了设备号{beep.devid = MKDEV(beep.major, 0);register_chrdev_region(beep.devid,BEEP_CNT,BEEP_NAME);}else//没有定义设备号{alloc_chrdev_region(&beep.devid, 0, BEEP_CNT, BEEP_NAME);beep.major = MAJOR(beep.devid);//获取分配号的主设备号beep.minor = MINOR(beep.devid);//获取分配号的次设备号}printk("beep major = %d, minor = %d\r\n",beep.major, beep.minor);//2、初始化cdevbeep.cdev.owner = THIS_MODULE;cdev_init(&beep.cdev, &beep_fops);//3、添加一个cdevcdev_add(&beep.cdev, beep.devid, BEEP_CNT);//4、创建类beep.class = class_create(THIS_MODULE,BEEP_NAME);if (IS_ERR(beep.class)){return PTR_ERR(beep.class);}//5、创建设备beep.device = device_create(beep.class, NULL, beep.devid, NULL, BEEP_NAME);if(IS_ERR(beep.device)){return PTR_ERR(beep.device);}return 0;
}
//驱动出口函数
static void __exit beep_exit(void)
{//注销字符设备驱动cdev_del(&beep.cdev); //删除cdevunregister_chrdev_region(beep.devid, BEEP_CNT); //删除设备号device_destroy(beep.class, beep.devid);class_destroy(beep.class);
}module_init(beep_init);
module_exit(beep_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ssz");

3、编写测试APP

编写测试文件beepApp.c:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>#define BEEPOFF 0
#define BEEPON 1int main(int argc, char *argv[])
{int fd,retvalue;char *filename;unsigned char databuf[1];if (argc != 3){printf("Error Usage!\r\n");return -1;}filename = argv[1];//打开beep驱动fd = open(filename ,O_RDWR);if(fd < 0){printf("file %s open failed!\r\n",argv[1]);return -1;}databuf[0] = atoi(argv[2]);//向/dev/beep文件写入数据retvalue = write(fd, databuf, sizeof(databuf));if(retvalue < 0){printf("BEEP Control Failed!\r\n");close(fd);return -1;}retvalue = close(fd); //关闭文件if(retvalue < 0){printf("file %s close failed!\r\n",argv[1]);return -1;}return 0;
}

 四、运行测试

同前面章节步骤。

相关文章:

Linux驱动开发学习笔记6《蜂鸣器实验》

目录 一、蜂鸣器驱动原理 二、硬件原理分析 三、实验程序编写 1、 修改设备树文件 &#xff08;1&#xff09;添加pinctrl节点 &#xff08;2&#xff09;添加BEEP设备节点 &#xff08;3&#xff09;检查PIN 是否被其他外设使用 2、蜂鸣器驱动程序编写 3、编写测试AP…...

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化

鸿蒙&#xff08;HarmonyOS 3.1&#xff09; DevEco Studio 3.1开发环境汉化 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、设置过程 打开IDE&#xff0c;在第一个菜单File 中找到Settings...菜单 在Setting...中找到Plugins…...

毫米波雷达:从 3D 走向 4D

1 毫米波雷达已广泛应用于汽车 ADAS 系统 汽车智能驾驶需要感知层、决策层、执行层三大核心系统的高效配合&#xff0c;其中感知层通过传感器探知周围的环境。汽车智能驾驶感知层将真实世界的视觉、物理、事件等信息转变成数字信号&#xff0c;为车辆了解周边环境、制定驾驶操…...

CENTOS docker拉取私服镜像

概述 docker的应用越来越多&#xff0c;安装部署越来越方便&#xff0c;批量自动化的镜像生成和发布都需要docker镜像的拉取。 centos6版本太老&#xff0c;docker的使用过程中问题较多&#xff0c;centos7相对简单容易。 本文档主要介绍centos系统安装docker和拉取docker私…...

【前端面经】即时设计

目录 前言一面git 常见命令跨窗口通信vue 响应式原理发布订阅模式翻转二叉树Promise.all()扁平化数组面试官建议 二面Event Loop 原理Promise 相关css 描边方式requestAnimationReact 18 新特性JSX 相关react 输出两次函数式编程React 批处理机制http请求头有哪些本地存储性能优…...

前端三件套html/css/js的基本认识以及示例程序

简介 本文简要讲解了html,css,js.主要是让大家简要了解网络知识 因为实际开发中很少直接写html&css,所以不必过多纠结,了解一下架构就好 希望深度学习可以参考MDN和w3school HTML 基础 HTML (Hyper Text Markup Language) 不是一门编程语言,而是一种用来告知浏览器如…...

云计算:OpenStack 配置云主机实例的存储挂载并实现外网互通

目录 一、实验 1. 环境 2.配置存储挂载 3.云主机实例连接外部网络&#xff08;SNAT&#xff09; 4.外部网络连接云主机实例&#xff08;DNAT&#xff09; 二、问题 1.云主机 ping 不通外部网络 2.nova list 查看云主机列表报错 3.nova list 与 virsh list --all有何区…...

python/selenium/jenkins整合

1、新建python项目&#xff0c;专门写selenium代码&#xff0c;建议用pytest框架写。 2、把代码上传到代码库中。 3、环境配置&#xff1a; 3.1 在跑jenkins的机器上配置好python环境&#xff0c;需要python --version能在任何地方运行&#xff08;配置好系统环境变量&#…...

华为路由器ACL操作SSH接口

ACL的定义 访问控制列表&#xff08;Access Control Lists&#xff0c;ACL&#xff09;是应用在路由器接口的指令列表。这些指令列表用来告诉路由器哪些数据包可以收、哪些数据包需要拒绝。至于数据包是被接收还是拒绝&#xff0c;可以由类似于源地址、目的地址、端口号等的特…...

Flutter 三点三:Dart Stream

Stream Stream用于接收异步事件Stream 可以接收多个异步事件Stream.listen()方法返回StreamSubscription 可用于取消事件订阅&#xff0c;取消后&#xff0c;不再接收事件 基本使用 Stream.fromFutures([Future.delayed(Duration(seconds: 1),(){return "事件1";})…...

centos 防火墙 设置 LTS

centos 防火墙 设置 LTS https://blog.csdn.net/m0_58805648/article/details/130671008...

SAP缓存 表缓存( Table Buffering)

本文主要介绍SAP中的表缓存在查询数据&#xff0c;更新数据时的工作情况以及对应概念。 SAP表缓存的工作 查询数据 更新数据 删除数据 表缓存的概念 表缓存技术设置属性 不允许缓冲&#xff1a; 允许缓冲&#xff0c;但已关闭&#xff1a; 缓冲已激活&#xff1a; 已…...

Mybatis插件入门

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...

DOA估计算法——迭代自适应算法(IAA)

1 简介 迭代自适应法 (Iterative Adaptive Approach&#xff0c;IAA)估计算法最早由美国的电气工程师和数学家Robert Schmidt和Roy A. Kuc在1986年的一篇论文"Multiple Emitter Location and Signal Parameter Estimation"中首次提出了这一算法&#xff0c; IAA DOA …...

Python If语句以及代码块的基本介绍

if语句 在编程中if语句是一种根据条件执行不同代码块的控制结构,他根据条件的真假来分支程序的执行路径,所以我们可以通过if语句根据不同情况而执行不同的程序 格式 if [条件(bool值或者计算结果为bool类型的算式)] : a11if a>10:print("a大于10") # --> a大…...

[嵌入式专栏](FOC - SVPWM扇区计算Part1)

文章目录 1 . 概要2 . 扇区计算2.1 扇区Ⅰ计算2.2 扇区Ⅱ计算2.3 扇区Ⅲ计算 3 . 小结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 概要 经过扇区判断后&#xff0c;就知道在哪个扇区进行输出了 【Q】但是每个扇区分别输出怎样的结…...

亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准

ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会&#xff08;CPSC&#xff09;发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准&#xff0c;已于2020年7月6日生效&#xff0c;并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…...

【机组期末速成】指令系统|机器指令概述|操作数类型与操作类型|寻址方式|指令格式

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、以下有关指令系统的说法中错误的是&#xff08; &#xff09;。 2…...

java美容管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web美容管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

Redis哨兵

1.哨兵介绍 1.1.为何需要哨兵&#xff1f; 为了解决master节点宕机问题&#xff0c;选举salve节点为新的master节点。 1.2.哨兵的作用 1.3.服务状态监控 1.4.选举新的master 1.5.如何实现故障转移 2.搭建哨兵集群 2.1.集群结构 这里我们搭建一个三节点形成的Sentinel集群&…...

面试算法78:合并排序链表

题目 输入k个排序的链表&#xff0c;请将它们合并成一个排序的链表。 分析&#xff1a;利用最小堆选取值最小的节点 用k个指针分别指向这k个链表的头节点&#xff0c;每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步&#xff0c;再比较k个指…...

鸿鹄电子招投标系统:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…...

node.js对应npm安装和使用

介绍 node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;安装node后自带npm。NPM &#xff1a;Node Package ManagerNPM是Node.js标准的软件包管理器 。2010年底&#xff0c;Node.js 的包管理器 npm 诞生&#xff0c;是全球最大的开源库生态系统。 node 20…...

(self-supervised learning)Event Camera Data Pre-training

Publisher: ICCV 2023 MOTIVATION OF READING: 自监督学习、稀疏事件 NILM link: https://arxiv.org/pdf/2301.01928.pdf Code: GitHub - Yan98/Event-Camera-Data-Pre-training 1. Overview Contributions are summarized as follows: 1. A self-supervised framework f…...

关于个人Git学习记录及相关

前言 可以看一下猴子都能懂的git入门&#xff0c;图文并茂不枯燥 猴子都能懂的git入门 学习东西还是建议尽可能的去看官方文档 权威且详细 官方文档 强烈建议看一下GitHub漫游指南及开源指北&#xff0c;可以对开源深入了解一下&#xff0c;打开新世界的大门&#xff01; …...

【eclipse】eclipse开发springboot项目使用入门

下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation 安装eclipse 其他一步一步即可 我们是开发java web选择如下 界面修改 Window->Preferences-> 修改eclipse风格主题 Window->Preferences->General->Appearance 修改字体和大小…...

Android 13 默认关闭 快速打开相机

介绍 在设置菜单的手势界面里&#xff0c;快速打开相机是默认开启的&#xff0c;此功能当开启时连续点击两次电源键会打开相机&#xff0c;现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件&#xff0c;在路径下果然找到了,从注释中看使我们需要的&#x…...

pytest pytest-html优化样式

conftest.py import pytest from pytest_metadata.plugin import metadata_keydef pytest_html_report_title(report):report.title"接口测试报告"def pytest_configure(config):# 获取命令行参数中的测试环境、测试版本、开始时间、测试人员config.stash[metadata_…...

Visual Studio 配置DLL

我们在用Visual Studio进行开发时&#xff0c;如果没有正确配置DLL&#xff0c;就会出现类似“丢失***.dll”的错误。DLL配置有哪些方法&#xff1f; 1、手动复制 将dll文件拷贝到生成的.exe所在的文件夹里 2、配置环境 在右键属性->配置属性->调试->环境&#xf…...

C/C++转WebAssembly及微信小程序调用

上一篇文章讲了C/C如何转WebAssembly&#xff0c;并测试了在Web端调用。本篇内容和上篇一样&#xff0c;介绍C/C包转的.wasm包如何在小程序中调用。 说明 本篇是在上一篇步骤1-4的基础上&#xff0c;再做修改&#xff0c;供微信小程序端调用的方法和步骤。 本篇操作手册可以…...

海宏集团网站建设/网站排名英文

正题 这题其实想想很简单。&#xff08;据说是老师找我们试水的 首先枚举一个关键点&#xff0c;因为我们知道分割这个多边形的最优方案一定是经过关键点的。 把顶点和关键点按照极角排序&#xff0c;做这个极角排序的方法&#xff0c;就是如果一个y<0&#xff0c;那么让x-x…...

13个实用平面设计网站/怎么注册一个网站

Python实现四边形检测和矫正操作 在图像处理中,四边形检测和矫正是一项重要的任务。本文将介绍如何使用Python实现对图像中四边形的检测和矫正。 首先,我们需要使用Python的OpenCV库来进行图像处理。通过使用OpenCV,我们可以很方便地对图像进行操作。 接下来,我们需要定…...

php动态网站开发说课/百度推广新手入门

答&#xff1a;请参考这个网址&#xff1a;https://docs.microsoft.com/zh-cn/office/vba/access/concepts/database-programming-with-vba/database-programming-with-vba&#xff0c;它提供了一个使用 VBA 连接 Access 数据库的教程。...

学院二级网站建设方案模板/推广软件有哪些

前言第1章 Javac介绍11.1 初识Javac11.2 Javac源码与调试41.3 Javac命令7第2章 Javac文件系统122.1 文件相关实现类122.2 文件的管理252.2.1 获取JavacFileManager对象252.2.2 StandardLocation类282.2.3 JavacFileManager类31第3章 词法分析383.1 字符编码383.2 获取字符输入流…...

怎么用htlm5自己做网站/谷歌搜索引擎官网

在中国&#xff0c;随着企业数字化转型的加速&#xff0c;越来越多的企业开始使用CRM&#xff08;客户关系管理&#xff09;系统来管理其客户关系。 然而&#xff0c;中国市场上有很多CRM系统供应商&#xff0c;让企业难以选择。那么&#xff0c;中国有这么多CRM系统供应商&am…...

做网站的动态图片/苏州网站优化公司

文章目录一、循环语句1.1 for循环语句1.1.1 for语句的结构1.1.2 for语句应用示例1.2 while循环语句1.3 until循环语句1.3.1 until语句的结构二、 Shell函数2.1 Shell函数2.1 函数应用示例2.2 函数的作用范围2.3 函数的参数2.4 递归函数三、 Shell数组3.1 Shell数组3.2 Shell脚本…...