Linux 蜂鸣器实验

46.1 蜂鸣器驱动原理

 I.MX6U-ALPHA 开发板上的蜂鸣器通过
SNVS_TAMPER1 引脚来控制,本节我们来看一下如果在 Linux 下编写蜂鸣器驱动需要做哪些
工作:
①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。
②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。
③、编写驱动程序和测试 APP,和第四十五章的 LED 驱动程序和测试 APP 基本一样。
接下来我们就根据上面这三步来编写蜂鸣器 Linux 驱动。

46.3 实验程序编写

本实验对应的例程路径为: 开发板光盘-> 2、 Linux 驱动例程-> 6_beep。

46.3.1 修改设备树文件
1、添加 pinctrl 节点
I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个 PIN,打开 imx6ull-alientekemmc.dts,
在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“ pinctrl_beep”的子节点,节点
内容如下所示:
示例代码 46.3.1.1 SNVS_TAMPER1 pinctrl 节点
1 pinctrl_beep: beepgrp {
    2 fsl,pins = <
        3 MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x10B0 /* beep */
        4 >;
5 };3 行 , 将 SNVS_TAMPER1 这 个 PIN 复 用 为 GPIO5_IO01 , 宏
MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 定义在 arch/arm/boot/dts/imx6ull-pinfunc-snvs.h
文件中。
2、添加 BEEP 设备节点
在根节点“ /”下创建 BEEP 节点,节点名为“ beep”,节点内容如下:
示例代码 46.3.1.2 创建 BEEP 蜂鸣器节点
1 beep {
    2 #address-cells = <1>;
    3 #size-cells = <1>;
    4 compatible = "atkalpha-beep";
    5 pinctrl-names = "default";
    6 pinctrl-0 = <&pinctrl_beep>;
    7 beep-gpio = <&gpio5 1 GPIO_ACTIVE_HIGH>;
    8 status = "okay";
9 };6 行, pinctrl-0 属性设置蜂鸣器所使用的 PIN 对应的 pinctrl 节点。
第 7 行, beep-gpio 属性指定了蜂鸣器所使用的 GPIO。
3、检查 PIN 是否被其他外设使用
在本章实验中蜂鸣器使用的 PIN 为 SNVS_TAMPER1,因此先检查 PIN 为 SNVS_TAMPER1
这个 PIN 有没有被其他的 pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查
GPIO5_IO01 这个 GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。
设备树编写完成以后使用“ make dtbs”命令重新编译设备树,然后使用新编译出来的
imx6ull-alientek-emmc.dtb 文件启动 Linux 系统。启动成功以后进入“ /proc/device-tree”目录中
查看“ beep”节点是否存在,如果存在的话就说明设备树基本修改成功。
46.3.2 蜂鸣器驱动程序编写
设备树准备好以后就可以编写驱动程序了,本章实验在第四十五章实验驱动文件 gpioled.c
的基础上修改而来。新建名为“ 6_beep”的文件夹,然后在 6_beep 文件夹里面创建 vscode 工
程,工作区命名为“ beep”。工程创建好以后新建 beep.c 文件,在 beep.c 里面输入如下内容:
示例代码 46.3.2.1 beep.c 文件代码段
略

46.4 运行测试

46.4.1 编译驱动程序和测试 APP
1、编译驱动程序
编写 Makefile 文件,本章实验的 Makefile 文件和第四十章实验基本一样,只是将 obj-m 变
量的值改为 beep.o, Makefile 内容如下所示:
示例代码 46.4.1.1 Makefile 文件
1 KERNELDIR := /home/zuozhongkai/linux/IMX6ULL/linux/temp/linux-imxrel_imx_4.1.15_2.1.0_ga_alientek
......
4 obj-m := beep.o
......
11 clean:
12 $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
第 4 行,设置 obj-m 变量的值为 beep.o。
输入如下命令编译出驱动模块文件:
make -j32
编译成功以后就会生成一个名为“ beep.ko”的驱动模块文件。
2、编译测试 APP
输入如下命令编译测试 beepApp.c 这个测试程序:
arm-linux-gnueabihf-gcc beepApp.c -o beepApp
编译成功以后就会生成 beepApp 这个应用程序。

46.4.2 运行测试
将上一小节编译出来的 beep.ko 和 beepApp 这两个文件拷贝到 rootfs/lib/modules/4.1.15 目
录中,重启开发板,进入到目录 lib/modules/4.1.15 中,输入如下命令加载 beep.ko 驱动模块:
depmod //第一次加载驱动的时候需要运行此命令
modprobe beep.ko //加载驱动
输入如下命令打开蜂鸣器:
./beepApp /dev/beep 1 //打开蜂鸣器
在输入如下命令关闭蜂鸣器:
./beepApp /dev/beep 0 //关闭蜂鸣器
卸载驱动
rmmod beep.ko

参考文献

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3.pdf

猜你喜欢

转载自blog.csdn.net/liurunjiang/article/details/107402162