Re: [PATCH 2/2] driver for Zhen Hua PCM-4CH RC transmitter v2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2008/2/13, Dmitry Torokhov:
> Hi,
>
> On Wed, Feb 13, 2008 at 04:51:50PM +0100, Kmarty wrote:
> >
> > +int zhenhua_init(int fd, long *id, long *extra)
> > +{
> > +     /* Zhen Hua 5 byte protokol: prvni (synchronizacni) byte obsahuje vzdy 0xF7,
> > +      * nasledujici ctyri pak jednotlive osy ovladace v intervalu 50-200.
> > +      * Pozor, nacitana data (jednotlive bajty) jsou bitove prevracene (nejnizsi
> > +      * bit je nejvyssim bitem) - neco jako little-endian na bitove urovni.
> > +      * Synchronizacni byte ma tedy bez prevraceni hodnotu 0xEF
> > +      *
> > +      * Inicializace je temer shodna s twiddlerem */
> > +
>
> Could you please change this comment to english since this way most
> people can read it? Other than that it all looks good, thanks.
>
> --
> Dmitry
>
Ok, translated.

Attachment: inputattach.c.diffstat
Description: Binary data

--- inputattach.c.orig	2008-02-06 10:35:22.000000000 +0100
+++ inputattach.c	2008-02-13 17:48:29.000000000 +0100
@@ -1,5 +1,4 @@
 /*
- * $Id: inputattach.c 2352 2006-02-08 12:19:31Z vojtech $
  *
  *  Copyright (c) 1999-2000 Vojtech Pavlik
  *
@@ -315,6 +314,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 +413,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 +454,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;
         }

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux