diff options
Diffstat (limited to 'kernel/drv/oss_usb/ossusb.h')
-rw-r--r-- | kernel/drv/oss_usb/ossusb.h | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/kernel/drv/oss_usb/ossusb.h b/kernel/drv/oss_usb/ossusb.h new file mode 100644 index 0000000..df28418 --- /dev/null +++ b/kernel/drv/oss_usb/ossusb.h @@ -0,0 +1,246 @@ +/* + * Purpose: Definitions for the USB audio driver files + */ +/* + * + * This file is part of Open Sound System. + * + * Copyright (C) 4Front Technologies 1996-2008. + * + * This this source file is released under GPL v2 license (no other versions). + * See the COPYING file included in the main directory of this source + * distribution for the license terms and conditions. + * + */ + +#ifndef __OSUSB_H_ +#define __OSUSB_H_ + +#include "udi.h" +#include "midi_core.h" + +#define CS_DEVICE 0x21 +#define CS_CONFIG 0x22 +#define CS_STRING 0x23 +#define CS_INTERFACE 0x24 +#define CS_ENDPOINT 0x25 + +#define AC_HEADER 0x01 +#define AC_INPUT_TERMINAL 0x02 +#define AC_OUTPUT_TERMINAL 0x03 +#define AC_MIXER_UNIT 0x04 +#define AC_SELECTOR_UNIT 0x05 +#define AC_FEATURE_UNIT 0x06 +#define AC_PROCESSING_UNIT 0x07 +#define AC_EXTENSION_UNIT 0x08 + +#define AS_GENERAL 0x01 +#define AS_FORMAT_TYPE 0x02 +#define AS_FORMAT_SPECIFIC 0x03 + +#define SET_CUR 0x01 +#define SET_MEM 0x05 +#define GET_CUR 0x81 +#define GET_MIN 0x82 +#define GET_MAX 0x83 +#define GET_RES 0x84 +#define GET_MEM 0x85 +#define GET_STAT 0xff + +#define USB_RECIP_MASK 0x1f +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 +#define USB_VENDOR_REQUEST 0x40 + +#define USB_TYPE_CLASS 0x20 + +/* + * Unit types + * + * Note that TY_OUTPUT is actually PCM input and TY_INPUT is actually + * PCM output. Unit types are defined as seen as the USB control interface. + * Input terminals listen to the output streaming interfases and output + * terminals feed the input streaming interfaces. Confusing it is. + */ +#define TY_INPUT 0 +#define TY_OUTPUT 1 +#define TY_MIXER 2 +#define TY_SELECT 3 +#define TY_FEAT 4 +#define TY_PROC 5 +#define TY_EXT 6 +// Remember to inclease size of devc->unit_counters[] if adding more unit types + +#define USBCLASS_AUDIO 1 +#define USBCLASS_HID 3 + +#define MAX_IFACE 10 + +typedef struct +{ + int num; + int typ; // TY_* + int subtyp; + char name[16]; + unsigned char *desc; + int desclen; + int mixnum; + int target; + int source; + int ctl_avail; + int control_count; + int channels; + int chmask; +} usb_audio_unit_t; + +#define MAX_UNIT 40 +#define MAX_CONTROLS 100 +#define MAX_PORTC 8 /* Max audio streaming interfaces per device */ +#define MAX_MIDIC 16 /* Max MIDI streaming interfaces per device */ + +typedef struct +{ + usb_audio_unit_t *unit; + int index; + int flags; + int min_ch, max_ch; + int global; + int chmask; + int value; + int min, max, scale; + int exttype; +} usb_control_t; + +typedef struct ossusb_devc ossusb_devc; + +typedef struct +{ + ossusb_devc *devc; + int disabled; + int if_number; + void *endpoint_desc, *orig_endpoint_desc; + udi_endpoint_handle_t *endpoint_handle; + int audio_dev; + int open_mode; + int permitted_modes; + int prepared_modes; + int stopping; + + int speed; + int bytes_per_sample; + int terminal_link; + udi_usb_devc *usbdev; + int num_settings; + int act_setting; + +#define NR_DATAPIPES 2 + udi_usb_request_t *datapipe[NR_DATAPIPES]; + int curr_datapipe; + int fragment_size; /* Bytes per (1ms) USB tick */ + int overflow_samples, overflow_size; + int convert_3byte; + int pipeline_delay; + unsigned char *tmp_buf[2]; + int use_tmpbuf; + oss_dma_handle_t tmpbuf_dma_handle[2]; +} ossusb_portc; + +typedef struct +{ + struct ossusb_devc *devc; + oss_device_t *osdev; + udi_usb_devc *usbdev; + + void *in_endpoint_desc, *out_endpoint_desc; + udi_endpoint_handle_t *in_endpoint_handle, *out_endpoint_handle; + int portnum; + int midi_dev; + int open_mode; + // int output_endpoint; + oss_midi_inputbyte_t midi_input_intr; + oss_midi_outputintr_t midi_output_intr; +} ossusb_midic; + +typedef void *(*special_driver_t) (ossusb_devc * devc); +typedef void (*special_unload_t) (void *devc); + +struct ossusb_devc +{ + special_unload_t unload_func; + oss_device_t *osdev; + oss_device_t *main_osdev; + oss_mutex_t mutex; + int num_interfaces; + udi_usb_devc *usbdev[MAX_IFACE], *last_usbdev; + int inum[MAX_IFACE]; + int vendor, product; + char *dev_name, devpath[32]; + int nports; + int disabled; + int usb_version; // 1 or 2 + + /* + * Units + */ + + usb_audio_unit_t units[MAX_UNIT]; + int nunits; + char unit_counters[7]; // For TY_* identifiers + + /* + * Mixer stuff + */ + int mixer_dev; + void *mixer_usbdev; + int devmask, recmask, stereodevs, recsrc; + + int rec_unit; + int num_recdevs; + int recdevs[32]; + + int *levels; + + usb_control_t controls[MAX_CONTROLS]; + int ncontrols; + +/* Audio stuff */ + int num_audio_engines, num_inputs, num_outputs; + ossusb_portc portc[MAX_PORTC]; + +/* MIDI stuff */ + int num_mididevs; + ossusb_midic midic[MAX_MIDIC]; + + unsigned char *playbuf; + oss_dma_handle_t playbuf_dma_handle; + udi_usb_request_t *output_pipe; + int output_busy; +#define Q_MAX 4096 + unsigned char queue[Q_MAX]; + int q_nbytes; + + unsigned char *recbuf; + oss_dma_handle_t recbuf_dma_handle; + udi_usb_request_t *input_pipe; + udi_endpoint_handle_t *input_endpoint_handle; +}; + +extern int usb_trace, usb_quiet; + +#define UDB(x) {if (usb_trace) x;} + +extern ossusb_devc *ossusb_init_audiostream (ossusb_devc * devc, + udi_usb_devc * usbdev, int inum, + int reinit); +extern ossusb_devc *ossusb_init_midistream (ossusb_devc * devc, + udi_usb_devc * usbdev, int inum, + int reinit); +extern void ossusb_disconnect_midistream (ossusb_devc * devc); +extern void ossusb_dump_desc (unsigned char *desc, int cfg_len); +extern unsigned int ossusb_get_int (unsigned char *p, int nbytes); +extern int ossusb_change_altsetting (int dev, int ctrl, unsigned int cmd, + int value); +extern void ossusb_create_altset_control(int dev, int portc_num, int nalt, char *name); +#endif |