Ticket #1671: sa3250ch.patch

File sa3250ch.patch, 5.5 KB (added by chris@…, 18 years ago)

Patch to sa3250ch.c with only new vendor/model ids (including SA4200) and '-s' mode

  • sa3250ch.c

     
    44 *
    55 * Copyright 2004,2005 by Stacey D. Son <mythdev@son.org>
    66 * Copyright 2005 Matt Porter <mporter@kernel.crashing.org>
     7 * Portions Copyright 2006 Chris Ingrassia <chris@spicecoffee.org> (SA4200 and Single-digit command mode)
    78 *
    89 * This program is free software; you can redistribute it and/or modify
    910 * it under the terms of the GNU General Public License as published by
     
    3132/* SA3250HD IDs */
    3233#define SA3250HD_VENDOR_ID      0x000011e6
    3334#define SA3250HD_VENDOR_ID2     0x000014f8
     35#define SA3250HD_VENDOR_ID3     0x00001692
     36#define SA4200HD_VENDOR_ID      0x000014f8
    3437#define SA3250HD_MODEL_ID       0x00000be0
     38#define SA4200HD_MODEL_ID   0x00001072
    3539
    3640#define AVC1394_SA3250_COMMAND_CHANNEL 0x000007c00   /* subunit command */
    3741#define AVC1394_SA3250_OPERAND_KEY_PRESS 0xe7
     
    4650
    4751void usage()
    4852{
    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");
    5056   exit(1);
    5157}
    5258
     
    5460{
    5561   rom1394_directory dir;
    5662   int device = -1;
     63   int single = 0;
    5764   int i;
    5865   int verbose = 0;
    5966   quadlet_t cmd[3];
     
    6370   if (argc < 2)
    6471      usage();
    6572
    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  }
    7290
    7391#ifdef RAW1394_V_0_8
    7492   raw1394handle_t handle = raw1394_get_handle();
     
    104122         printf("node %d: vendor_id = 0x%08x model_id = 0x%08x\n",
    105123                 i, dir.vendor_id, dir.model_id);
    106124               
    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)  &&
    109138          (dir.model_id == SA3250HD_MODEL_ID)) {
    110139            device = i;
    111140            break;
     
    118147        exit(1);
    119148   }
    120149
    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;
    124158
    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);
    128168
    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;
    132172
    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]);
    137176
    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;
    141181
    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]);
    143185
     186       avc1394_transaction_block(handle, 0, cmd, 3, 1);
     187   }
     188
    144189   raw1394_destroy_handle(handle);
    145190
    146191   exit(0);