1*9b0c1abeSSascha Wildner /* $FreeBSD: head/lib/libusb/libusb20_int.h 250201 2013-05-03 07:44:58Z hselasky $ */ 21d96047eSMarkus Pfeiffer /*- 31d96047eSMarkus Pfeiffer * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 41d96047eSMarkus Pfeiffer * 51d96047eSMarkus Pfeiffer * Redistribution and use in source and binary forms, with or without 61d96047eSMarkus Pfeiffer * modification, are permitted provided that the following conditions 71d96047eSMarkus Pfeiffer * are met: 81d96047eSMarkus Pfeiffer * 1. Redistributions of source code must retain the above copyright 91d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer. 101d96047eSMarkus Pfeiffer * 2. Redistributions in binary form must reproduce the above copyright 111d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer in the 121d96047eSMarkus Pfeiffer * documentation and/or other materials provided with the distribution. 131d96047eSMarkus Pfeiffer * 141d96047eSMarkus Pfeiffer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 151d96047eSMarkus Pfeiffer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 161d96047eSMarkus Pfeiffer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 171d96047eSMarkus Pfeiffer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 181d96047eSMarkus Pfeiffer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 191d96047eSMarkus Pfeiffer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 201d96047eSMarkus Pfeiffer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 211d96047eSMarkus Pfeiffer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 221d96047eSMarkus Pfeiffer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 231d96047eSMarkus Pfeiffer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 241d96047eSMarkus Pfeiffer * SUCH DAMAGE. 251d96047eSMarkus Pfeiffer */ 261d96047eSMarkus Pfeiffer 271d96047eSMarkus Pfeiffer /* 281d96047eSMarkus Pfeiffer * This file describes internal structures. 291d96047eSMarkus Pfeiffer */ 301d96047eSMarkus Pfeiffer 311d96047eSMarkus Pfeiffer #ifndef _LIBUSB20_INT_H_ 321d96047eSMarkus Pfeiffer #define _LIBUSB20_INT_H_ 331d96047eSMarkus Pfeiffer 341d96047eSMarkus Pfeiffer #ifdef COMPAT_32BIT 351d96047eSMarkus Pfeiffer #define libusb20_pass_ptr(ptr) ((uint64_t)(uintptr_t)(ptr)) 361d96047eSMarkus Pfeiffer #else 371d96047eSMarkus Pfeiffer #define libusb20_pass_ptr(ptr) (ptr) 381d96047eSMarkus Pfeiffer #endif 391d96047eSMarkus Pfeiffer 401d96047eSMarkus Pfeiffer struct libusb20_device; 411d96047eSMarkus Pfeiffer struct libusb20_backend; 421d96047eSMarkus Pfeiffer struct libusb20_transfer; 431d96047eSMarkus Pfeiffer struct libusb20_quirk; 441d96047eSMarkus Pfeiffer 451d96047eSMarkus Pfeiffer union libusb20_session_data { 461d96047eSMarkus Pfeiffer unsigned long session_data; 471d96047eSMarkus Pfeiffer struct timespec tv; 481d96047eSMarkus Pfeiffer uint32_t plugtime; 491d96047eSMarkus Pfeiffer }; 501d96047eSMarkus Pfeiffer 511d96047eSMarkus Pfeiffer /* USB backend specific */ 521d96047eSMarkus Pfeiffer typedef const char *(libusb20_get_backend_name_t)(void); 531d96047eSMarkus Pfeiffer typedef int (libusb20_root_get_dev_quirk_t)(struct libusb20_backend *pbe, uint16_t index, struct libusb20_quirk *pq); 541d96047eSMarkus Pfeiffer typedef int (libusb20_root_get_quirk_name_t)(struct libusb20_backend *pbe, uint16_t index, struct libusb20_quirk *pq); 551d96047eSMarkus Pfeiffer typedef int (libusb20_root_add_dev_quirk_t)(struct libusb20_backend *pbe, struct libusb20_quirk *pq); 561d96047eSMarkus Pfeiffer typedef int (libusb20_root_remove_dev_quirk_t)(struct libusb20_backend *pbe, struct libusb20_quirk *pq); 571d96047eSMarkus Pfeiffer typedef int (libusb20_close_device_t)(struct libusb20_device *pdev); 581d96047eSMarkus Pfeiffer typedef int (libusb20_dev_get_info_t)(struct libusb20_device *pdev, struct usb_device_info *pinfo); 591d96047eSMarkus Pfeiffer typedef int (libusb20_dev_get_iface_desc_t)(struct libusb20_device *pdev, uint8_t iface_index, char *buf, uint8_t len); 601d96047eSMarkus Pfeiffer typedef int (libusb20_init_backend_t)(struct libusb20_backend *pbe); 611d96047eSMarkus Pfeiffer typedef int (libusb20_open_device_t)(struct libusb20_device *pdev, uint16_t transfer_count_max); 621d96047eSMarkus Pfeiffer typedef void (libusb20_exit_backend_t)(struct libusb20_backend *pbe); 631d96047eSMarkus Pfeiffer typedef int (libusb20_root_set_template_t)(struct libusb20_backend *pbe, int temp); 641d96047eSMarkus Pfeiffer typedef int (libusb20_root_get_template_t)(struct libusb20_backend *pbe, int *ptemp); 651d96047eSMarkus Pfeiffer 661d96047eSMarkus Pfeiffer #define LIBUSB20_DEFINE(n,field) \ 671d96047eSMarkus Pfeiffer libusb20_##field##_t *field; 681d96047eSMarkus Pfeiffer 691d96047eSMarkus Pfeiffer #define LIBUSB20_DECLARE(n,field) \ 701d96047eSMarkus Pfeiffer /* .field = */ n##_##field, 711d96047eSMarkus Pfeiffer 721d96047eSMarkus Pfeiffer #define LIBUSB20_BACKEND(m,n) \ 731d96047eSMarkus Pfeiffer /* description of this backend */ \ 741d96047eSMarkus Pfeiffer m(n, get_backend_name) \ 751d96047eSMarkus Pfeiffer /* optional backend methods */ \ 761d96047eSMarkus Pfeiffer m(n, init_backend) \ 771d96047eSMarkus Pfeiffer m(n, exit_backend) \ 781d96047eSMarkus Pfeiffer m(n, dev_get_info) \ 791d96047eSMarkus Pfeiffer m(n, dev_get_iface_desc) \ 801d96047eSMarkus Pfeiffer m(n, root_get_dev_quirk) \ 811d96047eSMarkus Pfeiffer m(n, root_get_quirk_name) \ 821d96047eSMarkus Pfeiffer m(n, root_add_dev_quirk) \ 831d96047eSMarkus Pfeiffer m(n, root_remove_dev_quirk) \ 841d96047eSMarkus Pfeiffer m(n, root_set_template) \ 851d96047eSMarkus Pfeiffer m(n, root_get_template) \ 861d96047eSMarkus Pfeiffer /* mandatory device methods */ \ 871d96047eSMarkus Pfeiffer m(n, open_device) \ 881d96047eSMarkus Pfeiffer m(n, close_device) \ 891d96047eSMarkus Pfeiffer 901d96047eSMarkus Pfeiffer struct libusb20_backend_methods { 911d96047eSMarkus Pfeiffer LIBUSB20_BACKEND(LIBUSB20_DEFINE,) 921d96047eSMarkus Pfeiffer }; 931d96047eSMarkus Pfeiffer 941d96047eSMarkus Pfeiffer /* USB dummy methods */ 951d96047eSMarkus Pfeiffer typedef int (libusb20_dummy_int_t)(void); 961d96047eSMarkus Pfeiffer typedef void (libusb20_dummy_void_t)(void); 971d96047eSMarkus Pfeiffer 981d96047eSMarkus Pfeiffer /* USB device specific */ 991d96047eSMarkus Pfeiffer typedef int (libusb20_detach_kernel_driver_t)(struct libusb20_device *pdev, uint8_t iface_index); 1001d96047eSMarkus Pfeiffer typedef int (libusb20_do_request_sync_t)(struct libusb20_device *pdev, struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data, uint16_t *pactlen, uint32_t timeout, uint8_t flags); 1011d96047eSMarkus Pfeiffer typedef int (libusb20_get_config_desc_full_t)(struct libusb20_device *pdev, uint8_t **ppbuf, uint16_t *plen, uint8_t index); 1021d96047eSMarkus Pfeiffer typedef int (libusb20_get_config_index_t)(struct libusb20_device *pdev, uint8_t *pindex); 1031d96047eSMarkus Pfeiffer typedef int (libusb20_kernel_driver_active_t)(struct libusb20_device *pdev, uint8_t iface_index); 1041d96047eSMarkus Pfeiffer typedef int (libusb20_process_t)(struct libusb20_device *pdev); 1051d96047eSMarkus Pfeiffer typedef int (libusb20_reset_device_t)(struct libusb20_device *pdev); 1061d96047eSMarkus Pfeiffer typedef int (libusb20_set_power_mode_t)(struct libusb20_device *pdev, uint8_t power_mode); 1071d96047eSMarkus Pfeiffer typedef int (libusb20_get_power_mode_t)(struct libusb20_device *pdev, uint8_t *power_mode); 108*9b0c1abeSSascha Wildner typedef int (libusb20_get_port_path_t)(struct libusb20_device *pdev, uint8_t *buf, uint8_t bufsize); 109*9b0c1abeSSascha Wildner typedef int (libusb20_get_power_usage_t)(struct libusb20_device *pdev, uint16_t *power_usage); 1101d96047eSMarkus Pfeiffer typedef int (libusb20_set_alt_index_t)(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index); 1111d96047eSMarkus Pfeiffer typedef int (libusb20_set_config_index_t)(struct libusb20_device *pdev, uint8_t index); 1121d96047eSMarkus Pfeiffer typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev); 1131d96047eSMarkus Pfeiffer 1141d96047eSMarkus Pfeiffer /* USB transfer specific */ 115*9b0c1abeSSascha Wildner typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id, uint8_t pre_scale); 1161d96047eSMarkus Pfeiffer typedef int (libusb20_tr_close_t)(struct libusb20_transfer *xfer); 1171d96047eSMarkus Pfeiffer typedef int (libusb20_tr_clear_stall_sync_t)(struct libusb20_transfer *xfer); 1181d96047eSMarkus Pfeiffer typedef void (libusb20_tr_submit_t)(struct libusb20_transfer *xfer); 1191d96047eSMarkus Pfeiffer typedef void (libusb20_tr_cancel_async_t)(struct libusb20_transfer *xfer); 1201d96047eSMarkus Pfeiffer 1211d96047eSMarkus Pfeiffer #define LIBUSB20_DEVICE(m,n) \ 1221d96047eSMarkus Pfeiffer m(n, detach_kernel_driver) \ 1231d96047eSMarkus Pfeiffer m(n, do_request_sync) \ 1241d96047eSMarkus Pfeiffer m(n, get_config_desc_full) \ 1251d96047eSMarkus Pfeiffer m(n, get_config_index) \ 1261d96047eSMarkus Pfeiffer m(n, kernel_driver_active) \ 1271d96047eSMarkus Pfeiffer m(n, process) \ 1281d96047eSMarkus Pfeiffer m(n, reset_device) \ 1291d96047eSMarkus Pfeiffer m(n, check_connected) \ 1301d96047eSMarkus Pfeiffer m(n, set_power_mode) \ 1311d96047eSMarkus Pfeiffer m(n, get_power_mode) \ 132*9b0c1abeSSascha Wildner m(n, get_port_path) \ 133*9b0c1abeSSascha Wildner m(n, get_power_usage) \ 1341d96047eSMarkus Pfeiffer m(n, set_alt_index) \ 1351d96047eSMarkus Pfeiffer m(n, set_config_index) \ 1361d96047eSMarkus Pfeiffer m(n, tr_cancel_async) \ 1371d96047eSMarkus Pfeiffer m(n, tr_clear_stall_sync) \ 1381d96047eSMarkus Pfeiffer m(n, tr_close) \ 1391d96047eSMarkus Pfeiffer m(n, tr_open) \ 1401d96047eSMarkus Pfeiffer m(n, tr_submit) \ 1411d96047eSMarkus Pfeiffer 1421d96047eSMarkus Pfeiffer struct libusb20_device_methods { 1431d96047eSMarkus Pfeiffer LIBUSB20_DEVICE(LIBUSB20_DEFINE,) 1441d96047eSMarkus Pfeiffer }; 1451d96047eSMarkus Pfeiffer 1461d96047eSMarkus Pfeiffer struct libusb20_backend { 1471d96047eSMarkus Pfeiffer TAILQ_HEAD(, libusb20_device) usb_devs; 1481d96047eSMarkus Pfeiffer const struct libusb20_backend_methods *methods; 1491d96047eSMarkus Pfeiffer }; 1501d96047eSMarkus Pfeiffer 1511d96047eSMarkus Pfeiffer struct libusb20_transfer { 1521d96047eSMarkus Pfeiffer struct libusb20_device *pdev; /* the USB device we belong to */ 1531d96047eSMarkus Pfeiffer libusb20_tr_callback_t *callback; 1541d96047eSMarkus Pfeiffer void *priv_sc0; /* private client data */ 1551d96047eSMarkus Pfeiffer void *priv_sc1; /* private client data */ 1561d96047eSMarkus Pfeiffer /* 1571d96047eSMarkus Pfeiffer * Pointer to a list of buffer pointers: 1581d96047eSMarkus Pfeiffer */ 1591d96047eSMarkus Pfeiffer #ifdef COMPAT_32BIT 1601d96047eSMarkus Pfeiffer uint64_t *ppBuffer; 1611d96047eSMarkus Pfeiffer #else 1621d96047eSMarkus Pfeiffer void **ppBuffer; 1631d96047eSMarkus Pfeiffer #endif 1641d96047eSMarkus Pfeiffer /* 1651d96047eSMarkus Pfeiffer * Pointer to frame lengths, which are updated to actual length 1661d96047eSMarkus Pfeiffer * after the USB transfer completes: 1671d96047eSMarkus Pfeiffer */ 1681d96047eSMarkus Pfeiffer uint32_t *pLength; 1691d96047eSMarkus Pfeiffer uint32_t maxTotalLength; 1701d96047eSMarkus Pfeiffer uint32_t maxFrames; /* total number of frames */ 1711d96047eSMarkus Pfeiffer uint32_t nFrames; /* total number of frames */ 1721d96047eSMarkus Pfeiffer uint32_t aFrames; /* actual number of frames */ 1731d96047eSMarkus Pfeiffer uint32_t timeout; 1741d96047eSMarkus Pfeiffer /* isochronous completion time in milliseconds */ 1751d96047eSMarkus Pfeiffer uint16_t timeComplete; 1761d96047eSMarkus Pfeiffer uint16_t trIndex; 1771d96047eSMarkus Pfeiffer uint16_t maxPacketLen; 1781d96047eSMarkus Pfeiffer uint8_t flags; /* see LIBUSB20_TRANSFER_XXX */ 1791d96047eSMarkus Pfeiffer uint8_t status; /* see LIBUSB20_TRANSFER_XXX */ 1801d96047eSMarkus Pfeiffer uint8_t is_opened; 1811d96047eSMarkus Pfeiffer uint8_t is_pending; 1821d96047eSMarkus Pfeiffer uint8_t is_cancel; 1831d96047eSMarkus Pfeiffer uint8_t is_draining; 1841d96047eSMarkus Pfeiffer uint8_t is_restart; 1851d96047eSMarkus Pfeiffer }; 1861d96047eSMarkus Pfeiffer 1871d96047eSMarkus Pfeiffer struct libusb20_device { 1881d96047eSMarkus Pfeiffer 1891d96047eSMarkus Pfeiffer /* device descriptor */ 1901d96047eSMarkus Pfeiffer struct LIBUSB20_DEVICE_DESC_DECODED ddesc; 1911d96047eSMarkus Pfeiffer 1921d96047eSMarkus Pfeiffer /* device timestamp */ 1931d96047eSMarkus Pfeiffer union libusb20_session_data session_data; 1941d96047eSMarkus Pfeiffer 1951d96047eSMarkus Pfeiffer /* our device entry */ 1961d96047eSMarkus Pfeiffer TAILQ_ENTRY(libusb20_device) dev_entry; 1971d96047eSMarkus Pfeiffer 1981d96047eSMarkus Pfeiffer /* device methods */ 1991d96047eSMarkus Pfeiffer const struct libusb20_device_methods *methods; 2001d96047eSMarkus Pfeiffer 2011d96047eSMarkus Pfeiffer /* backend methods */ 2021d96047eSMarkus Pfeiffer const struct libusb20_backend_methods *beMethods; 2031d96047eSMarkus Pfeiffer 2041d96047eSMarkus Pfeiffer /* list of USB transfers */ 2051d96047eSMarkus Pfeiffer struct libusb20_transfer *pTransfer; 2061d96047eSMarkus Pfeiffer 2071d96047eSMarkus Pfeiffer /* private backend data */ 2081d96047eSMarkus Pfeiffer void *privBeData; 2091d96047eSMarkus Pfeiffer 2101d96047eSMarkus Pfeiffer /* libUSB v0.1 and v1.0 compat data */ 2111d96047eSMarkus Pfeiffer void *privLuData; 2121d96047eSMarkus Pfeiffer 2131d96047eSMarkus Pfeiffer /* claimed interface */ 2141d96047eSMarkus Pfeiffer uint8_t claimed_interface; 2151d96047eSMarkus Pfeiffer 2161d96047eSMarkus Pfeiffer /* device file handle */ 2171d96047eSMarkus Pfeiffer int file; 2181d96047eSMarkus Pfeiffer 2191d96047eSMarkus Pfeiffer /* device file handle (control transfers only) */ 2201d96047eSMarkus Pfeiffer int file_ctrl; 2211d96047eSMarkus Pfeiffer 2221d96047eSMarkus Pfeiffer /* debugging level */ 2231d96047eSMarkus Pfeiffer int debug; 2241d96047eSMarkus Pfeiffer 2251d96047eSMarkus Pfeiffer /* number of USB transfers */ 2261d96047eSMarkus Pfeiffer uint16_t nTransfer; 2271d96047eSMarkus Pfeiffer 2281d96047eSMarkus Pfeiffer uint8_t bus_number; 2291d96047eSMarkus Pfeiffer uint8_t device_address; 2301d96047eSMarkus Pfeiffer uint8_t usb_mode; 2311d96047eSMarkus Pfeiffer uint8_t usb_speed; 2321d96047eSMarkus Pfeiffer uint8_t is_opened; 2331d96047eSMarkus Pfeiffer uint8_t parent_address; 2341d96047eSMarkus Pfeiffer uint8_t parent_port; 2351d96047eSMarkus Pfeiffer 2361d96047eSMarkus Pfeiffer char usb_desc[96]; 2371d96047eSMarkus Pfeiffer }; 2381d96047eSMarkus Pfeiffer 2391d96047eSMarkus Pfeiffer extern const struct libusb20_backend_methods libusb20_ugen20_backend; 2401d96047eSMarkus Pfeiffer extern const struct libusb20_backend_methods libusb20_linux_backend; 2411d96047eSMarkus Pfeiffer 2421d96047eSMarkus Pfeiffer #endif /* _LIBUSB20_INT_H_ */ 243