Add support for different interfaces on FTDI chips.
Signed-off-by: Michal Demin <michaldemin@gmail.com>
This commit is contained in:
parent
47661cecc5
commit
6615630635
27
config.c
27
config.c
@ -23,6 +23,7 @@ static void read_config() {
|
|||||||
#ifdef JTAGKEY
|
#ifdef JTAGKEY
|
||||||
char *pbuf;
|
char *pbuf;
|
||||||
unsigned short vid, pid;
|
unsigned short vid, pid;
|
||||||
|
unsigned short iface;
|
||||||
int line, len, num;
|
int line, len, num;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -152,7 +153,7 @@ static void read_config() {
|
|||||||
pbuf = buf + i;
|
pbuf = buf + i;
|
||||||
|
|
||||||
for (; i < len; i++) {
|
for (; i < len; i++) {
|
||||||
if (buf[i] == ' ' || buf[i] == '\t')
|
if (buf[i] == ' ' || buf[i] == '\t' || buf[i] == ':')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,9 +164,16 @@ static void read_config() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iface = 0;
|
||||||
|
pbuf = buf + i;
|
||||||
|
if (pbuf[0] == ':') {
|
||||||
|
iface = atoi(pbuf + 1);
|
||||||
|
}
|
||||||
|
|
||||||
pp_config[num].real = 0;
|
pp_config[num].real = 0;
|
||||||
pp_config[num].usb_vid = vid;
|
pp_config[num].usb_vid = vid;
|
||||||
pp_config[num].usb_pid = pid;
|
pp_config[num].usb_pid = pid;
|
||||||
|
pp_config[num].usb_iface = iface;
|
||||||
pp_config[num].open = jtagkey_open;
|
pp_config[num].open = jtagkey_open;
|
||||||
pp_config[num].close = jtagkey_close;
|
pp_config[num].close = jtagkey_close;
|
||||||
pp_config[num].transfer = jtagkey_transfer;
|
pp_config[num].transfer = jtagkey_transfer;
|
||||||
@ -243,3 +251,20 @@ unsigned short config_usb_pid(int num) {
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned short config_usb_iface(int num) {
|
||||||
|
unsigned short ret = 0x00;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
read_config();
|
||||||
|
|
||||||
|
for (i=0; i<sizeof(pp_config)/sizeof(struct parport_config); i++) {
|
||||||
|
if (pp_config[i].num == num) {
|
||||||
|
ret = pp_config[i].usb_iface;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
2
config.h
2
config.h
@ -4,6 +4,7 @@ struct parport_config {
|
|||||||
unsigned char real;
|
unsigned char real;
|
||||||
unsigned short usb_vid;
|
unsigned short usb_vid;
|
||||||
unsigned short usb_pid;
|
unsigned short usb_pid;
|
||||||
|
unsigned short usb_iface;
|
||||||
int (*open) (int num);
|
int (*open) (int num);
|
||||||
void (*close) (int handle);
|
void (*close) (int handle);
|
||||||
int (*transfer) (WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num);
|
int (*transfer) (WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int ecpbase, int num);
|
||||||
@ -13,3 +14,4 @@ struct parport_config __attribute__ ((visibility ("hidden"))) *config_get(int nu
|
|||||||
unsigned char __attribute__ ((visibility ("hidden"))) config_is_real_pport(int num);
|
unsigned char __attribute__ ((visibility ("hidden"))) config_is_real_pport(int num);
|
||||||
unsigned short __attribute__ ((visibility ("hidden"))) config_usb_vid(int num);
|
unsigned short __attribute__ ((visibility ("hidden"))) config_usb_vid(int num);
|
||||||
unsigned short __attribute__ ((visibility ("hidden"))) config_usb_pid(int num);
|
unsigned short __attribute__ ((visibility ("hidden"))) config_usb_pid(int num);
|
||||||
|
unsigned short __attribute__ ((visibility ("hidden"))) config_usb_iface(int num);
|
||||||
|
@ -32,7 +32,7 @@ static int jtagkey_latency(int latency) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int jtagkey_init(unsigned short vid, unsigned short pid) {
|
static int jtagkey_init(unsigned short vid, unsigned short pid, unsigned short iface) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ static int jtagkey_init(unsigned short vid, unsigned short pid) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = ftdi_set_interface(&ftdic, INTERFACE_A)) != 0) {
|
if ((ret = ftdi_set_interface(&ftdic, iface)) != 0) {
|
||||||
fprintf(stderr, "unable to set interface: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
|
fprintf(stderr, "unable to set interface: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ static int jtagkey_init(unsigned short vid, unsigned short pid) {
|
|||||||
int jtagkey_open(int num) {
|
int jtagkey_open(int num) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = jtagkey_init(config_usb_vid(num), config_usb_pid(num));
|
ret = jtagkey_init(config_usb_vid(num), config_usb_pid(num), config_usb_iface(num));
|
||||||
|
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
ret = 0xff;
|
ret = 0xff;
|
||||||
|
@ -4,3 +4,6 @@
|
|||||||
|
|
||||||
# Amontec Jtagkey
|
# Amontec Jtagkey
|
||||||
LPT2 = FTDI:0403:cff8
|
LPT2 = FTDI:0403:cff8
|
||||||
|
# Dangerous Prototypes Bus Blaster v2
|
||||||
|
LPT3 = FTDI:0403:6010:2
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user