diff options
author | (no author) <(no author)@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-07-23 16:45:39 +0000 |
---|---|---|
committer | (no author) <(no author)@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-07-23 16:45:39 +0000 |
commit | a607facacf798c41405d711c6c524c6ebbf205ff (patch) | |
tree | 792eaaf4ca919cd0d2a77c1f081259afe52e7401 | |
parent | 327d426e30af5cc68d9de004b2f21e0aec82f56a (diff) |
implement help message, get and clear bit operations
git-svn-id: https://svn.openpcd.org:2342/trunk@27 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
-rw-r--r-- | openpcd/opcd_test/opcd_test.c | 128 | ||||
-rw-r--r-- | openpcd/opcd_test/openpcd.h | 24 |
2 files changed, 100 insertions, 52 deletions
diff --git a/openpcd/opcd_test/opcd_test.c b/openpcd/opcd_test/opcd_test.c index 1c2e909..c81afd8 100644 --- a/openpcd/opcd_test/opcd_test.c +++ b/openpcd/opcd_test/opcd_test.c @@ -37,22 +37,25 @@ hexdump(const void *data, unsigned int len) { static char string[65535]; unsigned char *d = (unsigned char *) data; - unsigned int i, left; + unsigned int i, left, ofs; string[0] = '\0'; - left = sizeof(string); + ofs = snprintf(string, sizeof(string)-1, "(%u): ", len); + + left = sizeof(string) - ofs; for (i = 0; len--; i += 3) { if (i >= sizeof(string) -4) break; - snprintf(string+i, 4, " %02x", *d++); + snprintf(string+ofs+i, 4, " %02x", *d++); } + string[sizeof(string)-1] = '\0'; return string; } #define OPCD_VENDOR_ID 0x2342 #define OPCD_PRODUCT_ID 0x0001 #define OPCD_OUT_EP 0x01 -#define OPCD_IN_EP 0x81 +#define OPCD_IN_EP 0x82 static struct usb_dev_handle *hdl; static struct usb_device *find_opcd_device(void) @@ -82,13 +85,15 @@ static int opcd_recv_reply(void) memset(buf, 0, sizeof(buf)); - ret = usb_bulk_read(hdl, OPCD_IN_EP, buf, sizeof(buf), 0); + ret = usb_bulk_read(hdl, OPCD_IN_EP, buf, sizeof(buf), 1000); - for (i = 0; i < ret; i ++) - if (buf[i] == 0x03) - buf[i] = 0x00; + if (ret < 0) { + fprintf(stderr, "bulk_read returns %d(%s)\n", ret, + usb_strerror()); + return ret; + } - printf("RX: %s\n", buf, hexdump(buf, ret)); + printf("RX: %s\n", hexdump(buf, ret)); return ret; } @@ -113,11 +118,14 @@ static int opcd_send_command(u_int8_t cmd, u_int8_t reg, u_int8_t val, u_int16_t cur = sizeof(*ohdr) + len; - printf("TX: %s\n", buf, hexdump(buf, cur)); + printf("TX: %s\n", hexdump(buf, cur)); ret = usb_bulk_write(hdl, OPCD_OUT_EP, buf, cur, 0); - if (ret < 0) + if (ret < 0) { + fprintf(stderr, "bulk_write returns %d(%s)\n", ret, + usb_strerror()); return ret; + } /* this usleep is required in order to make the process work. * apparently some race condition in the bootloader if we feed @@ -126,37 +134,56 @@ static int opcd_send_command(u_int8_t cmd, u_int8_t reg, u_int8_t val, u_int16_t //return ezx_blob_recv_reply(); } - -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' }, -}; - static int get_number(const char *optarg, unsigned int min, unsigned int max, unsigned int *num) { char *endptr; - unsigned long nbr = strtoul(optarg, &endptr, 10); + 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) + 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' }, + { "help", 0, 0, 'h'}, +}; int main(int argc, char **argv) { struct usb_device *dev; int c; + print_welcome(); + usb_init(); if (!usb_find_busses()) exit(1); @@ -183,7 +210,7 @@ int main(int argc, char **argv) while (1) { int option_index = 0; - c = getopt_long(argc, argv, "l:r:w:R:W:", opts, + c = getopt_long(argc, argv, "l:r:w:R:W:s:c:h?", opts, &option_index); if (c == -1) @@ -196,26 +223,32 @@ int main(int argc, char **argv) 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(OPENPCD_CMD_SET_LED, i, j, 0, NULL); opcd_recv_reply(); break; case 'r': - if (get_number(optarg, 0x00, 0x3f, &i) < 0) + if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0) exit(2); + printf("reading register 0x%02x: "); opcd_send_command(OPENPCD_CMD_READ_REG, i, 0, 0, NULL); opcd_recv_reply(); break; case 'w': - if (get_number(optarg, 0x00, 0x3f, &i) < 0) + 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) + } + 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(OPENPCD_CMD_WRITE_REG, i, j, 0, NULL); opcd_recv_reply(); break; case 'R': - if (get_number(optarg, 0x00, 0x3f, &i) < 0) + if (get_number(optarg, 0x00, OPENPCD_REG_MAX, &i) < 0) exit(2); opcd_send_command(OPENPCD_CMD_READ_FIFO, 0, i, 0, NULL); opcd_recv_reply(); @@ -223,29 +256,34 @@ int main(int argc, char **argv) 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(OPENPCD_CMD_REG_BITS_SET, i, j, 0, NULL); + opcd_recv_reply(); + 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(OPENPCD_CMD_REG_BITS_CLEAR, i, j, 0, NULL); + opcd_recv_reply(); + break; + case 'h': + case '?': + print_help(); + exit(0); + break; default: fprintf(stderr, "unknown key `%c'\n", c); + print_help(); + exit(2); break; } } -#if 0 - //opcd_send_command(OPENPCD_CMD_SET_LED, 2, 1, 0, NULL); - - opcd_send_command(OPENPCD_CMD_WRITE_REG, 0x1b, 0x11, 0, NULL); - opcd_recv_reply(); - - opcd_send_command(OPENPCD_CMD_READ_REG, 0x1b, 0x00, 0, NULL); - opcd_recv_reply(); - - opcd_send_command(OPENPCD_CMD_WRITE_REG, 0x1b, 0x33, 0, NULL); - opcd_recv_reply(); - - opcd_send_command(OPENPCD_CMD_READ_REG, 0x1b, 0x00, 0, NULL); - opcd_recv_reply(); - - opcd_send_command(OPENPCD_CMD_WRITE_REG, 0x15, 0x33, 0, NULL); -#endif - exit(0); } diff --git a/openpcd/opcd_test/openpcd.h b/openpcd/opcd_test/openpcd.h index 88478a4..d721baf 100644 --- a/openpcd/opcd_test/openpcd.h +++ b/openpcd/opcd_test/openpcd.h @@ -1,6 +1,8 @@ #ifndef _OPENPCD_PROTO_H #define _OPENPCD_PROTO_H +/* This header file describes the USB protocol of the OpenPCD RFID reader */ + #include <sys/types.h> struct openpcd_hdr { @@ -13,12 +15,20 @@ struct openpcd_hdr { u_int8_t data[0]; } __attribute__ ((packed)); -#define OPENPCD_CMD_WRITE_REG 0x01 -#define OPENPCD_CMD_WRITE_FIFO 0x02 -#define OPENPCD_CMD_WRITE_VFIFO 0x03 -#define OPENPCD_CMD_READ_REG 0x11 -#define OPENPCD_CMD_READ_FIFO 0x12 -#define OPENPCD_CMD_READ_VFIFO 0x13 -#define OPENPCD_CMD_SET_LED 0x21 +#define OPENPCD_REG_MAX 0x3f + +#define OPENPCD_CMD_WRITE_REG 0x01 +#define OPENPCD_CMD_WRITE_FIFO 0x02 +#define OPENPCD_CMD_WRITE_VFIFO 0x03 +#define OPENPCD_CMD_REG_BITS_CLEAR 0x04 +#define OPENPCD_CMD_REG_BITS_SET 0x05 + +#define OPENPCD_CMD_READ_REG 0x11 +#define OPENPCD_CMD_READ_FIFO 0x12 +#define OPENPCD_CMD_READ_VFIFO 0x13 + +#define OPENPCD_CMD_SET_LED 0x21 + +#define OPENPCD_CMD_IRQ 0x40 /* IRQ reported by RC632 */ #endif |