0x001f0000
     ˆ¿Äƒh¹¾Æ      100mA
     ˆÅÄ„Ž>ïÃ¾Æ ?÷     /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI__LINUX_FUNCTIONFS_H__
#define _UAPI__LINUX_FUNCTIONFS_H__


#include <linux/const.h>
#include <linux/types.h>
#include <linux/ioctl.h>

#include <linux/usb/ch9.h>


enum {
	FUNCTIONFS_DESCRIPTORS_MAGIC = 1,
	FUNCTIONFS_STRINGS_MAGIC = 2,
	FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3,
};

enum functionfs_flags {
	FUNCTIONFS_HAS_FS_DESC = 1,
	FUNCTIONFS_HAS_HS_DESC = 2,
	FUNCTIONFS_HAS_SS_DESC = 4,
	FUNCTIONFS_HAS_MS_OS_DESC = 8,
	FUNCTIONFS_VIRTUAL_ADDR = 16,
	FUNCTIONFS_EVENTFD = 32,
	FUNCTIONFS_ALL_CTRL_RECIP = 64,
	FUNCTIONFS_CONFIG0_SETUP = 128,
};

/* Descriptor of an non-audio endpoint */
struct usb_endpoint_descriptor_no_audio {
	__u8  bLength;
	__u8  bDescriptorType;

	__u8  bEndpointAddress;
	__u8  bmAttributes;
	__le16 wMaxPacketSize;
	__u8  bInterval;
} __attribute__((packed));

/**
 * struct usb_dfu_functional_descriptor - DFU Functional descriptor
 * @bLength:		Size of the descriptor (bytes)
 * @bDescriptorType:	USB_DT_DFU_FUNCTIONAL
 * @bmAttributes:	DFU attributes
 * @wDetachTimeOut:	Maximum time to wait after DFU_DETACH (ms, le16)
 * @wTransferSize:	Maximum number of bytes per control-write (le16)
 * @bcdDFUVersion:	DFU Spec version (BCD, le16)
 */
struct usb_dfu_functional_descriptor {
	__u8  bLength;
	__u8  bDescriptorType;
	__u8  bmAttributes;
	__le16 wDetachTimeOut;
	__le16 wTransferSize;
	__le16 bcdDFUVersion;
} __attribute__ ((packed));

/* from DFU functional descriptor bmAttributes */
#define DFU_FUNC_ATT_CAN_DOWNLOAD	_BITUL(0)
#define DFU_FUNC_ATT_CAN_UPLOAD		_BITUL(1)
#define DFU_FUNC_ATT_MANIFEST_TOLERANT	_BITUL(2)
#define DFU_FUNC_ATT_WILL_DETACH	_BITUL(3)


struct usb_functionfs_descs_head_v2 {
	__le32 magic;
	__le32 length;
	__le32 flags;
	/*
	 * __le32 fs_count, hs_count, fs_count; must be included manually in
	 * the structure taking flags into consideration.
	 */
} __attribute__((packed));

/* Legacy format, deprecated as of 3.14. */
struct usb_functionfs_descs_head {
	__le32 magic;
	__le32 length;
	__le32 fs_count;
	__le32 hs_count;
} __attribute__((packed, deprecated));

/* MS OS Descriptor header */
struct usb_os_desc_header {
	__u8	interface;
	__le32	dwLength;
	__le16	bcdVersion;
	__le16	wIndex;
	union {
		struct {
			__u8	bCount;
			__u8	Reserved;
		};
		__le16	wCount;
	};
} __attribute__((packed));

struct usb_ext_compat_desc {
	__u8	bFirstInterfaceNumber;
	__u8	Reserved1;
	__struct_group(/* no tag */, IDs, /* no attrs */,
		__u8	CompatibleID[8];
		__u8	SubCompatibleID[8];
	);
	__u8	Reserved2[6];
};

struct usb_ext_prop_desc {
	__le32	dwSize;
	__le32	dwPropertyDataType;
	__le16	wPropertyNameLength;
} __attribute__((packed));

/* Flags for usb_ffs_dmabuf_transfer_req->flags (none for now) */
#define USB_FFS_DMABUF_TRANSFER_MASK	0x0

/**
 * struct usb_ffs_dmabuf_transfer_req - Transfer request for a DMABUF object
 * @fd:		file descriptor of the DMABUF object
 * @flags:	one or more USB_FFS_DMABUF_TRANSFER_* flags
 * @length:	number of bytes used in this DMABUF for the data transfer.
 *		Should generally be set to the DMABUF's size.
 */
struct usb_ffs_dmabuf_transfer_req {
	int fd;
	__u32 flags;
	__u64 length;
} __attribute__((packed));

#ifndef __KERNEL__

/**
 * DOC: descriptors
 *
 * Descriptors format:
 *
 * +-----+-----------+--------------+--------------------------------------+
 * | off | name      | type         | description                          |
 * +-----+-----------+--------------+--------------------------------------+
 * |   0 | magic     | LE32         | FUNCTIONFS_DESCRIPTORS_MAGIC_V2      |
 * +-----+-----------+--------------+--------------------------------------+
 * |   4 | length    | LE32         | length of the whole data chunk       |
 * +-----+-----------+--------------+--------------------------------------+
 * |   8 | flags     | LE32         | combination of functionfs_flags      |
 * +-----+-----------+--------------+--------------------------------------+
 * |     | eventfd   | LE32         | eventfd file descri