diff options
-rw-r--r-- | sys/dev/usb/usbf.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/sys/dev/usb/usbf.h b/sys/dev/usb/usbf.h new file mode 100644 index 00000000000..b69aed3efc3 --- /dev/null +++ b/sys/dev/usb/usbf.h @@ -0,0 +1,179 @@ +/* $OpenBSD: usbf.h,v 1.1 2006/11/26 01:36:23 uwe Exp $ */ + +/* + * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * USB function driver interface data structures and subroutines + */ + +#ifndef _USBF_H_ +#define _USBF_H_ + +typedef struct usbf_function *usbf_function_handle; +typedef struct usbf_bus *usbf_bus_handle; +typedef struct usbf_device *usbf_device_handle; +typedef struct usbf_config *usbf_config_handle; +typedef struct usbf_interface *usbf_interface_handle; +typedef struct usbf_endpoint *usbf_endpoint_handle; +typedef struct usbf_pipe *usbf_pipe_handle; +typedef struct usbf_xfer *usbf_xfer_handle; +typedef void *usbf_private_handle; + +/* + * Return codes for many of the function driver interface routines + */ +typedef enum { /* keep in sync with USBF_ERROR_STRS */ + USBF_NORMAL_COMPLETION = 0, /* must be 0 */ + USBF_IN_PROGRESS, /* 1 */ + /* errors */ + USBF_NOT_STARTED, /* 2 */ + USBF_INVAL, /* 3 */ + USBF_NOMEM, /* 4 */ + USBF_CANCELLED, /* 5 */ + USBF_BAD_ADDRESS, /* 6 */ + USBF_IOERROR, /* 7 */ + USBF_TIMEOUT, /* 8 */ + USBF_SHORT_XFER, /* 9 */ + USBF_STALLED, /* 10 */ + USBF_ERROR_MAX /* must be last */ +} usbf_status; +#define USBF_ERROR_STRS { /* keep in sync with enum usbf_status */ \ + "NORMAL_COMPLETION", /* 0 */ \ + "IN_PROGRESS", /* 1 */ \ + "NOT_STARTED", /* 2 */ \ + "INVAL", /* 3 */ \ + "NOMEM", /* 4 */ \ + "CANCELLED", /* 5 */ \ + "BAD_ADDRESS", /* 6 */ \ + "IOERROR", /* 7 */ \ + "TIMEOUT", /* 8 */ \ + "SHORT_XFER", /* 9 */ \ + "STALLED", /* 10 */ \ +}; + +typedef void (*usbf_callback)(usbf_xfer_handle, usbf_private_handle, + usbf_status); + +/* + * Attach USB function at the logical device. + */ +struct usbf_attach_arg { + usbf_device_handle device; +}; + +struct usbf_function_methods { + usbf_status (*set_config)(usbf_function_handle, usbf_config_handle); + usbf_status (*do_request)(usbf_function_handle, + usb_device_request_t *req, void **data); +}; + +struct usbf_function { + USBBASEDEVICE bdev; /* base device */ + /* filled in by function driver */ + struct usbf_function_methods *methods; +}; + +#define USBF_EMPTY_STRING_ID (USB_LANGUAGE_TABLE+1) +#define USBF_STRING_ID_MIN (USB_LANGUAGE_TABLE+2) +#define USBF_STRING_ID_MAX 255 + +/* + * USB function driver interface + */ + +/* global */ +const char *usbf_errstr(usbf_status); + +/* device */ +void usbf_devinfo_setup(usbf_device_handle, u_int8_t, u_int8_t, + u_int8_t, u_int16_t, u_int16_t, + u_int16_t, const char *, const char *, + const char *); +char *usbf_devinfo_alloc(usbf_device_handle); +void usbf_devinfo_free(char *); +usb_device_descriptor_t * + usbf_device_descriptor(usbf_device_handle); +usb_string_descriptor_t * + usbf_string_descriptor(usbf_device_handle, u_int8_t); +usb_config_descriptor_t * + usbf_config_descriptor(usbf_device_handle, u_int8_t); + +/* configuration */ +u_int8_t usbf_add_string(usbf_device_handle, const char *); +usbf_status usbf_add_config(usbf_device_handle, usbf_config_handle *); +usbf_status usbf_add_config_desc(usbf_config_handle, usb_descriptor_t *, + usb_descriptor_t **); +usbf_status usbf_add_interface(usbf_config_handle, u_int8_t, u_int8_t, + u_int8_t, const char *, + usbf_interface_handle *); +usbf_status usbf_add_endpoint(usbf_interface_handle, u_int8_t, + u_int8_t, u_int16_t, u_int8_t, + usbf_endpoint_handle *); +usbf_status usbf_end_config(usbf_config_handle); +usbf_endpoint_handle usbf_config_endpoint(usbf_config_handle, u_int8_t); + +/* interface */ +int usbf_interface_number(usbf_interface_handle); +usbf_endpoint_handle usbf_iface_endpoint(usbf_interface_handle, u_int8_t); + +/* endpoint */ +u_int8_t usbf_endpoint_address(usbf_endpoint_handle); +u_int8_t usbf_endpoint_attributes(usbf_endpoint_handle); +#define usbf_endpoint_index(e) UE_GET_ADDR(usbf_endpoint_address((e))) +#define usbf_endpoint_dir(e) UE_GET_DIR(usbf_endpoint_address((e))) +#define usbf_endpoint_type(e) UE_GET_XFERTYPE(usbf_endpoint_attributes((e))) + +/* pipe */ +usbf_status usbf_open_pipe(usbf_interface_handle, u_int8_t, + usbf_pipe_handle *); +void usbf_abort_pipe(usbf_pipe_handle); +void usbf_close_pipe(usbf_pipe_handle); +void usbf_stall_pipe(usbf_pipe_handle); + +/* transfer */ +usbf_xfer_handle usbf_alloc_xfer(usbf_device_handle); +void usbf_free_xfer(usbf_xfer_handle); +void *usbf_alloc_buffer(usbf_xfer_handle, u_int32_t); +void usbf_free_buffer(usbf_xfer_handle); +void usbf_setup_xfer(usbf_xfer_handle, usbf_pipe_handle, + usbf_private_handle, void *, u_int32_t, + u_int16_t, u_int32_t, usbf_callback); +void usbf_setup_default_xfer(usbf_xfer_handle, usbf_pipe_handle, + usbf_private_handle, + usb_device_request_t *, u_int16_t, + u_int32_t, usbf_callback); +void usbf_get_xfer_status(usbf_xfer_handle, usbf_private_handle *, + void **, u_int32_t *, usbf_status *); +usbf_status usbf_transfer(usbf_xfer_handle); + +/* + * The usbf_task structure describes a task to be perfomed in process + * context, i.e. the USB device's task thread. This is normally used by + * USB function drivers that need to perform tasks in a process context. + */ +struct usbf_task { + TAILQ_ENTRY(usbf_task) next; + void (*fun)(void *); + void *arg; + char onqueue; +}; + +void usbf_add_task(usbf_device_handle, struct usbf_task *); +void usbf_rem_task(usbf_device_handle, struct usbf_task *); +#define usbf_init_task(t, f, a) ((t)->fun=(f), (t)->arg=(a), (t)->onqueue=0) + +#endif |