diff options
Diffstat (limited to 'Documentation/usb')
| -rw-r--r-- | Documentation/usb/chipidea.txt | 9 | ||||
| -rw-r--r-- | Documentation/usb/usbdevfs-drop-permissions.c | 120 | ||||
| -rw-r--r-- | Documentation/usb/usbip_protocol.txt | 358 | 
3 files changed, 483 insertions, 4 deletions
| diff --git a/Documentation/usb/chipidea.txt b/Documentation/usb/chipidea.txt index 05f735a1b5a5..678741b0f213 100644 --- a/Documentation/usb/chipidea.txt +++ b/Documentation/usb/chipidea.txt @@ -26,16 +26,17 @@ cat /sys/kernel/debug/ci_hdrc.0/registers     On B-device:     echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req -   if HNP polling is not supported, also need: -   On A-device: -   echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req -     B-device should take host role and enumrate A-device.  4) A-device switch back to host.     On B-device:     echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req +   or, by introducing HNP polling, B-Host can know when A-peripheral wish +   to be host role, so this role switch also can be trigged in A-peripheral +   side by answering the polling from B-Host, this can be done on A-device: +   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req +     A-device should switch back to host and enumrate B-device.  5) Remove B-device(unplug micro B plug) and insert again in 10 seconds, diff --git a/Documentation/usb/usbdevfs-drop-permissions.c b/Documentation/usb/usbdevfs-drop-permissions.c new file mode 100644 index 000000000000..6b8da6ef0c9a --- /dev/null +++ b/Documentation/usb/usbdevfs-drop-permissions.c @@ -0,0 +1,120 @@ +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <inttypes.h> +#include <unistd.h> + +#include <linux/usbdevice_fs.h> + +/* For building without an updated set of headers */ +#ifndef USBDEVFS_DROP_PRIVILEGES +#define USBDEVFS_DROP_PRIVILEGES		_IOW('U', 30, __u32) +#define USBDEVFS_CAP_DROP_PRIVILEGES		0x40 +#endif + +void drop_privileges(int fd, uint32_t mask) +{ +	int res; + +	res = ioctl(fd, USBDEVFS_DROP_PRIVILEGES, &mask); +	if (res) +		printf("ERROR: USBDEVFS_DROP_PRIVILEGES returned %d\n", res); +	else +		printf("OK: privileges dropped!\n"); +} + +void reset_device(int fd) +{ +	int res; + +	res = ioctl(fd, USBDEVFS_RESET); +	if (!res) +		printf("OK: USBDEVFS_RESET succeeded\n"); +	else +		printf("ERROR: reset failed! (%d - %s)\n", +		       -res, strerror(-res)); +} + +void claim_some_intf(int fd) +{ +	int i, res; + +	for (i = 0; i < 4; i++) { +		res = ioctl(fd, USBDEVFS_CLAIMINTERFACE, &i); +		if (!res) +			printf("OK: claimed if %d\n", i); +		else +			printf("ERROR claiming if %d (%d - %s)\n", +			       i, -res, strerror(-res)); +	} +} + +int main(int argc, char *argv[]) +{ +	uint32_t mask, caps; +	int c, fd; + +	fd = open(argv[1], O_RDWR); +	if (fd < 0) { +		printf("Failed to open file\n"); +		goto err_fd; +	} + +	/* +	 * check if dropping privileges is supported, +	 * bail on systems where the capability is not present +	 */ +	ioctl(fd, USBDEVFS_GET_CAPABILITIES, &caps); +	if (!(caps & USBDEVFS_CAP_DROP_PRIVILEGES)) { +		printf("DROP_PRIVILEGES not supported\n"); +		goto err; +	} + +	/* +	 * Drop privileges but keep the ability to claim all +	 * free interfaces (i.e., those not used by kernel drivers) +	 */ +	drop_privileges(fd, -1U); + +	printf("Available options:\n" +		"[0] Exit now\n" +		"[1] Reset device. Should fail if device is in use\n" +		"[2] Claim 4 interfaces. Should succeed where not in use\n" +		"[3] Narrow interface permission mask\n" +		"Which option shall I run?: "); + +	while (scanf("%d", &c) == 1) { +		switch (c) { +		case 0: +			goto exit; +		case 1: +			reset_device(fd); +			break; +		case 2: +			claim_some_intf(fd); +			break; +		case 3: +			printf("Insert new mask: "); +			scanf("%x", &mask); +			drop_privileges(fd, mask); +			break; +		default: +			printf("I don't recognize that\n"); +		} + +		printf("Which test shall I run next?: "); +	} + +exit: +	close(fd); +	return 0; + +err: +	close(fd); +err_fd: +	return 1; +} diff --git a/Documentation/usb/usbip_protocol.txt b/Documentation/usb/usbip_protocol.txt new file mode 100644 index 000000000000..16b6fe27284c --- /dev/null +++ b/Documentation/usb/usbip_protocol.txt @@ -0,0 +1,358 @@ +PRELIMINARY DRAFT, MAY CONTAIN MISTAKES! +28 Jun 2011 + +The USB/IP protocol follows a server/client architecture. The server exports the +USB devices and the clients imports them. The device driver for the exported +USB device runs on the client machine. + +The client may ask for the list of the exported USB devices. To get the list the +client opens a TCP/IP connection towards the server, and sends an OP_REQ_DEVLIST +packet on top of the TCP/IP connection (so the actual OP_REQ_DEVLIST may be sent +in one or more pieces at the low level transport layer). The server sends back +the OP_REP_DEVLIST packet which lists the exported USB devices. Finally the +TCP/IP connection is closed. + + virtual host controller                                 usb host +      "client"                                           "server" +  (imports USB devices)                             (exports USB devices) +          |                                                 | +          |                  OP_REQ_DEVLIST                 | +          | ----------------------------------------------> | +          |                                                 | +          |                  OP_REP_DEVLIST                 | +          | <---------------------------------------------- | +          |                                                 | + +Once the client knows the list of exported USB devices it may decide to use one +of them. First the client opens a TCP/IP connection towards the server and +sends an OP_REQ_IMPORT packet. The server replies with OP_REP_IMPORT. If the +import was successful the TCP/IP connection remains open and will be used +to transfer the URB traffic between the client and the server. The client may +send two types of packets: the USBIP_CMD_SUBMIT to submit an URB, and +USBIP_CMD_UNLINK to unlink a previously submitted URB. The answers of the +server may be USBIP_RET_SUBMIT and USBIP_RET_UNLINK respectively. + + virtual host controller                                 usb host +      "client"                                           "server" +  (imports USB devices)                             (exports USB devices) +          |                                                 | +          |                  OP_REQ_IMPORT                  | +          | ----------------------------------------------> | +          |                                                 | +          |                  OP_REP_IMPORT                  | +          | <---------------------------------------------- | +          |                                                 | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = n)         | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_RET_SUBMIT(seqnum = n)         | +          | <---------------------------------------------- | +          |                        .                        | +          |                        :                        | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = m)         | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = m+1)       | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = m+2)       | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_RET_SUBMIT(seqnum = m)         | +          | <---------------------------------------------- | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = m+3)       | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_RET_SUBMIT(seqnum = m+1)       | +          | <---------------------------------------------- | +          |                                                 | +          |            USBIP_CMD_SUBMIT(seqnum = m+4)       | +          | ----------------------------------------------> | +          |                                                 | +          |            USBIP_RET_SUBMIT(seqnum = m+2)       | +          | <---------------------------------------------- | +          |                        .                        | +          |                        :                        | +          |                                                 | +          |               USBIP_CMD_UNLINK                  | +          | ----------------------------------------------> | +          |                                                 | +          |               USBIP_RET_UNLINK                  | +          | <---------------------------------------------- | +          |                                                 | + +The fields are in network (big endian) byte order meaning that the most significant +byte (MSB) is stored at the lowest address. + + +OP_REQ_DEVLIST: Retrieve the list of exported USB devices. + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 2      | 0x0100     | Binary-coded decimal USBIP version number: v1.0.0 +-----------+--------+------------+--------------------------------------------------- + 2         | 2      | 0x8005     | Command code: Retrieve the list of exported USB +           |        |            |   devices. +-----------+--------+------------+--------------------------------------------------- + 4         | 4      | 0x00000000 | Status: unused, shall be set to 0 + +OP_REP_DEVLIST: Reply with the list of exported USB devices. + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 2      | 0x0100     | Binary-coded decimal USBIP version number: v1.0.0. +-----------+--------+------------+--------------------------------------------------- + 2         | 2      | 0x0005     | Reply code: The list of exported USB devices. +-----------+--------+------------+--------------------------------------------------- + 4         | 4      | 0x00000000 | Status: 0 for OK +-----------+--------+------------+--------------------------------------------------- + 8         | 4      | n          | Number of exported devices: 0 means no exported +           |        |            |   devices. +-----------+--------+------------+--------------------------------------------------- + 0x0C      |        |            | From now on the exported n devices are described, +           |        |            |   if any. If no devices are exported the message +           |        |            |   ends with the previous "number of exported +           |        |            |   devices" field. +-----------+--------+------------+--------------------------------------------------- +           | 256    |            | path: Path of the device on the host exporting the +           |        |            |   USB device, string closed with zero byte, e.g. +           |        |            |   "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" +           |        |            |   The unused bytes shall be filled with zero +           |        |            |   bytes. +-----------+--------+------------+--------------------------------------------------- + 0x10C     | 32     |            | busid: Bus ID of the exported device, string +           |        |            |   closed with zero byte, e.g. "3-2". The unused +           |        |            |   bytes shall be filled with zero bytes. +-----------+--------+------------+--------------------------------------------------- + 0x12C     | 4      |            | busnum +-----------+--------+------------+--------------------------------------------------- + 0x130     | 4      |            | devnum +-----------+--------+------------+--------------------------------------------------- + 0x134     | 4      |            | speed +-----------+--------+------------+--------------------------------------------------- + 0x138     | 2      |            | idVendor +-----------+--------+------------+--------------------------------------------------- + 0x13A     | 2      |            | idProduct +-----------+--------+------------+--------------------------------------------------- + 0x13C     | 2      |            | bcdDevice +-----------+--------+------------+--------------------------------------------------- + 0x13E     | 1      |            | bDeviceClass +-----------+--------+------------+--------------------------------------------------- + 0x13F     | 1      |            | bDeviceSubClass +-----------+--------+------------+--------------------------------------------------- + 0x140     | 1      |            | bDeviceProtocol +-----------+--------+------------+--------------------------------------------------- + 0x141     | 1      |            | bConfigurationValue +-----------+--------+------------+--------------------------------------------------- + 0x142     | 1      |            | bNumConfigurations +-----------+--------+------------+--------------------------------------------------- + 0x143     | 1      |            | bNumInterfaces +-----------+--------+------------+--------------------------------------------------- + 0x144     |        | m_0        | From now on each interface is described, all +           |        |            |   together bNumInterfaces times, with the +           |        |            |   the following 4 fields: +-----------+--------+------------+--------------------------------------------------- +           | 1      |            | bInterfaceClass +-----------+--------+------------+--------------------------------------------------- + 0x145     | 1      |            | bInterfaceSubClass +-----------+--------+------------+--------------------------------------------------- + 0x146     | 1      |            | bInterfaceProtocol +-----------+--------+------------+--------------------------------------------------- + 0x147     | 1      |            | padding byte for alignment, shall be set to zero +-----------+--------+------------+--------------------------------------------------- + 0xC +     |        |            | The second exported USB device starts at i=1 + i*0x138 + |        |            | with the busid field. + m_(i-1)*4 |        |            | + +OP_REQ_IMPORT: Request to import (attach) a remote USB device. + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 2      | 0x0100     | Binary-coded decimal USBIP version number: v1.0.0 +-----------+--------+------------+--------------------------------------------------- + 2         | 2      | 0x8003     | Command code: import a remote USB device. +-----------+--------+------------+--------------------------------------------------- + 4         | 4      | 0x00000000 | Status: unused, shall be set to 0 +-----------+--------+------------+--------------------------------------------------- + 8         | 32     |            | busid: the busid of the exported device on the +           |        |            |   remote host. The possible values are taken +           |        |            |   from the message field OP_REP_DEVLIST.busid. +           |        |            |   A string closed with zero, the unused bytes +           |        |            |   shall be filled with zeros. +-----------+--------+------------+--------------------------------------------------- + +OP_REP_IMPORT: Reply to import (attach) a remote USB device. + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 2      | 0x0100     | Binary-coded decimal USBIP version number: v1.0.0 +-----------+--------+------------+--------------------------------------------------- + 2         | 2      | 0x0003     | Reply code: Reply to import. +-----------+--------+------------+--------------------------------------------------- + 4         | 4      | 0x00000000 | Status: 0 for OK +           |        |            |         1 for error +-----------+--------+------------+--------------------------------------------------- + 8         |        |            | From now on comes the details of the imported +           |        |            |   device, if the previous status field was OK (0), +           |        |            |   otherwise the reply ends with the status field. +-----------+--------+------------+--------------------------------------------------- +           | 256    |            | path: Path of the device on the host exporting the +           |        |            |   USB device, string closed with zero byte, e.g. +           |        |            |   "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" +           |        |            |   The unused bytes shall be filled with zero +           |        |            |   bytes. +-----------+--------+------------+--------------------------------------------------- + 0x108     | 32     |            | busid: Bus ID of the exported device, string +           |        |            |   closed with zero byte, e.g. "3-2". The unused +           |        |            |   bytes shall be filled with zero bytes. +-----------+--------+------------+--------------------------------------------------- + 0x128     | 4      |            | busnum +-----------+--------+------------+--------------------------------------------------- + 0x12C     | 4      |            | devnum +-----------+--------+------------+--------------------------------------------------- + 0x130     | 4      |            | speed +-----------+--------+------------+--------------------------------------------------- + 0x134     | 2      |            | idVendor +-----------+--------+------------+--------------------------------------------------- + 0x136     | 2      |            | idProduct +-----------+--------+------------+--------------------------------------------------- + 0x138     | 2      |            | bcdDevice +-----------+--------+------------+--------------------------------------------------- + 0x139     | 1      |            | bDeviceClass +-----------+--------+------------+--------------------------------------------------- + 0x13A     | 1      |            | bDeviceSubClass +-----------+--------+------------+--------------------------------------------------- + 0x13B     | 1      |            | bDeviceProtocol +-----------+--------+------------+--------------------------------------------------- + 0x13C     | 1      |            | bConfigurationValue +-----------+--------+------------+--------------------------------------------------- + 0x13D     | 1      |            | bNumConfigurations +-----------+--------+------------+--------------------------------------------------- + 0x13E     | 1      |            | bNumInterfaces + +USBIP_CMD_SUBMIT: Submit an URB + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 4      | 0x00000001 | command: Submit an URB +-----------+--------+------------+--------------------------------------------------- + 4         | 4      |            | seqnum: the sequence number of the URB to submit +-----------+--------+------------+--------------------------------------------------- + 8         | 4      |            | devid +-----------+--------+------------+--------------------------------------------------- + 0xC       | 4      |            | direction: 0: USBIP_DIR_OUT +           |        |            |            1: USBIP_DIR_IN +-----------+--------+------------+--------------------------------------------------- + 0x10      | 4      |            | ep: endpoint number, possible values are: 0...15 +-----------+--------+------------+--------------------------------------------------- + 0x14      | 4      |            | transfer_flags: possible values depend on the +           |        |            |   URB transfer type, see below +-----------+--------+------------+--------------------------------------------------- + 0x18      | 4      |            | transfer_buffer_length +-----------+--------+------------+--------------------------------------------------- + 0x1C      | 4      |            | start_frame: specify the selected frame to +           |        |            |   transmit an ISO frame, ignored if URB_ISO_ASAP +           |        |            |   is specified at transfer_flags +-----------+--------+------------+--------------------------------------------------- + 0x20      | 4      |            | number_of_packets: number of ISO packets +-----------+--------+------------+--------------------------------------------------- + 0x24      | 4      |            | interval: maximum time for the request on the +           |        |            |   server-side host controller +-----------+--------+------------+--------------------------------------------------- + 0x28      | 8      |            | setup: data bytes for USB setup, filled with +           |        |            |   zeros if not used +-----------+--------+------------+--------------------------------------------------- + 0x30      |        |            | URB data. For ISO transfers the padding between +           |        |            |   each ISO packets is not transmitted. + + +  Allowed transfer_flags  | value      | control | interrupt | bulk     | isochronous + -------------------------+------------+---------+-----------+----------+------------- +  URB_SHORT_NOT_OK        | 0x00000001 | only in | only in   | only in  | no +  URB_ISO_ASAP            | 0x00000002 | no      | no        | no       | yes +  URB_NO_TRANSFER_DMA_MAP | 0x00000004 | yes     | yes       | yes      | yes +  URB_NO_FSBR             | 0x00000020 | yes     | no        | no       | no +  URB_ZERO_PACKET         | 0x00000040 | no      | no        | only out | no +  URB_NO_INTERRUPT        | 0x00000080 | yes     | yes       | yes      | yes +  URB_FREE_BUFFER         | 0x00000100 | yes     | yes       | yes      | yes +  URB_DIR_MASK            | 0x00000200 | yes     | yes       | yes      | yes + + +USBIP_RET_SUBMIT: Reply for submitting an URB + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 4      | 0x00000003 | command +-----------+--------+------------+--------------------------------------------------- + 4         | 4      |            | seqnum: URB sequence number +-----------+--------+------------+--------------------------------------------------- + 8         | 4      |            | devid +-----------+--------+------------+--------------------------------------------------- + 0xC       | 4      |            | direction: 0: USBIP_DIR_OUT +           |        |            |            1: USBIP_DIR_IN +-----------+--------+------------+--------------------------------------------------- + 0x10      | 4      |            | ep: endpoint number +-----------+--------+------------+--------------------------------------------------- + 0x14      | 4      |            | status: zero for successful URB transaction, +           |        |            |   otherwise some kind of error happened. +-----------+--------+------------+--------------------------------------------------- + 0x18      | 4      | n          | actual_length: number of URB data bytes +-----------+--------+------------+--------------------------------------------------- + 0x1C      | 4      |            | start_frame: for an ISO frame the actually +           |        |            |   selected frame for transmit. +-----------+--------+------------+--------------------------------------------------- + 0x20      | 4      |            | number_of_packets +-----------+--------+------------+--------------------------------------------------- + 0x24      | 4      |            | error_count +-----------+--------+------------+--------------------------------------------------- + 0x28      | 8      |            | setup: data bytes for USB setup, filled with +           |        |            |   zeros if not used +-----------+--------+------------+--------------------------------------------------- + 0x30      | n      |            | URB data bytes. For ISO transfers the padding +           |        |            |   between each ISO packets is not transmitted. + +USBIP_CMD_UNLINK: Unlink an URB + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 4      | 0x00000002 | command: URB unlink command +-----------+--------+------------+--------------------------------------------------- + 4         | 4      |            | seqnum: URB sequence number to unlink: FIXME: is this so? +-----------+--------+------------+--------------------------------------------------- + 8         | 4      |            | devid +-----------+--------+------------+--------------------------------------------------- + 0xC       | 4      |            | direction: 0: USBIP_DIR_OUT +           |        |            |            1: USBIP_DIR_IN +-----------+--------+------------+--------------------------------------------------- + 0x10      | 4      |            | ep: endpoint number: zero +-----------+--------+------------+--------------------------------------------------- + 0x14      | 4      |            | seqnum: the URB sequence number given previously +           |        |            |   at USBIP_CMD_SUBMIT.seqnum field +-----------+--------+------------+--------------------------------------------------- + 0x30      | n      |            | URB data bytes. For ISO transfers the padding +           |        |            |   between each ISO packets is not transmitted. + +USBIP_RET_UNLINK: Reply for URB unlink + + Offset    | Length | Value      | Description +-----------+--------+------------+--------------------------------------------------- + 0         | 4      | 0x00000004 | command: reply for the URB unlink command +-----------+--------+------------+--------------------------------------------------- + 4         | 4      |            | seqnum: the unlinked URB sequence number +-----------+--------+------------+--------------------------------------------------- + 8         | 4      |            | devid +-----------+--------+------------+--------------------------------------------------- + 0xC       | 4      |            | direction: 0: USBIP_DIR_OUT +           |        |            |            1: USBIP_DIR_IN +-----------+--------+------------+--------------------------------------------------- + 0x10      | 4      |            | ep: endpoint number +-----------+--------+------------+--------------------------------------------------- + 0x14      | 4      |            | status: This is the value contained in the +           |        |            |   urb->status in the URB completition handler. +           |        |            |   FIXME: a better explanation needed. +-----------+--------+------------+--------------------------------------------------- + 0x30      | n      |            | URB data bytes. For ISO transfers the padding +           |        |            |   between each ISO packets is not transmitted. |