replace usb-modeswitch with a rewrite that should be more reliable
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 36812
This commit is contained in:
parent
041ac5dbff
commit
b1df77669d
4 changed files with 64 additions and 222 deletions
|
@ -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))
|
|
|
@ -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
|
|
57
package/system/utils/usbmode/Makefile
Normal file
57
package/system/utils/usbmode/Makefile
Normal file
|
@ -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))
|
7
package/system/utils/usbmode/files/usbmode.hotplug
Normal file
7
package/system/utils/usbmode/files/usbmode.hotplug
Normal file
|
@ -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
|
Loading…
Reference in a new issue