public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 2.5.59 morse code panics
@ 2003-01-30 15:07 Tomas Szepe
  2003-01-30 17:36 ` Dave Jones
  0 siblings, 1 reply; 40+ messages in thread
From: Tomas Szepe @ 2003-01-30 15:07 UTC (permalink / raw)
  To: lkml; +Cc: Andrew Rodland, john, Alan Cox

Here's the initial port of Andrew Rodland's morse code panics to
2.5.  It's probably got a few issues that need to be sorted out:
at least the acquisition of the atkbd handle is a shameful hack.
The original regular blinking code from ac has been removed,
because it's no use when we've got morse about. :)

Any comments appreciated, patch against 2.5.59.

-- 
Tomas Szepe <szepe@pinerecords.com>


diff -urN a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
--- a/drivers/input/keyboard/atkbd.c	2002-12-08 20:06:16.000000000 +0100
+++ b/drivers/input/keyboard/atkbd.c	2003-01-30 15:19:50.000000000 +0100
@@ -445,6 +445,23 @@
 	atkbd_command(atkbd, &atkbd->oldset, ATKBD_CMD_SSCANSET);
 }
 
+#ifdef CONFIG_MORSE_PANICS
+static struct atkbd *atkbd_blinkdev = NULL;
+int atkbd_blink(char led) {
+	char param[2] = "\0\0";
+	led = led ? (0x01 | 0x04) : 0x00;
+	*param = led;
+
+	if (atkbd_blinkdev == NULL)
+		return -1;
+
+	if (atkbd_command(atkbd_blinkdev, param, ATKBD_CMD_SETLEDS))
+		return -1;
+
+	return 0;
+}
+#endif
+
 /*
  * atkbd_disconnect() closes and frees.
  */
@@ -543,11 +560,12 @@
 			set_bit(atkbd->keycode[i], atkbd->dev.keybit);
 
 	input_register_device(&atkbd->dev);
-
+#ifdef CONFIG_MORSE_PANICS
+	atkbd_blinkdev = atkbd;
+#endif
 	printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
 }
 
-
 static struct serio_dev atkbd_dev = {
 	.interrupt =	atkbd_interrupt,
 	.connect =	atkbd_connect,
diff -urN a/init/Kconfig b/init/Kconfig
--- a/init/Kconfig	2003-01-17 04:27:10.000000000 +0100
+++ b/init/Kconfig	2003-01-30 15:15:56.000000000 +0100
@@ -98,6 +98,17 @@
 		     13 =>  8 KB
 		     12 =>  4 KB
 
+config MORSE_PANICS
+	bool "Morse code panics"
+	depends on KEYBOARD_ATKBD || VT
+	help
+	  When enabled, this code will make a panicking kernel scream for
+	  help in morse code, signalling on the leds of a possibly attached
+	  AT keyboard and/or a bleeper.  You can enable/disable your morse
+	  output devices of choice using the "panicmorse" kernel boot
+	  parameter.
+	  If unsure, say Y.
+
 endmenu
 
 
@@ -159,4 +170,3 @@
 	  in <file:Documentation/kmod.txt>.
 
 endmenu
-
diff -urN a/kernel/panic.c b/kernel/panic.c
--- a/kernel/panic.c	2003-01-09 14:25:40.000000000 +0100
+++ b/kernel/panic.c	2003-01-30 15:46:11.000000000 +0100
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/sysrq.h>
 #include <linux/interrupt.h>
+#include <linux/vt_kern.h>
 
 asmlinkage void sys_sync(void);	/* it's really int */
 
@@ -31,6 +32,142 @@
 
 __setup("panic=", panic_setup);
 
+#ifdef CONFIG_MORSE_PANICS
+
+#ifdef CONFIG_KEYBOARD_ATKBD
+ extern int atkbd_blink(char led);	/* drivers/input/keyboards/atkbd.c */
+ #define do_blink(x) atkbd_blink(x)
+#else
+ #define do_blink(x) 0
+#endif
+
+static int morse_setting = 1;
+
+static const unsigned char morsetable[] = {
+	0122, 0, 0310, 0, 0, 0163,				/* "#$%&' */
+	055, 0155, 0, 0, 0163, 0141, 0152, 0051, 		/* ()*+,-./ */
+	077, 076, 074, 070, 060, 040, 041, 043, 047, 057,	/* 0-9 */
+	0107, 0125, 0, 0061, 0, 0114, 0, 			/* :;<=>?@ */
+	006, 021, 025, 011, 002, 024, 013, 020, 004,		/* A-I */
+	036, 015, 022, 007, 005, 017, 026, 033, 012,		/* J-R */
+	010, 003, 014, 030, 016, 031, 035, 023,			/* S-Z */
+	0, 0, 0, 0, 0154					/* [\]^_ */
+};
+
+static inline unsigned char tomorse(char c) {
+	if (c >= 'a' && c <= 'z')
+		c = c - 'a' + 'A';
+	if (c >= '"' && c <= '_') {
+		return morsetable[c - '"'];
+	} else
+		return 0;
+}
+
+#define DITLEN		(HZ / 5)
+#define DAHLEN		(3 * DITLEN)
+#define SPACELEN	(7 * DITLEN)
+
+#define FREQ 844
+
+/*  Tell the user who may be running in X and not see the console that
+ *  we have panic'd.  This is to distingush panics from "real lockups."
+ *  Could in theory send the panic message as morse, but that is left
+ *  as an exercise for the reader.
+ *
+ *  And now it's done! LED and speaker morse code by Andrew Rodland
+ *  <arodland@noln.com>, with improvements based on suggestions from
+ *  linux@horizon.com and a host of others.
+ *
+ *  Initial 2.5 morsepanics port by Tomas Szepe <szepe@pinerecords.com>,
+ *  January 2003.
+ */
+void panic_morseblink(char *buf)
+{ 
+	static unsigned long next_jiffie = 0;
+	static char * bufpos = 0;
+	static unsigned char morse = 0;
+	static char state = 1;
+	
+	if (!morse_setting) 
+		return;
+
+	if (!buf)
+		buf = "Uh oh, we lost the panic msg.";
+
+	/* Waiting for something? */
+	if (bufpos && time_after(next_jiffie, jiffies))
+		return;
+
+	if (state) {	/* Coming off of a blink. */
+		if (morse_setting & 0x01)
+			do_blink(0);
+
+		state = 0;
+
+		if (morse > 1) {
+			/* Not done yet, just a one-dit pause. */
+			next_jiffie = jiffies + DITLEN;
+		} else {
+			/* Get a new char, figure out how much space. */
+
+			/* First time through */
+			if (!bufpos)
+				bufpos = (char *) buf;
+
+			if (!*bufpos) {
+				/* Repeating */
+				bufpos = (char *) buf;
+				next_jiffie = jiffies + SPACELEN;
+			} else {
+				/* Inter-letter space */
+				next_jiffie = jiffies + DAHLEN; 
+			}
+
+			if (!(morse = tomorse(*bufpos))) {
+				next_jiffie = jiffies + SPACELEN;
+				state = 1;	/* And get us back here */
+			}
+			bufpos++;
+		}
+	} else {
+		/* Starting a new blink.  We have a valid code in morse. */
+		int len;
+
+		len = (morse & 001) ? DAHLEN : DITLEN;
+
+#ifdef CONFIG_VT
+		if (morse_setting & 0x02)
+			kd_mksound(FREQ, len);
+#endif
+
+		next_jiffie = jiffies + len;
+
+		if (morse_setting & 0x01)
+			do_blink(1);
+
+		state = 1;
+		morse >>= 1;
+	}
+}
+
+static int __init panicmorse_setup(char *str)
+{
+	int par;
+	if (get_option(&str, &par)) 
+		morse_setting = par;
+	return 1;
+}
+
+/*  "panicmorse=0" disables the blinking as it caused problems with
+ *  certain console switches.
+ *
+ *  "panicmorse | 1" does the show using kbd leds.
+ *  "panicmorse | 2" throws in bleeping via kd_mksound().
+ */
+__setup("panicmorse=", panicmorse_setup);
+
+#endif /* CONFIG_MORSE_PANICS */
+
 /**
  *	panic - halt the system
  *	@fmt: The text string to print
@@ -95,7 +232,10 @@
         disabled_wait(caller);
 #endif
 	local_irq_enable();
-	for(;;) {
+	for (;;) {
+#if defined(CONFIG_MORSE_PANICS)
+		panic_morseblink(buf);
+#endif
 		CHECK_EMERGENCY_SYNC
 	}
 }

^ permalink raw reply	[flat|nested] 40+ messages in thread
[parent not found: <20030131104326.GF12286@louise.pinerecords.com.suse.lists.linux.kernel>]
* Re: [PATCH] 2.5.59 morse code panics
@ 2003-01-31 21:31 Albert D. Cahalan
  0 siblings, 0 replies; 40+ messages in thread
From: Albert D. Cahalan @ 2003-01-31 21:31 UTC (permalink / raw)
  To: linux-kernel; +Cc: davej, john, alan, szepe


Dave Jones writes:
> On Fri, Jan 31, 2003 at 02:29:59PM +0000, John Bradford wrote:

>> On the other hand, I don't actually want to have to listen
>> to ten minutes of morse code over the phone when another
>> box could do it for me.
>
> That must be a pretty quiet datacentre. And what happens
> when more than one box starts beeping ?

a. Supposedly a good ham can pick one signal from many,
   at least if the pitches are different.

b. If you're not a good ham, you can process the audio.
   There are existing decoders that might do the job.
   This works for 1 computer if you have a tape recorder.

Using fast Morse over the speaker, an oops may take
30 minutes.

Blinking keyboard LEDs would have to be much slower.
The data would have to be just an instruction pointer.

Using a non-Morse code over the speaker could get the
transmission time down to a couple minutes, with full
ASCII and error correction.

Say, anybody have a *.wav file of machine-room noise?
(16-bit, 44.1 and 48 kHz)

^ permalink raw reply	[flat|nested] 40+ messages in thread
* Re: [PATCH] 2.5.59 morse code panics
@ 2003-02-05 17:56 Marcelo Roberto Jimenez
  0 siblings, 0 replies; 40+ messages in thread
From: Marcelo Roberto Jimenez @ 2003-02-05 17:56 UTC (permalink / raw)
  To: linux-kernel

Dave,

> That must be a pretty quiet datacentre. And what happens when more
> than one box starts beeping ?
>
> Dave

That is a very very low probability event if there are only linux boxes.
:-)

Regards,

Marcelo.



^ permalink raw reply	[flat|nested] 40+ messages in thread

end of thread, other threads:[~2003-02-07 16:29 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-30 15:07 [PATCH] 2.5.59 morse code panics Tomas Szepe
2003-01-30 17:36 ` Dave Jones
2003-01-30 18:45   ` Alan Cox
2003-01-31 10:43     ` Tomas Szepe
2003-01-31 11:12       ` John Bradford
2003-01-31 13:22         ` Dave Jones
2003-01-31 14:40           ` Valdis.Kletnieks
2003-01-31 14:58             ` John Bradford
2003-01-31 15:05             ` Dave Jones
2003-01-31 15:32               ` Valdis.Kletnieks
2003-01-31 15:09           ` Alan Cox
2003-01-31 14:29             ` John Bradford
2003-01-31 15:13               ` Dave Jones
2003-01-31 15:12             ` Dave Jones
2003-01-31 15:27               ` John Bradford
2003-01-31 15:21           ` Scott Robert Ladd
2003-01-31 17:59     ` Vojtech Pavlik
2003-01-31 18:06       ` Tomas Szepe
2003-01-31 19:38       ` Tomas Szepe
     [not found] <20030131104326.GF12286@louise.pinerecords.com.suse.lists.linux.kernel>
     [not found] ` <200301311112.h0VBCv00000575@darkstar.example.net.suse.lists.linux.kernel>
     [not found]   ` <20030131132221.GA12834@codemonkey.org.uk.suse.lists.linux.kernel>
     [not found]     ` <1044025785.1654.13.camel@irongate.swansea.linux.org.uk.suse.lists.linux.kernel>
2003-01-31 15:34       ` Andi Kleen
2003-01-31 15:41         ` Tomas Szepe
2003-01-31 16:01           ` John Bradford
2003-01-31 16:11             ` Tomas Szepe
2003-01-31 16:17               ` John Bradford
2003-01-31 19:52             ` Horst von Brand
2003-01-31 20:04               ` John Bradford
2003-01-31 21:08                 ` Eric Weigle
2003-01-31 21:14                   ` John Bradford
2003-02-02 15:42             ` Bill Davidsen
2003-02-03 19:14               ` Jos Hulzink
2003-02-03 21:29                 ` Bill Davidsen
2003-02-04  6:00             ` Peter C. Norton
2003-02-07 15:51               ` Ryan Anderson
2003-02-07 16:39                 ` John Bradford
2003-01-31 15:46         ` Dave Jones
2003-01-31 15:55           ` Valdis.Kletnieks
2003-02-03 15:50         ` Pavel Machek
2003-02-04 16:32           ` Henning P. Schmiedehausen
  -- strict thread matches above, loose matches on Subject: below --
2003-01-31 21:31 Albert D. Cahalan
2003-02-05 17:56 Marcelo Roberto Jimenez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox