summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2023-01-03 22:17:24 +0800
committersakimisu <[email protected]>2023-01-03 22:20:57 +0800
commite1585f801c4d0fc20e9b0b968ba8458e85fde3d2 (patch)
tree6fe72b70b872aa749f59bf37afaca8c6bff8118b
parent2e7c4953cea692edb1a920c5bc47fc81b951d78b (diff)
reset pipe and is_opened before set_interface cmd
-rw-r--r--class/video/usbh_video.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/class/video/usbh_video.c b/class/video/usbh_video.c
index 4b7ff6e7..28d5a642 100644
--- a/class/video/usbh_video.c
+++ b/class/video/usbh_video.c
@@ -247,18 +247,16 @@ int usbh_video_open(struct usbh_video *video_class,
int usbh_video_close(struct usbh_video *video_class)
{
struct usb_setup_packet *setup = &video_class->hport->setup;
- int ret;
+ int ret = 0;
- setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE;
- setup->bRequest = USB_REQUEST_SET_INTERFACE;
- setup->wValue = 0;
- setup->wIndex = video_class->data_intf;
- setup->wLength = 0;
+ USB_LOG_INFO("Close video device\r\n");
- ret = usbh_control_transfer(video_class->hport->ep0, setup, NULL);
- if (ret < 0) {
- return ret;
+ if (video_class->is_opened == false) {
+ return 0;
}
+
+ video_class->is_opened = false;
+
if (video_class->isoin) {
usbh_pipe_free(video_class->isoin);
video_class->isoin = NULL;
@@ -269,8 +267,16 @@ int usbh_video_close(struct usbh_video *video_class)
video_class->isoout = NULL;
}
- USB_LOG_INFO("Close video device\r\n");
- video_class->is_opened = false;
+ setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE;
+ setup->bRequest = USB_REQUEST_SET_INTERFACE;
+ setup->wValue = 0;
+ setup->wIndex = video_class->data_intf;
+ setup->wLength = 0;
+
+ ret = usbh_control_transfer(video_class->hport->ep0, setup, NULL);
+ if (ret < 0) {
+ return ret;
+ }
return ret;
}