From b1df77669d3dbd804723f15ec3fa37d6cbd20f1a Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
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 <nbd@openwrt.org>

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 <nbd@openwrt.org>
-
-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 <nbd@openwrt.org>
+
+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
-- 
GitLab