]> git.zerfleddert.de Git - usb-driver/blobdiff - xpcu.c
add xpcu_set_interface
[usb-driver] / xpcu.c
diff --git a/xpcu.c b/xpcu.c
index 28770fe6eba169a0690d52952443a593d29c7b54..de23d9eb8f69009d73362e3c6ce8fcde92c4a387 100644 (file)
--- a/xpcu.c
+++ b/xpcu.c
@@ -166,7 +166,7 @@ int xpcu_deviceinfo(struct xpcu_s *xpcu, unsigned char *buf) {
        return len;
 }
 
-int xpcu_claim(struct xpcu_s *xpcu, int claim) {
+static int xpcu_claim(struct xpcu_s *xpcu, int claim) {
        int ret = 0;
        static int claimed = 0;
 
@@ -232,6 +232,23 @@ int xpcu_transfer(struct xpcu_s *xpcu, struct usb_transfer *ut) {
        return ret;
 }
 
+void xpcu_set_interface(struct xpcu_s *xpcu, struct usb_set_interface *usi) {
+       if (xpcu->dev) {
+               if (!xpcu->handle) {
+                       xpcu->handle = usb_open(xpcu->dev);
+#ifndef NO_USB_RESET
+                       if (xpcu->handle) {
+                               usb_reset(xpcu->handle);
+                               xpcu->handle = usb_open(xpcu->dev);
+                       }
+#endif
+               }
+
+               xpcu->interface = xpcu->dev->config[0].interface[usi->dwInterfaceNum].altsetting[usi->dwAlternateSetting].bInterfaceNumber;
+               xpcu->alternate = usi->dwAlternateSetting;
+       }
+}
+
 struct xpcu_s *xpcu_open(void) {
        static struct xpcu_s xpcu;
 
@@ -247,3 +264,14 @@ struct xpcu_s *xpcu_open(void) {
 
        return &xpcu;
 }
+
+void xpcu_close(struct xpcu_s *xpcu) {
+       if (xpcu->handle) {
+               xpcu_claim(xpcu, XPCU_RELEASE);
+               usb_close(xpcu->handle);
+       }
+
+       xpcu->handle = NULL;
+       xpcu->interface = -1;
+       xpcu->alternate = -1;
+}
Impressum, Datenschutz