欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kernel(八)PWM 蜂鸣器

程序员文章站 2022-05-29 09:11:38
...
PWM 蜂鸣器驱动: drivers/input/misc/pwm-beeper.c,采用 input 子系统编写

需要在 mach-smdkv210.c 中为其构造平台设备,及平台数据,参考 samsung_bl_set 函数的处理过程

kernel(八)PWM 蜂鸣器

这里的 1 表示使用定时器 1,添加平台设备到 smdkv210_devices
kernel(八)PWM 蜂鸣器

注意: s3c_device_timer 一定要在 tq210_beeper 前面。

smdkv210_machine_init 中配置引脚为定时器输出功能
kernel(八)PWM 蜂鸣器

配置内核

System Type --->
        [*] PWM device support
Device Drivers --->
        Input device support --->
                [*] Miscellaneous devices --->
                            <*> PWM beeper support
重新编译,运行测试,启动时听到蜂鸣器响一声
kernel(八)PWM 蜂鸣器

蜂鸣器驱动的设备文件为
kernel(八)PWM 蜂鸣器

下面编写测试程序 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;
}
相关标签: kernel