a1b308abd4
With this patch drivers will be able to use usb path filtering. The path format is identical to the format provided by linux kernel: bus-port.port.... With this format it should be easier just to copy and paste path found in dmesg. Change-Id: I8bafa6fcb7a66ff68cc961a376f97f4f3dee35aa Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Reviewed-on: http://openocd.zylin.com/4580 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
/*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
* Copyright (c) 2018 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
|
|
*/
|
|
|
|
#include <helper/log.h>
|
|
|
|
#include "jtag_usb_common.h"
|
|
|
|
static char *jtag_usb_location;
|
|
/*
|
|
* 1 char: bus
|
|
* 2 * 7 chars: max 7 ports
|
|
* 1 char: test for overflow
|
|
* ------
|
|
* 16 chars
|
|
*/
|
|
#define JTAG_USB_MAX_LOCATION_LENGHT 16
|
|
|
|
void jtag_usb_set_location(const char *location)
|
|
{
|
|
if (strnlen(location, JTAG_USB_MAX_LOCATION_LENGHT) ==
|
|
JTAG_USB_MAX_LOCATION_LENGHT)
|
|
LOG_WARNING("usb location string is too long!!\n");
|
|
|
|
if (jtag_usb_location)
|
|
free(jtag_usb_location);
|
|
|
|
jtag_usb_location = strndup(location, JTAG_USB_MAX_LOCATION_LENGHT);
|
|
}
|
|
|
|
const char *jtag_usb_get_location(void)
|
|
{
|
|
return jtag_usb_location;
|
|
}
|
|
|
|
bool jtag_usb_location_equal(uint8_t dev_bus, uint8_t *port_path,
|
|
size_t path_len)
|
|
{
|
|
size_t path_step, string_lengh;
|
|
char *ptr, *loc;
|
|
bool equal = false;
|
|
|
|
/* strtok need non const char */
|
|
loc = strndup(jtag_usb_get_location(), JTAG_USB_MAX_LOCATION_LENGHT);
|
|
string_lengh = strnlen(loc, JTAG_USB_MAX_LOCATION_LENGHT);
|
|
|
|
ptr = strtok(loc, "-");
|
|
if (ptr == NULL) {
|
|
LOG_WARNING("no '-' in usb path\n");
|
|
goto done;
|
|
}
|
|
|
|
string_lengh -= 1;
|
|
/* check bus mismatch */
|
|
if (atoi(ptr) != dev_bus)
|
|
goto done;
|
|
|
|
path_step = 0;
|
|
while (path_step < path_len) {
|
|
ptr = strtok(NULL, ".");
|
|
|
|
/* no more tokens in path */
|
|
if (ptr == NULL)
|
|
break;
|
|
|
|
/* path mismatch at some step */
|
|
if (path_step < path_len && atoi(ptr) != port_path[path_step])
|
|
break;
|
|
|
|
path_step++;
|
|
string_lengh -= 2;
|
|
};
|
|
|
|
/* walked the full path, all elements match */
|
|
if (path_step == path_len && !string_lengh)
|
|
equal = true;
|
|
else
|
|
LOG_WARNING("excluded by device path option: %s\n",
|
|
jtag_usb_get_location());
|
|
|
|
done:
|
|
free(loc);
|
|
return equal;
|
|
}
|