linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH -ac] Panicking in morse code
@ 2002-07-19  5:13 Andrew Rodland
  2002-07-19  5:29 ` William Lee Irwin III
                   ` (4 more replies)
  0 siblings, 5 replies; 62+ messages in thread
From: Andrew Rodland @ 2002-07-19  5:13 UTC (permalink / raw)
  To: linux-kernel, alan

No, it's not 1 April.

I was researching panic_blink() for someone who needed a little help,
when I noticed the comment above the function definition, not being the
kind to step down from a challenge (unless it's just really hard), I
decided to write morse code output code.

The option panicblink= has been hijacked to be a simple bitfield: 
bit 1 : blink LEDs
bit 2 : sound the PC speaker.

the blinking option depends only on pc_keyb.c. the pcspeaker option
depends on kb_mksound() actually doing something. At the moment, both of
these mean i386. The call to panic_blink() in panic() is still guarded
by an i386 #ifdef, anyway, for the moment. The default is to blink only,
because I figured the beeps would be too annoying. Opinions?

It recognizes letters, and digits, and treats everything else as a
space. The timings are tunable by #defines. It repeats the message
indefinitely. And it should only bloat the kernel by a few hundred
bytes, although if someone wants to wrap this in its own config option,
well, that's good too.

Anyway, here's the patch. It's against linux-2.4.19-rc1-ac1+preempt, but
I suspect it applies against all recent -ac. If 2.5 has this, it will
hopefully apply with some fuzz against that, too. I don't have a tree.
(modem. ecch.)


diff -u -r -d linux.old/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c
--- linux.old/drivers/char/pc_keyb.c	Fri Jul 19 00:59:04 2002
+++ linux/drivers/char/pc_keyb.c	Fri Jul 19 01:00:34 2002
@@ -1244,37 +1244,126 @@
 #endif /* CONFIG_PSMOUSE */
 
 
-static int blink_frequency = HZ/2;
+static int blink_setting = 1;
 
 /* Tell the user who may be running in X and not see the console that we have 
    panic'ed. 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.  */ 
-void panic_blink(void)
-{ 
-	static unsigned long last_jiffie;
-	static char led;
-	/* Roughly 1/2s frequency. KDB uses about 1s. Make sure it is 
-	   different. */
-	if (!blink_frequency) 
-		return;
-	if (jiffies - last_jiffie > blink_frequency) {
-		led ^= 0x01 | 0x04;
+   exercise for the reader.  
+	And now it's done! LED and speaker morse code by Andrew Rodland, 18-19 Jul 2002
+*/ 
+
+static const char * morse[] = {
+	".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", /* A-H */
+	"..", ".---.", "-.-", ".-..", "--", "-.", "---", ".--.", /* I-P */
+	"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", /* Q-X */
+	"-.--", "--..",	 	 	 	 	 	 /* Y-Z */
+	"-----", ".----", "..---", "...--", "....-",	 	 /* 0-4 */
+	".....", "-....", "--...", "---..", "----."	 	 /* 5-9 */
+};
+
+#define DITLEN (HZ / 4)
+#define DAHLEN 3 * DITLEN
+#define FREQ 1000
+
+static __inline__ void do_blink (int led) {
+
+		if (! blink_setting & 0x01)
+			return;
+		
+		led = led ? (0x01 | 0x04) : 0x00;
+
 		while (kbd_read_status() & KBD_STAT_IBF) mdelay(1); 
 		kbd_write_output(KBD_CMD_SET_LEDS);
 		mdelay(1); 
 		while (kbd_read_status() & KBD_STAT_IBF) mdelay(1); 
 		mdelay(1); 
 		kbd_write_output(led);
-		last_jiffie = jiffies;
+}
+
+void panic_blink(char * buf)
+{ 
+	static unsigned long next_jiffie = 0;
+	static char * bufpos = 0;
+	static char * morsepos = 0;
+	static char state;
+	
+	if (!blink_setting) 
+		return;
+
+	if (!buf)
+		buf="ABC";
+
+
+	if (jiffies > next_jiffie || !bufpos) { //messy. fix.
+		
+		if (state) {
+			do_blink(0);
+			state = 0;
+			next_jiffie = jiffies + DITLEN;
+			return;
+		}
+
+		if (!bufpos) {
+			bufpos = (char *)buf;
+			return;
+		}
+
+	
+		if (!morsepos || !*morsepos) {
+			
+			if (!*bufpos) { /*Repeat the message */ 
+				bufpos = (char *)buf;
+				morsepos = 0;
+				next_jiffie = jiffies + 3 * DAHLEN;
+				return;
+			}
+			next_jiffie = jiffies + DITLEN;
+
+			if (*bufpos >= 'A' && *bufpos <= 'Z') {
+				morsepos = (char *)morse[*bufpos - 'A'];
+			} else if (*bufpos >= 'a' && *bufpos <= 'z') {
+				morsepos = (char *)morse[*bufpos - 'a'];
+			} else if (*bufpos >= '0' && *bufpos <= '9') {
+				morsepos = (char *)morse[*bufpos - '0' + 26];
+			} else {
+				next_jiffie += 2*DITLEN;
+			}
+			bufpos ++;
+			
+			return;
+		}
+
+		if (*morsepos == '.') {
+			if (blink_setting & 0x02)
+				kd_mksound(FREQ, DITLEN);
+			next_jiffie = jiffies + DITLEN;
+			do_blink(1);
+			state = 1;
+			morsepos++;
+			return;
+		} else if (*morsepos == '-') {
+			if (blink_setting & 0x02)
+				kd_mksound(FREQ, DAHLEN);
+			next_jiffie = jiffies + DAHLEN;
+			do_blink(1);
+			state = 1;
+			morsepos++;
+			return;
+		}
+
+		/*impossible*/
+		morsepos = 0;
+
 	}
+	
 }  
 
 static int __init panicblink_setup(char *str)
 {
     int par;
     if (get_option(&str,&par)) 
-	    blink_frequency = par*(1000/HZ);
+	    blink_setting = par;
     return 1;
 }
 
diff -u -r -d linux.old/kernel/panic.c linux/kernel/panic.c
--- linux.old/kernel/panic.c	Fri Jul 19 00:59:04 2002
+++ linux/kernel/panic.c	Thu Jul 18 21:45:45 2002
@@ -97,8 +97,8 @@
 	sti();
 	for(;;) {
 #if defined(__i386__) && defined(CONFIG_VT) 
-		extern void panic_blink(void);
-		panic_blink(); 
+		extern void panic_blink(char * buf);
+		panic_blink(buf); 
 #endif
 		CHECK_EMERGENCY_SYNC
 	}

^ permalink raw reply	[flat|nested] 62+ messages in thread
[parent not found: <20020719011300.548d72d5.arodland@noln.com.suse.lists.linux.kernel>]

end of thread, other threads:[~2002-08-13 17:18 UTC | newest]

Thread overview: 62+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-07-19  5:13 [PATCH -ac] Panicking in morse code Andrew Rodland
2002-07-19  5:29 ` William Lee Irwin III
2002-07-19 16:36 ` Thorsten Kranzkowski
2002-07-19 17:00   ` Andrew Rodland
2002-07-19 17:27     ` Eli Carter
2002-07-19 17:32       ` Andrew Rodland
2002-07-19 23:02 ` [PATCH -ac] Panicking in morse code, v2 Andrew Rodland
2002-07-20 10:58   ` Daniel Phillips
2002-07-20 11:19     ` Thunder from the hill
2002-07-20 13:22       ` Ville Herva
2002-07-20 14:18         ` Daniel Phillips
2002-07-20 14:55           ` Tomas Szepe
2002-07-20 16:05             ` Daniel Phillips
2002-07-20 19:51         ` Thunder from the hill
2002-07-20  0:35 ` [PATCH -ac] Panicking in morse code Alan Cox
2002-07-20  0:39   ` Andrew Rodland
2002-07-20  0:48   ` Thunder from the hill
2002-07-25 12:51   ` Bill Davidsen
2002-07-26  3:43     ` Daniel Phillips
2002-07-26  4:47       ` Daniel Phillips
2002-07-26  4:52       ` jdow
2002-07-26  5:13         ` Daniel Phillips
2002-07-26 13:50           ` Bill Davidsen
2002-07-26 13:38       ` Bill Davidsen
2002-07-26 14:39         ` Richard B. Johnson
2002-07-26 20:09           ` Bill Davidsen
2002-07-26 23:25           ` Jens Schmidt
2002-07-27  2:05             ` Albert D. Cahalan
2002-07-27  4:00               ` Andrew Rodland
     [not found]                 ` <200207270526.g6R5Qw942780@saturn.cs.uml.edu>
2002-07-27  5:57                   ` Speaker twiddling [was: Re: Panicking in morse code] Andrew Rodland
2002-07-27  9:46                     ` Daniel Phillips
2002-07-27 12:57                     ` David D. Hagood
2002-07-27 15:45                       ` Andrew Rodland
2002-07-29 17:47                         ` Pavel Machek
2002-07-29 22:02                           ` Ray Friess
2002-07-29 17:49                         ` Pavel Machek
2002-07-29 20:35                           ` Albert D. Cahalan
2002-07-29 21:08                             ` Pavel Machek
2002-07-27 18:56                       ` Albert D. Cahalan
2002-07-27 19:44                         ` Ville Herva
2002-07-27 22:40                         ` Alan Cox
2002-07-27 21:35                           ` Ville Herva
2002-07-31 15:20                             ` Thunder from the hill
2002-07-27 21:40                           ` Ryan Anderson
2002-07-28 10:26                         ` Lars Magne Ingebrigtsen
2002-07-29 20:03                           ` Albert D. Cahalan
2002-08-13 17:20                       ` Mark H. Wood
2002-07-27  4:04               ` [PATCH -ac] Panicking in morse code Andrew Rodland
2002-07-29 11:50               ` Bill Davidsen
2002-07-29 12:34                 ` Richard B. Johnson
2002-07-29 19:57                 ` Albert D. Cahalan
2002-07-31 17:54                   ` Bill Davidsen
2002-07-20 21:32 ` [PATCH -ac] Panicking in morse code v3 Andrew Rodland
2002-07-21  8:49   ` Brad Hards
2002-07-21  9:08     ` Russell King
2002-07-21 10:50       ` Zwane Mwaikambo
2002-07-21 15:43   ` Daniel Phillips
2002-07-22 17:18     ` Andrew Rodland
     [not found] <20020719011300.548d72d5.arodland@noln.com.suse.lists.linux.kernel>
2002-07-19 10:38 ` [PATCH -ac] Panicking in morse code Andi Kleen
2002-07-20  7:05   ` Ville Herva
2002-07-20 11:49     ` Neale Banks
2002-07-20 11:55       ` Thunder from the hill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).