From 2b05b1e4cec0d07b8445f1c5a2175a3b04a8bf1d Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 31 May 2013 15:41:17 +0000 Subject: [PATCH] replace usb-modeswitch with a rewrite that should be more reliable Signed-off-by: Felix Fietkau SVN-Revision: 36812 --- package/system/utils/usb-modeswitch/Makefile | 82 ---------- .../usb-modeswitch/files/modeswitch.hotplug | 140 ------------------ package/system/utils/usbmode/Makefile | 57 +++++++ .../utils/usbmode/files/usbmode.hotplug | 7 + 4 files changed, 64 insertions(+), 222 deletions(-) delete mode 100644 package/system/utils/usb-modeswitch/Makefile delete mode 100644 package/system/utils/usb-modeswitch/files/modeswitch.hotplug create mode 100644 package/system/utils/usbmode/Makefile create mode 100644 package/system/utils/usbmode/files/usbmode.hotplug diff --git a/package/system/utils/usb-modeswitch/Makefile b/package/system/utils/usb-modeswitch/Makefile deleted file mode 100644 index d82a83c56a..0000000000 --- a/package/system/utils/usb-modeswitch/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (C) 2008-2012 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:=usb-modeswitch -PKG_VERSION:=1.2.5 -PKG_DATA_VERSION:=20121109 -PKG_RELEASE:=1 - -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://www.draisberghof.de/usb_modeswitch -PKG_MD5SUM:=c393603908eceab95444c5bde790f6f0 - -PKG_DATA_PATH:=usb-modeswitch-data-$(PKG_DATA_VERSION) -PKG_DATA_FILENAME:=$(PKG_DATA_PATH).tar.bz2 - -PKG_MAINTAINER := Felix Fietkau - -include $(INCLUDE_DIR)/package.mk - -define Package/usb-modeswitch - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=+libusb-compat - TITLE:=USB ModeSwitch - URL:=http://www.draisberghof.de/usb_modeswitch/ -endef - -define Package/usb-modeswitch/description - A mode switching tool for controlling - "flip flop" (multiple device) USB gear. -endef - -define Package/usb-modeswitch-data - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=usb-modeswitch - VERSION:=$(PKG_DATA_VERSION) - TITLE:=USB ModeSwitch - Dongle configuration database - URL:=http://www.draisberghof.de/usb_modeswitch/ -endef - -define Package/usb-modeswitch-data/description - Configuration database for usb-modeswitch. - Contains definitions for many USB devices required to - autoswitch "flip flop" gear. -endef - -define Download/data - FILE:=$(PKG_DATA_FILENAME) - URL:=$(PKG_SOURCE_URL) - MD5SUM:=a7d23a03157871013a0d708ab2b1b6df -endef -$(eval $(call Download,data)) - -define Build/Compile - tar xvfj $(DL_DIR)/$(PKG_DATA_FILENAME) -C $(PKG_BUILD_DIR) - $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS) \ - -lusb \ - -o $(PKG_BUILD_DIR)/usb_modeswitch-OpenWrt \ - $(PKG_BUILD_DIR)/usb_modeswitch.c -endef - -define Package/usb-modeswitch/install - $(INSTALL_DIR) $(1)/usr/bin $(1)/etc/hotplug.d/usb - $(INSTALL_BIN) $(PKG_BUILD_DIR)/usb_modeswitch-OpenWrt $(1)/usr/bin/usb_modeswitch - $(INSTALL_DATA) ./files/modeswitch.hotplug $(1)/etc/hotplug.d/usb/20-modeswitch -endef - -define Package/usb-modeswitch-data/install - $(INSTALL_DIR) $(1)/etc - $(CP) $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d $(1)/etc/ -endef - -$(eval $(call BuildPackage,usb-modeswitch)) -$(eval $(call BuildPackage,usb-modeswitch-data)) diff --git a/package/system/utils/usb-modeswitch/files/modeswitch.hotplug b/package/system/utils/usb-modeswitch/files/modeswitch.hotplug deleted file mode 100644 index eb71b3056a..0000000000 --- a/package/system/utils/usb-modeswitch/files/modeswitch.hotplug +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/sh - -local uVid uPid uMa uPr uSe -local sVe sMo sRe - -local modeswitch="/usr/bin/usb_modeswitch" - - -log() { - logger -t "usb-modeswitch" "$@" -} - -sanitize() { - sed -e 's/[[:space:]]\+$//; s/[[:space:]]\+/_/g' "$@" -} - -find_scsi_attrs() { - [ -n "$DEVPATH" ] && [ -d /sys/$DEVPATH/host* ] && { - log "$DEVICENAME is a SCSI device, waiting for it to settle..." - local timeout=20 - while [ $((--timeout)) -ge 0 ]; do - [ -d /sys/$DEVPATH/host*/target* ] && { - local scsi_dir - for scsi_dir in /sys/$DEVPATH/host*/target*/*; do - [ -d "$scsi_dir" ] || break - case "$scsi_dir" in - */host*/target*/*:*:*:*) - sVe=$(sanitize "$scsi_dir/vendor") - sMo=$(sanitize "$scsi_dir/model") - sRe=$(sanitize "$scsi_dir/rev") - - log "$DEVICENAME: Vendor=${sVe:-?} Model=${sMo:-?} Revision=${sRe:-?}" - return 0 - ;; - esac - done - } || { - sleep 1 - } - done - log "$DEVICENAME: Failed to get SCSI attributes!" - } - - return 1 -} - -find_usb_attrs() { - local usb_dir="/sys/$DEVPATH" - [ -f "$usb_dir/idVendor" ] || usb_dir="${usb_dir%/*}" - - uVid=$(cat "$usb_dir/idVendor") - uPid=$(cat "$usb_dir/idProduct") - uMa=$(sanitize "$usb_dir/manufacturer") - uPr=$(sanitize "$usb_dir/product") - uSe=$(sanitize "$usb_dir/serial") - - log "$DEVICENAME: Manufacturer=${uMa:-?} Product=${uPr:-?} Serial=${uSe:-?}" -} - -match_config_tag() { - local conf="$1" - local tag="$2" - - case "${conf##*/}" in - *:*$tag=*) - local cmp; eval "cmp=\$$tag" - local pat="${conf#*:$tag=}"; pat="${pat%%:*}" - case "$cmp" in - *$pat*) return 0 ;; - *) return 1 ;; - esac - ;; - esac - - return 0 -} - -match_config() { - local conf="$1" - local tag - - for tag in uMa uPr uSe sVe sMo sRe; do - match_config_tag "$conf" "$tag" || return 1 - done - - return 0 -} - - - -if [ "$ACTION" = add ]; then - [ -d "/etc/usb_modeswitch.d" ] && [ -x "$modeswitch" ] && { - case "$DEVICENAME" in - *-*:*.*) : ;; - *) exit 0 ;; - esac - - find_usb_attrs - - local candidates=0 - local conf configs - for conf in /etc/usb_modeswitch.d/$uVid:$uPid*; do - [ -f "$conf" ] || break - configs="${configs:+$configs }$conf" - $((candidates++)) - done - - # Found more than one candidate, read SCSI attributes and find the best match - [ $candidates -gt 1 ] && { - find_scsi_attrs - for conf in $configs; do - match_config "$conf" && { - configs="$conf" - candidates=1 - break - } - done - } - - # If a candidate is remaining, start usb-modeswitch - [ -n "$configs" ] && { - log "$DEVICENAME: Selecting ${configs%% *} for mode switching" - # ugly workaround, but working for all hw we got for testing - switching_done=0 - switching_tries=0 - local usb_dir="/sys/$DEVPATH" - [ -f "$usb_dir/idVendor" ] || usb_dir="${usb_dir%/*}" - while [ $switching_done -lt 1 -a $switching_tries -le 6 ]; do - $modeswitch -v $uVid -p $uPid -I -D -n -s 30 -c "${configs%% *}" - if [ $(sanitize "$usb_dir/idProduct") = $uPid ]; then - log "$DEVICENAME: Switching seemingly failed" - sleep 1 - else - switching_done=1 - fi - switching_tries=$(( $switching_tries + 1 )) - done - } - } -fi diff --git a/package/system/utils/usbmode/Makefile b/package/system/utils/usbmode/Makefile new file mode 100644 index 0000000000..3182e7b7f5 --- /dev/null +++ b/package/system/utils/usbmode/Makefile @@ -0,0 +1,57 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=usbmode +PKG_VERSION:=2013-05-31 +PKG_RELEASE=$(PKG_SOURCE_VERSION) + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=git://git.openwrt.org/project/usbmode.git +PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) +PKG_SOURCE_VERSION:=b62a33af03c39a8970249ce7afe7baec7ea9b91b +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz +CMAKE_INSTALL:=1 + +PKG_LICENSE:=GPLv2 +PKG_LICENSE_FILES:= + +PKG_MAINTAINER:=Felix Fietkau + +PKG_DATA_VERSION:=20121109 +PKG_DATA_URL:=http://www.draisberghof.de/usb_modeswitch +PKG_DATA_PATH:=usb-modeswitch-data-$(PKG_DATA_VERSION) +PKG_DATA_FILENAME:=$(PKG_DATA_PATH).tar.bz2 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +define Download/data + FILE:=$(PKG_DATA_FILENAME) + URL:=$(PKG_DATA_URL) + MD5SUM:=a7d23a03157871013a0d708ab2b1b6df +endef +$(eval $(call Download,data)) + +define Package/usb-modeswitch + SECTION:=utils + CATEGORY:=Utilities + DEPENDS:=+libubox +libblobmsg-json +libusb-1.0 + TITLE:=USB mode switching utility +endef + +define Build/Prepare + $(Build/Prepare/Default) + tar xvfj $(DL_DIR)/$(PKG_DATA_FILENAME) -C $(PKG_BUILD_DIR) + rm -f \ + $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/05c6:1000:sVe=GT +endef + +define Package/usb-modeswitch/install + $(INSTALL_DIR) $(1)/etc/hotplug.d/usb $(1)/sbin + perl $(PKG_BUILD_DIR)/convert-modeswitch.pl \ + $(PKG_BUILD_DIR)/$(PKG_DATA_PATH)/usb_modeswitch.d/* \ + > $(1)/etc/usb-mode.json + $(CP) ./files/usbmode.hotplug $(1)/etc/hotplug.d/usb/ + $(CP) $(PKG_INSTALL_DIR)/usr/sbin/usbmode $(1)/sbin/ +endef + +$(eval $(call BuildPackage,usb-modeswitch)) diff --git a/package/system/utils/usbmode/files/usbmode.hotplug b/package/system/utils/usbmode/files/usbmode.hotplug new file mode 100644 index 0000000000..4ef2bd8daa --- /dev/null +++ b/package/system/utils/usbmode/files/usbmode.hotplug @@ -0,0 +1,7 @@ +. /lib/functions/procd.sh + +procd_open_service "usbmode" +procd_open_instance +procd_set_param command "/sbin/usbmode" -s +procd_close_instance +procd_close_service -- 2.30.2