00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <libavc1394/rom1394.h>
00025 #include <libavc1394/avc1394.h>
00026 #include <libraw1394/raw1394.h>
00027 #include <sys/types.h>
00028 #include <stdio.h>
00029 #include <errno.h>
00030 #include <stdlib.h>
00031 #include <string.h>
00032
00033
00034
00035
00036 #define SA_VENDOR_ID1 0x00000a73
00037 #define SA_VENDOR_ID2 0x00000f21
00038 #define SA_VENDOR_ID3 0x000011e6
00039 #define SA_VENDOR_ID4 0x000014f8
00040 #define SA_VENDOR_ID5 0x00001692
00041 #define SA_VENDOR_ID6 0x00001868
00042 #define SA_VENDOR_ID7 0x00001947
00043 #define SA_VENDOR_ID8 0x00001ac3
00044 #define SA_VENDOR_ID9 0x00001bd7
00045 #define SA_VENDOR_ID10 0x00001cea
00046 #define SA_VENDOR_ID11 0x00001e6b
00047 #define SA_VENDOR_ID12 0x000021be
00048 #define SA_VENDOR_ID13 0x0000223a
00049 #define SA_VENDOR_ID14 0x000022ce
00050 #define SA_VENDOR_ID15 0x000023be
00051 #define SA_VENDOR_ID16 0x0000252e
00052
00053 #define SA3250HD_MODEL_ID1 0x00000be0
00054 #define SA4200HD_MODEL_ID1 0x00001072
00055 #define SA4250HDC_MODEL_ID1 0x000010cc
00056
00057 #define AVC1394_SA3250_COMMAND_CHANNEL 0x000007c00
00058 #define AVC1394_SA3250_OPERAND_KEY_PRESS 0xe7
00059 #define AVC1394_SA3250_OPERAND_KEY_RELEASE 0x67
00060
00061 #define CTL_CMD0 AVC1394_CTYPE_CONTROL | AVC1394_SUBUNIT_TYPE_PANEL | \
00062 AVC1394_SUBUNIT_ID_0 | AVC1394_SA3250_COMMAND_CHANNEL
00063 #define CTL_CMD1 (0x04 << 24)
00064 #define CTL_CMD2 0xff000000
00065
00066 #define STARTING_NODE 0
00067
00068 void usage()
00069 {
00070 fprintf(stderr, "Usage: sa3250ch [-v] [-s] <channel_num>\n");
00071 fprintf(stderr, " -v : Verbose Mode\n");
00072 fprintf(stderr, " -s : Send command as single digit "
00073 "(for SA4200 and some SA3250s and SA4200HD's)\n");
00074 exit(1);
00075 }
00076
00077 int main (int argc, char *argv[])
00078 {
00079 rom1394_directory dir;
00080 int device = -1;
00081 int single = 0;
00082 int i;
00083 int verbose = 0;
00084 quadlet_t cmd[3];
00085 int dig[3];
00086 int chn = 708;
00087
00088 if (argc < 2)
00089 usage();
00090
00091 for(i = 1; i < argc; ++i) {
00092 if ((argv[i][0] == '-') && (strlen(argv[i]) > 1)) {
00093 switch(argv[i][1]) {
00094 case 'v':
00095 verbose = 1;
00096 break;
00097 case 's':
00098 single = 1;
00099 break;
00100 default:
00101 fprintf(stderr, "WARNING: Unknown option \'%c\', ignoring", argv[i][1]);
00102 }
00103 }
00104 else {
00105 chn = atoi(argv[i]);
00106 }
00107 }
00108
00109 #ifdef RAW1394_V_0_8
00110 raw1394handle_t handle = raw1394_get_handle();
00111 #else
00112 raw1394handle_t handle = raw1394_new_handle();
00113 #endif
00114
00115 if (!handle) {
00116 if (!errno) {
00117 fprintf(stderr, "Not Compatible!\n");
00118 } else {
00119 perror("Couldn't get 1394 handle");
00120 fprintf(stderr, "Is ieee1394, driver, and raw1394 loaded?\n");
00121 }
00122 exit(1);
00123 }
00124
00125 if (raw1394_set_port(handle, 0) < 0) {
00126 perror("couldn't set port");
00127 raw1394_destroy_handle(handle);
00128 exit(1);
00129 }
00130
00131 int nc = raw1394_get_nodecount(handle);
00132 for (i=STARTING_NODE; i < nc; ++i) {
00133 if (rom1394_get_directory(handle, i, &dir) < 0) {
00134 fprintf(stderr,"error reading config rom directory for node %d\n", i);
00135 raw1394_destroy_handle(handle);
00136 exit(1);
00137 }
00138
00139 if (verbose)
00140 printf("node %d: vendor_id = 0x%08x model_id = 0x%08x\n",
00141 i, dir.vendor_id, dir.model_id);
00142
00143
00144 if (((dir.vendor_id == SA_VENDOR_ID1) ||
00145 (dir.vendor_id == SA_VENDOR_ID2) ||
00146 (dir.vendor_id == SA_VENDOR_ID3) ||
00147 (dir.vendor_id == SA_VENDOR_ID4) ||
00148 (dir.vendor_id == SA_VENDOR_ID5) ||
00149 (dir.vendor_id == SA_VENDOR_ID6) ||
00150 (dir.vendor_id == SA_VENDOR_ID7) ||
00151 (dir.vendor_id == SA_VENDOR_ID8) ||
00152 (dir.vendor_id == SA_VENDOR_ID9) ||
00153 (dir.vendor_id == SA_VENDOR_ID10) ||
00154 (dir.vendor_id == SA_VENDOR_ID11) ||
00155 (dir.vendor_id == SA_VENDOR_ID12) ||
00156 (dir.vendor_id == SA_VENDOR_ID13) ||
00157 (dir.vendor_id == SA_VENDOR_ID14) ||
00158 (dir.vendor_id == SA_VENDOR_ID15) ||
00159 (dir.vendor_id == SA_VENDOR_ID16)) &&
00160 ((dir.model_id == SA3250HD_MODEL_ID1) ||
00161 (dir.model_id == SA4200HD_MODEL_ID1) ||
00162 (dir.model_id == SA4250HDC_MODEL_ID1)))
00163 {
00164 if (dir.model_id == SA4250HDC_MODEL_ID1)
00165 {
00166 fprintf(stderr, "Ignoring SA 4250HDC on node %d -- "
00167 "sorry not supported yet\n", i);
00168 }
00169 else
00170 {
00171 device = i;
00172 break;
00173 }
00174 }
00175 }
00176
00177 if (device == -1)
00178 {
00179 fprintf(stderr, "Could not find SA3250HD or SA4200HD "
00180 "on the IEEE 1394 bus.\n");
00181
00182 raw1394_destroy_handle(handle);
00183 exit(1);
00184 }
00185
00186 if (single) {
00187
00188 if (verbose)
00189 printf("Using single number channel change command method\n");
00190
00191 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_PRESS;
00192 cmd[1] = CTL_CMD1 | (chn << 8);
00193 cmd[2] = 0x0;
00194
00195 if (verbose)
00196 printf("AV/C Command: cmd0=0x%08x cmd1=0x%08x cmd2=0x%08x\n",
00197 cmd[0], cmd[1], cmd[2]);
00198 avc1394_transaction_block(handle, 0, cmd, 3, 1);
00199 } else {
00200
00201 dig[2] = 0x30 | (chn % 10);
00202 dig[1] = 0x30 | ((chn % 100) / 10);
00203 dig[0] = 0x30 | ((chn % 1000) / 100);
00204
00205 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_PRESS;
00206 cmd[1] = CTL_CMD1 | (dig[2] << 16) | (dig[1] << 8) | dig[0];
00207 cmd[2] = CTL_CMD2;
00208
00209 if (verbose)
00210 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n",
00211 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]);
00212
00213 avc1394_transaction_block(handle, 0, cmd, 3, 1);
00214 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_RELEASE;
00215 cmd[1] = CTL_CMD1 | (dig[0] << 16) | (dig[1] << 8) | dig[2];
00216 cmd[2] = CTL_CMD2;
00217
00218 if (verbose)
00219 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n",
00220 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]);
00221
00222 avc1394_transaction_block(handle, 0, cmd, 3, 1);
00223 }
00224
00225 raw1394_destroy_handle(handle);
00226
00227 exit(0);
00228 }