Ticket #1671: sa3250ch.patch
File sa3250ch.patch, 5.5 KB (added by , 18 years ago) |
---|
-
sa3250ch.c
4 4 * 5 5 * Copyright 2004,2005 by Stacey D. Son <mythdev@son.org> 6 6 * Copyright 2005 Matt Porter <mporter@kernel.crashing.org> 7 * Portions Copyright 2006 Chris Ingrassia <chris@spicecoffee.org> (SA4200 and Single-digit command mode) 7 8 * 8 9 * This program is free software; you can redistribute it and/or modify 9 10 * it under the terms of the GNU General Public License as published by … … 31 32 /* SA3250HD IDs */ 32 33 #define SA3250HD_VENDOR_ID 0x000011e6 33 34 #define SA3250HD_VENDOR_ID2 0x000014f8 35 #define SA3250HD_VENDOR_ID3 0x00001692 36 #define SA4200HD_VENDOR_ID 0x000014f8 34 37 #define SA3250HD_MODEL_ID 0x00000be0 38 #define SA4200HD_MODEL_ID 0x00001072 35 39 36 40 #define AVC1394_SA3250_COMMAND_CHANNEL 0x000007c00 /* subunit command */ 37 41 #define AVC1394_SA3250_OPERAND_KEY_PRESS 0xe7 … … 46 50 47 51 void usage() 48 52 { 49 fprintf(stderr, "Usage: sa3250ch [-v] <channel_num>\n"); 53 fprintf(stderr, "Usage: sa3250ch [-v] [-s] <channel_num>\n"); 54 fprintf(stderr, " -v : Verbose Mode\n"); 55 fprintf(stderr, " -s : Send command as single digit (for SA4200 and some SA3250s)\n"); 50 56 exit(1); 51 57 } 52 58 … … 54 60 { 55 61 rom1394_directory dir; 56 62 int device = -1; 63 int single = 0; 57 64 int i; 58 65 int verbose = 0; 59 66 quadlet_t cmd[3]; … … 63 70 if (argc < 2) 64 71 usage(); 65 72 66 if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'v') { 67 verbose = 1; 68 chn = atoi(argv[2]); 69 } else { 70 chn = atoi(argv[1]); 71 } 73 for(i = 1; i < argc; ++i) { 74 if((argv[i][0] == '-') && (strlen(argv[i]) > 1)) { 75 switch(argv[i][1]) { 76 case 'v': 77 verbose = 1; 78 break; 79 case 's': 80 single = 1; 81 break; 82 default: 83 fprintf(stderr, "WARNING: Unknown option \'%c\', ignoring", argv[i][1]); 84 } 85 } 86 else { 87 chn = atoi(argv[i]); 88 } 89 } 72 90 73 91 #ifdef RAW1394_V_0_8 74 92 raw1394handle_t handle = raw1394_get_handle(); … … 104 122 printf("node %d: vendor_id = 0x%08x model_id = 0x%08x\n", 105 123 i, dir.vendor_id, dir.model_id); 106 124 107 if ((dir.vendor_id == SA3250HD_VENDOR_ID || 108 dir.vendor_id == SA3250HD_VENDOR_ID2) && 125 /* SA4200 Hook 126 * Note: I know you also need to use '-s' mode for some SA3250s, but I'm not sure 127 * if you can key it off of the vendor id since I only have mine to test with. 128 * Further input welcome. -- Chris Ingrassia <chris@spicecoffee.org> */ 129 if((dir.vendor_id == SA4200HD_VENDOR_ID) && 130 (dir.model_id == SA4200HD_MODEL_ID)) { 131 single = 1; 132 device = i; 133 break; 134 } 135 else if ((dir.vendor_id == SA3250HD_VENDOR_ID || 136 dir.vendor_id == SA3250HD_VENDOR_ID2 || 137 dir.vendor_id == SA3250HD_VENDOR_ID3) && 109 138 (dir.model_id == SA3250HD_MODEL_ID)) { 110 139 device = i; 111 140 break; … … 118 147 exit(1); 119 148 } 120 149 121 dig[2] = 0x30 | (chn % 10); 122 dig[1] = 0x30 | ((chn % 100) / 10); 123 dig[0] = 0x30 | ((chn % 1000) / 100); 150 if(single) { 151 /* Send channel as single number for SA4200 and some SA3250s */ 152 if(verbose) 153 printf("Using single number channel change command method\n"); 154 155 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_PRESS; 156 cmd[1] = CTL_CMD1 | (chn << 8); 157 cmd[2] = 0x0; 124 158 125 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_PRESS; 126 cmd[1] = CTL_CMD1 | (dig[2] << 16) | (dig[1] << 8) | dig[0]; 127 cmd[2] = CTL_CMD2; 159 if(verbose) 160 printf("AV/C Command: cmd0=0x%08x cmd1=0x%08x cmd2=0x%08x\n", 161 cmd[0], cmd[1], cmd[2]); 162 avc1394_transaction_block(handle, 0, cmd, 3, 1); 163 } else { 164 /* Default method sending three seperate digits */ 165 dig[2] = 0x30 | (chn % 10); 166 dig[1] = 0x30 | ((chn % 100) / 10); 167 dig[0] = 0x30 | ((chn % 1000) / 100); 128 168 129 if (verbose)130 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n",131 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]);169 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_PRESS; 170 cmd[1] = CTL_CMD1 | (dig[2] << 16) | (dig[1] << 8) | dig[0]; 171 cmd[2] = CTL_CMD2; 132 172 133 avc1394_transaction_block(handle, 0, cmd, 3, 1); 134 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_RELEASE; 135 cmd[1] = CTL_CMD1 | (dig[0] << 16) | (dig[1] << 8) | dig[2]; 136 cmd[2] = CTL_CMD2; 173 if (verbose) 174 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n", 175 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]); 137 176 138 if (verbose) 139 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n", 140 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]); 177 avc1394_transaction_block(handle, 0, cmd, 3, 1); 178 cmd[0] = CTL_CMD0 | AVC1394_SA3250_OPERAND_KEY_RELEASE; 179 cmd[1] = CTL_CMD1 | (dig[0] << 16) | (dig[1] << 8) | dig[2]; 180 cmd[2] = CTL_CMD2; 141 181 142 avc1394_transaction_block(handle, 0, cmd, 3, 1); 182 if (verbose) 183 printf("AV/C Command: %d%d%d = cmd0=0x%08x cmd2=0x%08x cmd3=0x%08x\n", 184 dig[0] & 0xf, dig[1] & 0xf, dig[2] & 0xf, cmd[0], cmd[1], cmd[2]); 143 185 186 avc1394_transaction_block(handle, 0, cmd, 3, 1); 187 } 188 144 189 raw1394_destroy_handle(handle); 145 190 146 191 exit(0);