root/src/add-ons/kernel/drivers/bus/usb/usb_raw.h
/*
 * Copyright 2006-2008, Haiku Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#ifndef _USB_RAW_H_
#define _USB_RAW_H_

#include <USB3.h>

#define B_USB_RAW_PROTOCOL_VERSION      0x0015
#define B_USB_RAW_ACTIVE_ALTERNATE      0xffffffff

typedef enum {
        B_USB_RAW_COMMAND_GET_VERSION = 0x1000,

        B_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR = 0x2000,
        B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR,
        B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR,
        B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR,
        B_USB_RAW_COMMAND_GET_STRING_DESCRIPTOR,
        B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR,
        B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT,
        B_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX,
        B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC,
        B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC,
        B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR_ETC,
        B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR_ETC,

        B_USB_RAW_COMMAND_SET_CONFIGURATION = 0x3000,
        B_USB_RAW_COMMAND_SET_FEATURE,
        B_USB_RAW_COMMAND_CLEAR_FEATURE,
        B_USB_RAW_COMMAND_GET_STATUS,
        B_USB_RAW_COMMAND_GET_DESCRIPTOR,
        B_USB_RAW_COMMAND_SET_ALT_INTERFACE,

        B_USB_RAW_COMMAND_CONTROL_TRANSFER = 0x4000,
        B_USB_RAW_COMMAND_INTERRUPT_TRANSFER,
        B_USB_RAW_COMMAND_BULK_TRANSFER,
        B_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER
} usb_raw_command_id;


typedef enum {
        B_USB_RAW_STATUS_SUCCESS = 0,

        B_USB_RAW_STATUS_FAILED,
        B_USB_RAW_STATUS_ABORTED,
        B_USB_RAW_STATUS_STALLED,
        B_USB_RAW_STATUS_CRC_ERROR,
        B_USB_RAW_STATUS_TIMEOUT,

        B_USB_RAW_STATUS_INVALID_CONFIGURATION,
        B_USB_RAW_STATUS_INVALID_INTERFACE,
        B_USB_RAW_STATUS_INVALID_ENDPOINT,
        B_USB_RAW_STATUS_INVALID_STRING,

        B_USB_RAW_STATUS_NO_MEMORY
} usb_raw_command_status;


typedef union {
        struct {
                status_t                                                status;
        } version;

        struct {
                status_t                                                status;
                usb_device_descriptor                   *descriptor;
        } device;

        struct {
                status_t                                                status;
                usb_configuration_descriptor    *descriptor;
                uint32                                                  config_index;
        } config;

        struct {
                status_t                                                status;
                usb_configuration_descriptor    *descriptor;
                uint32                                                  config_index;
                size_t                          length;
        } config_etc;

        struct {
                status_t                                                status;
                uint32                                                  alternate_info;
                uint32                                                  config_index;
                uint32                                                  interface_index;
        } alternate;

        struct {
                status_t                                                status;
                usb_interface_descriptor                *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
        } interface;

        struct {
                status_t                                                status;
                usb_interface_descriptor                *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
                uint32                                                  alternate_index;
        } interface_etc;

        struct {
                status_t                                                status;
                usb_endpoint_descriptor                 *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
                uint32                                                  endpoint_index;
        } endpoint;

        struct {
                status_t                                                status;
                usb_endpoint_descriptor                 *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
                uint32                                                  alternate_index;
                uint32                                                  endpoint_index;
        } endpoint_etc;

        struct {
                status_t                                                status;
                usb_descriptor                                  *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
                uint32                                                  generic_index;
                size_t                                                  length;
        } generic;

        struct {
                status_t                                                status;
                usb_descriptor                                  *descriptor;
                uint32                                                  config_index;
                uint32                                                  interface_index;
                uint32                                                  alternate_index;
                uint32                                                  generic_index;
                size_t                                                  length;
        } generic_etc;

        struct {
                status_t                                                status;
                usb_string_descriptor                   *descriptor;
                uint32                                                  string_index;
                size_t                                                  length;
        } string;

        struct {
                status_t                                                status;
                uint8                                                   type;
                uint8                                                   index;
                uint16                                                  language_id;
                void                                                    *data;
                size_t                                                  length;
        } descriptor;

        struct {
                status_t                                                status;
                uint8                                                   request_type;
                uint8                                                   request;
                uint16                                                  value;
                uint16                                                  index;
                uint16                                                  length;
                void                                                    *data;
        } control;

        struct {
                status_t                                                status;
                uint32                                                  interface;
                uint32                                                  endpoint;
                void                                                    *data;
                size_t                                                  length;
        } transfer;

        struct {
                status_t                                                status;
                uint32                                                  interface;
                uint32                                                  endpoint;
                void                                                    *data;
                size_t                                                  length;
                usb_iso_packet_descriptor               *packet_descriptors;
                uint32                                                  packet_count;
        } isochronous;
} usb_raw_command;

#endif // _USB_RAW_H_