Remove obsolete tool, bus_autoconf, which is replaced by devmatch(8).
This commit is contained in:
parent
201c73815f
commit
78b52692f2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=329459
@ -1,46 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
#
|
|
||||||
# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
# SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Example on how to use:
|
|
||||||
#
|
|
||||||
# make clean all install
|
|
||||||
#
|
|
||||||
# ./bus_autoconf.sh /boot/kernel/*.ko | less
|
|
||||||
#
|
|
||||||
|
|
||||||
PROG= bus_autoconf
|
|
||||||
MAN=
|
|
||||||
BINDIR?= /usr/local/bin
|
|
||||||
|
|
||||||
SRCS+= bus_autoconf.c
|
|
||||||
SRCS+= bus_load_file.c
|
|
||||||
SRCS+= bus_sections.c
|
|
||||||
SRCS+= bus_usb.c
|
|
||||||
|
|
||||||
WARNS= 6
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,125 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Disclaimer: This utility and format is subject to change and not a
|
|
||||||
* committed interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <sysexits.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "bus_autoconf.h"
|
|
||||||
#include "bus_sections.h"
|
|
||||||
#include "bus_load_file.h"
|
|
||||||
#include "bus_usb.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(void)
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
"bus_autoconf - devd config file generator\n"
|
|
||||||
" -i <structure_type,module.ko>\n"
|
|
||||||
" -F <format_file>\n"
|
|
||||||
" -h show usage\n"
|
|
||||||
);
|
|
||||||
exit(EX_USAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
const char *params = "i:F:h";
|
|
||||||
char *fname;
|
|
||||||
char *section;
|
|
||||||
char *module;
|
|
||||||
char *postfix;
|
|
||||||
uint8_t *ptr;
|
|
||||||
uint32_t len;
|
|
||||||
int c;
|
|
||||||
int any_opt = 0;
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, params)) != -1) {
|
|
||||||
switch (c) {
|
|
||||||
case 'i':
|
|
||||||
fname = optarg;
|
|
||||||
load_file(fname, &ptr, &len);
|
|
||||||
|
|
||||||
module = strchr(fname, ',');
|
|
||||||
if (module == NULL) {
|
|
||||||
errx(EX_USAGE, "Invalid input "
|
|
||||||
"file name '%s'", fname);
|
|
||||||
}
|
|
||||||
/* split module and section */
|
|
||||||
*module++ = 0;
|
|
||||||
|
|
||||||
/* remove postfix */
|
|
||||||
postfix = strchr(module, '.');
|
|
||||||
if (postfix)
|
|
||||||
*postfix = 0;
|
|
||||||
|
|
||||||
/* get section name */
|
|
||||||
section = fname;
|
|
||||||
|
|
||||||
/* check section type */
|
|
||||||
if (strncmp(section, "usb_", 4) == 0)
|
|
||||||
usb_import_entries(section, module, ptr, len);
|
|
||||||
else
|
|
||||||
errx(EX_USAGE, "Invalid section '%s'", section);
|
|
||||||
|
|
||||||
free(ptr);
|
|
||||||
|
|
||||||
any_opt = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
fname = optarg;
|
|
||||||
load_file(fname, &ptr, &len);
|
|
||||||
format_parse_entries(ptr, len);
|
|
||||||
free(ptr);
|
|
||||||
|
|
||||||
any_opt = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
usage();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (any_opt == 0)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
usb_dump_entries();
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BUS_AUTOCONF_H_
|
|
||||||
#define _BUS_AUTOCONF_H_
|
|
||||||
|
|
||||||
#endif /* _BUS_AUTOCONF_H_ */
|
|
@ -1,78 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# $FreeBSD$
|
|
||||||
#
|
|
||||||
# Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
# SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
OS=FreeBSD
|
|
||||||
DOLLAR=$
|
|
||||||
OBJCOPY=objcopy
|
|
||||||
|
|
||||||
cat <<EOF
|
|
||||||
#
|
|
||||||
# ${DOLLAR}${OS}${DOLLAR}
|
|
||||||
#
|
|
||||||
# This file was automatically generated by "tools/tools/bus_autoconf/bus_autoconf.sh".
|
|
||||||
# Please do not edit!
|
|
||||||
#
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
rm -f bus_autoconf_format.bin
|
|
||||||
rm -f bus_autoconf_args.txt
|
|
||||||
rm -f bus_autoconf.ids
|
|
||||||
|
|
||||||
for F in $*
|
|
||||||
do
|
|
||||||
|
|
||||||
G=$(basename ${F})
|
|
||||||
|
|
||||||
# Format information
|
|
||||||
${OBJCOPY} -j bus_autoconf_format -O binary ${F} bus_autoconf.ids 2> /dev/null
|
|
||||||
[ -f bus_autoconf.ids ] && cat bus_autoconf.ids >> bus_autoconf_format.bin
|
|
||||||
|
|
||||||
# USB Host mode
|
|
||||||
${OBJCOPY} -j usb_host_id -O binary ${F} "usb_host_id,${G}" 2> /dev/null
|
|
||||||
[ -f "usb_host_id,${G}" ] && (echo -n " -i usb_host_id,${G}" >> bus_autoconf_args.txt)
|
|
||||||
|
|
||||||
# USB Device mode
|
|
||||||
${OBJCOPY} -j usb_device_id -O binary ${F} "usb_device_id,${G}" 2> /dev/null
|
|
||||||
[ -f "usb_device_id,${G}" ] && (echo -n " -i usb_device_id,${G}" >> bus_autoconf_args.txt)
|
|
||||||
|
|
||||||
# USB Dual mode
|
|
||||||
${OBJCOPY} -j usb_dual_id -O binary ${F} "usb_dual_id,${G}" 2> /dev/null
|
|
||||||
[ -f "usb_dual_id,${G}" ] && (echo -n " -i usb_dual_id,${G}" >> bus_autoconf_args.txt)
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
# Dump all data
|
|
||||||
bus_autoconf -F bus_autoconf_format.bin $(cat bus_autoconf_args.txt)
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
rm -f -- \
|
|
||||||
$(cat bus_autoconf_args.txt) \
|
|
||||||
bus_autoconf_args.txt \
|
|
||||||
bus_autoconf_format.bin \
|
|
||||||
bus_autoconf.ids
|
|
@ -1,111 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
|
||||||
#define U16_XOR "8"
|
|
||||||
#define U32_XOR "12"
|
|
||||||
#define U64_XOR "56"
|
|
||||||
#define U8_BITFIELD_XOR "7"
|
|
||||||
#define U16_BITFIELD_XOR "15"
|
|
||||||
#define U32_BITFIELD_XOR "31"
|
|
||||||
#define U64_BITFIELD_XOR "63"
|
|
||||||
#else
|
|
||||||
#define U16_XOR "0"
|
|
||||||
#define U32_XOR "0"
|
|
||||||
#define U64_XOR "0"
|
|
||||||
#define U8_BITFIELD_XOR "0"
|
|
||||||
#define U16_BITFIELD_XOR "0"
|
|
||||||
#define U32_BITFIELD_XOR "0"
|
|
||||||
#define U64_BITFIELD_XOR "0"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USB_HAVE_COMPAT_LINUX
|
|
||||||
#define MFL_SIZE "1"
|
|
||||||
#else
|
|
||||||
#define MFL_SIZE "0"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const char __section("bus_autoconf_format") __used usb_id_format[] = {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Declare three different sections that use the same format.
|
|
||||||
* All sizes are in bits. Fields cannot be greater than
|
|
||||||
* 8 bits in size. Bitfields having a size greater than 1
|
|
||||||
* must fit within the byte in which the bitfield is defined.
|
|
||||||
*/
|
|
||||||
|
|
||||||
"usb_host_id{256,:}"
|
|
||||||
"usb_device_id{256,:}"
|
|
||||||
"usb_dual_id{256,:}"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Describe all fields in the usb_device_id structure
|
|
||||||
* which is found in sys/dev/usb/usbdi.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if BITS_PER_LONG == 32 || BITS_PER_LONG == 64
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
#if BITS_PER_LONG == 64
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
"unused{0,8}"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#error "Please update code."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"idVendor[0]{" U16_XOR ",8}"
|
|
||||||
"idVendor[1]{" U16_XOR ",8}"
|
|
||||||
"idProduct[0]{" U16_XOR ",8}"
|
|
||||||
"idProduct[1]{" U16_XOR ",8}"
|
|
||||||
"bcdDevice_lo[0]{" U16_XOR ",8}"
|
|
||||||
"bcdDevice_lo[1]{" U16_XOR ",8}"
|
|
||||||
"bcdDevice_hi[0]{" U16_XOR ",8}"
|
|
||||||
"bcdDevice_hi[1]{" U16_XOR ",8}"
|
|
||||||
|
|
||||||
"bDeviceClass{0,8}"
|
|
||||||
"bDeviceSubClass{0,8}"
|
|
||||||
"bDeviceProtocol{0,8}"
|
|
||||||
"bInterfaceClass{0,8}"
|
|
||||||
"bInterfaceSubClass{0,8}"
|
|
||||||
"bInterfaceProtocol{0,8}"
|
|
||||||
|
|
||||||
/* NOTE: On big endian machines bitfields are bitreversed. */
|
|
||||||
|
|
||||||
"mf_vendor{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_product{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_dev_lo{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_dev_hi{" U8_BITFIELD_XOR ",1}"
|
|
||||||
|
|
||||||
"mf_dev_class{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_dev_subclass{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_dev_protocol{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_int_class{" U8_BITFIELD_XOR ",1}"
|
|
||||||
|
|
||||||
"mf_int_subclass{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"mf_int_protocol{" U8_BITFIELD_XOR ",1}"
|
|
||||||
"unused{" U8_BITFIELD_XOR ",6}"
|
|
||||||
|
|
||||||
"mfl_vendor{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_product{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_dev_lo{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_dev_hi{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
|
|
||||||
"mfl_dev_class{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_dev_subclass{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_dev_protocol{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_int_class{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
|
|
||||||
"mfl_int_subclass{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"mfl_int_protocol{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
"unused{" U16_XOR "," MFL_SIZE "}"
|
|
||||||
};
|
|
@ -1,76 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <sysexits.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "bus_load_file.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
load_file(const char *fname, uint8_t **pptr, uint32_t *plen)
|
|
||||||
{
|
|
||||||
uint8_t *ptr;
|
|
||||||
ssize_t len;
|
|
||||||
off_t off;
|
|
||||||
int f;
|
|
||||||
|
|
||||||
f = open(fname, O_RDONLY);
|
|
||||||
if (f < 0)
|
|
||||||
err(EX_NOINPUT, "Cannot open file '%s'", fname);
|
|
||||||
|
|
||||||
off = lseek(f, 0, SEEK_END);
|
|
||||||
if (off < 0) {
|
|
||||||
err(EX_NOINPUT, "Cannot seek to "
|
|
||||||
"end of file '%s'", fname);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lseek(f, 0, SEEK_SET) < 0) {
|
|
||||||
err(EX_NOINPUT, "Cannot seek to "
|
|
||||||
"beginning of file '%s'", fname);
|
|
||||||
}
|
|
||||||
|
|
||||||
len = off;
|
|
||||||
if (len != off)
|
|
||||||
err(EX_NOINPUT, "File '%s' is too big", fname);
|
|
||||||
|
|
||||||
ptr = malloc(len);
|
|
||||||
if (ptr == NULL)
|
|
||||||
errx(EX_SOFTWARE, "Out of memory");
|
|
||||||
|
|
||||||
if (read(f, ptr, len) != len)
|
|
||||||
err(EX_NOINPUT, "Cannot read all data");
|
|
||||||
|
|
||||||
close(f);
|
|
||||||
|
|
||||||
*pptr = ptr;
|
|
||||||
*plen = len;
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BUS_LOAD_FILE_H_
|
|
||||||
#define _BUS_LOAD_FILE_H_
|
|
||||||
|
|
||||||
void load_file(const char *, uint8_t **, uint32_t *);
|
|
||||||
|
|
||||||
#endif /* _BUS_LOAD_FILE_H_ */
|
|
@ -1,223 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sysexits.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <sys/queue.h>
|
|
||||||
|
|
||||||
#include "bus_sections.h"
|
|
||||||
|
|
||||||
#define MAX_STRING 64
|
|
||||||
|
|
||||||
struct format_info;
|
|
||||||
typedef TAILQ_HEAD(,format_info) format_info_head_t;
|
|
||||||
typedef TAILQ_ENTRY(format_info) format_info_entry_t;
|
|
||||||
|
|
||||||
static format_info_head_t format_head = TAILQ_HEAD_INITIALIZER(format_head);
|
|
||||||
|
|
||||||
struct format_info {
|
|
||||||
format_info_entry_t entry;
|
|
||||||
format_info_head_t fields;
|
|
||||||
char name[MAX_STRING];
|
|
||||||
uint16_t bit_offset;
|
|
||||||
uint16_t bit_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct format_info *
|
|
||||||
format_info_new(char *pstr, uint16_t bo, uint16_t bs)
|
|
||||||
{
|
|
||||||
struct format_info *pfi;
|
|
||||||
|
|
||||||
pfi = malloc(sizeof(*pfi));
|
|
||||||
if (pfi == NULL)
|
|
||||||
errx(EX_SOFTWARE, "Out of memory.");
|
|
||||||
|
|
||||||
memset(pfi, 0, sizeof(*pfi));
|
|
||||||
|
|
||||||
TAILQ_INIT(&pfi->fields);
|
|
||||||
|
|
||||||
strlcpy(pfi->name, pstr, sizeof(pfi->name));
|
|
||||||
pfi->bit_offset = bo;
|
|
||||||
pfi->bit_size = bs;
|
|
||||||
return (pfi);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct format_info *
|
|
||||||
format_get_section(const char *section)
|
|
||||||
{
|
|
||||||
const struct format_info *psub;
|
|
||||||
static const struct format_info *psub_last;
|
|
||||||
static const char *psub_cache;
|
|
||||||
|
|
||||||
if (psub_cache && strcmp(psub_cache, section) == 0)
|
|
||||||
return (psub_last);
|
|
||||||
|
|
||||||
TAILQ_FOREACH(psub, &format_head, entry) {
|
|
||||||
if (strcmp(section, psub->name) == 0) {
|
|
||||||
psub_cache = section;
|
|
||||||
psub_last = psub;
|
|
||||||
return (psub);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
warnx("Section '%s' not found", section);
|
|
||||||
psub_cache = section;
|
|
||||||
psub_last = psub;
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t
|
|
||||||
format_get_section_size(const char *section)
|
|
||||||
{
|
|
||||||
const struct format_info *pfi;
|
|
||||||
|
|
||||||
pfi = format_get_section(section);
|
|
||||||
if (pfi == NULL)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
return ((pfi->bit_offset + 7) / 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t
|
|
||||||
format_get_field(const char *section, const char *field,
|
|
||||||
const uint8_t *ptr, uint16_t size)
|
|
||||||
{
|
|
||||||
const struct format_info *pfi;
|
|
||||||
const struct format_info *psub;
|
|
||||||
uint16_t rem;
|
|
||||||
uint16_t off;
|
|
||||||
uint16_t sz;
|
|
||||||
|
|
||||||
pfi = format_get_section(section);
|
|
||||||
if (pfi == NULL)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/* skip until we find the fields */
|
|
||||||
while (pfi && TAILQ_FIRST(&pfi->fields) == NULL)
|
|
||||||
pfi = TAILQ_NEXT(pfi, entry);
|
|
||||||
|
|
||||||
if (pfi == NULL)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
TAILQ_FOREACH(psub, &pfi->fields, entry) {
|
|
||||||
if (strcmp(field, psub->name) == 0) {
|
|
||||||
|
|
||||||
/* range check */
|
|
||||||
if (((psub->bit_offset + psub->bit_size) / 8) > size)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/* compute byte offset */
|
|
||||||
rem = psub->bit_offset & 7;
|
|
||||||
off = psub->bit_offset / 8;
|
|
||||||
sz = psub->bit_size;
|
|
||||||
|
|
||||||
/* extract bit-field */
|
|
||||||
return ((ptr[off] >> rem) & ((1 << sz) - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
warnx("Field '%s' not found in '%s'", field, pfi->name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
format_parse_entries(const uint8_t *ptr, uint32_t len)
|
|
||||||
{
|
|
||||||
static const char *command_list = "012345678:";
|
|
||||||
const char *cmd;
|
|
||||||
struct format_info *pfi;
|
|
||||||
struct format_info *pfi_last = NULL;
|
|
||||||
char linebuf[3][MAX_STRING];
|
|
||||||
uint32_t off = 0;
|
|
||||||
uint16_t bit_offset = 0;
|
|
||||||
uint8_t state = 0;
|
|
||||||
uint8_t cmd_index;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The format we are parsing:
|
|
||||||
* <string>{string,string}<next_string>{...}
|
|
||||||
*/
|
|
||||||
while (len--) {
|
|
||||||
c = *(ptr++);
|
|
||||||
|
|
||||||
/* skip some characters */
|
|
||||||
if (c == 0 || c == '\n' || c == '\r' || c == ' ' || c == '\t')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* accumulate non-field delimiters */
|
|
||||||
if (strchr("{,}", c) == NULL) {
|
|
||||||
if (off < (MAX_STRING - 1)) {
|
|
||||||
linebuf[state][off] = c;
|
|
||||||
off++;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* parse keyword */
|
|
||||||
linebuf[state][off] = 0;
|
|
||||||
off = 0;
|
|
||||||
state++;
|
|
||||||
if (state == 3) {
|
|
||||||
/* check for command in command list */
|
|
||||||
cmd = strchr(command_list, linebuf[2][0]);
|
|
||||||
if (cmd != NULL)
|
|
||||||
cmd_index = cmd - command_list;
|
|
||||||
else
|
|
||||||
cmd_index = 255;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check for new field, format is:
|
|
||||||
*
|
|
||||||
* <field_name>{bit_offset_xor, bit_size}
|
|
||||||
*/
|
|
||||||
if (cmd_index < 9 && pfi_last != NULL) {
|
|
||||||
pfi = format_info_new(linebuf[0], bit_offset ^
|
|
||||||
atoi(linebuf[1]), cmd_index);
|
|
||||||
TAILQ_INSERT_TAIL(&pfi_last->fields, pfi, entry);
|
|
||||||
bit_offset += cmd_index;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Check for new section, format is:
|
|
||||||
*
|
|
||||||
* <section_name>{section_bit_size, :}
|
|
||||||
*/
|
|
||||||
if (cmd_index == 9) {
|
|
||||||
pfi_last = format_info_new(linebuf[0],
|
|
||||||
atoi(linebuf[1]), cmd_index);
|
|
||||||
TAILQ_INSERT_TAIL(&format_head, pfi_last, entry);
|
|
||||||
bit_offset = 0;
|
|
||||||
}
|
|
||||||
state = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BUS_SECTIONS_H_
|
|
||||||
#define _BUS_SECTIONS_H_
|
|
||||||
|
|
||||||
uint16_t format_get_section_size(const char *);
|
|
||||||
uint8_t format_get_field(const char *, const char *, const uint8_t *, uint16_t);
|
|
||||||
void format_parse_entries(const uint8_t *, uint32_t);
|
|
||||||
|
|
||||||
#endif /* _BUS_SECTIONS_H_ */
|
|
@ -1,386 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <sysexits.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/queue.h>
|
|
||||||
|
|
||||||
#include "bus_autoconf.h"
|
|
||||||
#include "bus_sections.h"
|
|
||||||
#include "bus_usb.h"
|
|
||||||
|
|
||||||
struct usb_blob;
|
|
||||||
typedef TAILQ_HEAD(,usb_blob) usb_blob_head_t;
|
|
||||||
typedef TAILQ_ENTRY(usb_blob) usb_blob_entry_t;
|
|
||||||
|
|
||||||
static usb_blob_head_t usb_blob_head = TAILQ_HEAD_INITIALIZER(usb_blob_head);
|
|
||||||
static uint32_t usb_blob_count;
|
|
||||||
|
|
||||||
struct usb_blob {
|
|
||||||
usb_blob_entry_t entry;
|
|
||||||
struct usb_device_id temp;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To ensure that the correct USB driver is loaded, the driver having
|
|
||||||
* the most information about the device must be probed first. Then
|
|
||||||
* more generic drivers shall be probed.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
usb_compare(const void *_a, const void *_b)
|
|
||||||
{
|
|
||||||
const struct usb_device_id *a = _a;
|
|
||||||
const struct usb_device_id *b = _b;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
/* vendor matches first */
|
|
||||||
|
|
||||||
if (a->match_flag_vendor > b->match_flag_vendor)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_vendor < b->match_flag_vendor)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
/* product matches first */
|
|
||||||
|
|
||||||
if (a->match_flag_product > b->match_flag_product)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_product < b->match_flag_product)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
/* device class matches first */
|
|
||||||
|
|
||||||
if (a->match_flag_dev_class > b->match_flag_dev_class)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_dev_class < b->match_flag_dev_class)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
if (a->match_flag_dev_subclass > b->match_flag_dev_subclass)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_dev_subclass < b->match_flag_dev_subclass)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
/* interface class matches first */
|
|
||||||
|
|
||||||
if (a->match_flag_int_class > b->match_flag_int_class)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_int_class < b->match_flag_int_class)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
if (a->match_flag_int_subclass > b->match_flag_int_subclass)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_int_subclass < b->match_flag_int_subclass)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
if (a->match_flag_int_protocol > b->match_flag_int_protocol)
|
|
||||||
return (-1);
|
|
||||||
if (a->match_flag_int_protocol < b->match_flag_int_protocol)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
/* then sort according to value */
|
|
||||||
|
|
||||||
if (a->idVendor > b->idVendor)
|
|
||||||
return (1);
|
|
||||||
if (a->idVendor < b->idVendor)
|
|
||||||
return (-1);
|
|
||||||
if (a->idProduct > b->idProduct)
|
|
||||||
return (1);
|
|
||||||
if (a->idProduct < b->idProduct)
|
|
||||||
return (-1);
|
|
||||||
if (a->bDeviceClass > b->bDeviceClass)
|
|
||||||
return (1);
|
|
||||||
if (a->bDeviceClass < b->bDeviceClass)
|
|
||||||
return (-1);
|
|
||||||
if (a->bDeviceSubClass > b->bDeviceSubClass)
|
|
||||||
return (1);
|
|
||||||
if (a->bDeviceSubClass < b->bDeviceSubClass)
|
|
||||||
return (-1);
|
|
||||||
if (a->bDeviceProtocol > b->bDeviceProtocol)
|
|
||||||
return (1);
|
|
||||||
if (a->bDeviceProtocol < b->bDeviceProtocol)
|
|
||||||
return (-1);
|
|
||||||
if (a->bInterfaceClass > b->bInterfaceClass)
|
|
||||||
return (1);
|
|
||||||
if (a->bInterfaceClass < b->bInterfaceClass)
|
|
||||||
return (-1);
|
|
||||||
if (a->bInterfaceSubClass > b->bInterfaceSubClass)
|
|
||||||
return (1);
|
|
||||||
if (a->bInterfaceSubClass < b->bInterfaceSubClass)
|
|
||||||
return (-1);
|
|
||||||
if (a->bInterfaceProtocol > b->bInterfaceProtocol)
|
|
||||||
return (1);
|
|
||||||
if (a->bInterfaceProtocol < b->bInterfaceProtocol)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
/* in the end sort by module name and mode */
|
|
||||||
|
|
||||||
retval = strcmp(a->module_name, b->module_name);
|
|
||||||
if (retval == 0)
|
|
||||||
retval = strcmp(a->module_mode, b->module_mode);
|
|
||||||
return (retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usb_sort_entries(struct usb_device_id *id, uint32_t nid)
|
|
||||||
{
|
|
||||||
qsort(id, nid, sizeof(*id), &usb_compare);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usb_import_entry(struct usb_device_id *id, const char *type,
|
|
||||||
const char *module, const uint8_t *ptr, uint16_t size)
|
|
||||||
{
|
|
||||||
const char *mode;
|
|
||||||
|
|
||||||
if (strstr(type, "_host_"))
|
|
||||||
mode = "host";
|
|
||||||
else if (strstr(type, "_device_"))
|
|
||||||
mode = "device";
|
|
||||||
else
|
|
||||||
mode = "(host|device)";
|
|
||||||
|
|
||||||
strlcpy(id->module_name, module, sizeof(id->module_name));
|
|
||||||
strlcpy(id->module_mode, mode, sizeof(id->module_mode));
|
|
||||||
|
|
||||||
/* import data from binary object */
|
|
||||||
|
|
||||||
if (format_get_field(type, "mfl_vendor", ptr, size))
|
|
||||||
id->match_flag_vendor = 1;
|
|
||||||
if (format_get_field(type, "mfl_product", ptr, size))
|
|
||||||
id->match_flag_product = 1;
|
|
||||||
if (format_get_field(type, "mfl_dev_lo", ptr, size))
|
|
||||||
id->match_flag_dev_lo = 1;
|
|
||||||
if (format_get_field(type, "mfl_dev_hi", ptr, size))
|
|
||||||
id->match_flag_dev_hi = 1;
|
|
||||||
if (format_get_field(type, "mfl_dev_class", ptr, size))
|
|
||||||
id->match_flag_dev_class = 1;
|
|
||||||
if (format_get_field(type, "mfl_dev_subclass", ptr, size))
|
|
||||||
id->match_flag_dev_subclass = 1;
|
|
||||||
if (format_get_field(type, "mfl_dev_protocol", ptr, size))
|
|
||||||
id->match_flag_dev_protocol = 1;
|
|
||||||
if (format_get_field(type, "mfl_int_class", ptr, size))
|
|
||||||
id->match_flag_int_class = 1;
|
|
||||||
if (format_get_field(type, "mfl_int_subclass", ptr, size))
|
|
||||||
id->match_flag_int_subclass = 1;
|
|
||||||
if (format_get_field(type, "mfl_int_protocol", ptr, size))
|
|
||||||
id->match_flag_int_protocol = 1;
|
|
||||||
|
|
||||||
id->idVendor = format_get_field(type, "idVendor[0]", ptr, size) |
|
|
||||||
(format_get_field(type, "idVendor[1]", ptr, size) << 8);
|
|
||||||
id->idProduct = format_get_field(type, "idProduct[0]", ptr, size) |
|
|
||||||
(format_get_field(type, "idProduct[1]", ptr, size) << 8);
|
|
||||||
|
|
||||||
id->bcdDevice_lo = format_get_field(type, "bcdDevice_lo[0]", ptr, size) |
|
|
||||||
(format_get_field(type, "bcdDevice_lo[1]", ptr, size) << 8);
|
|
||||||
|
|
||||||
id->bcdDevice_hi = format_get_field(type, "bcdDevice_hi[0]", ptr, size) |
|
|
||||||
(format_get_field(type, "bcdDevice_hi[1]", ptr, size) << 8);
|
|
||||||
|
|
||||||
id->bDeviceClass = format_get_field(type, "bDeviceClass", ptr, size);
|
|
||||||
id->bDeviceSubClass = format_get_field(type, "bDeviceSubClass", ptr, size);
|
|
||||||
id->bDeviceProtocol = format_get_field(type, "bDeviceProtocol", ptr, size);
|
|
||||||
|
|
||||||
id->bInterfaceClass = format_get_field(type, "bInterfaceClass", ptr, size);
|
|
||||||
id->bInterfaceSubClass = format_get_field(type, "bInterfaceSubClass", ptr, size);
|
|
||||||
id->bInterfaceProtocol = format_get_field(type, "bInterfaceProtocol", ptr, size);
|
|
||||||
|
|
||||||
if (format_get_field(type, "mf_vendor", ptr, size))
|
|
||||||
id->match_flag_vendor = 1;
|
|
||||||
if (format_get_field(type, "mf_product", ptr, size))
|
|
||||||
id->match_flag_product = 1;
|
|
||||||
if (format_get_field(type, "mf_dev_lo", ptr, size))
|
|
||||||
id->match_flag_dev_lo = 1;
|
|
||||||
if (format_get_field(type, "mf_dev_hi", ptr, size))
|
|
||||||
id->match_flag_dev_hi = 1;
|
|
||||||
if (format_get_field(type, "mf_dev_class", ptr, size))
|
|
||||||
id->match_flag_dev_class = 1;
|
|
||||||
if (format_get_field(type, "mf_dev_subclass", ptr, size))
|
|
||||||
id->match_flag_dev_subclass = 1;
|
|
||||||
if (format_get_field(type, "mf_dev_protocol", ptr, size))
|
|
||||||
id->match_flag_dev_protocol = 1;
|
|
||||||
if (format_get_field(type, "mf_int_class", ptr, size))
|
|
||||||
id->match_flag_int_class = 1;
|
|
||||||
if (format_get_field(type, "mf_int_subclass", ptr, size))
|
|
||||||
id->match_flag_int_subclass = 1;
|
|
||||||
if (format_get_field(type, "mf_int_protocol", ptr, size))
|
|
||||||
id->match_flag_int_protocol = 1;
|
|
||||||
|
|
||||||
/* compute some internal fields */
|
|
||||||
id->is_iface = id->match_flag_int_class |
|
|
||||||
id->match_flag_int_protocol |
|
|
||||||
id->match_flag_int_subclass;
|
|
||||||
|
|
||||||
id->is_dev = id->match_flag_dev_class |
|
|
||||||
id->match_flag_dev_subclass;
|
|
||||||
|
|
||||||
id->is_vp = id->match_flag_vendor |
|
|
||||||
id->match_flag_product;
|
|
||||||
|
|
||||||
id->is_any = id->is_vp + id->is_dev + id->is_iface;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
usb_dump(struct usb_device_id *id, uint32_t nid)
|
|
||||||
{
|
|
||||||
uint32_t n = 1;
|
|
||||||
|
|
||||||
if (id->is_any) {
|
|
||||||
printf("nomatch 32 {\n"
|
|
||||||
" match \"bus\" \"uhub[0-9]+\";\n"
|
|
||||||
" match \"mode\" \"%s\";\n", id->module_mode);
|
|
||||||
} else {
|
|
||||||
printf("# skipped entry on module %s\n",
|
|
||||||
id->module_name);
|
|
||||||
return (n);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id->match_flag_vendor) {
|
|
||||||
printf(" match \"vendor\" \"0x%04x\";\n",
|
|
||||||
id->idVendor);
|
|
||||||
}
|
|
||||||
if (id->match_flag_product) {
|
|
||||||
uint32_t x;
|
|
||||||
|
|
||||||
if (id->is_any == 1 && id->is_vp == 1) {
|
|
||||||
/* try to join similar entries */
|
|
||||||
while (n < nid) {
|
|
||||||
if (id[n].is_any != 1 || id[n].is_vp != 1)
|
|
||||||
break;
|
|
||||||
if (id[n].idVendor != id[0].idVendor)
|
|
||||||
break;
|
|
||||||
if (strcmp(id[n].module_name, id[0].module_name))
|
|
||||||
break;
|
|
||||||
if (strcmp(id[n].module_mode, id[0].module_mode))
|
|
||||||
break;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n == 1) {
|
|
||||||
printf(" match \"product\" \"0x%04x\";\n",
|
|
||||||
id->idProduct);
|
|
||||||
} else {
|
|
||||||
printf(" match \"product\" \"(");
|
|
||||||
|
|
||||||
for (x = 0; x != n; x++) {
|
|
||||||
printf("0x%04x%s", id[x].idProduct,
|
|
||||||
(x == (n - 1)) ? "" : "|");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf(")\";\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (id->match_flag_dev_class) {
|
|
||||||
printf(" match \"devclass\" \"0x%02x\";\n",
|
|
||||||
id->bDeviceClass);
|
|
||||||
}
|
|
||||||
if (id->match_flag_dev_subclass) {
|
|
||||||
printf(" match \"devsubclass\" \"0x%02x\";\n",
|
|
||||||
id->bDeviceSubClass);
|
|
||||||
}
|
|
||||||
if (id->match_flag_int_class) {
|
|
||||||
printf(" match \"intclass\" \"0x%02x\";\n",
|
|
||||||
id->bInterfaceClass);
|
|
||||||
}
|
|
||||||
if (id->match_flag_int_subclass) {
|
|
||||||
printf(" match \"intsubclass\" \"0x%02x\";\n",
|
|
||||||
id->bInterfaceSubClass);
|
|
||||||
}
|
|
||||||
if (id->match_flag_int_protocol) {
|
|
||||||
printf(" match \"intprotocol\" \"0x%02x\";\n",
|
|
||||||
id->bInterfaceProtocol);
|
|
||||||
}
|
|
||||||
printf(" action \"kldload -n %s\";\n"
|
|
||||||
"};\n\n", id->module_name);
|
|
||||||
|
|
||||||
return (n);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
usb_import_entries(const char *section, const char *module,
|
|
||||||
const uint8_t *ptr, uint32_t len)
|
|
||||||
{
|
|
||||||
struct usb_blob *pub;
|
|
||||||
uint32_t section_size;
|
|
||||||
uint32_t off;
|
|
||||||
|
|
||||||
section_size = format_get_section_size(section);
|
|
||||||
if (section_size == 0) {
|
|
||||||
errx(EX_DATAERR, "Invalid or non-existing "
|
|
||||||
"section format '%s'", section);
|
|
||||||
}
|
|
||||||
if (len % section_size) {
|
|
||||||
errx(EX_DATAERR, "Length %d is not "
|
|
||||||
"divisible by %d. Section format '%s'",
|
|
||||||
len, section_size, section);
|
|
||||||
}
|
|
||||||
for (off = 0; off != len; off += section_size) {
|
|
||||||
pub = malloc(sizeof(*pub));
|
|
||||||
if (pub == NULL)
|
|
||||||
errx(EX_SOFTWARE, "Out of memory");
|
|
||||||
|
|
||||||
memset(pub, 0, sizeof(*pub));
|
|
||||||
|
|
||||||
usb_import_entry(&pub->temp, section,
|
|
||||||
module, ptr + off, section_size);
|
|
||||||
|
|
||||||
TAILQ_INSERT_TAIL(&usb_blob_head, pub, entry);
|
|
||||||
|
|
||||||
usb_blob_count++;
|
|
||||||
if (usb_blob_count == 0)
|
|
||||||
errx(EX_SOFTWARE, "Too many entries");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
usb_dump_entries(void)
|
|
||||||
{
|
|
||||||
struct usb_blob *pub;
|
|
||||||
struct usb_device_id *id;
|
|
||||||
uint32_t x;
|
|
||||||
|
|
||||||
id = malloc(usb_blob_count * sizeof(*id));
|
|
||||||
if (id == NULL)
|
|
||||||
errx(EX_SOFTWARE, "Out of memory");
|
|
||||||
|
|
||||||
/* make linear array of all USB blobs */
|
|
||||||
x = 0;
|
|
||||||
TAILQ_FOREACH(pub, &usb_blob_head, entry)
|
|
||||||
id[x++] = pub->temp;
|
|
||||||
|
|
||||||
usb_sort_entries(id, usb_blob_count);
|
|
||||||
|
|
||||||
for (x = 0; x != usb_blob_count;)
|
|
||||||
x += usb_dump(id + x, usb_blob_count - x);
|
|
||||||
|
|
||||||
free(id);
|
|
||||||
|
|
||||||
printf("# %d USB entries processed\n\n", usb_blob_count);
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
/* $FreeBSD$ */
|
|
||||||
|
|
||||||
/*-
|
|
||||||
* Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BUS_USB_H_
|
|
||||||
#define _BUS_USB_H_
|
|
||||||
|
|
||||||
struct usb_device_id {
|
|
||||||
|
|
||||||
/* Internal fields */
|
|
||||||
char module_name[32];
|
|
||||||
char module_mode[32];
|
|
||||||
uint8_t is_iface;
|
|
||||||
uint8_t is_vp;
|
|
||||||
uint8_t is_dev;
|
|
||||||
uint8_t is_any;
|
|
||||||
|
|
||||||
/* Used for product specific matches; the BCD range is inclusive */
|
|
||||||
uint16_t idVendor;
|
|
||||||
uint16_t idProduct;
|
|
||||||
uint16_t bcdDevice_lo;
|
|
||||||
uint16_t bcdDevice_hi;
|
|
||||||
|
|
||||||
/* Used for device class matches */
|
|
||||||
uint8_t bDeviceClass;
|
|
||||||
uint8_t bDeviceSubClass;
|
|
||||||
uint8_t bDeviceProtocol;
|
|
||||||
|
|
||||||
/* Used for interface class matches */
|
|
||||||
uint8_t bInterfaceClass;
|
|
||||||
uint8_t bInterfaceSubClass;
|
|
||||||
uint8_t bInterfaceProtocol;
|
|
||||||
|
|
||||||
/* Select which fields to match against */
|
|
||||||
uint8_t match_flag_vendor:1;
|
|
||||||
uint8_t match_flag_product:1;
|
|
||||||
uint8_t match_flag_dev_lo:1;
|
|
||||||
uint8_t match_flag_dev_hi:1;
|
|
||||||
uint8_t match_flag_dev_class:1;
|
|
||||||
uint8_t match_flag_dev_subclass:1;
|
|
||||||
uint8_t match_flag_dev_protocol:1;
|
|
||||||
uint8_t match_flag_int_class:1;
|
|
||||||
uint8_t match_flag_int_subclass:1;
|
|
||||||
uint8_t match_flag_int_protocol:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
void usb_import_entries(const char *, const char *, const uint8_t *, uint32_t);
|
|
||||||
void usb_dump_entries(void);
|
|
||||||
|
|
||||||
#endif /* _BUS_USB_H_ */
|
|
Loading…
Reference in New Issue
Block a user