📄 pxa2xx_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>MODULE_AUTHOR("antiscle<hzhmei@hotmail.com>");MODULE_DESCRIPTION("PXA255 buzzer driver");MODULE_LICENSE("GPL");static char s3c2410_buzzer_name[] = "pxa2xx buzzer";static char s3c2410_buzzer_phys[] = "pxa2xx/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) { if (value < 60) value = 60; if (value > 20000) value = 20000; count = (614400 / value + 5)/10; // 3686400/60 = 61440 } spin_lock_irqsave(&s3c2410_buzzer_lock, flags); if (count) { /* pwm output */ CKEN |= CKEN0_PWM0; pxa_gpio_mode(GPIO16_PWM0_MD); PWM_PWDUTY0 = count>>1; PWM_PERVAL0 = count-1; PWM_CTRL0 = (0<<6)|59; } else { /* output 0 */ PWM_PWDUTY0 = 0; PWM_PERVAL0 = 0; CKEN &= ~CKEN0_PWM0; //pxa_gpio_mode(GPIO16_PWM0|GPIO_OUT); //GPCR0 = 1<<16; } 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 + -