/* mastercfg.c
*
* Master configuration program.
*
* Copyright (C) 2004-2010 Linear Systems Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of Linear Systems Ltd. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY LINEAR SYSTEMS LTD. "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LINEAR SYSTEMS LTD. OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Linear Systems can be contacted at .
*
*/
#include
#include
#include
#include "master.h"
#include "util.h"
#define MAXLEN 256
#define BYPASS_FLAG 0x00000001
#define GPO_FLAG 0x00000002
#define WATCHDOG_FLAG 0x00000004
#define BLACKBURST_FLAG 0x00000008
static const char progname[] = "mastercfg";
int
main (int argc, char **argv)
{
const char fmt[] = "/sys/class/%s/%s/%s";
int opt;
unsigned int write_flags;
unsigned long int id, fw_version;
unsigned long int bypass_mode, bypass_status, blackburst, gpi, gpo, watchdog;
unsigned long long int uid;
char *endptr;
char name[MAXLEN], data[MAXLEN];
/* Parse the command line */
write_flags = 0;
bypass_mode = 0;
blackburst = 0;
gpo = 0;
watchdog = 0;
while ((opt = getopt (argc, argv, "b:g:ho:t:V")) != -1) {
switch (opt) {
case 'b':
write_flags |= BYPASS_FLAG;
bypass_mode = strtoul (optarg, &endptr, 0);
if (*endptr != '\0') {
fprintf (stderr,
"%s: invalid bypass mode: %s\n",
argv[0], optarg);
return -1;
}
break;
case 'g':
write_flags |= BLACKBURST_FLAG;
blackburst = strtoul (optarg, &endptr, 0);
if (*endptr != '\0') {
fprintf (stderr,
"%s: invalid black burst type: %s\n",
argv[0], optarg);
return -1;
}
break;
case 'h':
printf ("Usage: %s [OPTION]... DRIVER BOARD_ID\n",
argv[0]);
printf ("Configure a Master board.\n\n");
printf (" -b BYPASS\tset the bypass mode\n");
printf (" -g BLACKBURST\tset the black burst type\n");
printf (" -h\t\tdisplay this help and exit\n");
printf (" -o OUTPUT\tset the general purpose output "
"value to OUTPUT\n");
printf (" -t TIMEOUT\tset the watchdog timeout "
"to TIMEOUT milliseconds\n");
printf (" -V\t\toutput version information "
"and exit\n");
printf ("\nIf no options are specified, "
"the current configuration is displayed.\n");
printf ("\nBYPASS may be:\n");
printf ("\t0 (bypass)\n");
printf ("\t1 (normal)\n");
printf ("\t2 (enable and reset the watchdog timer)\n");
printf ("\nBLACKBURST may be:\n");
printf ("\t0 (NTSC)\n");
printf ("\t1 (PAL)\n");
printf ("\nReport bugs to .\n");
return 0;
case 'o':
write_flags |= GPO_FLAG;
gpo = strtoul (optarg, &endptr, 0);
if (*endptr != '\0') {
fprintf (stderr,
"%s: invalid general purpose "
"output value: %s\n",
argv[0], optarg);
return -1;
}
break;
case 't':
write_flags |= WATCHDOG_FLAG;
watchdog = strtoul (optarg, &endptr, 0);
if (*endptr != '\0') {
fprintf (stderr,
"%s: invalid watchdog timeout: %s\n",
argv[0], optarg);
return -1;
}
break;
case 'V':
printf ("%s from master-%s (%s)\n", progname,
MASTER_DRIVER_VERSION,
MASTER_DRIVER_DATE);
printf ("\nCopyright (C) 2004-2010 "
"Linear Systems Ltd.\n"
"This is free software; "
"see the source for copying conditions. "
"There is NO\n"
"warranty; not even for MERCHANTABILITY "
"or FITNESS FOR A PARTICULAR PURPOSE.\n");
return 0;
case '?':
goto USAGE;
}
}
/* Check the number of arguments */
if ((argc - optind) < 2) {
fprintf (stderr, "%s: missing arguments\n", argv[0]);
goto USAGE;
} else if ((argc - optind) > 2) {
fprintf (stderr, "%s: extra operand\n", argv[0]);
goto USAGE;
}
printf (fmt, argv[optind], argv[optind + 1], ":\n");
if (write_flags) {
if (write_flags & BYPASS_FLAG) {
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"bypass_mode");
snprintf (data, sizeof (data), "%lu\n", bypass_mode);
if (util_write (name, data, sizeof (data)) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to set "
"the bypass mode");
return -1;
}
switch (bypass_mode) {
case MASTER_CTL_BYPASS_ENABLE:
printf ("\tEnabling bypass.\n");
break;
case MASTER_CTL_BYPASS_DISABLE:
printf ("\tDisabling bypass.\n");
break;
case MASTER_CTL_BYPASS_WATCHDOG:
printf ("\tGiving bypass control to "
"the watchdog timer.\n");
break;
default:
printf ("\tSet bypass mode = %lu.\n",
bypass_mode);
break;
}
}
if (write_flags & BLACKBURST_FLAG) {
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"blackburst_type");
snprintf (data, sizeof (data), "%lu\n", blackburst);
if (util_write (name, data, sizeof (data)) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to set "
"the black burst type");
return -1;
}
switch (blackburst) {
case MASTER_CTL_BLACKBURST_NTSC:
printf ("\tBlack burst type set to NTSC.\n");
break;
case MASTER_CTL_BLACKBURST_PAL:
printf ("\tBlack burst type set to PAL.\n");
break;
default:
printf ("\tSet black burst type = %lu.\n",
blackburst);
break;
}
}
if (write_flags & GPO_FLAG) {
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"gpo");
snprintf (data, sizeof (data), "%lu\n", gpo);
if (util_write (name, data, sizeof (data)) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to set "
"the general purpose output value");
return -1;
}
printf ("\tSet general purpose output = %lu.\n",
gpo);
}
if (write_flags & WATCHDOG_FLAG) {
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"watchdog");
snprintf (data, sizeof (data), "%lu\n", watchdog);
if (util_write (name, data, sizeof (data)) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to set "
"the watchdog timeout");
return -1;
}
printf ("\tSet watchdog timeout = %lu ms.\n", watchdog);
}
} else {
struct util_info *info;
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"device/device");
if (util_strtoul (name, &id) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to get the firmware version");
return -1;
}
if ((info = getinfo (id)) == NULL) {
printf ("\tUnknown device\n");
} else {
printf ("\t%s\n",
info->name);
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"fw_version");
if (util_strtoul (name, &fw_version) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to get the firmware version");
return -1;
}
printf ("\tFirmware version: %lu.%lu (0x%04lX)\n",
(fw_version >> 8), (fw_version & 0x00ff), fw_version);
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"bypass_mode");
if (util_strtoul (name, &bypass_mode) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tBypass mode: %lu ", bypass_mode);
switch (bypass_mode) {
case MASTER_CTL_BYPASS_ENABLE:
printf ("(bypass enabled)\n");
break;
case MASTER_CTL_BYPASS_DISABLE:
printf ("(bypass disabled)\n");
break;
case MASTER_CTL_BYPASS_WATCHDOG:
printf ("(bypass controlled by "
"watchdog timer)\n");
break;
default:
printf ("(unknown)\n");
break;
}
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"bypass_status");
if (util_strtoul (name, &bypass_status) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tBypass %sabled\n",
bypass_status ? "dis" : "en");
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"blackburst_type");
if (util_strtoul (name, &blackburst) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tBlack burst type: %lu ", blackburst);
switch (blackburst) {
case MASTER_CTL_BLACKBURST_NTSC:
printf ("(NTSC)\n");
break;
case MASTER_CTL_BLACKBURST_PAL:
printf ("(PAL)\n");
break;
default:
printf ("(unknown)\n");
break;
}
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"gpi");
if (util_strtoul (name, &gpi) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tGeneral purpose inputs: %lu (0x%02lX)\n",
gpi, gpi);
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"gpo");
if (util_strtoul (name, &gpo) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tGeneral purpose output: %lu (0x%02lX)\n",
gpo, gpo);
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"uid");
if (util_strtoull (name, &uid) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tUnique ID: 0x%016llX\n", uid);
}
snprintf (name, sizeof (name),
fmt, argv[optind], argv[optind + 1],
"watchdog");
if (util_strtoul (name, &watchdog) > 0) {
/* Don't complain on an error,
* since this parameter may not exist. */
printf ("\tWatchdog timeout: %lu ms\n", watchdog);
}
}
return 0;
USAGE:
fprintf (stderr, "Try '%s -h' for more information.\n", argv[0]);
return -1;
}