kernel(八)PWM 蜂鸣器
程序员文章站
2022-05-29 09:11:38
...
PWM 蜂鸣器驱动: drivers/input/misc/pwm-beeper.c,采用 input 子系统编写
重新编译,运行测试,启动时听到蜂鸣器响一声
需要在 mach-smdkv210.c 中为其构造平台设备,及平台数据,参考 samsung_bl_set 函数的处理过程
这里的 1 表示使用定时器 1,添加平台设备到 smdkv210_devices
注意: s3c_device_timer 一定要在 tq210_beeper 前面。
在 smdkv210_machine_init 中配置引脚为定时器输出功能
配置内核
System Type ---> [*] PWM device support Device Drivers ---> Input device support ---> [*] Miscellaneous devices ---> <*> PWM beeper support |
蜂鸣器驱动的设备文件为
下面编写测试程序 beeper_ctl.c
[[email protected]$Louis210: /]# ./beeper_ctl Please enter the value(Hz) (0 is sop) : 1 freq = 1 Hz 0 freq = 0 Hz [[email protected]$Louis210: /]# |
输入 1,蜂鸣器以 1Hz 的频率发出声音
输入 0,蜂鸣器停止发声
beeper_ctl.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/fcntl.h>
int main(int argc, char *argv[])
{
int fd = -1;
int num;
size_t wb;
char name[20];
struct input_event ev;
if ((fd = open("/dev/input/event0", O_RDWR)) < 0) //open device
{
perror("open error");
exit(1);
}
printf("Please enter the value(Hz) (0 is stop) :\n");
while (1)
{
ev.type = EV_SND;
ev.code = SND_TONE;
scanf("%d", &ev.value);
printf("freq = %d Hz\n", ev.value);
if (ev.value == 0)
sleep(2);
wb = write(fd, &ev, sizeof(struct input_event));
if (wb < sizeof(struct input_event))
{
perror("write error");
exit(1);
}
if (ev.value == 0)
break;
}
close(fd);
return 0;
}