--- contrib/channel_changers/6200ch/6200ch.c.orig 2009-09-03 19:51:11.913853152 +0000 +++ contrib/channel_changers/6200ch/6200ch.c 2009-09-03 20:18:12.926708146 +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,6 +130,7 @@ #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); @@ -143,6 +146,7 @@ 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.\n"); exit(1); } @@ -153,6 +157,7 @@ int i; int verbose = 0; int single_packet = 0; + int use_four_digit = 0; int toggle_power = 0; int bGUID=0; octlet_t cli_GUID=0LL; @@ -191,6 +196,9 @@ case 'p': starting_port = atoi(optarg); break; + case '4': + use_four_digit = 1; + break; default: fprintf(stderr, "incorrect command line arguments\n"); usage(); @@ -203,6 +211,10 @@ /* the last argument is the channel number */ chn = atoi(argv[optind]); } + if (single_packet && use_four_digit) { + fprintf(stderr, "Can't use both -s and -4 together.\n"); + usage(); + } else if (!toggle_power) { usage(); @@ -292,6 +304,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 +326,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) || @@ -356,6 +368,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 +402,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 = 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]); + + 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];