You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

58 lines
2.1 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2009 by Zachary T Welch <zw@superlucidity.net> *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This program is distributed in the hope that it will be useful, *
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  12. * GNU General Public License for more details. *
  13. * *
  14. * You should have received a copy of the GNU General Public License *
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>. *
  16. ***************************************************************************/
  17. #ifdef HAVE_CONFIG_H
  18. #include "config.h"
  19. #endif
  20. #include "usb_common.h"
  21. #include "log.h"
  22. static bool jtag_usb_match(struct usb_device *dev,
  23. const uint16_t vids[], const uint16_t pids[])
  24. {
  25. for (unsigned i = 0; vids[i] && pids[i]; i++) {
  26. if (dev->descriptor.idVendor == vids[i] &&
  27. dev->descriptor.idProduct == pids[i])
  28. return true;
  29. }
  30. return false;
  31. }
  32. int jtag_usb_open(const uint16_t vids[], const uint16_t pids[],
  33. struct usb_dev_handle **out)
  34. {
  35. usb_find_busses();
  36. usb_find_devices();
  37. struct usb_bus *busses = usb_get_busses();
  38. for (struct usb_bus *bus = busses; bus; bus = bus->next) {
  39. for (struct usb_device *dev = bus->devices; dev; dev = dev->next) {
  40. if (!jtag_usb_match(dev, vids, pids))
  41. continue;
  42. *out = usb_open(dev);
  43. if (NULL == *out) {
  44. LOG_ERROR("usb_open() failed with %s", usb_strerror());
  45. return ERROR_FAIL;
  46. }
  47. return ERROR_OK;
  48. }
  49. }
  50. return ERROR_FAIL;
  51. }