add usbreset - a small simple utility to send port rests to selected usb devices (#10394)
SVN-Revision: 29611
This commit is contained in:
		
							
								
								
									
										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; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Jo-Philipp Wich
					Jo-Philipp Wich