]> zub.fei.tuke.sk Git - walkera0701-joystick/commitdiff
Better ASCII art
authorPeter Popovec <popovec@fei.tuke.sk>
Sun, 12 Oct 2008 20:20:35 +0000 (22:20 +0200)
committerPeter Popovec <popovec@fei.tuke.sk>
Sun, 12 Oct 2008 20:20:35 +0000 (22:20 +0200)
If checksum is bad, do not report bad values to iput driver
counter for open and close, disabling irq only if not opened (temp workaround)
all kernelr messages start  "walkera0701:" ..

walkera0701.c

index a3014e55736952f4d11b46514ef07c20304157cd..6129b2d027f03a29094c152e69e1ec307a5b373d 100644 (file)
 /*
 Cable: (walkera TX to parralel port)
 
-Walkera 0701 TX S-VIDEO connector:
+Walkera WK-0701 TX S-VIDEO connector:
                   (back side of TX)
      __   __ 
-    /  |_|  \     connect pin 2 (signal)                             canon25
-   / O 4 3 O \    connect pin 3 (GND)        LED      NPN transistor
-  ( O 2   1 O )                                        / ---------------10
-   \   ___   /      2 o-----------------------|>|-----|
-    | [___] |                                          V\
-     -------        3 o --------------------------------v-------------- 25  
-
+    /  |_|  \     connect pin 2 (signal)              NPN           canon25
+   / O 4 3 O \    connect pin 3 (GND)        LED        ________________  10
+  ( O 2   1 O )                                         | C
+   \   ___   /      2 ________________________|\|_____|/
+    | [___] |                                 |/|   B |\ 
+     -------        3 __________________________________|________________ 25
+                                                          E
 Frame format:
 Based on walkera WK-0701 PCM Format description by Shaul Eizikovich.
 
@@ -87,35 +88,40 @@ static unsigned char counter;
 static struct hrtimer walkera0701_timer;
 
 static u64 IRQtime, IRQlasttime;
-
+static int open_counter;
 struct input_dev *input_dev;
 struct parport *walkera0701_parport;
 struct pardevice *walkera0701_pardevice;
 
-//TODO real paket parsing 
 static inline void walkera0701_parse_frame(void)
 {
        int i;
-       int val1, val2, val3, val4, val5, val6, val7, val8, magic;
+       int val1, val2, val3, val4, val5, val6, val7, val8, magic, magic_bit;
        int crc1, crc2;
        for (crc1 = crc2 = i = 0; i < 10; i++) {
                crc1 += DATA[i] & 7;
                crc2 += (DATA[i] & 8) >> 3;
        }
-       if ((DATA[10] & 7) != (crc1 & 7))
-               printk(KERN_INFO "Bad OCT 1-4 checksum\n");
-       if (((DATA[10] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1))
-               printk(KERN_INFO "Bad BIN - OCT 1-4 checksum\n");
-
+       if ((DATA[10] & 7) != (crc1 & 7)) {
+               printk(KERN_INFO "walkera0701: Bad OCT 1-4 checksum\n");
+               return;
+       }
+       if (((DATA[10] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1)) {
+               printk(KERN_INFO "walkera0701: Bad BIN - OCT 1-4 checksum\n");
+               return;
+       }
        for (crc1 = crc2 = 0, i = 11; i < 23; i++) {
                crc1 += DATA[i] & 7;
                crc2 += (DATA[i] & 8) >> 3;
        }
-       if ((DATA[23] & 7) != (crc1 & 7))
-               printk(KERN_INFO "Bad OCT 5-8 checksum\n");
-       if (((DATA[23] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1))
-               printk(KERN_INFO "Bad BIN - OCT 5-8 checksum\n");
-
+       if ((DATA[23] & 7) != (crc1 & 7)) {
+               printk(KERN_INFO "walkera0701: Bad OCT 5-8 checksum\n");
+               return;
+       }
+       if (((DATA[23] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1)) {
+               printk(KERN_INFO "walkera0701: Bad BIN - OCT 5-8 checksum\n");
+               return;
+       }
        val1 = ((DATA[0] & 7) * 256 + DATA[1] * 16 + DATA[2]) >> 2;
        val1 *= ((DATA[0] >> 2) & 2) - 1;       //sign
        val2 = (DATA[2] & 1) << 8 | (DATA[3] << 4) | DATA[4];
@@ -134,16 +140,16 @@ static inline void walkera0701_parse_frame(void)
        val8 *= (DATA[18] & 2) - 1;     //sign
 
        magic = (DATA[21] << 4) | DATA[22];
-/*     printk(KERN_INFO "%4d %4d %4d %4d  %4d %4d %4d %4d (magic %2x %d)\n",
-              val1, val2, val3, val4, val5, val6, val7, val8, magic,
-              (DATA[24] & 8) >> 3);
+       magic_bit = (DATA[24] & 8) >> 3;
+/*     printk(KERN_INFO "walkera0701: %4d %4d %4d %4d  %4d %4d %4d %4d (magic %2x %d)\n",
+              val1, val2, val3, val4, val5, val6, val7, val8, magic,magic_bit);
 */
        input_report_abs(input_dev, ABS_X, val2);
        input_report_abs(input_dev, ABS_Y, val1);
        input_report_abs(input_dev, ABS_THROTTLE, val3);
        input_report_abs(input_dev, ABS_RUDDER, val4);
        input_report_abs(input_dev, ABS_MISC, val7);
