--- contrib/channel_changers/6200ch/6200ch.c.orig	2009-09-03 19:51:11.913853152 +0000
+++ contrib/channel_changers/6200ch/6200ch.c	2009-09-04 05:11:44.212465932 +0000
@@ -88,6 +88,9 @@
 #define QIP7100_MODEL_ID1  0x00008100
 #define QIP7100_MODEL_ID2  0x00000001
 
+#define QIP6200_VENDOR_ID1 0x0000211e
+#define QIP6200_MODEL_ID1  0x00007100
+
 #define MOT_UNKNOWN_VENDOR_ID1 0x04db
 #define MOT_UNKNOWN_VENDOR_ID2 0x0406
 #define MOT_UNKNOWN_VENDOR_ID3 0x0ce5
@@ -99,17 +102,16 @@
 #define MOT_UNKNOWN_VENDOR_ID9 0x1ade
 #define MOT_UNKNOWN_VENDOR_ID10 0x1cfb
 #define MOT_UNKNOWN_VENDOR_ID11 0x2040
-#define MOT_UNKNOWN_VENDOR_ID12 0x211e
-#define MOT_UNKNOWN_VENDOR_ID13 0x2180
-#define MOT_UNKNOWN_VENDOR_ID14 0x2210
-#define MOT_UNKNOWN_VENDOR_ID15 0x230b
-#define MOT_UNKNOWN_VENDOR_ID16 0x2375
-#define MOT_UNKNOWN_VENDOR_ID17 0x2395
-#define MOT_UNKNOWN_VENDOR_ID18 0x23a2
-#define MOT_UNKNOWN_VENDOR_ID19 0x23ed
-#define MOT_UNKNOWN_VENDOR_ID20 0x23ee
-#define MOT_UNKNOWN_VENDOR_ID21 0x23a0
-#define MOT_UNKNOWN_VENDOR_ID22 0x23a1
+#define MOT_UNKNOWN_VENDOR_ID12 0x2180
+#define MOT_UNKNOWN_VENDOR_ID13 0x2210
+#define MOT_UNKNOWN_VENDOR_ID14 0x230b
+#define MOT_UNKNOWN_VENDOR_ID15 0x2375
+#define MOT_UNKNOWN_VENDOR_ID16 0x2395
+#define MOT_UNKNOWN_VENDOR_ID17 0x23a2
+#define MOT_UNKNOWN_VENDOR_ID18 0x23ed
+#define MOT_UNKNOWN_VENDOR_ID19 0x23ee
+#define MOT_UNKNOWN_VENDOR_ID20 0x23a0
+#define MOT_UNKNOWN_VENDOR_ID21 0x23a1
 
 #define PACE_VENDOR_ID1    0x00005094 /* 550 & 779 */
 #define PACE_VENDOR_ID2    0x00005094 /* unknown */
@@ -128,21 +130,23 @@
 #define RETRY_COUNT_FAST 0
 
 void set_chan_slow(raw1394handle_t handle, int device, int verbose, int chn);
+void set_chan_slow_four_digit(raw1394handle_t handle, int device, int verbose, int chn);
 void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn);
 void set_power_fast(raw1394handle_t handle, int device, int verbose);
 
 void usage()
 {
    fprintf(stderr, "Usage: 6200ch [-v] [-s] [-n NODE] [-g GUID] [-p PORT] "
-           "<channel_num>\n");
+           "[-4] <channel_num>\n");
    fprintf(stderr, "-v        print additional verbose output\n");
-   fprintf(stderr, "-s        use single packet method\n");
+   fprintf(stderr, "-s        use single packet method. Cannot be used with -4.\n");
    fprintf(stderr, "-w        toggle power state\n");
    fprintf(stderr, "-n NODE   node to start device scanning on (default:%i)\n",
            STARTING_NODE);
    fprintf(stderr, "-p PORT   port/adapter to use              (default:%i)\n",
            STARTING_PORT);
    fprintf(stderr, "-g GUID   GUID to use, -n switch, if present, will be ignored.\n");
+   fprintf(stderr, "-4        Enable 4 digit channel number support. Cannot be used with -s.\n");
    exit(1);
 }
 
