From owner-freebsd-usb@FreeBSD.ORG Sat Jul 22 04:52:34 2006 Return-Path: X-Original-To: freebsd-usb@freebsd.org Delivered-To: freebsd-usb@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6331C16A4DA for ; Sat, 22 Jul 2006 04:52:34 +0000 (UTC) (envelope-from robert@nilssonstudios.com) Received: from smtp102.sbc.mail.mud.yahoo.com (smtp102.sbc.mail.mud.yahoo.com [68.142.198.201]) by mx1.FreeBSD.org (Postfix) with SMTP id BF76F43D68 for ; Sat, 22 Jul 2006 04:52:27 +0000 (GMT) (envelope-from robert@nilssonstudios.com) Received: (qmail 97097 invoked from network); 22 Jul 2006 04:52:27 -0000 Received: from unknown (HELO ?10.0.1.150?) (rnilsson@sbcglobal.net@68.88.194.47 with plain) by smtp102.sbc.mail.mud.yahoo.com with SMTP; 22 Jul 2006 04:52:26 -0000 Mime-Version: 1.0 (Apple Message framework v752.2) To: freebsd-usb@freebsd.org Message-Id: <61566738-B90E-4C80-B596-50912DC9872B@nilssonstudios.com> From: Robert Nilsson Date: Fri, 21 Jul 2006 23:52:04 -0500 X-Mailer: Apple Mail (2.752.2) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: [PATCH] libusb usb_clear_halt implementation X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Jul 2006 04:52:34 -0000 In order to get a device working correctly after a program restart I had to use this function. It's a pretty simple change. --- libusb-0.1.12/bsd.c Fri Mar 3 20:52:46 2006 +++ libusb-0.1.12.rob/bsd.c Fri Jul 21 22:47:55 2006 @@ -623,9 +623,21 @@ int usb_clear_halt(usb_dev_handle *dev, unsigned int ep) { - /* Not yet done, because I haven't needed it. */ + int ret; + struct usb_ctl_request ctl_req; - USB_ERROR_STR(-ENOSYS, "usb_clear_halt called, unimplemented on BSD"); + ctl_req.ucr_addr = 0; // Not used for this type of request + ctl_req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; + ctl_req.ucr_request.bRequest = UR_CLEAR_FEATURE; + USETW(ctl_req.ucr_request.wValue, UF_ENDPOINT_HALT); + USETW(ctl_req.ucr_request.wIndex, ep); + USETW(ctl_req.ucr_request.wLength, 0); + ctl_req.ucr_flags = 0; + + if ((ret = ioctl(dev->fd, USB_DO_REQUEST, &ctl_req)) < 0) + USB_ERROR_STR(-errno, "clear_halt: failed for %d", ep); + + return ret; } int usb_reset(usb_dev_handle *dev) Rob.