📄 s3c2410_buzzer.c
字号:
/* * PC Speaker beeper driver for Linux * * Copyright (c) 2002 Vojtech Pavlik * Copyright (c) 1992 Orest Zborowski * *//* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation */#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/input.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/arch/regs-gpio.h>#include <asm/arch/regs-timer.h>MODULE_AUTHOR("antiscle<hzhmei@hotmail.com>");MODULE_DESCRIPTION("S3C2410 buzzer driver");MODULE_LICENSE("GPL");static char s3c2410_buzzer_name[] = "S3C2410 buzzer";static char s3c2410_buzzer_phys[] = "s3c2410/buzzer";static struct input_dev s3c2410_buzzer_dev;spinlock_t s3c2410_buzzer_lock = SPIN_LOCK_UNLOCKED;static int s3c2410_buzzer_event(struct input_dev *dev, unsigned int type, unsigned int code, int value){ unsigned int count = 0; unsigned long flags; if (type != EV_SND) return -1; switch (code) { case SND_BELL: if (value) value = 1000; case SND_TONE: break; default: return -1; } if (value > 20 && value < 32767) count = (s3c2410_pclk>>6) / value; spin_lock_irqsave(&s3c2410_buzzer_lock, flags); if (count) { /* pwm output */ __raw_writel(__raw_readl(S3C2410_GPBCON)&~3, S3C2410_GPBCON); __raw_writel(__raw_readl(S3C2410_GPBCON)|S3C2410_GPB0_TOUT0, S3C2410_GPBCON); __raw_writel(__raw_readl(S3C2410_TCFG0)&~0xff, S3C2410_TCFG0); __raw_writel(__raw_readl(S3C2410_TCFG0)|15, S3C2410_TCFG0); __raw_writel(__raw_readl(S3C2410_TCFG1)&~0xf, S3C2410_TCFG1); __raw_writel(__raw_readl(S3C2410_TCFG1)|1, S3C2410_TCFG1); /* select desired HZ */ __raw_writel(count, S3C2410_TCNTB(0)); __raw_writel(count>>1, S3C2410_TCMPB(0)); __raw_writel(__raw_readl(S3C2410_TCON)&~0x1f, S3C2410_TCON); __raw_writel(__raw_readl(S3C2410_TCON)|0xb, S3C2410_TCON); __raw_writel(__raw_readl(S3C2410_TCON)&~2, S3C2410_TCON); } else { /* output 0 */ __raw_writel(__raw_readl(S3C2410_GPBCON)&~3, S3C2410_GPBCON); __raw_writel(__raw_readl(S3C2410_GPBCON)|S3C2410_GPB0_OUTP, S3C2410_GPBCON); __raw_writel(__raw_readl(S3C2410_GPBDAT)&~1, S3C2410_GPBDAT); } spin_unlock_irqrestore(&s3c2410_buzzer_lock, flags); return 0;}static int __init s3c2410_buzzer_init(void){ s3c2410_buzzer_dev.evbit[0] = BIT(EV_SND); s3c2410_buzzer_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE); s3c2410_buzzer_dev.event = s3c2410_buzzer_event; s3c2410_buzzer_dev.name = s3c2410_buzzer_name; s3c2410_buzzer_dev.phys = s3c2410_buzzer_phys; s3c2410_buzzer_dev.id.bustype = BUS_HOST; s3c2410_buzzer_dev.id.vendor = 0x001f; s3c2410_buzzer_dev.id.product = 0x0001; s3c2410_buzzer_dev.id.version = 0x0100; input_register_device(&s3c2410_buzzer_dev); printk(KERN_INFO "input: %s\n", s3c2410_buzzer_name); return 0;}static void __exit s3c2410_buzzer_exit(void){ input_unregister_device(&s3c2410_buzzer_dev);}module_init(s3c2410_buzzer_init);module_exit(s3c2410_buzzer_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -