From: David Brownell <david-b@pacbell.net>
To: linux-hotplug@vger.kernel.org
Subject: Re: the match_flags support
Date: Sat, 24 Mar 2001 02:49:26 +0000 [thread overview]
Message-ID: <marc-linux-hotplug-98540560320285@msgid-missing> (raw)
In-Reply-To: <marc-linux-hotplug-98415238525418@msgid-missing>
[-- Attachment #1: Type: text/plain, Size: 809 bytes --]
I merged this and fixed some of the bugs. Here's the updated
version of "usb.agent" ... works on one RH7 system, haven't yet
tried on a distro with bash1. It's not in CVS yet (but the various
cleanup-only patches are).
Matt, this uses "range_lo <= bcdVersion < range_hi" for the range test.
- Dave
----- Original Message -----
From: "Gioele Barabucci" <gioele@gioelebarabucci.com>
To: <linux-hotplug-devel@lists.sourceforge.net>
Sent: Friday, March 09, 2001 8:07 AM
Subject: the match_flags support
And also this is done...
As always test and retest, I have only one USB device (a non working HP
scanner) untill I will take that ZIP100.
--
Gioele Barabucci (Gb])
) mailto:gioele@gioelebarabucci.com
) http://www.gioelebarabucci.com
) ) I've been and now I've gone
) ) /Magic Pie^Oasis
[-- Attachment #2: usb.agent --]
[-- Type: application/octet-stream, Size: 8987 bytes --]
#!/bin/bash
#
# USB-specific hotplug policy agent.
#
# This should handle 2.2.18+ and 2.4.* USB hotplugging,
# with a consistent framework for adding device and driver
# specific treatments.
#
# Kernel USB hotplug params include:
#
# ACTION=%s [add or remove]
# PRODUCT=%x/%x/%x
# INTERFACE=%d/%d/%d
# TYPE=%d/%d/%d
#
# And if usbdevfs is configured, also:
#
# DEVFS=/proc/bus/usb
# DEVICE=/proc/bus/usb/%03d/%03d
#
# If usbdevfs is mounted on /proc/bus/usb, $DEVICE is a file which
# can be read to get the device's current configuration descriptor.
# (The "usbmodules" utility helps do that.)
#
# On systems using Linux 2.4.* kernels, be sure to use the right
# modutils (2.4.2+). That ensures that hotplugging uses the list
# of modules installed for your kernel, rather than the one that's
# included here for use on systems without MODULE_DEVICE_TABLE
# support.
#
#
# HISTORY:
#
# 14-Mar-2001 Cleanup, bitmask the match_flags
# 26-Feb-2001 Cleanup, support comments (Gioele Barabucci)
# 23-Jan-2001 Update 2.2 handling; unfortunately there's no "feature
# test" that can work robustly
# 05-Jan-2001 Quick hack for kernel 2.4.0 and modutils 2.4.1
# 03-Jan-2001 Initial version of "new" hotplug agent, using feedback
# and contributions from Adam Richter, Ryan VanderBijl,
# Norbert Preining, Florian Lohoff, David Brownell and
# others. To replace the original /etc/usb/policy. (db)
# 15-Feb-2001 Remove use of "<<" (Adam Richter)
#
# $Id: usb.agent,v 1.9 2001/02/28 01:03:59 dbrownell Exp $
#
if [ -f /etc/sysconfig/usb ]; then
. /etc/sysconfig/usb
if [ "$USBD_ENABLE" = "false" ]; then
exit 0
fi
fi
cd /etc/hotplug
. hotplug.functions
# DEBUG=yes export DEBUG
# generated by modutils, for current 2.4.x kernels
MAP_CURRENT=$MODULE_DIR/modules.usbmap
# used if MAP_CURRENT is missing; for 2.2.x kernels
MAP_DISTMAP=$HOTPLUG_DIR/usb.distmap
#
# used for kernel drivers that don't show up in CURRENT or DISTMAP,
# currently input drivers (joysticks, UPSs, etc) and usb storage;
#
MAP_HANDMAP=$HOTPLUG_DIR/usb.handmap
#
# used to run config scripts for user mode drivers (jPhoto, gPhoto2,
# rio500 tools, etc) ... instead of naming kernel modules, it names
# config scripts (which mustn't overlap with kernel modules). Those
# could change $DEVICE permissions, etc.
#
MAP_USERMAP=$HOTPLUG_DIR/usb.usermap
# accumulates list of modules we may care about
DRIVERS=""
if [ "$PRODUCT" = "" -o "$ACTION" = "" ]; then
mesg Bad USB agent invocation
exit 1
fi
# we can't "unset IFS" on bash1, so save a copy
DEFAULT_IFS="$IFS"
#
# Each modules.usbmap format line corresponds to one entry in a
# MODULE_DEVICE_TABLE(usb,...) declaration in a kernel file.
#
# Think of it as a database column with up to three "match specs"
# to associate kernel modules with particular devices or classes
# of device. The match specs provide a reasonably good filtering
# mechanism, but some driver probe() routines need to provide
# extra filtering.
#
declare -i usb_idVendor usb_idProduct usb_bcdDevice
declare -i usb_bDeviceClass usb_bDeviceSubClass usb_bDeviceProtocol
declare -i usb_bInterfaceClass usb_bInterfaceSubClass usb_bInterfaceProtocol
usb_convert_vars ()
{
if [ "$AWK" = "" ]; then
mesg "can't find awk!"
exit 1
fi
set `echo $PRODUCT | $AWK -F/ '{print "0x" $1, "0x" $2, "0x" $3 }'` ''
usb_idVendor=$1
usb_idProduct=$2
usb_bcdDevice=$3
if [ "$TYPE" != "" ]; then
IFS=/
set $TYPE ''
usb_bDeviceClass=$1
usb_bDeviceSubClass=$2
usb_bDeviceProtocol=$3
IFS="$DEFAULT_IFS"
else
# out-of-range values
usb_bDeviceClass=1000
usb_bDeviceSubClass=1000
usb_bDeviceProtocol=1000
fi
if [ "$INTERFACE" != "" ]; then
IFS=/
set $INTERFACE ''
usb_bInterfaceClass=$1
usb_bInterfaceSubClass=$2
usb_bInterfaceProtocol=$3
IFS="$DEFAULT_IFS"
else
# out-of-range values
usb_bInterfaceClass=1000
usb_bInterfaceSubClass=1000
usb_bInterfaceProtocol=1000
fi
}
declare -i USB_MATCH_VENDOR=0x0001
declare -i USB_MATCH_PRODUCT=0x0002
declare -i USB_MATCH_DEV_LO=0x0004
declare -i USB_MATCH_DEV_HI=0x0008
declare -i USB_MATCH_DEV_CLASS=0x0010
declare -i USB_MATCH_DEV_SUBCLASS=0x0020
declare -i USB_MATCH_DEV_PROTOCOL=0x0040
declare -i USB_MATCH_INT_CLASS=0x0080
declare -i USB_MATCH_INT_SUBCLASS=0x0100
declare -i USB_MATCH_INT_PROTOCOL=0x0200
#
# stdin is "modules.usbmap" syntax
# on return, all matching modules were added to $DRIVERS
#
usb_map_modules ()
{
# convert the usb_device_id fields to integers as we read them
local line module
declare -i match_flags
declare -i idVendor idProduct bcdDevice_lo bcdDevice_hi
declare -i bDeviceClass bDeviceSubClass bDeviceProtocol
declare -i bInterfaceClass bInterfaceSubClass bInterfaceProtocol
# look at each usb_device_id entry
# collect all matches in $DRIVERS
while read line
do
# comments are lines that start with "#" ...
# be careful, they still get parsed by bash!
case "$line" in
\#*) continue ;;
esac
set $line
module=$1
match_flags=$2
idVendor=$3
idProduct=$4
bcdDevice_lo=$5
bcdDevice_hi=$6
bDeviceClass=$7
bDeviceSubClass=$8
bDeviceProtocol=$9
shift 9
bInterfaceClass=$1
bInterfaceSubClass=$2
bInterfaceProtocol=$3
: checkmatch $module
: idVendor $idVendor $usb_idVendor
if [ $USB_MATCH_VENDOR -eq $(( $match_flags & $USB_MATCH_VENDOR )) ] &&
[ $idVendor -ne $usb_idVendor ]; then
continue
fi
: idProduct $idProduct $usb_idProduct
if [ $USB_MATCH_PRODUCT -eq $(( $match_flags & $USB_MATCH_PRODUCT )) ] &&
[ $idProduct -ne $usb_idProduct ]; then
continue
fi
: bcdDevice range $bcdDevice_hi $bcdDevice_lo actual $usb_bcdDevice
if [ $USB_MATCH_DEV_LO -eq $(( $match_flags & $USB_MATCH_DEV_LO )) ] &&
[ $usb_bcdDevice -lt $bcdDevice_lo ]; then
continue
fi
# bcdDevice_lo <= bcdDevice < bcdDevice_hi
if [ $USB_MATCH_DEV_HI -eq $(( $match_flags & $USB_MATCH_DEV_HI )) ] &&
[ $usb_bcdDevice -ge $bcdDevice_hi ]; then
continue
fi
: bDeviceClass $bDeviceClass $usb_bDeviceClass
if [ $USB_MATCH_DEV_CLASS -eq $(( $match_flags & $USB_MATCH_DEV_CLASS )) ] &&
[ $bDeviceClass -ne $usb_bDeviceClass ]; then
continue
fi
: bDeviceSubClass $bDeviceSubClass $usb_bDeviceSubClass
if [ $USB_MATCH_DEV_SUBCLASS -eq $(( $match_flags & $USB_MATCH_DEV_SUBCLASS )) ] &&
[ $bDeviceSubClass -ne $usb_bDeviceSubClass ]; then
continue
fi
: bDeviceProtocol $bDeviceProtocol $usb_bDeviceProtocol
if [ $USB_MATCH_DEV_PROTOCOL -eq $(( $match_flags & $USB_MATCH_DEV_PROTOCOL )) ] &&
[ $bDeviceProtocol -ne $usb_bDeviceProtocol ]; then
continue
fi
# NOTE: for now, this only checks the first of perhaps
# several interfaces for this device.
: bInterfaceClass $bInterfaceClass $usb_bInterfaceClass
if [ $USB_MATCH_INT_CLASS -eq $(( $match_flags & $USB_MATCH_INT_CLASS )) ] &&
[ $bInterfaceClass -ne $usb_bInterfaceClass ]; then
continue
fi
: bInterfaceSubClass $bInterfaceSubClass $usb_bInterfaceSubClass
if [ $USB_MATCH_INT_SUBCLASS -eq $(( $match_flags & $USB_MATCH_INT_SUBCLASS )) ] &&
[ $bInterfaceSubClass -ne $usb_bInterfaceSubClass ]; then
continue
fi
: bInterfaceProtocol $bInterfaceProtocol $usb_bInterfaceProtocol
if [ $USB_MATCH_INT_PROTOCOL -eq $(( $match_flags & $USB_MATCH_INT_PROTOCOL )) ] &&
[ $bInterfaceProtocol -ne $usb_bInterfaceProtocol ]; then
continue
fi
# It was a match!
DRIVERS="$module $DRIVERS"
: drivers $DRIVERS
done
}
#
# What to do with this USB hotplug event?
#
case $ACTION in
add)
usb_convert_vars
FOUND=false
LABEL="USB product $PRODUCT"
# on 2.4 systems, modutils 2.4.2+ maintains MAP_CURRENT
# ... otherwise we can't rely on it (sigh)
case "$KERNEL" in
2.4.*|2.5.*)
if [ -r $MAP_CURRENT ]; then
load_drivers usb $MAP_CURRENT "$LABEL"
fi;;
*)
if [ -r $MAP_DISTMAP ]; then
load_drivers usb $MAP_DISTMAP "$LABEL"
fi;;
esac
if [ "$DRIVERS" != "" ]; then
FOUND=true
fi
# cope with special driver module configurations
# (mostly HID devices, until input can hotplug)
if [ -r $MAP_HANDMAP ]; then
load_drivers usb $MAP_HANDMAP "$LABEL"
if [ "$DRIVERS" != "" ]; then
FOUND=true
fi
fi
# some devices have user-mode drivers (no kernel module, but config)
if [ "$FOUND" = "false" -a -r $MAP_USERMAP ]; then
MODPROBE=:
load_drivers usb $MAP_USERMAP "$LABEL"
if [ "$DRIVERS" != "" ]; then
FOUND=true
fi
fi
if [ "$FOUND" = "false" ]; then
mesg "... no drivers for $LABEL"
exit 2
fi
;;
*)
mesg USB $ACTION event not supported
exit 1
;;
esac
prev parent reply other threads:[~2001-03-24 2:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-03-09 15:39 the match_flags support Gioele Barabucci
2001-03-09 22:43 ` Matthew Dharm
2001-03-10 12:44 ` Gioele Barabucci
2001-03-24 2:49 ` David Brownell [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=marc-linux-hotplug-98540560320285@msgid-missing \
--to=david-b@pacbell.net \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).