⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c2410_buzzer.c

📁 优龙2410linux2.6.8内核源代码
💻 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 + -