蜂鸣器驱动代码如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/ioctl.h>
#include <linux/gpio.h>
#include <mach/regs-gpio.h>
#include "buzzer.h"
static int buzzer_open(struct inode *inode, struct file *file)
{
s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPB(0), 0); /* turn off buzzer */
return 0;
}
static int buzzer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
switch (cmd) {
case BUZZER_ON:
s3c2410_gpio_setpin(S3C2410_GPB(0), 1);
return 0;
case BUZZER_OFF:
s3c2410_gpio_setpin(S3C2410_GPB(0), 0);
return 0;
default:
return -EINVAL;
}
}
static struct file_operations buzzer_fops = {
.owner = THIS_MODULE,
.open = buzzer_open,
.ioctl = buzzer_ioctl,
};
static struct miscdevice buzzer_misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = "buzzer",
.fops = &buzzer_fops,
};
static int buzzer_init(void)
{
return misc_register(&buzzer_misc);
}
static void buzzer_exit(void)
{
misc_deregister(&buzzer_misc);
}
MODULE_LICENSE("Dual BSD/GPL");
module_init(buzzer_init);
module_exit(buzzer_exit);
蜂鸣器驱动代码同led驱动代码完全类似,它是通过GPB0来控制,当GPB0输出高电平时蜂鸣器发声。
头文件buzzer.h如下:
#ifndef __LED_H
#define __LED_H
#define BUZZER_ON _IO('b', 0)
#define BUZZER_OFF _IO('b', 1)
#endif /* __LED_H */
测试代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include "buzzer.h"
int main(void)
{
int fd;
fd = open("/dev/buzzer", O_RDWR);
if (fd < 0) {
printf("No such device!\n");
return -1;
}
printf("buzzer on\n");
ioctl(fd, BUZZER_ON);
sleep(5);
printf("buzzer off\n");
ioctl(fd, BUZZER_OFF);
close(fd);
return 0;
}