finish up print and prompt device selection.
This commit is contained in:
parent
537ceafe2f
commit
8a7b50176e
|
@ -1,9 +1,12 @@
|
||||||
/* control reset and VREF2 lines */
|
/* control reset and VREF2 lines */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <ftdi.h>
|
#include <ftdi.h>
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
|
||||||
#define low(x) (1 << x)
|
#define low(x) (1 << x)
|
||||||
#define high(x) (1 << (x + 8))
|
#define high(x) (1 << (x + 8))
|
||||||
|
|
||||||
|
@ -17,7 +20,7 @@
|
||||||
#define REDBEE_USB_VREF2H low(6)
|
#define REDBEE_USB_VREF2H low(6)
|
||||||
#define REDBEE_USB_INTERFACE INTERFACE_B
|
#define REDBEE_USB_INTERFACE INTERFACE_B
|
||||||
|
|
||||||
#define BOARD REDBEE_ECONOTAG
|
#define BOARD REDBEE_USB
|
||||||
|
|
||||||
#define STR(x) #x
|
#define STR(x) #x
|
||||||
#define STR2(x) STR(x)
|
#define STR2(x) STR(x)
|
||||||
|
@ -31,16 +34,21 @@
|
||||||
#define vref2_normal(x) ( CAT(x,_VREF2H) )
|
#define vref2_normal(x) ( CAT(x,_VREF2H) )
|
||||||
#define vref2_erase(x) ( CAT(x,_VREF2L) )
|
#define vref2_erase(x) ( CAT(x,_VREF2L) )
|
||||||
|
|
||||||
int print_and_prompt(struct ftdi_device_list *devlist);
|
/* fgets input buffer length: for prompts and such */
|
||||||
|
#define BUF_LEN 32
|
||||||
|
|
||||||
|
int print_and_prompt( struct ftdi_device_list *devlist, int num_devs);
|
||||||
|
int bb_mpsee(struct ftdi_context *ftdic, uint16_t dir, uint16_t val);
|
||||||
void toggle_reset(struct ftdi_context *ftdic);
|
void toggle_reset(struct ftdi_context *ftdic);
|
||||||
|
|
||||||
|
static uint32_t vendid = 0x0403; uint32_t prodid = 0x6010;
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
struct ftdi_context ftdic;
|
struct ftdi_context ftdic;
|
||||||
struct ftdi_device_list *devlist;
|
struct ftdi_device_list *devlist;
|
||||||
uint32_t vendid = 0x0403; uint32_t prodid = 0x6010;
|
int dev_index = -1; int num_devs;
|
||||||
int devindex = 0;
|
int ret;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int c;
|
int c;
|
||||||
|
@ -59,21 +67,21 @@ int main(int argc, char **argv)
|
||||||
switch (c) {
|
switch (c) {
|
||||||
/* process long opts */
|
/* process long opts */
|
||||||
case 'i':
|
case 'i':
|
||||||
devindex = atoi(optarg);
|
dev_index = atoi(optarg);
|
||||||
printf("index %d\n", devindex);
|
printf("index %d\n", dev_index);
|
||||||
default:
|
default:
|
||||||
printf("Usage: don't know yet\n");
|
printf("Usage: don't know yet\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = ftdi_usb_find_all(&ftdic, &devlist, vendid, prodid)) < 0)
|
if ((num_devs = ftdi_usb_find_all(&ftdic, &devlist, vendid, prodid)) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
|
fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n",
|
||||||
|
num_devs,
|
||||||
|
ftdi_get_error_string(&ftdic));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Number of FTDI devices found: %d\n", ret);
|
|
||||||
|
|
||||||
if (ftdi_init(&ftdic) < 0)
|
if (ftdi_init(&ftdic) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ftdi_init failed\n");
|
fprintf(stderr, "ftdi_init failed\n");
|
||||||
|
@ -84,159 +92,128 @@ int main(int argc, char **argv)
|
||||||
fprintf(stderr, "couldn't set interface %d\n", interface(BOARD));
|
fprintf(stderr, "couldn't set interface %d\n", interface(BOARD));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ret == 1) /*|| device number passed on cmdline */ ) {
|
if(num_devs == 1) { dev_index = 0; }
|
||||||
if( (ret = ftdi_usb_open_desc_index(
|
while( (dev_index < 0) || (dev_index >= num_devs)){
|
||||||
&ftdic,
|
dev_index = print_and_prompt(devlist, num_devs);
|
||||||
vendid,
|
|
||||||
prodid,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
devindex)) < 0) {
|
|
||||||
fprintf(stderr, "couldn't open devindex %d\n", devindex);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
toggle_reset(&ftdic);
|
|
||||||
} else {
|
|
||||||
print_and_prompt(devlist);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( (ret = ftdi_usb_open_desc_index(
|
||||||
|
&ftdic,
|
||||||
|
vendid,
|
||||||
|
prodid,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
dev_index)) < 0) {
|
||||||
|
fprintf(stderr, "couldn't open dev_index %d\n", dev_index);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
toggle_reset(&ftdic);
|
||||||
|
|
||||||
ftdi_list_free(&devlist);
|
ftdi_list_free(&devlist);
|
||||||
ftdi_deinit(&ftdic);
|
ftdi_deinit(&ftdic);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int print_and_prompt( struct ftdi_device_list *devlist )
|
int print_and_prompt( struct ftdi_device_list *devlist, int num_devs)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
struct ftdi_context ftdic;
|
struct ftdi_context ftdic;
|
||||||
struct ftdi_device_list *curdev;
|
struct ftdi_device_list *curdev;
|
||||||
char manufacturer[128], description[128];
|
char manufacturer[128], description[128], serial[128];
|
||||||
|
char input[BUF_LEN]; char *s;
|
||||||
|
int sel = -1;
|
||||||
|
|
||||||
|
printf("Found %d devices with vendor id 0x%04x product id 0x%04x\n\n",
|
||||||
|
num_devs, vendid, prodid);
|
||||||
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (curdev = devlist; curdev != NULL; i++)
|
for (curdev = devlist; curdev != NULL; i++)
|
||||||
{
|
{
|
||||||
printf("Checking device: %d\n", i);
|
printf(" [%d] ", i);
|
||||||
if (0 > (ret = ftdi_usb_get_strings(&ftdic,
|
if (0 > (ret = ftdi_usb_get_strings(&ftdic,
|
||||||
curdev->dev,
|
curdev->dev,
|
||||||
manufacturer, 128,
|
manufacturer, 128,
|
||||||
description, 128,
|
description, 128,
|
||||||
NULL, 0)))
|
serial, 128)))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n",
|
fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n",
|
||||||
ret, ftdi_get_error_string(&ftdic));
|
ret, ftdi_get_error_string(&ftdic));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
printf("Manufacturer: %s, Description: %s\n\n", manufacturer, description);
|
printf("Manufacturer: %s, Description: %s, Serial %s\n",
|
||||||
|
manufacturer, description, serial);
|
||||||
curdev = curdev->next;
|
curdev = curdev->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
printf("\nUse which device? ");
|
||||||
|
|
||||||
|
s = fgets(input, BUF_LEN, stdin);
|
||||||
|
if (s != NULL) {
|
||||||
|
size_t last = strlen (input) - 1;
|
||||||
|
if (input[last] == '\n') input[last] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
sscanf(s, "%i",&sel);
|
||||||
|
|
||||||
|
return sel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggle_reset(struct ftdi_context *ftdic)
|
void toggle_reset(struct ftdi_context *ftdic)
|
||||||
{
|
{
|
||||||
uint8_t buf[3], size;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
printf("toggle reset\n");
|
printf("toggle reset\n");
|
||||||
|
|
||||||
/* using MPSSE since it give access to high GPIO*/
|
/* using MPSSE since it give access to high GPIO*/
|
||||||
/* set as inputs for now */
|
/* set as inputs for now */
|
||||||
ftdi_set_bitmode(ftdic, 0 , BITMODE_MPSSE);
|
ftdi_set_bitmode(ftdic, 0 , BITMODE_MPSSE);
|
||||||
|
|
||||||
size = 3;
|
bb_mpsee(ftdic, dir(BOARD), (reset_release(BOARD) | vref2_normal(BOARD)));
|
||||||
|
bb_mpsee(ftdic, dir(BOARD), (reset_set(BOARD) | vref2_normal(BOARD)));
|
||||||
/* RESET RELEASE */
|
bb_mpsee(ftdic, dir(BOARD), (reset_release(BOARD) | vref2_normal(BOARD)));
|
||||||
|
|
||||||
/* initialize low byte */
|
|
||||||
/* command "set data bits low byte" */
|
|
||||||
buf[0] = 0x80;
|
|
||||||
buf[1] = ((reset_release(BOARD) | vref2_normal(BOARD)) & 0xff);
|
|
||||||
buf[2] = dir(BOARD) & 0xff;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* command "set data bits high byte" */
|
|
||||||
buf[0] = 0x82;
|
|
||||||
buf[1] = ((reset_release(BOARD) | vref2_normal(BOARD)) >> 8);
|
|
||||||
buf[2] = dir(BOARD) >> 8;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RESET HOLD */
|
|
||||||
|
|
||||||
/* initialize low byte */
|
|
||||||
/* command "set data bits low byte" */
|
|
||||||
buf[0] = 0x80;
|
|
||||||
buf[1] = ((reset_set(BOARD) | vref2_normal(BOARD)) & 0xff);
|
|
||||||
buf[2] = dir(BOARD) & 0xff;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* command "set data bits high byte" */
|
|
||||||
buf[0] = 0x82;
|
|
||||||
buf[1] = ((reset_set(BOARD) | vref2_normal(BOARD)) >> 8);
|
|
||||||
buf[2] = dir(BOARD) >> 8;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RESET RELEASE */
|
|
||||||
|
|
||||||
/* initialize low byte */
|
|
||||||
/* command "set data bits low byte" */
|
|
||||||
buf[0] = 0x80;
|
|
||||||
buf[1] = ((reset_release(BOARD) | vref2_normal(BOARD)) & 0xff);
|
|
||||||
buf[2] = dir(BOARD) & 0xff;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* command "set data bits high byte" */
|
|
||||||
buf[0] = 0x82;
|
|
||||||
buf[1] = ((reset_release(BOARD) | vref2_normal(BOARD)) >> 8);
|
|
||||||
buf[2] = dir(BOARD) >> 8;
|
|
||||||
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
|
||||||
|
|
||||||
if ((ret = (ftdi_write_data(ftdic, buf, size))) < 0)
|
|
||||||
{
|
|
||||||
perror("ft2232_write error");
|
|
||||||
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int bb_mpsee(struct ftdi_context *ftdic, uint16_t dir, uint16_t val)
|
||||||
|
{
|
||||||
|
uint8_t buf[3];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* command "set data bits low byte" */
|
||||||
|
buf[0] = 0x80;
|
||||||
|
buf[1] = (val & 0xff);
|
||||||
|
buf[2] = dir & 0xff;
|
||||||
|
#if DEBUG
|
||||||
|
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ret = (ftdi_write_data(ftdic, buf, 3))) < 0)
|
||||||
|
{
|
||||||
|
perror("ft2232_write error");
|
||||||
|
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* command "set data bits high byte" */
|
||||||
|
buf[0] = 0x82;
|
||||||
|
buf[1] = (val >> 8);
|
||||||
|
buf[2] = dir >> 8;
|
||||||
|
#if DEBUG
|
||||||
|
fprintf(stderr,"write %x %x %x\n",buf[0],buf[1],buf[2]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((ret = (ftdi_write_data(ftdic, buf, 3))) < 0)
|
||||||
|
{
|
||||||
|
perror("ft2232_write error");
|
||||||
|
fprintf(stderr, "ft2232_write command %x\n", buf[0]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue