aboutsummaryrefslogtreecommitdiff
path: root/util/usb_detach
diff options
context:
space:
mode:
Diffstat (limited to 'util/usb_detach')
-rw-r--r--util/usb_detach/Makefile18
-rw-r--r--util/usb_detach/readme.md14
-rw-r--r--util/usb_detach/usb_detach.c34
3 files changed, 66 insertions, 0 deletions
diff --git a/util/usb_detach/Makefile b/util/usb_detach/Makefile
new file mode 100644
index 000000000..533c1928f
--- /dev/null
+++ b/util/usb_detach/Makefile
@@ -0,0 +1,18 @@
1# the compiler: gcc for C program, define as g++ for C++
2CC = gcc
3
4# compiler flags:
5# -g adds debugging information to the executable file
6# -Wall turns on most, but not all, compiler warnings
7CFLAGS = -g -Wall
8
9# the build target executable:
10TARGET = usb_detach
11
12all: $(TARGET)
13
14$(TARGET): $(TARGET).c
15 $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
16
17clean:
18 $(RM) $(TARGET)
diff --git a/util/usb_detach/readme.md b/util/usb_detach/readme.md
new file mode 100644
index 000000000..ac42944ee
--- /dev/null
+++ b/util/usb_detach/readme.md
@@ -0,0 +1,14 @@
1# usb_detach
2
3When trying to flash on Linux, you may encounter a "Resource Unavailable" error. This means that Linux's HID driver has taken exclusive control of the keyboard, and the program script can't flash it.
4This program can force Linux to give up a device, so that the programming script can reset it.
5
6## To compile:
7```bash
8make clean && make
9```
10
11## To run:
121. Use `lsusb` to discover the Bus and Device numbers for your keyboard.
132. Run the program: `sudo ./usb_detach /dev/bus/usb/<BUS>/<DEVICE>`.
143. Build and program the firmware as normal.
diff --git a/util/usb_detach/usb_detach.c b/util/usb_detach/usb_detach.c
new file mode 100644
index 000000000..786ab5e67
--- /dev/null
+++ b/util/usb_detach/usb_detach.c
@@ -0,0 +1,34 @@
1/* Found at https://www.linuxquestions.org/questions/linux-hardware-18/how-to-unclaim-usb-device-558138/#post3406986 */
2#include <stdio.h>
3#include <sys/ioctl.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include <fcntl.h>
7#include <linux/ioctl.h>
8#include <linux/usbdevice_fs.h>
9
10int main(int argc, char**argv)
11{
12 struct usbdevfs_ioctl command;
13 int ret;
14 int fd;
15 int i;
16 if (argc>1) {
17 fd = open(argv[1],O_RDWR);
18 if (fd<1){
19 perror("unable to open file");
20 return 1;
21 }
22 for (i=0;i<255;i++){ // hack: should fetch how many interface there is.
23 command.ifno = i;
24 command.ioctl_code = USBDEVFS_DISCONNECT;
25 command.data = NULL;
26 ret = ioctl(fd, USBDEVFS_IOCTL, &command);
27 if(ret!=-1)
28 printf("un claimed interface %d %d\n",i,ret);
29 }
30 } else {
31 printf ("usage: %s /dev/bus/usb/BUS/DEVICE\n",argv[0]);
32 printf("Release all interfaces of this usb device for usage in virtualisation\n");
33 }
34} \ No newline at end of file