I'm looking into why the package misc/calibre doesn't seem to see any
connected USB devices, and I'm beginning to think that libusb1 simply
doesn't work.
Below is a test program I've reduced from what Calibre does to scan for
usb devices (it requires libusb-1.0 from pkgsrc).
It always prints this, run as root or not, even though I have at least a
USB mouse plugged in:
$ ./usb
libusb_init: 0
count = 0
ktracing and looking at NAMI lines, it looks at
23605 1 usb NAMI "/dev/ugen0.00"
23605 1 usb NAMI "/dev/ugen1.00"
23605 1 usb NAMI "/dev/ugen2.00"
23605 1 usb NAMI "/dev/ugen3.00"
etc.
Is this even a way to detect plugged-in devices?
Why does it ignore /dev/ugen0.01 ... /dev/ugen0.15, etc?
Why doesn't the devel/libusb1 package install a manual page?
Test program: run it as a shell script to compile.
# /*
gcc -I/usr/pkg/include -L/usr/pkg/lib -R/usr/pkg/lib usb.c -lusb-1.0 -o usb
exit $?
*/
#include <stdio.h>
#include <libusb-1.0/libusb.h>
static void format_err(int err) {
printf("error: %s\n", libusb_error_name(err));
}
static unsigned char *read_string_property(libusb_device_handle *dev, uint8_t idx) {
static unsigned char buf[301];
int err;
err = libusb_get_string_descriptor_ascii(dev, idx, buf, 300);
//printf("read_string_property: %s\n", buf);
return buf;
}
static void read_string_data(libusb_device *dev, uint8_t manufacturer, uint8_t product, uint8_t serial) {
libusb_device_handle *handle;
int err;
char *p;
err = libusb_open(dev, &handle);
if (err == 0) {
p = read_string_property(handle, manufacturer);
if (p != NULL) { printf("manufacturer: %s", p); }
p = read_string_property(handle, product);
if (p != NULL) { printf("product: %s", p); }
p = read_string_property(handle, serial);
if (p != NULL) { printf("serial: %s", p); }
libusb_close(handle);
}
}
static void get_devices(void) {
int err, i = 0;
libusb_device **devs = NULL, *dev = NULL;
ssize_t count;
libusb_context *ctx = NULL;
err = libusb_init(NULL); // &ctx or NULL
printf("libusb_init: %d\n", err);
if (err) {
format_err(count);
}
count = libusb_get_device_list(ctx, &devs);
printf("count = %d\n", count);
if (count < 0) {
format_err(count);
return;
}
while ( (dev = devs[i++]) != NULL ) {
struct libusb_device_descriptor desc;
err = libusb_get_device_descriptor(dev, &desc);
if (err != 0) { format_err(err); break; }
if (desc.bDeviceClass == LIBUSB_CLASS_HUB) continue;
printf("libusb_get_bus_number: %d\n", libusb_get_bus_number(dev));
printf("libusb_get_device_address: %d\n", libusb_get_device_address(dev));
printf("idVendor: %d\n", desc.idVendor);
printf("idProduct: %d\n", desc.idProduct);
printf("bcdDevice: %d\n", desc.bcdDevice);
read_string_data(dev, desc.iManufacturer, desc.iProduct, desc.iSerialNumber);
}
if (devs != NULL) libusb_free_device_list(devs, 1);
libusb_exit(ctx);
}
int main(int argc, char *argv[])
{
get_devices();
return 0;
}
-Olaf.
--
___ "Buying carbon credits is a bit like a serial killer paying someone else to
\X/ have kids to make his activity cost neutral." -The BOFH falu.nl@rhialto
Attachment:
signature.asc
Description: PGP signature