1bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/*
2bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * usbfs header structures
3bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
4bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>
5bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
6bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This library is free software; you can redistribute it and/or
7bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * modify it under the terms of the GNU Lesser General Public
8bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * License as published by the Free Software Foundation; either
9bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * version 2.1 of the License, or (at your option) any later version.
10bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
11bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This library is distributed in the hope that it will be useful,
12bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of
13bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Lesser General Public License for more details.
15bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
16bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You should have received a copy of the GNU Lesser General Public
17bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * License along with this library; if not, write to the Free Software
18bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
20bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
21bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifndef __LIBUSB_USBFS_H__
22bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define __LIBUSB_USBFS_H__
23bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
24bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices"
25bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
26bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_ctrltransfer {
27bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */
28bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint8_t  bmRequestType;
29bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint8_t  bRequest;
30bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint16_t wValue;
31bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint16_t wIndex;
32bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint16_t wLength;
33bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
34bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint32_t timeout;	/* in milliseconds */
35bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
36bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* pointer to data */
37bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *data;
38bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
39bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
40bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_bulktransfer {
41bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */
42bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int ep;
43bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int len;
44bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int timeout;	/* in milliseconds */
45bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
46bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* pointer to data */
47bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *data;
48bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
49bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
50bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_setinterface {
51bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */
52bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int interface;
53bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int altsetting;
54bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
55bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
56bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define USBFS_MAXDRIVERNAME 255
57bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
58bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_getdriver {
59bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int interface;
60bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	char driver[USBFS_MAXDRIVERNAME + 1];
61bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
62bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
63bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define USBFS_URB_SHORT_NOT_OK		0x01
64bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define USBFS_URB_ISO_ASAP			0x02
65bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define USBFS_URB_BULK_CONTINUATION	0x04
66bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define USBFS_URB_QUEUE_BULK		0x10
67bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
68bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevenum usbfs_urb_type {
69bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBFS_URB_TYPE_ISO = 0,
70bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBFS_URB_TYPE_INTERRUPT = 1,
71bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBFS_URB_TYPE_CONTROL = 2,
72bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBFS_URB_TYPE_BULK = 3,
73bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
74bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
75bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_iso_packet_desc {
76bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int length;
77bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int actual_length;
78bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int status;
79bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
80bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
81bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define MAX_ISO_BUFFER_LENGTH		32768
82bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define MAX_BULK_BUFFER_LENGTH		16384
83bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define MAX_CTRL_BUFFER_LENGTH		4096
84bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
85bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_urb {
86bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char type;
87bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char endpoint;
88bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int status;
89bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int flags;
90bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *buffer;
91bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int buffer_length;
92bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int actual_length;
93bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int start_frame;
94bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int number_of_packets;
95bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int error_count;
96bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int signr;
97bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *usercontext;
98bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbfs_iso_packet_desc iso_frame_desc[0];
99bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_connectinfo {
102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int devnum;
103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char slow;
104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_ioctl {
107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int ifno;	/* interface 0..N ; negative numbers reserved */
108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int ioctl_code;	/* MUST encode size + direction of data so the
109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			 * macros in <asm/ioctl.h> give correct values */
110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *data;	/* param buffer (in, or out) */
111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstruct usbfs_hub_portinfo {
114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char numports;
115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char port[127];	/* port to device num mapping */
116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev};
117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_CONTROL	_IOWR('U', 0, struct usbfs_ctrltransfer)
119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_BULK		_IOWR('U', 2, struct usbfs_bulktransfer)
120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_RESETEP	_IOR('U', 3, unsigned int)
121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_SETINTF	_IOR('U', 4, struct usbfs_setinterface)
122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_SETCONFIG	_IOR('U', 5, unsigned int)
123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_GETDRIVER	_IOW('U', 8, struct usbfs_getdriver)
124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_SUBMITURB	_IOR('U', 10, struct usbfs_urb)
125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_DISCARDURB	_IO('U', 11)
126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_REAPURB	_IOW('U', 12, void *)
127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_REAPURBNDELAY	_IOW('U', 13, void *)
128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_CLAIMINTF	_IOR('U', 15, unsigned int)
129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_RELEASEINTF	_IOR('U', 16, unsigned int)
130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_CONNECTINFO	_IOW('U', 17, struct usbfs_connectinfo)
131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_IOCTL         _IOWR('U', 18, struct usbfs_ioctl)
132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_HUB_PORTINFO	_IOR('U', 19, struct usbfs_hub_portinfo)
133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_RESET		_IO('U', 20)
134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_CLEAR_HALT	_IOR('U', 21, unsigned int)
135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_DISCONNECT	_IO('U', 22)
136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define IOCTL_USBFS_CONNECT	_IO('U', 23)
137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
139