PERFORCE change 126745 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Sep 23 09:25:44 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126745
Change 126745 by hselasky at hselasky_laptop001 on 2007/09/23 16:25:37
- moved and renamed two functions into "usb_hid.c" from
"usb_subr.c"
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_hid.c#4 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_hid.c#4 (text+ko) ====
@@ -464,3 +464,79 @@
hid_end_parse(hd);
return (err);
}
+
+usb_hid_descriptor_t *
+hid_get_descriptor_from_usb(usb_config_descriptor_t *cd,
+ usb_interface_descriptor_t *id)
+{
+ usb_descriptor_t *desc = (void *)id;
+
+ if(desc == NULL) {
+ return NULL;
+ }
+
+ while ((desc = usbd_desc_foreach(cd, desc)))
+ {
+ if ((desc->bDescriptorType == UDESC_HID) &&
+ (desc->bLength >= USB_HID_DESCRIPTOR_SIZE(0)))
+ {
+ return (void *)desc;
+ }
+
+ if (desc->bDescriptorType == UDESC_INTERFACE)
+ {
+ break;
+ }
+ }
+ return NULL;
+}
+
+usbd_status
+hid_read_report_desc_from_usb(struct usbd_device *udev, struct mtx *mtx,
+ void **descp, uint16_t *sizep,
+ usb_malloc_type mem, uint8_t iface_index)
+{
+ struct usbd_interface *iface = usbd_get_iface(udev, iface_index);
+ usb_hid_descriptor_t *hid;
+ usbd_status err;
+
+ if((iface == NULL) || (iface->idesc == NULL))
+ {
+ return USBD_INVAL;
+ }
+
+ hid = hid_get_descriptor_from_usb
+ (usbd_get_config_descriptor(udev), iface->idesc);
+
+ if(hid == NULL)
+ {
+ return USBD_IOERROR;
+ }
+
+ *sizep = UGETW(hid->descrs[0].wDescriptorLength);
+ if (*sizep == 0) {
+ return USBD_IOERROR;
+ }
+
+ if (mtx) mtx_unlock(mtx);
+
+ *descp = malloc(*sizep, mem, M_ZERO|M_WAITOK);
+
+ if (mtx) mtx_lock(mtx);
+
+ if(*descp == NULL)
+ {
+ return USBD_NOMEM;
+ }
+
+ err = usbreq_get_report_descriptor
+ (udev, mtx, *descp, *sizep, iface_index);
+
+ if(err)
+ {
+ free(*descp, mem);
+ *descp = NULL;
+ return err;
+ }
+ return USBD_NORMAL_COMPLETION;
+}
More information about the p4-projects
mailing list