当前位置: 首页 > 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集群&…...

深入解析Baichuan-7B:从GPT架构到LoRA微调的实践指南

1. 项目概述&#xff1a;从开源大模型到“百川”入海 最近在和朋友聊起国内大模型的开源生态时&#xff0c;总绕不开一个名字——“百川”。我说的不是地理上的河流&#xff0c;而是由百川智能公司开源的Baichuan系列大语言模型。今天想重点聊聊的&#xff0c;是它的起点&#…...

基于MCP协议与WebDAV构建AI智能体统一数据访问层

1. 项目概述与核心价值最近在折腾个人知识库和自动化工作流时&#xff0c;我又一次被“数据孤岛”问题绊住了脚。手头的信息散落在各种地方&#xff1a;Notion里的项目规划、Obsidian的零散笔记、Google Calendar的日程、甚至是一些本地文件夹里的PDF和图片。想要让这些数据联动…...

30.【Verilog】Verilog 除法器设计

第一步&#xff1a;分析与整理Verilog 除法器设计 1. 除法器原理&#xff08;定点&#xff09;与十进制竖式除法类似&#xff0c;以 27 5 为例&#xff08;二进制&#xff09;&#xff1a; 取被除数高位&#xff08;与除数同宽&#xff0c;如 3bit&#xff09;&#xff0c;与除…...

README智能生成工具:从项目分析到自动化文档的工程实践

1. 项目概述&#xff1a;一个为README注入灵魂的智能工具在开源社区和日常开发中&#xff0c;README文件的重要性不言而喻。它不仅是项目的门面&#xff0c;更是连接开发者与用户、贡献者之间的第一座桥梁。然而&#xff0c;有多少次&#xff0c;我们面对一个功能强大但文档寥寥…...

I²C总线协议深度解析:从物理层到实战调试与疑难排查

1. IC总线&#xff1a;从电视遥控器到无处不在的嵌入式神经如果你在过去的二十年里摆弄过任何一块微控制器开发板&#xff0c;或者拆解过一台智能家电&#xff0c;那么你几乎百分之百会碰到两根被拉高的信号线&#xff0c;一根是时钟&#xff08;SCL&#xff09;&#xff0c;一…...

如何快速实现OBS多平台直播:obs-multi-rtmp完全配置指南

如何快速实现OBS多平台直播&#xff1a;obs-multi-rtmp完全配置指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否厌倦了每次直播都要在不同平台间反复切换设置&#xff1f;obs…...

3分钟掌握PC端聊天软件防撤回:RevokeMsgPatcher实战指南

3分钟掌握PC端聊天软件防撤回&#xff1a;RevokeMsgPatcher实战指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.…...

【华南理工大学支持 | IEEE出版 | 往届会议论文完成EIScopus双检索 | 云计算、通信工程、图像处理等相关主题均可投稿】第三届云计算与通信工程国际学术会议(CCCE 2026)

第三届云计算与通信工程国际学术会议(CCCE 2026) 2026 3rd International Conference on Cloud Computing and Communication Engineering 2026年06月12-14日 &#xff0c; 中国深圳 征稿主题广&#xff1a;云计算|通信工程|图像处理等相关主题 权威收录&#xff1a;EI…...

Windows系统美化终极指南:如何快速实现个性化定制与性能优化 [特殊字符]

Windows系统美化终极指南&#xff1a;如何快速实现个性化定制与性能优化 &#x1f680; 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/…...

精通 Harness架构 :DeerFlow 2.0 的 lead_agent 任务总调度 架构设计与实现解析

今天不聊虚的&#xff0c;我们直接切进核心代码。 看看它是怎么把责任链模式、配置驱动思维和任务编排哲学&#xff0c;严丝合缝地揉进 LangGraph 骨架里的。顺便对标一下微软 AutoGen AG2 最新的架构演进&#xff0c;你会发现&#xff0c;行业对 Agent 运行时&#xff08;Age…...