91d6b3e6e9ad4b87ba2cf7a5c37f58b5a06faa71
[people/mcb30/quickusb.git] / setquickusb.c
1 /*
2  * setquickusb - get/set Linux quickusb information
3  *
4  * Copyright 2006 Dan Lynch <dlynch@fensystems.co.uk>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  */
12
13 #include <unistd.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <stdint.h>
17 #include <fcntl.h>
18 #include <errno.h>
19 #include <getopt.h>
20 #include <string.h>
21 #include <sys/ioctl.h>
22
23 #include "kernel/quickusb.h"
24
25 #define UNDEFINED_UL -1UL
26
27 /*
28  * Options
29  *
30  * --outputs=value  where value is any valid positive integer 0-255
31  *                  presented in either decimal or hexadecimal form
32  */
33 struct options
34 {
35   unsigned long outputs;
36 };
37
38 int parseopts ( const int, char **argv, struct options * );
39 unsigned long parseint ( const char * );
40 void printhelp ();
41
42 /*
43  * Program Usage
44  * 
45  * setquickusb [options] device
46  *
47  */
48 int main ( int argc, char* argv[] ) {
49   struct options opts = { UNDEFINED_UL }; /* initialise options structure */
50   int last_index = parseopts(argc,argv,&opts), fd;
51   quickusb_gppio_ioctl_data_t outputs;
52
53   if ( last_index == ( argc - 1 ) )
54     fd = open( argv[last_index], O_RDWR );
55   else {
56     printf("No device specified!\n");
57     exit(EXIT_FAILURE);
58   }
59   if ( fd < 0 ) {
60     printf( "Error: Could not open device %s: %s\n", argv[last_index], strerror(errno) );
61     exit(EXIT_FAILURE);
62   }
63
64   if ( opts.outputs != UNDEFINED_UL ) {
65     outputs = opts.outputs;
66     if ( ioctl(fd,QUICKUSB_IOC_GPPIO_SET_OUTPUTS, &(outputs) ) == 0 ) {}
67     else {
68       printf("Error: %s\n", strerror(errno));
69       exit(EXIT_FAILURE);
70     }
71   }
72   else {
73     if ( ioctl(fd,QUICKUSB_IOC_GPPIO_GET_OUTPUTS, &(outputs) ) == 0 ) {
74       printf("Outputs: %#x\n",outputs);
75     }
76     else {
77       printf("Error: %s\n", strerror(errno));
78       exit(EXIT_FAILURE);
79     }
80   }
81
82   close(fd);
83
84   return 0;
85 }
86
87 /*
88  * Parse command-line options and return index of last element in
89  * argument list that is not an option
90  */
91 int parseopts ( const int argc, char **argv, struct options *opts ) {
92   int c;
93
94   while (1) {
95     int option_index = 0;
96     static struct option long_options[] = {
97       { "outputs", 1, NULL, 'o' },
98       { "help", 0, NULL, 'h' },
99       { 0, 0, 0, 0 }
100     };
101
102     if ( ( c = getopt_long ( argc, argv, "o:h", long_options, &option_index ) ) == -1 )
103       break;
104
105     switch(c) {
106     case 'o':
107       opts->outputs = parseint(optarg);
108       break;
109     case 'h':
110     case '?':
111       printhelp();
112       break;
113     default:
114       printf("Warning: unrecognised character code %o\n", c);
115       if (optarg)
116         printf("         with arg %s\n", optarg);
117     }
118   }
119
120   return optind;
121 }
122
123 unsigned long parseint ( const char *nPtr ) {
124   unsigned long tmp;
125   char *endPtr;
126
127   if ( *nPtr == '\0' ) {
128     printf("Error: No value specified\n");
129     exit(EXIT_FAILURE);
130   }
131
132   tmp = strtoul ( nPtr, &endPtr, 0 );
133
134   if ( *endPtr != '\0' ) {
135     printf("Error: Invalid value \"%s\"\n", nPtr);
136     exit(EXIT_FAILURE);
137   }
138
139   return tmp;
140 }
141
142 /*
143  * Print helpful message
144  */
145 void printhelp () {
146   printf("Usage: setquickusb [options] device\n");
147   exit(EXIT_SUCCESS);
148 }