[正点原子]Linux驱动学习笔记--7.beep蜂鸣器实验

adtxl
2022-10-22 / 0 评论 / 435 阅读 / 正在检测是否收录...

1. 实验目的

I.MX6U-ALPHA 开发板上还有一个蜂鸣器,从软件的角度考虑,蜂鸣器驱动和 LED 灯驱动其实是一摸一样的,都是控制 IO 输出高低电平。本章我们就来学习编写蜂鸣器的 Linux 驱动,也算是对上一章讲解的 pinctrl和 gpio 子系统的巩固。

2. 知识点

2.1 硬件原理

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:

有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。 I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作

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

蜂鸣器的硬件原理图如图 14.3.1 所示:

image.png

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

在 Linux 下编写蜂鸣器驱动需要做以下工作:
1、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。
2、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。
3、编写驱动程序和测试 APP

3. 实验&测试

1、添加pinctrl节点

内容如下所示:

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

2、添加BRRP设备节点

在根节点下创建BEEP节点,内容如下所示,

        beep{
                compatible = "alientek,beep";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_beep>;
                beep-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
                status = "okay";
        };

3、检查PIN是否被其它外设使用

在本章实验中蜂鸣器使用的 PIN 为SNVS_TAMPER1,因此先检查PIN为SNVS_TAMPER1这个PIN有没有被其他的pinctrl节点使用,如果有使用的话就要屏蔽掉,然后再检查GPIO5_IO01这个 GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。

实验代码:
https://github.com/ADTXL/imx_linux/tree/master/kmod/06_beep
测试OK.

0

评论 (0)

取消