有源蜂鸣器只要通电就会叫,所以可以做一个供电电路,这个供电电路通过一个IO来控制其通断 ,一般使用三极管来搭建这个电路。
在Linux下编写蜂鸣器驱动就需要以下工作:
上图中通过一个PNP型的三极管8550来驱动蜂鸣器,通过PC7这个IO来控制三极管Q1的导通,当BEEP输出低电平的时候Q1导通,相当于蜂鸣器的正极连接到3.3V电源, 蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当BEEP输出高电平的时候Q1不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
在根节点“/”创建BEEP节点,节点名为“beep”,内容如下:
示例代码26.3.1.1 创建BEEP蜂鸣器节点
1 beep {
2 compatible = "alientek,beep";
3 status = "okay";
4 beep-gpio = <&gpioc 7 GPIO_ACTIVE_HIGH>;
5 };
第4行,beep-gpio属性指定了蜂鸣器所使用的GPIO。
设备树编写完成以后使用“make dtbs”命令重新编译设备树,然后使用新编译出来的stm32mp157d-atk.dtb文件启动Linux系统。启动成功以后进入“/proc/device-tree”目录中查看“beep”节点是否存在,如果存在的话就说明设备树基本修改成功(具体还要驱动验证)。
这一部分跟之前LED很类似,只是在设备结构体中,改为beep_dev中有一个int beep_gpio代表GPIO编号,然后beep_dev一个beep表示beep设备;其他的操作跟之前的,除了节点的名字换了一下,其他的是一模一样的。
这个跟之前也基本是一样的,就是对文件的打开、写、关闭等操作。
这个把Makefile中的obj-m换成beep.o就可以了。然后“make -j8”就可以变异了。
APP可以通过如下命令编译:
arm-none-linux-gnueabihf-gcc beepApp.c -o beepApp |
将之前编译得到的beep.ko和beepApp拷贝到rootfs/lib/modules/5.4.31目录中,然后重启开发板,进入/lib/modules/5.4.31目录,输入如下命令加载gpioled.ko:
depmod //第一次加载驱动的时候需要运行此命令 modprobe beep //加载驱动 |
加载成功后可以通过如下命令打开和关闭BEEP:
./beepApp /dev/beep 1 //打开蜂鸣器 ./beepApp /dev/beep 0 //关闭蜂鸣器 |
可以通过如下命令卸载驱动:
rmmod beep.ko |
就是原理跟LED不太一样,其余的基本都是一样的,说白了就是对GPIO的高低电平控制。