/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _SYS_USB_LIBUSB_LIBUSB_IMPL_H
#define _SYS_USB_LIBUSB_LIBUSB_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
/* debug levels */
#define DEBUG_NONE 0
#define DEBUG_ERRORS 1
#define DEBUG_RECOVERABLE 2
#define DEBUG_FUNCTIONS 3
#define DEBUG_DETAILED 4
#define DEBUG_DATA_DUMP 5
/* api binding */
#define API_RELAXED 0
#define API_STRICT 1
/*
* XXX issues: remove duplicates with usb.h
*/
typedef struct usb_device usb_device_t;
typedef struct usb_bus usb_bus_t;
typedef struct usb_ctrl_setup usb_ctrl_setup_t;
/* some useful defines */
#define USB_DEV_REQ_HOST_TO_DEV 0x00
#define USB_DEV_REQ_DEV_TO_HOST 0x80
#define USB_DEV_REQ_DIR_MASK 0x80
#define USB_DESCR_TYPE_SETUP_DEV 0x0100
#define USB_DESCR_TYPE_SETUP_CFG 0x0200
#define USB_DESCR_TYPE_SETUP_STRING 0x0300
#define USB_DESCR_TYPE_SETUP_IF 0x0400
#define USB_DESCR_TYPE_SETUP_EP 0x0500
#define USB_DESCR_TYPE_SETUP_DEV_QLF 0x0600
#define USB_DESCR_TYPE_SETUP_OTHER_SPEED_CFG 0x0700
#define USB_DESCR_TYPE_SETUP_IFPWR 0x0800
#define USB_DESCR_TYPE_DEV 0x01
#define USB_DESCR_TYPE_CFG 0x02
#define USB_DESCR_TYPE_STRING 0x03
#define USB_DESCR_TYPE_IF 0x04
#define USB_DESCR_TYPE_EP 0x05
#define USB_DESCR_TYPE_DEV_QLF 0x06
#define USB_DESCR_TYPE_OTHER_SPEED_CFG 0x07
#define USB_DESCR_TYPE_IF_PWR 0x08
/*
* bEndpointAddress masks
*/
#define USB_EP_NUM_MASK 0x0F /* endpoint number mask */
#define USB_EP_DIR_MASK 0x80 /* direction mask */
#define USB_EP_DIR_OUT 0x00 /* OUT endpoint */
#define USB_EP_DIR_IN 0x80 /* IN endpoint */
/*
* The compiler pads the above structures; the following represent the
* unpadded, aggregate data sizes.
*/
#define USB_DEV_DESCR_SIZE 18 /* device descr size */
#define USB_CFG_DESCR_SIZE 9 /* configuration desc. size */
#define USBA_CFG_PWR_DESCR_SIZE 18 /* configuration pwr desc. size */
#define USB_IF_DESCR_SIZE 9 /* interface descr size */
#define USBA_IF_PWR_DESCR_SIZE 15 /* interface pwr descr size */
#define USB_EP_DESCR_SIZE 7 /* endpoint descr size */
#define BYTE_SWAP(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
/* I/O direction */
#define READ 0
#define WRITE 1
typedef enum {
USB_ERROR_TYPE_NONE = 0,
USB_ERROR_TYPE_STRING,
USB_ERROR_TYPE_ERRNO
} usb_error_type_t;
/*
* This records the file descriptors for endpoint/status devices.
*/
typedef struct usb_dev_handle_info {
int configuration_value;
int configuration_index;
int claimed_interface;
int alternate;
int ep_fd[USB_MAXENDPOINTS];
int ep_status_fd[USB_MAXENDPOINTS];
int ep_interface[USB_MAXENDPOINTS];
} usb_dev_handle_info_t;
typedef struct {
usb_device_t *device;
usb_dev_handle_info_t *info;
} usb_dev_handle_impl_t;
#define USB_MAX_INTERFACES 256
typedef struct {
int ref_count;
int ep0_fd;
int ep0_fd_stat;
usb_dev_handle_impl_t
*claimed_interfaces[USB_MAX_INTERFACES];
} usb_device_specific_t;
#define USB_PARSE_ERROR 0
#define USB_DESCR_TYPE_ANY -1 /* Wild card */
#define INCREMENT_BUF(buf) \
if ((buf)[0] == 0) { \
break; \
} else { \
(buf) += (buf)[0]; \
}
#define isdigit(ch) ((ch >= '0') && (ch <= '9'))
typedef struct usb_cfg_descr {
uint8_t bLength; /* descriptor size */
uint8_t bDescriptorType; /* set to CONFIGURATION */
uint16_t wTotalLength; /* total length of data returned */
uint8_t bNumInterfaces; /* # interfaces in config */
uint8_t bConfigurationValue; /* arg for SetConfiguration */
uint8_t iConfiguration; /* configuration string */
uint8_t bmAttributes; /* config characteristics */
uint8_t MaxPower; /* max pwr consumption */
} usb_cfg_descr_t;
/*
* usb_if_descr:
* usb interface descriptor, refer to USB 2.0/9.6.5
*/
typedef struct usb_if_descr {
uint8_t bLength; /* descriptor size */
uint8_t bDescriptorType; /* set to INTERFACE */
uint8_t bInterfaceNumber; /* interface number */
uint8_t bAlternateSetting; /* alt. interface number */
uint8_t bNumEndpoints; /* # of endpoints */
uint8_t bInterfaceClass; /* class code */
uint8_t bInterfaceSubClass; /* sub class code */
uint8_t bInterfaceProtocol; /* protocol code */
uint8_t iInterface; /* description string */
} usb_if_descr_t;
/*
* usb_ep_descr:
* usb endpoint descriptor, refer to USB 2.0/9.6.6
*/
typedef struct usb_ep_descr {
uint8_t bLength; /* descriptor size */
uint8_t bDescriptorType; /* set to ENDPOINT */
uint8_t bEndpointAddress; /* address of this e/p */
uint8_t bmAttributes; /* transfer type */
uint16_t wMaxPacketSize; /* maximum packet size */
uint8_t bInterval; /* e/p polling interval */
uint8_t bRefresh; /* refresh */
uint8_t bSynchAddress;
} usb_ep_descr_t;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_USB_LIBUSB_LIBUSB_IMPL_H */