@@ -158,6 +162,7 @@
    octlet_t cli_GUID=0LL;
    octlet_t node_GUID=0LL;
    int chn = 0;
+   int use_four_digit = 0;
 
    /* some people experience crashes when starting on node 1 */
    int starting_node = STARTING_NODE;
@@ -168,7 +173,7 @@
       usage();
 
    opterr = 0;
-   while ((c = getopt(argc, argv, "vswg:n:p:")) != -1)
+   while ((c = getopt(argc, argv, "vswg:n:p:4")) != -1)
    {
        switch (c) {
        case 'v':
@@ -191,16 +196,24 @@
        case 'p':
            starting_port = atoi(optarg);
            break;
+       case '4':
+           use_four_digit = 1;
+           break;
        default:
            fprintf(stderr, "incorrect command line arguments\n");
            usage();
        }
    }
 
+   {
+   /* We cannot use single packet with 4 digits */
+       if (single_packet && use_four_digit)
+           usage();
+   }
    /* print out usage message if not enough arguments */
    if (optind == argc-1)
    {
-       /* the last argument is the channel number */
+   /* the last argument is the channel number */
        chn = atoi(argv[optind]);
    }
    else if (!toggle_power)
@@ -292,6 +305,7 @@
             (dir.vendor_id == DCT6416_VENDOR_ID1) ||
             (dir.vendor_id == DCT6416_VENDOR_ID2) ||
             (dir.vendor_id == QIP7100_VENDOR_ID1) ||
+            (dir.vendor_id == QIP6200_VENDOR_ID1) ||
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID1) ||
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID2) ||
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID3) ||
@@ -313,7 +327,6 @@
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID19) ||
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID20) ||
             (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID21) ||
-            (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID22) ||
             (dir.vendor_id == PACE_VENDOR_ID1) ||
             (dir.vendor_id == PACE_VENDOR_ID2)) &&
            ((dir.model_id == DCH3200_MODEL_ID1) ||
@@ -330,6 +343,7 @@
             (dir.model_id == DCT6416_MODEL_ID1) ||
             (dir.model_id == QIP7100_MODEL_ID1) ||
             (dir.model_id == QIP7100_MODEL_ID2) ||
+            (dir.model_id == QIP6200_MODEL_ID1) ||
             (dir.model_id == PACE550_MODEL_ID1) ||
             (dir.model_id == PACE779_MODEL_ID1)) )
       {
@@ -356,6 +370,9 @@
        if (single_packet)
            set_chan_fast(handle, device, verbose, chn);
        else
+       if (use_four_digit)
+           set_chan_slow_four_digit(handle, device, verbose, chn); 
+       else
            set_chan_slow(handle, device, verbose, chn);
    }
 
@@ -387,6 +404,37 @@
    }
 }
 
+// Same as set_chan_slow(), but sends 4 digits instead of 3 (for quicker channel changes on QIP6200-2 / QIP7100-1)
+void set_chan_slow_four_digit(raw1394handle_t handle, int device, int verbose, int chn)
+{
+   int i;
+   int dig[4];
+   quadlet_t cmd[2];
+
+   if (verbose)
+       printf("chn: %d\n", chn);
+
+   dig[3] = (chn % 10);
+   dig[2] = (chn % 100) / 10;
+   dig[1] = (chn % 1000) / 100;
+   dig[0] = (chn % 10000) / 1000;
+
+   if (verbose)
+      printf("AV/C Command: %d%d%d%d = Op1=0x%08X Op2=0x%08X Op3=0x%08X Op4=0x%08X\n",
+            dig[0], dig[1], dig[2], dig[3],
+            CTL_CMD0 | dig[0], CTL_CMD0 | dig[1], CTL_CMD0 | dig[2], CTL_CMD0 | dig[3]);
+
+   for (i=0; i<4; i++) {
+      if (verbose)
+          printf("Sending digit %d\n", dig[i]);
+      cmd[0] = CTL_CMD0 | dig[i];
+      cmd[1] = 0x0;
+    
+      avc1394_transaction_block(handle, device, cmd, 2, RETRY_COUNT_SLOW);
+      usleep(500000); // small delay for button to register
+   }
+} 
+
 void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn)
 {
     quadlet_t cmd[3];