summaryrefslogtreecommitdiff
path: root/host/opcd_test.c
diff options
context:
space:
mode:
authorlaforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2006-09-12 17:37:00 +0000
committerlaforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2006-09-12 17:37:00 +0000
commit8bd3d51b23e328e91c209dbebe8cfe002b0b0042 (patch)
tree5145facfb2f864519fd9e4914929f5da6d8be1fa /host/opcd_test.c
parent5fdccde69e5288b147c7c3ed81c412c18c5d5d54 (diff)
move to new directory
git-svn-id: https://svn.openpcd.org:2342/trunk@193 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
Diffstat (limited to 'host/opcd_test.c')
-rw-r--r--host/opcd_test.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/host/opcd_test.c b/host/opcd_test.c
new file mode 100644
index 0000000..37f3094
--- /dev/null
+++ b/host/opcd_test.c
@@ -0,0 +1,199 @@
+/* opcd_test - Low-Level test program for OpenPCD
+ * (C) 2006 by Harald Welte <laforge@gnumonks.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#define _GNU_SOURCE
+#include <getopt.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+#include <usb.h>
+
+#include "../firmware/include/openpcd.h"
+#include "opcd_usb.h"
+
+static int get_number(const char *optarg, unsigned int min,
+ unsigned int max, unsigned int *num)
+{
+ char *endptr;
+ unsigned long nbr = strtoul(optarg, &endptr, 0);
+ //fprintf(stderr, "trying to read `%s' as number\n", optarg);
+
+ if (nbr == 0 && optarg == endptr)
+ return -EINVAL;
+
+ if (nbr < min || nbr > max)
+ return -ERANGE;
+
+ *num = nbr;
+ return 0;
+}
+
+static void print_welcome(void)
+{
+ printf("opcd_test - OpenPCD Test and Debug Program\n"
+ "(C) 2006 by Harald Welte <laforge@gnumonks.org>\n\n");
+}
+static void print_help(void)
+{
+ printf( "\t-l\t--led-set\tled {0,1}\n"
+ "\t-w\t--reg-write\treg value\n"
+ "\t-r\t--reg-read\treg\n"
+
+ "\t-s\t--set-bits\treg\tmask\n"
+ "\t-c\t--clear-bits\treg\tmask\n");
+}
+
+
+static struct option opts[] = {
+ { "led-set", 1, 0, 'l' },
+ { "reg-write", 1, 0, 'w' },
+ { "reg-read", 1, 0, 'r' },
+ { "fifo-write", 1, 0, 'W' },
+ { "fifo-read", 1, 0, 'R' },
+ { "set-bits", 1, 0, 's' },
+ { "clear-bits", 1, 0, 'c' },
+ { "usb-perf", 1, 0, 'u' },
+ { "adc-read", 0, 0, 'a' },
+ { "adc-loop", 0, 0, 'A' },
+ { "ssc-read", 0, 0, 'S' },
+ { "loop", 0, 0, 'L' },
+ { "help", 0, 0, 'h'},
+};
+
+int main(int argc, char **argv)
+{
+ struct opcd_handle *od;
+ int c;
+ static char buf[8192];
+ int buf_len = sizeof(buf);
+
+ print_welcome();
+
+ od = opcd_init();
+
+ while (1) {
+ int option_index = 0;
+
+ c = getopt_long(argc, argv, "l:r:w:R:W:s:c:h?u:aASL", opts,
+ &option_index);
+
+ if (c == -1)
+ break;
+
+ switch (c) {
+ unsigned int i,j;
+ case 'l':
+ if (get_number(optarg, 1, 2, &i) < 0)
+ exit(2);
+ if (get_number(argv[optind], 0, 1, &j) < 0)
+ exit(2);
+ printf("setting LED %d to %s\n", i, j ? "on" : "off");
+ opcd_send_command(od, OPENPCD_CMD_SET_LED, i, j, 0, NULL);
+ break;
+ case 'r':
+ if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0)
+ exit(2);
+ printf("reading register 0x%02x: ");
+ opcd_send_command(od, OPENPCD_CMD_READ_REG, i, 0, 0, NULL);
+ opcd_recv_reply(od, buf, buf_len);
+ break;
+ case 'w':
+ if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0) {
+ fprintf(stderr, "can't read register\n");
+ exit(2);
+ }
+ if (get_number(argv[optind], 0x00, 0xff, &j) < 0) {
+ fprintf(stderr, "can't read value\n");
+ exit(2);
+ }
+ fprintf(stdout, "setting register 0x%02x to 0x%02x\n", i, j);
+ opcd_send_command(od, OPENPCD_CMD_WRITE_REG, i, j, 0, NULL);
+ break;
+ case 'R':
+ if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0)
+ exit(2);
+ opcd_send_command(od, OPENPCD_CMD_READ_FIFO, 0, i, 0, NULL);
+ opcd_recv_reply(od, buf, buf_len);
+ break;
+ case 'W':
+ fprintf(stderr, "FIFO write not implemented yet\n");
+ break;
+ case 's':
+ if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0)
+ exit(2);
+ if (get_number(argv[optind], 0x00, 0xff, &j) < 0)
+ exit(2);
+ opcd_send_command(od, OPENPCD_CMD_REG_BITS_SET, i, j, 0, NULL);
+ break;
+ case 'c':
+ if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0)
+ exit(2);
+ if (get_number(argv[optind], 0x00, 0xff, &j) < 0)
+ exit(2);
+ opcd_send_command(od, OPENPCD_CMD_REG_BITS_CLEAR, i, j, 0, NULL);
+ break;
+ case 'u':
+ if (get_number(optarg, 1, 255, &i) < 0)
+ exit(2);
+ opcd_usbperf(od, i);
+ break;
+ case 'a':
+ opcd_send_command(od, OPENPCD_CMD_ADC_READ, 0, 1, 0, NULL);
+ opcd_recv_reply(od, buf, buf_len);
+ /* FIXME: interpret and print ADC result */
+ break;
+ case 'A':
+ while (1) {
+ opcd_send_command(od, OPENPCD_CMD_ADC_READ, 0, 1, 0, NULL);
+ opcd_recv_reply(od, buf, buf_len);
+ /* FIXME: interpret and print ADC result */
+ }
+ break;
+ case 'S':
+ opcd_send_command(od, OPENPCD_CMD_SSC_READ, 0, 1, 0, NULL);
+ opcd_recv_reply(od, buf, buf_len);
+ /* FIXME: interpret and print ADC result */
+ break;
+ case 'L':
+ while (1)
+ opcd_recv_reply(od, buf, buf_len);
+ break;
+ case 'h':
+ case '?':
+ print_help();
+ exit(0);
+ break;
+ default:
+ fprintf(stderr, "unknown key `%c'\n", c);
+ print_help();
+ exit(2);
+ break;
+ }
+ }
+
+ sleep(1);
+
+ exit(0);
+}
personal git repositories of Harald Welte. Your mileage may vary