Please send libhid-related questions to the mailing list. The list is
CC'd.
On Sep 5, 2009, at 5:16 AM, Sajjad Gerami wrote:
hi
another problem .
i try to enumerate my usb devices but i encouterd a problem
--------------------------------------------
here's the code :
#include <hid.h>
#include <stdio.h>
#include <string.h>
char *hid_id[32]; /* FIXME: 32 devices MAX */
struct usb_dev_handle;
bool device_iterator (struct usb_dev_handle const* usbdev, void*
custom,
unsigned int len)
{
bool ret = false;
int i;
char current_dev_path[10];
const struct usb_device *device = usb_device((struct usb_dev_handle
*)usbdev);
/* only here to prevent the unused warning */
/* TODO remove */
len = *((unsigned long*)custom);
/* Obtain the device's full path */
//sprintf(current_dev_path, "%s/%s", usbdev->bus->dirname,
usbdev->device->filename);
sprintf(current_dev_path, "%s/%s", device->bus->dirname,
device->filename);
/* Check if we already saw this dev */
for ( i = 0 ; ( hid_id[i] != NULL ) ; i++ )
{
if (!strcmp(hid_id[i], current_dev_path ) )
break;
}
/* Append device to the list if needed */
if (hid_id[i] == NULL)
{
hid_id[i] = (char *) malloc (strlen(device->filename) +
strlen(device->bus->dirname) );
sprintf(hid_id[i], "%s/%s", device->bus->dirname, device-
>filename);
}
else /* device already seen */
{
return false;
}
/* Filter non HID device */
if ( (device->descriptor.bDeviceClass == 0) /* Class defined at
interface level */
&& device->config
&& device->config->interface->altsetting->bInterfaceClass ==
USB_CLASS_HID)
ret = true;
else
ret = false;
return ret;
}
int main(void)
{
int i;
hid_return ret;
HIDInterface* hid;
HIDInterfaceMatcher matcher;
/* hid_write_library_config(stdout); */
/* hid_set_debug(HID_DEBUG_NOTRACES); */
// hid_set_debug(HID_DEBUG_NONE);
hid_set_debug(HID_DEBUG_ALL);
hid_set_debug_stream(stderr);
hid_set_usb_debug(0);
/* data init */
for (i = 0 ; i < 32 ; i++)
hid_id[i] = NULL;
ret = hid_init();
hid = hid_new_HIDInterface();
/* //tested - not working
matcher.vendor_id = HID_ID_MATCH_ANY;
matcher.product_id = HID_ID_MATCH_ANY;
matcher.matcher_fn = device_iterator;
*/
matcher.vendor_id = 0x1114;
matcher.product_id = 0x1028;
matcher.matcher_fn = device_iterator;
// matcher.matcher_fn = NULL; //WARNNING : infinity loop
/* open recursively all HID devices found */
while ( (ret = hid_force_open(hid, 0, &matcher, 3)) !=
HID_RET_DEVICE_NOT_FOUND)//Segmentation fault accures here!!!
{
printf
("************************************************************************\n
");
hid_write_identification(stdout, hid);
/* Only dump HID tree if asked */
/* hid_dump_tree(stdout, hid); */
hid_close(hid);
}
hid_delete_HIDInterface(&hid);
ret = hid_cleanup();
return 0;
}
/* COPYRIGHT --
*
* This file is part of libhid, a user-space HID access library.
* libhid is (c) 2003-2005
* Martin F. Krafft <[email protected]>
* Charles Lepple <[email protected]>
* Arnaud Quette <[email protected]> &&
<[email protected]>
* and distributed under the terms of the GNU General Public License.
* See the file ./COPYING in the source distribution for more
information.
*
* THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES
* OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
--------------------------------------------
and here's the output :
r...@sajjad-laptop:/home/sajjad/NetBeansProjects/libhid1/dist/Debug/
GNU-Linux-x86# ./libhid1
NOTICE: hid_init(): libhid 0.2.15+20060325.0.0 is being initialized.
TRACE: hid_init(): initialising USB subsystem...
TRACE: hid_init(): scanning for USB busses...
TRACE: hid_init(): scanning for USB devices...
NOTICE: hid_init(): successfully initialised HID library.
TRACE: hid_new_HIDInterface(): creating a new HIDInterface
instance...
TRACE: hid_force_open(): forcefully opening a device interface
according to matching criteria...
TRACE: hid_get_usb_handle(): acquiring handle for a USB device...
TRACE: hid_find_usb_device(): enumerating USB busses...
TRACE: hid_find_usb_device(): enumerating USB devices on bus 001...
TRACE: hid_find_usb_device(): inspecting USB device 001/001[0]...
TRACE: hid_compare_usb_device(): comparing match specifications to
USB
device...
TRACE: hid_compare_usb_device(): inspecting vendor ID...
TRACE: hid_compare_usb_device(): no match on vendor ID.
TRACE: hid_compare_usb_device(): inspecting product ID...
TRACE: hid_compare_usb_device(): no match on product ID.
TRACE: hid_compare_usb_device(): calling custom matching function...
Segmentation fault
r...@sajjad-laptop:/home/sajjad/NetBeansProjects/libhid1/dist/Debug/
GNU-Linux-x86#
--------------------------------------------
Segmentation fault ????!!!??!?!?!?!?
A debugger is very helpful if you get a segmentation fault.
and when i changed
matcher.matcher_fn = device_iterator;
to
matcher.matcher_fn = NULL;
it fall in the loop and check the same 1st find matching bus again and
again.
custom matching function !!!!????
what is this ?
i search in libhid documentation but i found nothing
even in libhid codes again nothing
then discuss list , nothing relative
Look again.
thanks for helping.
god bless you.
--
Sajjad Gerami <[email protected]>
_______________________________________________
libhid-discuss mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/libhid-discuss
http://libhid.alioth.debian.org/