]>
Commit | Line | Data |
---|---|---|
ddf8abd2 MN |
1 | #ifndef __LINUX_FUNCTIONFS_H__ |
2 | #define __LINUX_FUNCTIONFS_H__ 1 | |
3 | ||
4 | ||
5 | #include <linux/types.h> | |
6 | #include <linux/ioctl.h> | |
7 | ||
8 | #include <linux/usb/ch9.h> | |
9 | ||
10 | ||
11 | enum { | |
12 | FUNCTIONFS_DESCRIPTORS_MAGIC = 1, | |
13 | FUNCTIONFS_STRINGS_MAGIC = 2 | |
14 | }; | |
15 | ||
16 | ||
17 | #ifndef __KERNEL__ | |
18 | ||
19 | /* Descriptor of an non-audio endpoint */ | |
20 | struct usb_endpoint_descriptor_no_audio { | |
21 | __u8 bLength; | |
22 | __u8 bDescriptorType; | |
23 | ||
24 | __u8 bEndpointAddress; | |
25 | __u8 bmAttributes; | |
26 | __le16 wMaxPacketSize; | |
27 | __u8 bInterval; | |
28 | } __attribute__((packed)); | |
29 | ||
30 | ||
31 | /* | |
32 | * All numbers must be in little endian order. | |
33 | */ | |
34 | ||
35 | struct usb_functionfs_descs_head { | |
36 | __le32 magic; | |
37 | __le32 length; | |
38 | __le32 fs_count; | |
39 | __le32 hs_count; | |
40 | } __attribute__((packed)); | |
41 | ||
42 | /* | |
43 | * Descriptors format: | |
44 | * | |
45 | * | off | name | type | description | | |
46 | * |-----+-----------+--------------+--------------------------------------| | |
47 | * | 0 | magic | LE32 | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC | | |
48 | * | 4 | lenght | LE32 | length of the whole data chunk | | |
49 | * | 8 | fs_count | LE32 | number of full-speed descriptors | | |
50 | * | 12 | hs_count | LE32 | number of high-speed descriptors | | |
51 | * | 16 | fs_descrs | Descriptor[] | list of full-speed descriptors | | |
52 | * | | hs_descrs | Descriptor[] | list of high-speed descriptors | | |
53 | * | |
54 | * descs are just valid USB descriptors and have the following format: | |
55 | * | |
56 | * | off | name | type | description | | |
57 | * |-----+-----------------+------+--------------------------| | |
58 | * | 0 | bLength | U8 | length of the descriptor | | |
59 | * | 1 | bDescriptorType | U8 | descriptor type | | |
60 | * | 2 | payload | | descriptor's payload | | |
61 | */ | |
62 | ||
63 | struct usb_functionfs_strings_head { | |
64 | __le32 magic; | |
65 | __le32 length; | |
66 | __le32 str_count; | |
67 | __le32 lang_count; | |
68 | } __attribute__((packed)); | |
69 | ||
70 | /* | |
71 | * Strings format: | |
72 | * | |
73 | * | off | name | type | description | | |
74 | * |-----+------------+-----------------------+----------------------------| | |
75 | * | 0 | magic | LE32 | FUNCTIONFS_STRINGS_MAGIC | | |
76 | * | 4 | length | LE32 | length of the data chunk | | |
77 | * | 8 | str_count | LE32 | number of strings | | |
78 | * | 12 | lang_count | LE32 | number of languages | | |
79 | * | 16 | stringtab | StringTab[lang_count] | table of strings per lang | | |
80 | * | |
81 | * For each language there is one stringtab entry (ie. there are lang_count | |
82 | * stringtab entires). Each StringTab has following format: | |
83 | * | |
84 | * | off | name | type | description | | |
85 | * |-----+---------+-------------------+------------------------------------| | |
86 | * | 0 | lang | LE16 | language code | | |
87 | * | 2 | strings | String[str_count] | array of strings in given language | | |
88 | * | |
89 | * For each string ther is one strings entry (ie. there are str_count | |
90 | * string entries). Each String is a NUL terminated string encoded in | |
91 | * UTF-8. | |
92 | */ | |
93 | ||
94 | #endif | |
95 | ||
96 | ||
97 | /* | |
98 | * Events are delivered on the ep0 file descriptor, when the user mode driver | |
99 | * reads from this file descriptor after writing the descriptors. Don't | |
100 | * stop polling this descriptor. | |
101 | */ | |
102 | ||
103 | enum usb_functionfs_event_type { | |
104 | FUNCTIONFS_BIND, | |
105 | FUNCTIONFS_UNBIND, | |
106 | ||
107 | FUNCTIONFS_ENABLE, | |
108 | FUNCTIONFS_DISABLE, | |
109 | ||
110 | FUNCTIONFS_SETUP, | |
111 | ||
112 | FUNCTIONFS_SUSPEND, | |
113 | FUNCTIONFS_RESUME | |
114 | }; | |
115 | ||
116 | /* NOTE: this structure must stay the same size and layout on | |
117 | * both 32-bit and 64-bit kernels. | |
118 | */ | |
119 | struct usb_functionfs_event { | |
120 | union { | |
121 | /* SETUP: packet; DATA phase i/o precedes next event | |
122 | *(setup.bmRequestType & USB_DIR_IN) flags direction */ | |
123 | struct usb_ctrlrequest setup; | |
124 | } __attribute__((packed)) u; | |
125 | ||
126 | /* enum usb_functionfs_event_type */ | |
127 | __u8 type; | |
128 | __u8 _pad[3]; | |
129 | } __attribute__((packed)); | |
130 | ||
131 | ||
132 | /* Endpoint ioctls */ | |
133 | /* The same as in gadgetfs */ | |
134 | ||
135 | /* IN transfers may be reported to the gadget driver as complete | |
136 | * when the fifo is loaded, before the host reads the data; | |
137 | * OUT transfers may be reported to the host's "client" driver as | |
138 | * complete when they're sitting in the FIFO unread. | |
139 | * THIS returns how many bytes are "unclaimed" in the endpoint fifo | |
140 | * (needed for precise fault handling, when the hardware allows it) | |
141 | */ | |
142 | #define FUNCTIONFS_FIFO_STATUS _IO('g', 1) | |
143 | ||
144 | /* discards any unclaimed data in the fifo. */ | |
145 | #define FUNCTIONFS_FIFO_FLUSH _IO('g', 2) | |
146 | ||
147 | /* resets endpoint halt+toggle; used to implement set_interface. | |
148 | * some hardware (like pxa2xx) can't support this. | |
149 | */ | |
150 | #define FUNCTIONFS_CLEAR_HALT _IO('g', 3) | |
151 | ||
152 | /* Specific for functionfs */ | |
153 | ||
154 | /* | |
155 | * Returns reverse mapping of an interface. Called on EP0. If there | |
156 | * is no such interface returns -EDOM. If function is not active | |
157 | * returns -ENODEV. | |
158 | */ | |
159 | #define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128) | |
160 | ||
161 | /* | |
162 | * Returns real bEndpointAddress of an endpoint. If function is not | |
163 | * active returns -ENODEV. | |
164 | */ | |
165 | #define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129) | |
166 | ||
167 | ||
168 | #ifdef __KERNEL__ | |
169 | ||
170 | struct ffs_data; | |
171 | struct usb_composite_dev; | |
172 | struct usb_configuration; | |
173 | ||
174 | ||
175 | static int functionfs_init(void) __attribute__((warn_unused_result)); | |
176 | static void functionfs_cleanup(void); | |
177 | ||
178 | static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) | |
179 | __attribute__((warn_unused_result, nonnull)); | |
180 | static void functionfs_unbind(struct ffs_data *ffs) | |
181 | __attribute__((nonnull)); | |
182 | ||
7898aee1 MN |
183 | static int functionfs_bind_config(struct usb_composite_dev *cdev, |
184 | struct usb_configuration *c, | |
185 | struct ffs_data *ffs) | |
ddf8abd2 MN |
186 | __attribute__((warn_unused_result, nonnull)); |
187 | ||
188 | ||
189 | static int functionfs_ready_callback(struct ffs_data *ffs) | |
190 | __attribute__((warn_unused_result, nonnull)); | |
191 | static void functionfs_closed_callback(struct ffs_data *ffs) | |
192 | __attribute__((nonnull)); | |
193 | static int functionfs_check_dev_callback(const char *dev_name) | |
194 | __attribute__((warn_unused_result, nonnull)); | |
195 | ||
196 | ||
197 | #endif | |
198 | ||
199 | #endif |