00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <libavc1394/rom1394.h>
00022 #include <libavc1394/avc1394.h>
00023 #include <libraw1394/raw1394.h>
00024 #include <sys/types.h>
00025 #include <stdio.h>
00026 #include <errno.h>
00027 #include <stdlib.h>
00028 #include <limits.h>
00029 #include <getopt.h>
00030 #include <unistd.h>
00031
00032
00033
00034
00035
00036 #define DCH3200_VENDOR_ID1 0x00001c11
00037 #define DCH3200_VENDOR_ID2 0x00001cfb
00038 #define DCH3200_VENDOR_ID3 0x00001fc4
00039 #define DCH3200_VENDOR_ID4 0x000023a3
00040 #define DCH3200_MODEL_ID1 0x0000d330
00041
00042 #define DCH3416_VENDOR_ID1 0x00001e46
00043 #define DCH3416_MODEL_ID1 0x0000b630
00044
00045 #define DCT3412_VENDOR_ID1 0x0000159a
00046 #define DCT3412_MODEL_ID1 0x000034cb
00047
00048 #define DCT3416_VENDOR_ID1 0x000016b5
00049 #define DCT3416_VENDOR_ID2 0x00001bdd
00050 #define DCT3416_MODEL_ID1 0x0000346b
00051 #define DCT3416_MODEL_ID2 0x0000b630
00052
00053 #define DCT5100_VENDOR_ID1 0x000017ee
00054 #define DCT5100_MODEL_ID1 0x0000620a
00055
00056 #define DCT6200_VENDOR_ID1 0x00000ce5
00057 #define DCT6200_VENDOR_ID2 0x00000e5c
00058 #define DCT6200_VENDOR_ID3 0x00001225
00059 #define DCT6200_VENDOR_ID4 0x00000f9f
00060 #define DCT6200_VENDOR_ID5 0x00001180
00061 #define DCT6200_VENDOR_ID6 0x000012c9
00062 #define DCT6200_VENDOR_ID7 0x000011ae
00063 #define DCT6200_VENDOR_ID8 0x0000152f
00064 #define DCT6200_VENDOR_ID9 0x000014e8
00065 #define DCT6200_VENDOR_ID10 0x000016b5
00066 #define DCT6200_VENDOR_ID11 0x00001371
00067 #define DCT6200_VENDOR_ID12 0x000019a6
00068 #define DCT6200_VENDOR_ID13 0x00001aad
00069 #define DCT6200_VENDOR_ID14 0x00000b06
00070 #define DCT6200_VENDOR_ID15 0x0000195e
00071 #define DCT6200_VENDOR_ID16 0x000010dc
00072 #define DCT6200_SPEC_ID 0x00005068
00073 #define DCT6200_SW_VERSION 0x00010101
00074 #define DCT6200_MODEL_ID1 0x0000620a
00075 #define DCT6200_MODEL_ID2 0x00006200
00076
00077 #define DCT6412_VENDOR_ID1 0x00000f9f
00078 #define DCT6412_VENDOR_ID2 0x0000152f
00079 #define DCT6412_MODEL_ID1 0x000064ca
00080 #define DCT6412_MODEL_ID2 0x000064cb
00081
00082 #define DCT6416_VENDOR_ID1 0x000017ee
00083 #define DCT6416_VENDOR_ID2 0x00001a66
00084 #define DCT6416_MODEL_ID1 0x0000646b
00085
00086 #define QIP7100_VENDOR_ID1 0x00002374
00087 #define QIP7100_MODEL_ID1 0x00008100
00088 #define QIP7100_MODEL_ID2 0x00000001
00089
00090 #define MOT_UNKNOWN_VENDOR_ID1 0x04db
00091 #define MOT_UNKNOWN_VENDOR_ID2 0x0406
00092 #define MOT_UNKNOWN_VENDOR_ID3 0x0ce5
00093 #define MOT_UNKNOWN_VENDOR_ID4 0x111a
00094 #define MOT_UNKNOWN_VENDOR_ID5 0x1225
00095 #define MOT_UNKNOWN_VENDOR_ID6 0x1404
00096 #define MOT_UNKNOWN_VENDOR_ID7 0x1626
00097 #define MOT_UNKNOWN_VENDOR_ID8 0x18c0
00098 #define MOT_UNKNOWN_VENDOR_ID9 0x1ade
00099 #define MOT_UNKNOWN_VENDOR_ID10 0x1cfb
00100 #define MOT_UNKNOWN_VENDOR_ID11 0x2040
00101 #define MOT_UNKNOWN_VENDOR_ID12 0x211e
00102 #define MOT_UNKNOWN_VENDOR_ID13 0x2180
00103 #define MOT_UNKNOWN_VENDOR_ID14 0x2210
00104 #define MOT_UNKNOWN_VENDOR_ID15 0x230b
00105 #define MOT_UNKNOWN_VENDOR_ID16 0x2375
00106 #define MOT_UNKNOWN_VENDOR_ID17 0x2395
00107 #define MOT_UNKNOWN_VENDOR_ID18 0x23a2
00108 #define MOT_UNKNOWN_VENDOR_ID19 0x23ed
00109 #define MOT_UNKNOWN_VENDOR_ID20 0x23ee
00110 #define MOT_UNKNOWN_VENDOR_ID21 0x23a0
00111 #define MOT_UNKNOWN_VENDOR_ID22 0x23a1
00112
00113 #define PACE_VENDOR_ID1 0x00005094
00114 #define PACE_VENDOR_ID2 0x00005094
00115 #define PACE550_MODEL_ID1 0x00010551
00116 #define PACE779_MODEL_ID1 0x00010755
00117
00118 #define AVC1394_6200_OPERAND_SET 0x20
00119
00120 #define CTL_CMD0 AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_PANEL | \
00121 AVC1394_SUBUNIT_ID_0 | AVC1394_PANEL_COMMAND_PASS_THROUGH | \
00122 AVC1394_6200_OPERAND_SET
00123
00124 #define STARTING_NODE 1
00125 #define STARTING_PORT 0
00126 #define RETRY_COUNT_SLOW 1
00127 #define RETRY_COUNT_FAST 0
00128
00129 void set_chan_slow(raw1394handle_t handle, int device, int verbose, int chn);
00130 void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn);
00131
00132 void usage()
00133 {
00134 fprintf(stderr, "Usage: 6200ch [-v] [-s] [-n NODE] [-g GUID] [-p PORT] "
00135 "<channel_num>\n");
00136 fprintf(stderr, "-v print additional verbose output\n");
00137 fprintf(stderr, "-s use single packet method\n");
00138 fprintf(stderr, "-n NODE node to start device scanning on (default:%i)\n",
00139 STARTING_NODE);
00140 fprintf(stderr, "-p PORT port/adapter to use (default:%i)\n",
00141 STARTING_PORT);
00142 fprintf(stderr, "-g GUID GUID to use, -n switch, if present, will be ignored.\n");
00143 exit(1);
00144 }
00145
00146 int main (int argc, char *argv[])
00147 {
00148 rom1394_directory dir;
00149 int device = -1;
00150 int i;
00151 int verbose = 0;
00152 int single_packet = 0;
00153 int bGUID=0;
00154 octlet_t cli_GUID=0LL;
00155 octlet_t node_GUID=0LL;
00156 quadlet_t cmd[2];
00157 int chn = 550;
00158
00159
00160 int starting_node = STARTING_NODE;
00161 int starting_port = STARTING_PORT;
00162 int c;
00163 int index;
00164
00165 if (argc < 2)
00166 usage();
00167
00168 opterr = 0;
00169 while ((c = getopt(argc, argv, "vsg:n:p:")) != -1)
00170 {
00171 switch (c) {
00172 case 'v':
00173 verbose = 1;
00174 break;
00175 case 's':
00176 single_packet = 1;
00177 break;
00178 case 'n':
00179 starting_node = atoi(optarg);
00180 break;
00181 case 'g':
00182 bGUID=1;
00183 starting_node=0;
00184 cli_GUID = (octlet_t)strtoll(optarg, (char **)NULL, 16);
00185 break;
00186 case 'p':
00187 starting_port = atoi(optarg);
00188 break;
00189 default:
00190 fprintf(stderr, "incorrect command line arguments\n");
00191 usage();
00192 }
00193 }
00194
00195
00196 if (optind != argc-1) {
00197 usage();
00198 }
00199
00200 chn = atoi(argv[optind]);
00201
00202 #ifdef RAW1394_V_0_8
00203 raw1394handle_t handle = raw1394_get_handle();
00204 #else
00205 raw1394handle_t handle = raw1394_new_handle();
00206 #endif
00207
00208 if (!handle) {
00209 if (!errno) {
00210 fprintf(stderr, "Not Compatible!\n");
00211 } else {
00212 perror("Couldn't get 1394 handle");
00213 fprintf(stderr, "Is ieee1394, driver, and raw1394 loaded?\n");
00214 }
00215 exit(1);
00216 }
00217
00218 if (raw1394_set_port(handle, starting_port) < 0) {
00219 perror("couldn't set port");
00220 raw1394_destroy_handle(handle);
00221 exit(1);
00222 }
00223
00224 if (verbose)
00225 printf("starting with node: %d\n", starting_node);
00226
00227 int nc = raw1394_get_nodecount(handle);
00228 if (bGUID!=0) {
00229 if (cli_GUID==0LL || cli_GUID==LLONG_MAX || cli_GUID==LLONG_MIN) {
00230 fprintf(stderr, "error parsing GUID command line parameter\n");
00231 exit(1);
00232 }
00233 }
00234 for (i=starting_node; i < nc; ++i) {
00235 if (bGUID!=0) {
00236 node_GUID=rom1394_get_guid(handle, i);
00237 #ifdef DEBUG
00238 printf("node=%d, node_GUID=%LX, cli_GUID=%LX\n", i, node_GUID, cli_GUID);
00239 #endif
00240 if (cli_GUID!=node_GUID) {
00241 continue;
00242 }
00243 }
00244
00245 if (rom1394_get_directory(handle, i, &dir) < 0) {
00246 fprintf(stderr,"error reading config rom directory for node %d\n", i);
00247 raw1394_destroy_handle(handle);
00248 exit(1);
00249 }
00250
00251 if (verbose)
00252 printf("node %d: vendor_id = 0x%08x model_id = 0x%08x\n",
00253 i, dir.vendor_id, dir.model_id);
00254
00255
00256 if ( ((dir.vendor_id == DCH3200_VENDOR_ID1) ||
00257 (dir.vendor_id == DCH3200_VENDOR_ID2) ||
00258 (dir.vendor_id == DCH3200_VENDOR_ID3) ||
00259 (dir.vendor_id == DCH3200_VENDOR_ID4) ||
00260 (dir.vendor_id == DCH3416_VENDOR_ID1) ||
00261 (dir.vendor_id == DCT3412_VENDOR_ID1) ||
00262 (dir.vendor_id == DCT3416_VENDOR_ID1) ||
00263 (dir.vendor_id == DCT3416_VENDOR_ID2) ||
00264 (dir.vendor_id == DCT5100_VENDOR_ID1) ||
00265 (dir.vendor_id == DCT6200_VENDOR_ID1) ||
00266 (dir.vendor_id == DCT6200_VENDOR_ID2) ||
00267 (dir.vendor_id == DCT6200_VENDOR_ID3) ||
00268 (dir.vendor_id == DCT6200_VENDOR_ID4) ||
00269 (dir.vendor_id == DCT6200_VENDOR_ID5) ||
00270 (dir.vendor_id == DCT6200_VENDOR_ID6) ||
00271 (dir.vendor_id == DCT6200_VENDOR_ID7) ||
00272 (dir.vendor_id == DCT6200_VENDOR_ID8) ||
00273 (dir.vendor_id == DCT6200_VENDOR_ID9) ||
00274 (dir.vendor_id == DCT6200_VENDOR_ID10) ||
00275 (dir.vendor_id == DCT6200_VENDOR_ID11) ||
00276 (dir.vendor_id == DCT6200_VENDOR_ID12) ||
00277 (dir.vendor_id == DCT6200_VENDOR_ID13) ||
00278 (dir.vendor_id == DCT6200_VENDOR_ID14) ||
00279 (dir.vendor_id == DCT6200_VENDOR_ID15) ||
00280 (dir.vendor_id == DCT6200_VENDOR_ID16) ||
00281 (dir.vendor_id == DCT6412_VENDOR_ID1) ||
00282 (dir.vendor_id == DCT6412_VENDOR_ID2) ||
00283 (dir.vendor_id == DCT6416_VENDOR_ID1) ||
00284 (dir.vendor_id == DCT6416_VENDOR_ID2) ||
00285 (dir.vendor_id == QIP7100_VENDOR_ID1) ||
00286 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID1) ||
00287 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID2) ||
00288 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID3) ||
00289 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID4) ||
00290 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID5) ||
00291 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID6) ||
00292 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID7) ||
00293 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID8) ||
00294 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID9) ||
00295 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID10) ||
00296 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID11) ||
00297 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID12) ||
00298 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID13) ||
00299 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID14) ||
00300 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID15) ||
00301 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID16) ||
00302 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID17) ||
00303 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID18) ||
00304 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID19) ||
00305 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID20) ||
00306 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID21) ||
00307 (dir.vendor_id == MOT_UNKNOWN_VENDOR_ID22) ||
00308 (dir.vendor_id == PACE_VENDOR_ID1) ||
00309 (dir.vendor_id == PACE_VENDOR_ID2)) &&
00310 ((dir.model_id == DCH3200_MODEL_ID1) ||
00311 (dir.model_id == DCH3416_MODEL_ID1) ||
00312 (dir.model_id == DCT3412_MODEL_ID1) ||
00313 (dir.model_id == DCT3416_MODEL_ID1) ||
00314 (dir.model_id == DCT3416_MODEL_ID2) ||
00315 (dir.model_id == DCT5100_MODEL_ID1) ||
00316 (dir.model_id == DCT6200_MODEL_ID1) ||
00317 (dir.model_id == DCT6200_MODEL_ID2) ||
00318 (dir.model_id == DCT6412_MODEL_ID1) ||
00319 (dir.model_id == DCT6412_MODEL_ID2) ||
00320 (dir.model_id == DCT6416_MODEL_ID1) ||
00321 (dir.model_id == QIP7100_MODEL_ID1) ||
00322 (dir.model_id == QIP7100_MODEL_ID2) ||
00323 (dir.model_id == PACE550_MODEL_ID1) ||
00324 (dir.model_id == PACE779_MODEL_ID1)) )
00325 {
00326 if (dir.unit_spec_id != DCT6200_SPEC_ID)
00327 fprintf(stderr, "Warning: Unit Spec ID different.\n");
00328 if (dir.unit_sw_version != DCT6200_SW_VERSION)
00329 fprintf(stderr, "Warning: Unit Software Version different.\n");
00330 device = i;
00331 break;
00332 }
00333 }
00334
00335 if (device == -1) {
00336 fprintf(stderr, "Could not find Motorola DCT-6200 on the 1394 bus.\n");
00337 raw1394_destroy_handle(handle);
00338 exit(1);
00339 }
00340
00341 if (single_packet)
00342 set_chan_fast(handle, device, verbose, chn);
00343 else
00344 set_chan_slow(handle, device, verbose, chn);
00345
00346 raw1394_destroy_handle(handle);
00347 exit(0);
00348 }
00349
00350 void set_chan_slow(raw1394handle_t handle, int device, int verbose, int chn)
00351 {
00352 int i;
00353 int dig[3];
00354 quadlet_t cmd[2];
00355
00356 dig[2] = (chn % 10);
00357 dig[1] = (chn % 100) / 10;
00358 dig[0] = (chn % 1000) / 100;
00359
00360 if (verbose)
00361 printf("AV/C Command: %d%d%d = Op1=0x%08X Op2=0x%08X Op3=0x%08X\n",
00362 dig[0], dig[1], dig[2],
00363 CTL_CMD0 | dig[0], CTL_CMD0 | dig[1], CTL_CMD0 | dig[2]);
00364
00365 for (i=0; i<3; i++) {
00366 cmd[0] = CTL_CMD0 | dig[i];
00367 cmd[1] = 0x0;
00368
00369 avc1394_transaction_block(handle, device, cmd, 2, RETRY_COUNT_SLOW);
00370 usleep(500000);
00371 }
00372 }
00373
00374 void set_chan_fast(raw1394handle_t handle, int device, int verbose, int chn)
00375 {
00376 quadlet_t cmd[3];
00377
00378 cmd[0] = CTL_CMD0 | 0x67;
00379 cmd[1] = (0x04 << 24) | (chn << 8) | 0x000000FF;
00380 cmd[2] = 0xFF << 24;
00381
00382 if (verbose)
00383 printf("AV/C command for channel %d = 0x%08X %08X %08X\n",
00384 chn, cmd[0], cmd[1], cmd[2]);
00385
00386 avc1394_transaction_block(handle, device, cmd, 3, RETRY_COUNT_FAST);
00387 }
00388
00389