public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Rodland <arodland@noln.com>
To: linux-kernel@vger.kernel.org
Subject: Re: [PATCH -ac] Panicking in morse code v3
Date: Sat, 20 Jul 2002 17:32:22 -0400	[thread overview]
Message-ID: <20020720173222.3286fcbb.arodland@noln.com> (raw)
In-Reply-To: <20020719011300.548d72d5.arodland@noln.com>

Once more Mr. unnamed sent me some suggestions, and once more I've
merged [my own adaptation of] them in. Also, I took an attempt to make
it somewhat more platform-independent, and re-organize. The original
panic_blink was in pc_keyb.c, and was guarded by an #ifdef __i386__ .
v3 moves the generic code out of pc_keyb (and into panic.c). It should
be able to blink on anything that uses pc_keyb (i386, some ARM, and
some MIPS, apparently), and should be able to beep on anything that
defines kd_mksound to do something (currently only i386). Also the code
has been reorganized so as to be easier to read and follow, and there
are a few more punctuation characters.

Yes, I actually _am_ trying to turn this into something useful.
Now, I don't have a 2.5 tree, and probably wouldn't understand it if I
did, but I get a feeling that this won't be so incredibly easy to port,
thanks to having everything use the input layer. Or am I wrong?

--hobbs

Patch follows

diff -u -r linux.old/drivers/char/pc_keyb.c linux.new/drivers/char/pc_keyb.c
--- linux.old/drivers/char/pc_keyb.c	Fri Jul 19 18:56:36 2002
+++ linux.new/drivers/char/pc_keyb.c	Sat Jul 20 13:18:40 2002
@@ -1244,41 +1244,13 @@
 #endif /* CONFIG_PSMOUSE */
 
 
-static int blink_frequency = HZ/2;
+void pckbd_blink (char led) {
+		led = led ? (0x01 | 0x04) : 0x00;
 
-/* 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;
 		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;
-	}
-}  
-
-static int __init panicblink_setup(char *str)
-{
-    int par;
-    if (get_option(&str,&par)) 
-	    blink_frequency = par*(1000/HZ);
-    return 1;
 }
-
-/* panicblink=0 disables the blinking as it caused problems with some console
-   switches. otherwise argument is ms of a blink period. */
-__setup("panicblink=", panicblink_setup);
-
diff -u -r linux.old/kernel/panic.c linux.new/kernel/panic.c
--- linux.old/kernel/panic.c	Fri Jul 19 18:56:36 2002
+++ linux.new/kernel/panic.c	Sat Jul 20 17:28:41 2002
@@ -16,6 +16,8 @@
 #include <linux/init.h>
 #include <linux/sysrq.h>
 #include <linux/interrupt.h>
+#include <linux/vt_kern.h>
+#include <linux/pc_keyb.h>
 
 asmlinkage void sys_sync(void);	/* it's really int */
 
@@ -28,9 +30,132 @@
 	panic_timeout = simple_strtoul(str, NULL, 0);
 	return 1;
 }
-
 __setup("panic=", panic_setup);
 
+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.  
+	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.
+*/ 
+
+static const unsigned char morsetable[] = {
+	/*  !   "    #  $     %  &    '	 	 */
+	    0, 0122, 0, 0310, 0, 0, 0163,
+	/*  (       )  *  +    ,     -    .      /	 */
+	    055, 0155, 0, 0, 0163, 0141, 0152, 0051,
+	/* 0-9 */
+	    077, 076, 074, 070, 060, 040, 041, 043, 047, 057,
+	/*  :     ;     <   =    >   ?    @  */
+	    0107, 0125, 0, 0061, 0, 0114, 0,
+	/* A-I */
+	   006, 021, 025, 011, 002, 024, 013, 020, 004,
+	/* J-R */
+	   036, 015, 022, 007, 005, 017, 026, 033, 012,
+	/* S-Z */
+	   010, 003, 014, 030, 016, 031, 035, 023,
+	/* [  \  ]  ^  */
+	   0, 0, 0, 0,
+	/* _ */
+	   0154
+
+};
+
+#define DITLEN (HZ / 5)
+#define DAHLEN 3 * DITLEN
+#define SPACELEN 7 * DITLEN
+
+#define FREQ 844
+
+
+#if (defined(__i386__) && defined(CONFIG_VT)) || defined(CONFIG_PC_KEYB)
+#define do_blink(x) pckbd_blink(x)
+#else
+#define do_blink(x) 0
+#endif
+
+void panic_blink(char * buf)
+{ 
+	static unsigned long next_jiffie = 0;
+	static char * bufpos = 0;
+	static unsigned char morse = 0;
+	static char state = 1;
+	
+	if (!blink_setting) 
+		return;
+
+	if (!buf)
+		buf="Panic lost?";
+
+
+	if (bufpos && time_after (next_jiffie, jiffies)) {
+		return; /* Waiting for something. */
+	}
+
+	if (state) { /* Coming off of a blink. */
+		if (blink_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, and figure out how much space. */
+			
+			if(!bufpos)
+				bufpos = (char *)buf; /* First time through */
+
+			if(!*bufpos) {
+				bufpos = (char *)buf; /* Repeating */
+				next_jiffie = jiffies + SPACELEN;
+			} else {
+				next_jiffie = jiffies + DAHLEN; /* Inter-letter space */
+			}
+
+			if (*bufpos >= '!' && *bufpos <= '_') {
+				morse = morsetable[*bufpos - '!'];
+			} else if (*bufpos >= 'a' && *bufpos <= 'z') {
+				morse = morsetable[*bufpos - 'a' + 'A' - '!'];
+			} else {
+				next_jiffie = jiffies + SPACELEN; /*Space -- For a total of 7*/
+				state = 1; /* And bring us back here when we're done */
+			}
+			bufpos ++;
+		}
+	} else { /* Starting a new blink. We have valid code in morse. */
+		int len;
+
+		len = (morse & 001) ? DAHLEN : DITLEN;
+
+		if (blink_setting & 0x02)
+			kd_mksound(FREQ, len);
+		
+		next_jiffie = jiffies + len;
+
+		if (blink_setting & 0x01)
+			do_blink(1);
+		state = 1;
+		morse >>= 1;
+	}
+}  
+
+static int __init panicblink_setup(char *str)
+{
+    int par;
+    if (get_option(&str,&par)) 
+	    blink_setting = par;
+    return 1;
+}
+
+/* panicblink=0 disables the blinking as it caused problems with some console
+   switches. otherwise argument is ms of a blink period. */
+__setup("panicblink=", panicblink_setup);
+
+
 /**
  *	panic - halt the system
  *	@fmt: The text string to print
@@ -96,10 +221,7 @@
 #endif
 	sti();
 	for(;;) {
-#if defined(__i386__) && defined(CONFIG_VT) 
-		extern void panic_blink(void);
-		panic_blink(); 
-#endif
+		panic_blink(buf); 
 		CHECK_EMERGENCY_SYNC
 	}
 }


  parent reply	other threads:[~2002-07-20 21:31 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 ` Andrew Rodland [this message]
2002-07-21  8:49   ` [PATCH -ac] Panicking in morse code v3 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>
     [not found] ` <20020720173222.3286fcbb.arodland@noln.com.suse.lists.linux.kernel>
     [not found]   ` <200207211849.56076.bhards@bigpond.net.au.suse.lists.linux.kernel>
     [not found]     ` <20020721100818.A22176@flint.arm.linux.org.uk.suse.lists.linux.kernel>
2002-07-21  9:29       ` Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020720173222.3286fcbb.arodland@noln.com \
    --to=arodland@noln.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox