From b23fce89cb8d36c97156b21ee921c80b6884df5a Mon Sep 17 00:00:00 2001 From: Peter Popovec Date: Sun, 12 Oct 2008 22:20:35 +0200 Subject: [PATCH] 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:" .. --- walkera0701.c | 78 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 31 deletions(-) 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; } -- 2.39.5