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.
 
 
 
 
 
 

57 lines
2.2 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, write to the *
  16. * Free Software Foundation, Inc., *
  17. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. ***************************************************************************/
  19. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include "usb_common.h"
  23. static bool jtag_usb_match(struct usb_device *dev,
  24. const uint16_t vids[], const uint16_t pids[])
  25. {
  26. for (unsigned i = 0; vids[i] && pids[i]; i++) {
  27. if (dev->descriptor.idVendor == vids[i] &&
  28. dev->descriptor.idProduct == pids[i])
  29. return true;
  30. }
  31. return false;
  32. }
  33. int jtag_usb_open(const uint16_t vids[], const uint16_t pids[],
  34. struct usb_dev_handle **out)
  35. {
  36. usb_find_busses();
  37. usb_find_devices();
  38. struct usb_bus *busses = usb_get_busses();
  39. for (struct usb_bus *bus = busses; bus; bus = bus->next) {
  40. for (struct usb_device *dev = bus->devices; dev; dev = dev->next) {
  41. if (!jtag_usb_match(dev, vids, pids))
  42. continue;
  43. *out = usb_open(dev);
  44. if (NULL == *out)
  45. return -errno;
  46. return 0;
  47. }
  48. }
  49. return -ENODEV;
  50. }