mirror of
https://github.com/avrdudes/avrdude.git
synced 2026-10-03 00:18:42 +03:00
Utilise str_set_vid_pid_serno() in usb_hidapi.c
This commit is contained in:
@@ -37,54 +37,24 @@
|
||||
|
||||
#include "usbdevs.h"
|
||||
|
||||
/*
|
||||
* The "baud" parameter is meaningless for USB devices, so we reuse it to pass
|
||||
* the desired USB device ID.
|
||||
*/
|
||||
static int usbhid_open(const char *port, union pinfo pinfo, union filedescriptor *fd) {
|
||||
hid_device *dev = NULL;
|
||||
char serno[64], *s;
|
||||
const char *serp, *vidp, *pidp;
|
||||
char serno[64] = {0};
|
||||
unsigned char usbbuf[USBDEV_MAX_XFER_3 + 1];
|
||||
|
||||
if(fd->usb.max_xfer == 0)
|
||||
fd->usb.max_xfer = USBDEV_MAX_XFER_3;
|
||||
|
||||
/*
|
||||
* The syntax for usb devices is defined as:
|
||||
*
|
||||
* -P usb:vid:pid
|
||||
* -P usb:serialnumber
|
||||
* -P usb
|
||||
*
|
||||
* First check for a valid vid:pid pair, then see if there is a serial number
|
||||
* passed here. The serial number might contain colons which are removed;
|
||||
* comparison is right-to-left, so only the least significant nibbles need to
|
||||
* be specified.
|
||||
*/
|
||||
|
||||
if((vidp = strchr(port, ':')) && (pidp = strchr(vidp + 1, ':'))) {
|
||||
int vid, pid;
|
||||
|
||||
if(sscanf(vidp + 1, "%x", &vid) == 1 && sscanf(pidp + 1, "%x", &pid) == 1) {
|
||||
if((dev = hid_open(vid, pid, NULL))) {
|
||||
pmsg_notice2("USB device with VID: 0x%04x and PID: 0x%04x\n", vid, pid);
|
||||
pinfo.usbinfo.vid = vid;
|
||||
pinfo.usbinfo.pid = pid;
|
||||
}
|
||||
}
|
||||
// Override/set pid, vid and/or serno from -P usb[[:[<vid>]:<pid>]:<serno>]
|
||||
if(str_set_vid_pid_serno(port, &pinfo.usbinfo.vid, &pinfo.usbinfo.pid, -1, serno, sizeof serno) < 0) {
|
||||
pmsg_error("parsing error in -P %s\n", port);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!dev && (serp = vidp) && *++serp) {
|
||||
// First, get a copy of the serial number w/out colons
|
||||
for(s = serno; *serp && s < serno + sizeof serno - 1; serp++)
|
||||
if(*serp != ':')
|
||||
*s++ = *serp;
|
||||
*s = 0;
|
||||
|
||||
if(*serno) {
|
||||
wchar_t wserno[sizeof serno] = { 0 };
|
||||
mbstowcs(wserno, serno, sizeof serno);
|
||||
size_t serlen = s - serno;
|
||||
size_t serlen = strlen(serno);
|
||||
|
||||
/*
|
||||
* Now, try finding all devices matching VID:PID, and compare their serial
|
||||
@@ -123,7 +93,7 @@ static int usbhid_open(const char *port, union pinfo pinfo, union filedescriptor
|
||||
pmsg_error("found device, but hid_open_path() failed\n");
|
||||
return -1;
|
||||
}
|
||||
} else if(!dev) {
|
||||
} else {
|
||||
dev = hid_open(pinfo.usbinfo.vid, pinfo.usbinfo.pid, NULL);
|
||||
if(dev == NULL) {
|
||||
pmsg_notice2("USB device with VID: 0x%04x and PID: 0x%04x not found\n", pinfo.usbinfo.vid, pinfo.usbinfo.pid);
|
||||
|
||||
Reference in New Issue
Block a user