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 所示:
图 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.
评论