Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
/* $FreeBSD$ */
|
|
|
|
/*-
|
2017-11-26 02:00:33 +00:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
|
|
*
|
Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
* Copyright (c) 2008 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 _LIBUSB20_COMPAT_01_H_
|
|
|
|
#define _LIBUSB20_COMPAT_01_H_
|
|
|
|
|
2013-03-13 12:23:14 +00:00
|
|
|
#ifndef LIBUSB_GLOBAL_INCLUDE_FILE
|
|
|
|
#include <stdint.h>
|
Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
#include <sys/param.h>
|
2010-02-13 09:45:50 +00:00
|
|
|
#include <sys/endian.h>
|
2013-03-13 12:23:14 +00:00
|
|
|
#endif
|
Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
|
|
|
|
/* USB interface class codes */
|
|
|
|
|
|
|
|
#define USB_CLASS_PER_INTERFACE 0
|
|
|
|
#define USB_CLASS_AUDIO 1
|
|
|
|
#define USB_CLASS_COMM 2
|
|
|
|
#define USB_CLASS_HID 3
|
|
|
|
#define USB_CLASS_PRINTER 7
|
|
|
|
#define USB_CLASS_PTP 6
|
|
|
|
#define USB_CLASS_MASS_STORAGE 8
|
|
|
|
#define USB_CLASS_HUB 9
|
|
|
|
#define USB_CLASS_DATA 10
|
|
|
|
#define USB_CLASS_VENDOR_SPEC 0xff
|
|
|
|
|
|
|
|
/* USB descriptor types */
|
|
|
|
|
|
|
|
#define USB_DT_DEVICE 0x01
|
|
|
|
#define USB_DT_CONFIG 0x02
|
|
|
|
#define USB_DT_STRING 0x03
|
|
|
|
#define USB_DT_INTERFACE 0x04
|
|
|
|
#define USB_DT_ENDPOINT 0x05
|
|
|
|
|
|
|
|
#define USB_DT_HID 0x21
|
|
|
|
#define USB_DT_REPORT 0x22
|
|
|
|
#define USB_DT_PHYSICAL 0x23
|
|
|
|
#define USB_DT_HUB 0x29
|
|
|
|
|
|
|
|
/* USB descriptor type sizes */
|
|
|
|
|
|
|
|
#define USB_DT_DEVICE_SIZE 18
|
|
|
|
#define USB_DT_CONFIG_SIZE 9
|
|
|
|
#define USB_DT_INTERFACE_SIZE 9
|
|
|
|
#define USB_DT_ENDPOINT_SIZE 7
|
|
|
|
#define USB_DT_ENDPOINT_AUDIO_SIZE 9
|
|
|
|
#define USB_DT_HUB_NONVAR_SIZE 7
|
|
|
|
|
|
|
|
/* USB descriptor header */
|
|
|
|
struct usb_descriptor_header {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB string descriptor */
|
|
|
|
struct usb_string_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint16_t wData[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB HID descriptor */
|
|
|
|
struct usb_hid_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint16_t bcdHID;
|
|
|
|
uint8_t bCountryCode;
|
|
|
|
uint8_t bNumDescriptors;
|
|
|
|
/* uint8_t bReportDescriptorType; */
|
|
|
|
/* uint16_t wDescriptorLength; */
|
|
|
|
/* ... */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB endpoint descriptor */
|
|
|
|
#define USB_MAXENDPOINTS 32
|
|
|
|
struct usb_endpoint_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint8_t bEndpointAddress;
|
|
|
|
#define USB_ENDPOINT_ADDRESS_MASK 0x0f
|
|
|
|
#define USB_ENDPOINT_DIR_MASK 0x80
|
|
|
|
uint8_t bmAttributes;
|
|
|
|
#define USB_ENDPOINT_TYPE_MASK 0x03
|
|
|
|
#define USB_ENDPOINT_TYPE_CONTROL 0
|
|
|
|
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1
|
|
|
|
#define USB_ENDPOINT_TYPE_BULK 2
|
|
|
|
#define USB_ENDPOINT_TYPE_INTERRUPT 3
|
|
|
|
uint16_t wMaxPacketSize;
|
|
|
|
uint8_t bInterval;
|
|
|
|
uint8_t bRefresh;
|
|
|
|
uint8_t bSynchAddress;
|
|
|
|
|
|
|
|
uint8_t *extra; /* Extra descriptors */
|
|
|
|
int extralen;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB interface descriptor */
|
|
|
|
#define USB_MAXINTERFACES 32
|
|
|
|
struct usb_interface_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint8_t bInterfaceNumber;
|
|
|
|
uint8_t bAlternateSetting;
|
|
|
|
uint8_t bNumEndpoints;
|
|
|
|
uint8_t bInterfaceClass;
|
|
|
|
uint8_t bInterfaceSubClass;
|
|
|
|
uint8_t bInterfaceProtocol;
|
|
|
|
uint8_t iInterface;
|
|
|
|
|
|
|
|
struct usb_endpoint_descriptor *endpoint;
|
|
|
|
|
|
|
|
uint8_t *extra; /* Extra descriptors */
|
|
|
|
int extralen;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define USB_MAXALTSETTING 128 /* Hard limit */
|
|
|
|
struct usb_interface {
|
|
|
|
struct usb_interface_descriptor *altsetting;
|
|
|
|
|
|
|
|
int num_altsetting;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB configuration descriptor */
|
|
|
|
#define USB_MAXCONFIG 8
|
|
|
|
struct usb_config_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint16_t wTotalLength;
|
|
|
|
uint8_t bNumInterfaces;
|
|
|
|
uint8_t bConfigurationValue;
|
|
|
|
uint8_t iConfiguration;
|
|
|
|
uint8_t bmAttributes;
|
|
|
|
uint8_t MaxPower;
|
|
|
|
|
|
|
|
struct usb_interface *interface;
|
|
|
|
|
|
|
|
uint8_t *extra; /* Extra descriptors */
|
|
|
|
int extralen;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB device descriptor */
|
|
|
|
struct usb_device_descriptor {
|
|
|
|
uint8_t bLength;
|
|
|
|
uint8_t bDescriptorType;
|
|
|
|
uint16_t bcdUSB;
|
|
|
|
uint8_t bDeviceClass;
|
|
|
|
uint8_t bDeviceSubClass;
|
|
|
|
uint8_t bDeviceProtocol;
|
|
|
|
uint8_t bMaxPacketSize0;
|
|
|
|
uint16_t idVendor;
|
|
|
|
uint16_t idProduct;
|
|
|
|
uint16_t bcdDevice;
|
|
|
|
uint8_t iManufacturer;
|
|
|
|
uint8_t iProduct;
|
|
|
|
uint8_t iSerialNumber;
|
|
|
|
uint8_t bNumConfigurations;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* USB setup packet */
|
|
|
|
struct usb_ctrl_setup {
|
|
|
|
uint8_t bRequestType;
|
|
|
|
#define USB_RECIP_DEVICE 0x00
|
|
|
|
#define USB_RECIP_INTERFACE 0x01
|
|
|
|
#define USB_RECIP_ENDPOINT 0x02
|
|
|
|
#define USB_RECIP_OTHER 0x03
|
|
|
|
#define USB_TYPE_STANDARD (0x00 << 5)
|
|
|
|
#define USB_TYPE_CLASS (0x01 << 5)
|
|
|
|
#define USB_TYPE_VENDOR (0x02 << 5)
|
|
|
|
#define USB_TYPE_RESERVED (0x03 << 5)
|
|
|
|
#define USB_ENDPOINT_IN 0x80
|
|
|
|
#define USB_ENDPOINT_OUT 0x00
|
|
|
|
uint8_t bRequest;
|
|
|
|
#define USB_REQ_GET_STATUS 0x00
|
|
|
|
#define USB_REQ_CLEAR_FEATURE 0x01
|
|
|
|
#define USB_REQ_SET_FEATURE 0x03
|
|
|
|
#define USB_REQ_SET_ADDRESS 0x05
|
|
|
|
#define USB_REQ_GET_DESCRIPTOR 0x06
|
|
|
|
#define USB_REQ_SET_DESCRIPTOR 0x07
|
|
|
|
#define USB_REQ_GET_CONFIGURATION 0x08
|
|
|
|
#define USB_REQ_SET_CONFIGURATION 0x09
|
|
|
|
#define USB_REQ_GET_INTERFACE 0x0A
|
|
|
|
#define USB_REQ_SET_INTERFACE 0x0B
|
|
|
|
#define USB_REQ_SYNCH_FRAME 0x0C
|
|
|
|
uint16_t wValue;
|
|
|
|
uint16_t wIndex;
|
|
|
|
uint16_t wLength;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Error codes */
|
|
|
|
#define USB_ERROR_BEGIN 500000
|
|
|
|
|
|
|
|
/* Byte swapping */
|
|
|
|
#define USB_LE16_TO_CPU(x) le16toh(x)
|
|
|
|
|
|
|
|
/* Data types */
|
|
|
|
struct usb_device;
|
|
|
|
struct usb_bus;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* To maintain compatibility with applications already built with libusb,
|
|
|
|
* we must only add entries to the end of this structure. NEVER delete or
|
|
|
|
* move members and only change types if you really know what you're doing.
|
|
|
|
*/
|
|
|
|
struct usb_device {
|
|
|
|
struct usb_device *next;
|
|
|
|
struct usb_device *prev;
|
|
|
|
|
|
|
|
char filename[PATH_MAX + 1];
|
|
|
|
|
|
|
|
struct usb_bus *bus;
|
|
|
|
|
|
|
|
struct usb_device_descriptor descriptor;
|
|
|
|
struct usb_config_descriptor *config;
|
|
|
|
|
|
|
|
void *dev;
|
|
|
|
|
|
|
|
uint8_t devnum;
|
|
|
|
|
|
|
|
uint8_t num_children;
|
|
|
|
struct usb_device **children;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct usb_bus {
|
|
|
|
struct usb_bus *next;
|
|
|
|
struct usb_bus *prev;
|
|
|
|
|
|
|
|
char dirname[PATH_MAX + 1];
|
|
|
|
|
|
|
|
struct usb_device *devices;
|
|
|
|
uint32_t location;
|
|
|
|
|
|
|
|
struct usb_device *root_dev;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct usb_dev_handle;
|
|
|
|
typedef struct usb_dev_handle usb_dev_handle;
|
|
|
|
|
|
|
|
/* Variables */
|
|
|
|
extern struct usb_bus *usb_busses;
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
#if 0
|
|
|
|
} /* style */
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Function prototypes from "libusb20_compat01.c" */
|
|
|
|
|
|
|
|
usb_dev_handle *usb_open(struct usb_device *dev);
|
|
|
|
int usb_close(usb_dev_handle * dev);
|
|
|
|
int usb_get_string(usb_dev_handle * dev, int index, int langid, char *buf, size_t buflen);
|
|
|
|
int usb_get_string_simple(usb_dev_handle * dev, int index, char *buf, size_t buflen);
|
|
|
|
int usb_get_descriptor_by_endpoint(usb_dev_handle * udev, int ep, uint8_t type, uint8_t index, void *buf, int size);
|
|
|
|
int usb_get_descriptor(usb_dev_handle * udev, uint8_t type, uint8_t index, void *buf, int size);
|
|
|
|
int usb_parse_descriptor(uint8_t *source, char *description, void *dest);
|
|
|
|
int usb_parse_configuration(struct usb_config_descriptor *config, uint8_t *buffer);
|
|
|
|
void usb_destroy_configuration(struct usb_device *dev);
|
|
|
|
void usb_fetch_and_parse_descriptors(usb_dev_handle * udev);
|
|
|
|
int usb_bulk_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
|
|
|
|
int usb_bulk_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
|
|
|
|
int usb_interrupt_write(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
|
|
|
|
int usb_interrupt_read(usb_dev_handle * dev, int ep, char *bytes, int size, int timeout);
|
|
|
|
int usb_control_msg(usb_dev_handle * dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
|
|
|
|
int usb_set_configuration(usb_dev_handle * dev, int configuration);
|
|
|
|
int usb_claim_interface(usb_dev_handle * dev, int interface);
|
|
|
|
int usb_release_interface(usb_dev_handle * dev, int interface);
|
|
|
|
int usb_set_altinterface(usb_dev_handle * dev, int alternate);
|
|
|
|
int usb_resetep(usb_dev_handle * dev, unsigned int ep);
|
|
|
|
int usb_clear_halt(usb_dev_handle * dev, unsigned int ep);
|
|
|
|
int usb_reset(usb_dev_handle * dev);
|
2010-10-14 20:04:36 +00:00
|
|
|
int usb_check_connected(usb_dev_handle * dev);
|
2008-11-19 08:56:35 +00:00
|
|
|
const char *usb_strerror(void);
|
Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
void usb_init(void);
|
|
|
|
void usb_set_debug(int level);
|
|
|
|
int usb_find_busses(void);
|
|
|
|
int usb_find_devices(void);
|
|
|
|
struct usb_device *usb_device(usb_dev_handle * dev);
|
|
|
|
struct usb_bus *usb_get_busses(void);
|
2011-07-16 08:29:12 +00:00
|
|
|
int usb_get_driver_np(usb_dev_handle * dev, int interface, char *name, int namelen);
|
|
|
|
int usb_detach_kernel_driver_np(usb_dev_handle * dev, int interface);
|
Bring in USB4BSD, Hans Petter Selasky rework of the USB stack
that includes significant features and SMP safety.
This commit includes a more or less complete rewrite of the *BSD USB
stack, including Host Controller and Device Controller drivers and
updating all existing USB drivers to use the new USB API:
1) A brief feature list:
- A new and mutex enabled USB API.
- Many USB drivers are now running Giant free.
- Linux USB kernel compatibility layer.
- New UGEN backend and libusb library, finally solves the "driver
unloading" problem. The new BSD licensed libusb20 library is fully
compatible with libusb-0.1.12 from sourceforge.
- New "usbconfig" utility, for easy configuration of USB.
- Full support for Split transactions, which means you can use your
full speed USB audio device on a high speed USB HUB.
- Full support for HS ISOC transactions, which makes writing drivers
for various HS webcams possible, for example.
- Full support for USB on embedded platforms, mostly cache flushing
and buffer invalidating stuff.
- Safer parsing of USB descriptors.
- Autodetect of annoying USB install disks.
- Support for USB device side mode, also called USB gadget mode,
using the same API like the USB host side. In other words the new
USB stack is symmetric with regard to host and device side.
- Support for USB transfers like I/O vectors, means more throughput
and less interrupts.
- ... see the FreeBSD quarterly status reports under "USB project"
2) To enable the driver in the default kernel build:
2.a) Remove all existing USB device options from your kernel config
file.
2.b) Add the following USB device options to your kernel configuration
file:
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
device usb2_sound
2) To enable the driver at runtime:
2.a) Unload all existing USB modules. If USB is compiled into the
kernel then you might have to build a new kernel.
2.b) Load the "usb2_xxx.ko" modules under /boot/kernel having the same
base name like the kernel device option.
Submitted by: Hans Petter Selasky hselasky at c2i dot net
Reviewed by: imp, alfred
2008-11-04 02:31:03 +00:00
|
|
|
|
|
|
|
#if 0
|
|
|
|
{ /* style */
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* _LIBUSB20_COMPAT01_H_ */
|