add usbreset - a small simple utility to send port rests to selected usb devices (#10394)
SVN-Revision: 29611
This commit is contained in:
parent
9fa33ceee2
commit
250ef0cb72
2 changed files with 120 additions and 0 deletions
44
package/usbreset/Makefile
Normal file
44
package/usbreset/Makefile
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 OpenWrt.org
|
||||||
|
#
|
||||||
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
|
# See /LICENSE for more information.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=usbreset
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/usbreset
|
||||||
|
SECTION:=utils
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
TITLE:=Utility to send a USB port reset to a USB device
|
||||||
|
MAINTAINER:=Jo-Philipp Wich <xm@subsignal.org>
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/usbreset/description
|
||||||
|
This package contains the small usbreset utility which
|
||||||
|
can be used to send a USB port reset to a USB device -
|
||||||
|
useful for debugging or to force re-detection of particular
|
||||||
|
devices.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Prepare
|
||||||
|
$(INSTALL_DIR) $(PKG_BUILD_DIR)
|
||||||
|
$(INSTALL_DATA) ./src/usbreset.c $(PKG_BUILD_DIR)/
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
$(TARGET_CC) $(TARGET_CFLAGS) -Wall \
|
||||||
|
-o $(PKG_BUILD_DIR)/usbreset $(PKG_BUILD_DIR)/usbreset.c
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/usbreset/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/bin
|
||||||
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/usbreset $(1)/usr/bin/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,usbreset))
|
76
package/usbreset/src/usbreset.c
Normal file
76
package/usbreset/src/usbreset.c
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/* usbreset -- send a USB port reset to a USB device */
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
http://marc.info/?l=linux-usb-users&m=116827193506484&w=2
|
||||||
|
|
||||||
|
and needs mounted usbfs filesystem
|
||||||
|
|
||||||
|
sudo mount -t usbfs none /proc/bus/usb
|
||||||
|
|
||||||
|
There is a way to suspend a USB device. In order to use it,
|
||||||
|
you must have a kernel with CONFIG_PM_SYSFS_DEPRECATED turned on. To
|
||||||
|
suspend a device, do (as root):
|
||||||
|
|
||||||
|
echo -n 2 >/sys/bus/usb/devices/.../power/state
|
||||||
|
|
||||||
|
where the "..." is the ID for your device. To unsuspend, do the same
|
||||||
|
thing but with a "0" instead of the "2" above.
|
||||||
|
|
||||||
|
Note that this mechanism is slated to be removed from the kernel within
|
||||||
|
the next year. Hopefully some other mechanism will take its place.
|
||||||
|
|
||||||
|
> To reset a
|
||||||
|
> device?
|
||||||
|
|
||||||
|
Here's a program to do it. You invoke it as either
|
||||||
|
|
||||||
|
usbreset /proc/bus/usb/BBB/DDD
|
||||||
|
or
|
||||||
|
usbreset /dev/usbB.D
|
||||||
|
|
||||||
|
depending on how your system is set up, where BBB and DDD are the bus and
|
||||||
|
device address numbers.
|
||||||
|
|
||||||
|
Alan Stern
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#include <linux/usbdevice_fs.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *filename;
|
||||||
|
int fd;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "Usage: usbreset device-filename\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
filename = argv[1];
|
||||||
|
|
||||||
|
fd = open(filename, O_WRONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("Error opening output file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Resetting USB device %s\n", filename);
|
||||||
|
rc = ioctl(fd, USBDEVFS_RESET, 0);
|
||||||
|
if (rc < 0) {
|
||||||
|
perror("Error in ioctl");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
printf("Reset successful\n");
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue