From: Peter Popovec Date: Sun, 12 Oct 2008 20:20:35 +0000 (+0200) Subject: Better ASCII art X-Git-Tag: stable1.0-rc1~2 X-Git-Url: http://zub.fei.tuke.sk/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b23fce89cb8d36c97156b21ee921c80b6884df5a;p=walkera0701-joystick Better ASCII art 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:" .. --- diff --git a/walkera0701.c b/walkera0701.c index a3014e5..6129b2d 100644 --- a/walkera0701.c +++ b/walkera0701.c @@ -13,16 +13,17 @@ /* 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; }