-       input_report_key(input_dev,BTN_GEAR_DOWN,val5 >0);
+       input_report_key(input_dev, BTN_GEAR_DOWN, val5 > 0);
 }
 
 static int ACK;
@@ -205,13 +211,22 @@ static enum hrtimer_restart walkera0701_timer_handler(struct hrtimer
 }
 static int walkera0701_open(struct input_dev *dev)
 {
+       open_counter++;
        parport_enable_irq(walkera0701_parport);
+       printk(KERN_INFO "walkera0701: irq enabled, open count=%d\n",
+              open_counter);
        return (0);
 }
 static void walkera0701_close(struct input_dev *dev)
 {
-       parport_disable_irq(walkera0701_parport);
-
+//TODO  if this is enabled, sometime parport not send interupts if module is openned 
+//workaround, counting for open and close ...
+//      parport_disable_irq(walkera0701_parport);
+       open_counter--;
+       if (!open_counter) {
+               parport_disable_irq(walkera0701_parport);
+               printk(KERN_INFO "walkera0701: irq disabled\n");
+       }
 }
 static int walkera0701_connect(int parport)
 {
@@ -261,9 +276,9 @@ static int walkera0701_connect(int parport)
        input_dev->open = walkera0701_open;
        input_dev->close = walkera0701_close;
 
-       input_dev->evbit[0] = BIT(EV_ABS)|BIT_MASK(EV_KEY) ;
-       input_dev->keybit[BIT_WORD(BTN_GEAR_DOWN)]=BIT_MASK(BTN_GEAR_DOWN);
-       
+       input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY);
+       input_dev->keybit[BIT_WORD(BTN_GEAR_DOWN)] = BIT_MASK(BTN_GEAR_DOWN);
+
        input_set_abs_params(input_dev, ABS_X, -512, 512, 0, 0);
        input_set_abs_params(input_dev, ABS_Y, -512, 512, 0, 0);
        input_set_abs_params(input_dev, ABS_THROTTLE, -512, 512, 0, 0);
@@ -277,7 +292,8 @@ static int walkera0701_connect(int parport)
                parport_put_port(walkera0701_parport);
                return (err);
        }
-       parport_enable_irq(walkera0701_parport);
+       open_counter = 0;
+       //parport_enable_irq(walkera0701_parport);
        return 0;
 }