--- inputattach-1.23/inputattach.c	2006-02-02 20:20:24.000000000 +0100
+++ inputattach-1.23.patched/inputattach.c	2008-05-20 16:26:04.000000000 +0200
@@ -49,6 +49,10 @@
 #include <assert.h>
 #include <ctype.h>
 
+#ifndef SERIO_ZHENHUA
+#define SERIO_ZHENHUA 0x36
+#endif
+
 int readchar(int fd, unsigned char *c, int timeout)
 {
 	struct timeval tv;
@@ -315,6 +319,44 @@
 	return 0;
 }
 
+int zhenhua_init(int fd, long *id, long *extra)
+{
+	/* Zhen Hua 5 byte protocol: first (synchronization) byte allways
+	 * contain 0xF7, next four bytes are axis of controller with values
+	 * between 50-200.
+	 * Incoming data (each byte) have reversed bits (lowest bit is
+	 * highest bit) - something like little-endian but on bit level.
+	 * Synchronization byte without reversing bits have (raw) value:
+	 * 0xEF
+	 *
+	 * Initialization is almost same as twiddler_init */
+
+	unsigned char c[10];
+	int count;
+
+	for (count=0 ; count < 5 ; count++) {
+		if(readchar(fd, c+0, 500)) return -1;
+		if(c[0] == 0xef) break;
+	}
+
+	if (count == 5) {
+		/* Could not find header byte in data stream */
+		return -1;
+	}
+
+	/* Read remaining 4 bytes plus the full next data packet */
+	for (count = 1; count < 10; count++) {
+		if (readchar(fd, c+count, 500)) return -1;
+	}
+
+	/* check if next sync byte exists */
+	if (c[5] != 0xef)
+		return -1;
+
+	return 0;
+		
+}
+
 int dump_init(int fd, long *id, long *extra)
 {
 	unsigned char c, o = 0;
@@ -376,6 +418,7 @@
 { "--elo4002",		"-elo6b",	B9600, CS8 | CRTSCTS,		SERIO_ELO,	1,	0,	0,	NULL },
 { "--elo271-140",	"-elo4b",	B9600, CS8 | CRTSCTS,		SERIO_ELO,	2,	0,	0,	NULL },
 { "--elo261-280",	"-elo3b",	B9600, CS8 | CRTSCTS,		SERIO_ELO,	3,	0,	0,	NULL },
+{ "--zhen-hua",		"-zhen",	B19200, CS8, 			SERIO_ZHENHUA,	0,	0,	0,	zhenhua_init },
 { "--dump",		"-dump",	B2400, CS8, 			0,		0,	0,	0,	dump_init },
 { "", "", 0, 0 }
 
@@ -416,6 +459,7 @@
 		puts("  --ps2serkbd     -ps2ser PS/2 via serial keyboard");
 		puts("  --twiddler      -twid   Handykey Twiddler chording keyboard");
 		puts("  --twiddler-joy  -twidjoy  Handykey Twiddler used as a joystick");
+		puts("  --zhen-hua      -zhen  Zhen Hua 5-byte protocol");
 		puts("");
                 return 1;
         }
