For the archive, this is what he is wanting to do, or something very similar..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <dev/usb/usb.h>
#define VID 0x16C0
#define PID 0x0478
int open_my_usb_device(int vid, int pid);
int
main(int argc, char **argv)
{
return open_my_usb_device(VID, PID);
}
#define UHIDEV "/dev/uhid"
int open_my_usb_device(int vid, int pid)
{
struct usb_device_info di;
const char *dev_name;
char buf[50];
int f,e,i,n;
for (n = 0, i = 0; i < 10; i++) {
snprintf(buf, sizeof buf, "%s%d", UHIDEV, i);
f = open(buf, O_RDWR);
if (f < 0)
continue;
e = ioctl(f, USB_GET_DEVICEINFO, &di);
if (e) {
close(f);
continue;
}
if (di.udi_vendorNo == vid && di.udi_productNo == pid)
printf("found one: ");
printf("%s: %s(0x%04x), %s(0x%04x), rev %s\n",
buf, di.udi_product, di.udi_productNo,
di.udi_vendor, di.udi_vendorNo, di.udi_release);
n++;
break;
}
if (n == 0)
printf("no uhid found\n");
return f;
}
Penned by Paul Stoffregen on 20100121 12:50.58, we have:
| I'm hoping this is the right list for this question, and please
| forgive me if this is a dumb question or it's been asked before.
| I've tried google and man pages and about a day's worth of coding
| with little success.
|
| I'm trying to support OpenBSD in a new version of this program
| http://www.pjrc.com/teensy/loader_cli.html Based on an earlier
| patch from Chris Kuethe, it's working great on OpenBSD. Well,
| except the /dev/uhid0 device name is hard-coded, and my next version
| will have a feature to use multiple devices at the same time (for
| different functions, based on their product IDs), so hard coding or
| expecting the user to supply the device names just isn't practical.
|
| My question: how do I figure out which /dev/uhid device file(s), if
| any, corresponds to my device's product and vendor ID numbers?
| Basically, this is what I need to do:
|
| int open_my_usb_device(int vid, int pid)
| {
| const char *dev_name;
|
| // TODO: Perform some magic to figure out
| // which /dev/uhid# device is actually the
| // this vendor and product ID.
|
| dev_name = "/dev/uhid0"; // not hard coded like this, nor
| from user input
|
| return open(dev_name, O_RDWR);
| }
|
| I've tried opening the /dev/usb devices and calling the
| USB_DEVICEINFO ioctl (originally suggested to me by Todd T Fries).
| This gets very close, but the best I've been able to do is learn
| which uhidev driver (but not uhid) is connected to my device. For
| example (this code copied at the end of this email):
|
| $ ./test /dev/usb1
| addr 1: 0x0000, 0x106b, rev 1.00, drivers: uhub1
| addr 2: 0x0478, 0x16c0, rev 1.20, drivers: uhidev0
|
| This tells me the uhidev0 driver is loaded for my device. But the
| mapping from uhidev to uhid isn't necessarily 1-to-1. I need to
| know which uhid device to open!
|
| So far, the only way I've discovered to learn which uhid device
| corresponds to my hardware is by looking at /var/log/messages.
|
| $ tail -3 /var/log/messages Jan 21 00:42:11 bsd /bsd: uhidev0 at
| uhub1 port 1 configuration 1 interface 0 "vendor 0x16c0 product
| 0x0478" rev 1.10/1.20 addr 2
| Jan 21 00:42:11 bsd /bsd: uhidev0: iclass 3/0
| Jan 21 00:42:11 bsd /bsd: uhid0 at uhidev0: input=0, output=130, feature=0
|
| I suppose I could write code to try parsing /var/log/messages, but
| that seems like a horribly ugly hack that's bound to fail at some
| point in the future.
|
|
| Here is the work in progress.
|
| http://www.pjrc.com/tmp/teensy_loader_cli.work-in-progress.zip
|
| I've finished Linux, Windows and Macos support, and BSD is working
| but the device name is hard coded. I'm truly stuck on this last
| bit, so I'm hoping you might tell me how I can figure out how to
| find the right uhid device for my product/vendor IDs. This is the
| last piece I need to support BSD as well as the other systems.
|
|
| Thanks,
|
| -Paul
| [email protected]
|
|
| // test.c
| #include <stdio.h>
| #include <string.h>
| #include <fcntl.h>
| #include <unistd.h>
| #include <err.h>
| #include <dev/usb/usb.h>
| // originally suggested by Todd T. Fries
|
| int
| main(int argc, char **argv)
| {
| struct usb_device_info di;
| int i, e,f,a;
|
| f = open(argv[1], O_RDWR);
| if (f < 0) err(1, "%s", argv[1]);
|
| for (a=0; a < USB_MAX_DEVICES; a++) {
| memset(&di, 0, sizeof(struct usb_device_info));
| di.udi_addr = a;
| e = ioctl(f, USB_DEVICEINFO, &di);
| if (e) continue;
| printf("addr %d: 0x%04x, 0x%04x, rev %s, drivers: ", a,
| di.udi_productNo, di.udi_vendorNo, di.udi_release);
| for (i=0; i < USB_MAX_DEVNAMES; i++) {
| if (*di.udi_devnames[i] == NULL) continue;
| printf(" %s", di.udi_devnames[i]);
| }
| printf("\n");
| }
| close(f);
| return 0;
| }
--
Todd Fries .. [email protected]
_____________________________________________
| \ 1.636.410.0632 (voice)
| Free Daemon Consulting, LLC \ 1.405.227.9094 (voice)
| http://FreeDaemonConsulting.com \ 1.866.792.3418 (FAX)
| 2525 NW Expy #525, Oklahoma City, OK 73112 \ sip:[email protected]
| "..in support of free software solutions." \ sip:[email protected]
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
37E7 D3EB 74D0 8D66 A68D B866 0326 204E 3F42 004A
http://todd.fries.net/pgp.txt