Commit 7bf1da72 authored by Osamu Tomita's avatar Osamu Tomita Committed by Vojtech Pavlik

input: Support for NEC PC-9800 beeper and support for Kana Lock LED.

parent 7a4d842a
...@@ -48,21 +48,21 @@ extern void ctrl_alt_del(void); ...@@ -48,21 +48,21 @@ extern void ctrl_alt_del(void);
* Exported functions/variables * Exported functions/variables
*/ */
#ifndef KBD_DEFMODE
#define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META)) #define KBD_DEFMODE ((1 << VC_REPEAT) | (1 << VC_META))
#endif
#ifndef KBD_DEFLEDS
/* /*
* Some laptops take the 789uiojklm,. keys as number pad when NumLock is on. * Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
* This seems a good reason to start with NumLock off. * This seems a good reason to start with NumLock off. On PC9800 however there
* is no NumLock key and everyone expects the keypad to be used for numbers.
*/ */
#ifdef CONFIG_X86_PC9800
#define KBD_DEFLEDS (1 << VC_NUMLOCK)
#else
#define KBD_DEFLEDS 0 #define KBD_DEFLEDS 0
#endif #endif
#ifndef KBD_DEFLOCK
#define KBD_DEFLOCK 0 #define KBD_DEFLOCK 0
#endif
void compute_shiftstate(void); void compute_shiftstate(void);
......
/*
* PC-9800 Speaker beeper driver for Linux
*
* Copyright (c) 2002 Osamu Tomita
* 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/io.h>
MODULE_AUTHOR("Osamu Tomita <tomita@cinet.co.jp>");
MODULE_DESCRIPTION("PC-9800 Speaker beeper driver");
MODULE_LICENSE("GPL");
static char spkr98_name[] = "PC-9801 Speaker";
static char spkr98_phys[] = "isa3fdb/input0";
static struct input_dev spkr98_dev;
spinlock_t i8253_beep_lock = SPIN_LOCK_UNLOCKED;
static int spkr98_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 = CLOCK_TICK_RATE / value;
spin_lock_irqsave(&i8253_beep_lock, flags);
if (count) {
outb(0x76, 0x3fdf);
outb(0, 0x5f);
outb(count & 0xff, 0x3fdb);
outb(0, 0x5f);
outb((count >> 8) & 0xff, 0x3fdb);
/* beep on */
outb(6, 0x37);
} else {
/* beep off */
outb(7, 0x37);
}
spin_unlock_irqrestore(&i8253_beep_lock, flags);
return 0;
}
static int __init spkr98_init(void)
{
spkr98_dev.evbit[0] = BIT(EV_SND);
spkr98_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
spkr98_dev.event = spkr98_event;
spkr98_dev.name = spkr98_name;
spkr98_dev.phys = spkr98_phys;
spkr98_dev.id.bustype = BUS_ISA;
spkr98_dev.id.vendor = 0x001f;
spkr98_dev.id.product = 0x0001;
spkr98_dev.id.version = 0x0100;
input_register_device(&spkr98_dev);
printk(KERN_INFO "input: %s\n", spkr98_name);
return 0;
}
static void __exit spkr98_exit(void)
{
input_unregister_device(&spkr98_dev);
}
module_init(spkr98_init);
module_exit(spkr98_exit);
...@@ -44,6 +44,10 @@ config INPUT_M68K_BEEP ...@@ -44,6 +44,10 @@ config INPUT_M68K_BEEP
tristate "M68k Beeper support" tristate "M68k Beeper support"
depends on M68K && INPUT && INPUT_MISC depends on M68K && INPUT && INPUT_MISC
config INPUT_98SPKR
tristate "PC-9800 Speaker support"
depends on X86_PC9800 && INPUT && INPUT_MISC
config INPUT_UINPUT config INPUT_UINPUT
tristate "User level driver support" tristate "User level driver support"
depends on INPUT && INPUT_MISC depends on INPUT && INPUT_MISC
......
...@@ -7,5 +7,6 @@ ...@@ -7,5 +7,6 @@
obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
obj-$(CONFIG_INPUT_98SPKR) += 98spkr.o
obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_UINPUT) += uinput.o
obj-$(CONFIG_INPUT_GSC) += gsc_ps2.o obj-$(CONFIG_INPUT_GSC) += gsc_ps2.o
...@@ -43,11 +43,12 @@ struct kbd_struct { ...@@ -43,11 +43,12 @@ struct kbd_struct {
#define LED_SHOW_IOCTL 1 /* only change leds upon ioctl */ #define LED_SHOW_IOCTL 1 /* only change leds upon ioctl */
#define LED_SHOW_MEM 2 /* `heartbeat': peek into memory */ #define LED_SHOW_MEM 2 /* `heartbeat': peek into memory */
unsigned char ledflagstate:3; /* flags, not lights */ unsigned char ledflagstate:4; /* flags, not lights */
unsigned char default_ledflagstate:3; unsigned char default_ledflagstate:4;
#define VC_SCROLLOCK 0 /* scroll-lock mode */ #define VC_SCROLLOCK 0 /* scroll-lock mode */
#define VC_NUMLOCK 1 /* numeric lock mode */ #define VC_NUMLOCK 1 /* numeric lock mode */
#define VC_CAPSLOCK 2 /* capslock mode */ #define VC_CAPSLOCK 2 /* capslock mode */
#define VC_KANALOCK 3 /* kanalock mode */
unsigned char kbdmode:2; /* one 2-bit value */ unsigned char kbdmode:2; /* one 2-bit value */
#define VC_XLATE 0 /* translate keycodes using keymap */ #define VC_XLATE 0 /* translate keycodes using keymap */
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#define KG_ALT 3 #define KG_ALT 3
#define KG_ALTGR 1 #define KG_ALTGR 1
#define KG_SHIFTL 4 #define KG_SHIFTL 4
#define KG_KANASHIFT 4
#define KG_SHIFTR 5 #define KG_SHIFTR 5
#define KG_CTRLL 6 #define KG_CTRLL 6
#define KG_CTRLR 7 #define KG_CTRLR 7
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment