/* * mitsu-ch - an external channel changer for Mitsu ???? * * Copyright 2004,2005 by Stacey D. Son * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include // Motorola DCT-6200 IDs // Note: there are at least two different vendor and model IDs for the 6200 #define DCT6200_VENDOR_ID1 0x00000ce5 #define DCT6200_VENDOR_ID2 0x00000e5c #define MITSU_VENDOR_ID1 0x00080070 #define DCT6200_SPEC_ID 0x00005068 #define MITSU_SPEC_ID 0x00000989 #define DCT6200_SW_VERSION 0x00010101 #define MITSU_SW_VERSION 0x00000100 #define DCT6200_MODEL_ID1 0x0000620a #define DCT6200_MODEL_ID2 0x00006200 #define MITSU_MODEL_ID1 0x0001ffff #define AVC1394_SUBUNIT_TYPE_6200 (9 << 19) /* uses a reserved subunit type */ #define AVC1394_6200_COMMAND_CHANNEL 0x000007C00 /* 6200 subunit command */ #define AVC1394_6200_OPERAND_SET 0x20 /* 6200 subunit command operand */ #define CTL_CMD0 AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_6200 | \ AVC1394_SUBUNIT_ID_0 | AVC1394_6200_COMMAND_CHANNEL | \ AVC1394_6200_OPERAND_SET #define STARTING_NODE 0 void usage() { fprintf(stderr, "Usage: 6200ch [-v] \n"); exit(1); } int main (int argc, char *argv[]) { rom1394_directory dir; int device = -1; int i; int verbose = 0; quadlet_t cmd[2]; int dig[3]; int chn = 550; if (argc < 2) usage(); if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'v') { verbose = 1; chn = atoi(argv[2]); } else { chn = atoi(argv[1]); } #ifdef RAW1394_V_0_8 raw1394handle_t handle = raw1394_get_handle(); #else raw1394handle_t handle = raw1394_new_handle(); #endif if (!handle) { if (!errno) { fprintf(stderr, "Not Compatable!\n"); } else { perror("Couldn't get 1394 handle"); fprintf(stderr, "Is ieee1394, driver, and raw1394 loaded?\n"); } exit(1); } if (raw1394_set_port(handle, 0) < 0) { perror("couldn't set port"); raw1394_destroy_handle(handle); exit(1); } int nc = raw1394_get_nodecount(handle); for (i=STARTING_NODE; i < nc; ++i) { if (rom1394_get_directory(handle, i, &dir) < 0) { fprintf(stderr,"error reading config rom directory for node %d\n", i); raw1394_destroy_handle(handle); exit(1); } if (verbose) printf("node %d: vendor_id = 0x%08x model_id = 0x%08x\n", i, dir.vendor_id, dir.model_id); if ( ((dir.vendor_id == DCT6200_VENDOR_ID1) || (dir.vendor_id == DCT6200_VENDOR_ID2) || (dir.vendor_id == MITSU_VENDOR_ID1)) && ((dir.model_id == DCT6200_MODEL_ID1) || (dir.model_id == DCT6200_MODEL_ID2) || (dir.model_id == MITSU_MODEL_ID1)) ) { if (dir.unit_spec_id != DCT6200_SPEC_ID || dir.unit_spec_id != MITSU_SPEC_ID) fprintf(stderr, "Warning: Unit Spec ID different.\n"); if (dir.unit_sw_version != DCT6200_SW_VERSION || dir.unit_sw_version != MITSU_SW_VERSION) fprintf(stderr, "Warning: Unit Software Version different.\n"); device = i; break; } } if (device == -1) { fprintf(stderr, "Could not find Motorola DCT-6200 or Mitsu on the 1394 bus.\n"); raw1394_destroy_handle(handle); exit(1); } dig[2] = (chn % 10); dig[1] = (chn % 100) / 10; dig[0] = (chn % 1000) / 100; if (verbose) printf("AV/C Command: %d%d%d = Op1=0x%08X Op2=0x%08X Op3=0x%08X\n", dig[0], dig[1], dig[2], CTL_CMD0 | dig[0], CTL_CMD0 | dig[1], CTL_CMD0 | dig[2]); for (i=0; i<3; i++) { cmd[0] = CTL_CMD0 | dig[i]; cmd[1] = 0x0; avc1394_transaction_block(handle, device, cmd, 2, 1); usleep(500000); // small delay for button to register } raw1394_destroy_handle(handle); exit(0); }