6200ch.c.0.21-fixes.patch

admin, 09/04/2009 12:16 am

Download (9.4 kB)

 
contrib/channel_changers/6200ch.c 2009-09-05 01:05:17.442389834 +0000
76 76
#define DCT6416_VENDOR_ID2 0x00001a66 
77 77
#define DCT6416_MODEL_ID1  0x0000646b
78 78

  
79
#define QIP6200_VENDOR_ID1 0x0000211e
80
#define QIP6200_MODEL_ID1  0x00007100
81

  
79 82
#define PACE_VENDOR_ID1    0x00005094 /* 550 & 779 */
80 83
#define PACE550_MODEL_ID1  0x00010551
81 84
#define PACE779_MODEL_ID1  0x00010755
......
92 95
#define RETRY_COUNT_FAST 0
93 96

  
94 97
void set_chan_slow(raw1394handle_t handle, int device, int verbose, int chn);
98
void set_chan_slow_four_digit(raw1394handle_t handle, int device, int verbose, int chn);
95 99
void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn);
96 100

  
97 101
void usage()
98 102
{
99 103
   fprintf(stderr, "Usage: 6200ch [-v] [-s] [-n NODE] [-g GUID] [-p PORT] "
100
           "<channel_num>\n");
104
           "[-4] <channel_num>\n");
101 105
   fprintf(stderr, "-v        print additional verbose output\n");
102
   fprintf(stderr, "-s        use single packet method\n");
106
   fprintf(stderr, "-s        use single packet method. Cannot be used with -4.\n");
103 107
   fprintf(stderr, "-n NODE   node to start device scanning on (default:%i)\n",
104 108
           STARTING_NODE);
105 109
   fprintf(stderr, "-p PORT   port/adapter to use              (default:%i)\n",
106 110
           STARTING_PORT);
107 111
   fprintf(stderr, "-g GUID   GUID to use, -n switch, if present, will be ignored.\n");
112
   fprintf(stderr, "-4        Support for 4 digit channel numbers.  Cannot be used with -s.\n");
108 113
   exit(1);
109 114
}
110 115

  
......
119 124
   octlet_t cli_GUID=0LL;
120 125
   octlet_t node_GUID=0LL;
121 126
   quadlet_t cmd[2];
122
   int chn = 550;
127
   int chn = 0;
128
   int use_four_digit = 0;
123 129

  
124 130
   /* some people experience crashes when starting on node 1 */
125 131
   int starting_node = STARTING_NODE;
......
131 137
      usage();
132 138

  
133 139
   opterr = 0;
134
   while ((c = getopt(argc, argv, "vsg:n:p:")) != -1)
140
   while ((c = getopt(argc, argv, "vsg:n:p:4")) != -1)
135 141
   {
136 142
       switch (c) {
137 143
       case 'v':
......
151 157
       case 'p':
152 158
           starting_port = atoi(optarg);
153 159
           break;
160
       case '4':
161
           use_four_digit = 1;
162
           break;
154 163
       default:
155 164
           fprintf(stderr, "incorrect command line arguments\n");
156 165
           usage();
157 166
       }
158 167
   }
159

  
168
   /* We cannot use single channel with 4 digits */
169
   if (single_packet && use_four_digit) {
170
       usage();
171
   }
160 172
   /* print out usage message if not enough arguments */
161 173
   if (optind != argc-1) {
162 174
       usage();
......
242 254
            (dir.vendor_id == DCT6412_VENDOR_ID2) ||
243 255
            (dir.vendor_id == DCT6416_VENDOR_ID1) || 
244 256
            (dir.vendor_id == DCT6416_VENDOR_ID2) ||
257
            (dir.vendor_id == QIP6200_VENDOR_ID1) ||
245 258
            (dir.vendor_id == PACE_VENDOR_ID1)) &&
246 259
           ((dir.model_id == DCH3200_MODEL_ID1) ||
247 260
            (dir.model_id == DCT3412_MODEL_ID1) ||
......
253 266
            (dir.model_id == DCT6412_MODEL_ID1) ||
254 267
            (dir.model_id == DCT6412_MODEL_ID2) ||
255 268
            (dir.model_id == DCT6416_MODEL_ID1) ||
269
            (dir.model_id == QIP6200_MODEL_ID1) ||
256 270
            (dir.model_id == PACE550_MODEL_ID1) ||
257 271
            (dir.model_id == PACE779_MODEL_ID1)) )
258 272
      {
......
274 288
   if (single_packet)
275 289
       set_chan_fast(handle, device, verbose, chn);
276 290
   else
291
   if (use_four_digit)
292
       set_chan_slow_four_digit(handle, device, verbose, chn);
293
   else
277 294
       set_chan_slow(handle, device, verbose, chn);
278 295

  
279 296
   raw1394_destroy_handle(handle);
......
304 321
   }
305 322
}
306 323

  
324
// Same as set_chan_slow(), but sends 4 digits instead of 3 (for quicker channel changes on QIP6200-2 / QIP7100-1)
325
void set_chan_slow_four_digit(raw1394handle_t handle, int device, int verbose, int chn)
326
{
327
   int i;
328
   int dig[4];
329
   quadlet_t cmd[2];
330

  
331
   if (verbose)
332
       printf("chn: %d\n", chn);
333

  
334
   dig[3] = (chn % 10);
335
   dig[2] = (chn % 100)  / 10;
336
   dig[1] = (chn % 1000) / 100;
337
   dig[0] = (chn % 10000) / 1000;
338

  
339
   if (verbose)
340
      printf("AV/C Command: %d%d%d%d = Op1=0x%08X Op2=0x%08X Op3=0x%08X Op4=0x%08X\n",
341
            dig[0], dig[1], dig[2], dig[3],
342
            CTL_CMD0 | dig[0], CTL_CMD0 | dig[1], CTL_CMD0 | dig[2], CTL_CMD0 | dig[3]);
343

  
344
   for (i=0; i<4; i++) {
345
      if (verbose)
346
          printf("Sending digit %d\n", dig[i]);
347
      cmd[0] = CTL_CMD0 | dig[i];
348
      cmd[1] = 0x0;
349

  
350
      avc1394_transaction_block(handle, device, cmd, 2, RETRY_COUNT_SLOW);
351
      usleep(500000);  // small delay for button to register
352
   }
353
}
354

  
307 355
void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn)
308 356
{
309 357
    quadlet_t cmd[3];