/*
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.
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];
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;
}
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)
{
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);
parport_put_port(walkera0701_parport);
return (err);
}
- parport_enable_irq(walkera0701_parport);
+ open_counter = 0;
+ //parport_enable_irq(walkera0701_parport);
return 0;
}