summaryrefslogtreecommitdiff
path: root/firmware/usbstack/drivers/device/usb_storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/usbstack/drivers/device/usb_storage.c')
-rw-r--r--firmware/usbstack/drivers/device/usb_storage.c134
1 files changed, 67 insertions, 67 deletions
diff --git a/firmware/usbstack/drivers/device/usb_storage.c b/firmware/usbstack/drivers/device/usb_storage.c
index 0cb1f108b5..355fc4dfed 100644
--- a/firmware/usbstack/drivers/device/usb_storage.c
+++ b/firmware/usbstack/drivers/device/usb_storage.c
@@ -128,8 +128,8 @@ static int set_config(int config);
128 128
129/*-------------------------------------------------------------------------*/ 129/*-------------------------------------------------------------------------*/
130 130
131void usb_storage_driver_init(void) { 131void usb_storage_driver_init(void)
132 132{
133 logf("usb storage: register"); 133 logf("usb storage: register");
134 usb_device_driver_register(&usb_storage_driver); 134 usb_device_driver_register(&usb_storage_driver);
135} 135}
@@ -137,41 +137,41 @@ void usb_storage_driver_init(void) {
137/*-------------------------------------------------------------------------*/ 137/*-------------------------------------------------------------------------*/
138/* device driver ops */ 138/* device driver ops */
139 139
140void usb_storage_driver_bind(void* controler_ops) { 140void usb_storage_driver_bind(void* controler_ops)
141 141{
142 ops = controler_ops; 142 ops = controler_ops;
143 143
144 /* serach and asign endpoints */ 144 /* serach and asign endpoints */
145 usb_ep_autoconfig_reset(); 145 usb_ep_autoconfig_reset();
146 146
147 dev.in = usb_ep_autoconfig(&storage_bulk_in_desc); 147 dev.in = usb_ep_autoconfig(&storage_bulk_in_desc);
148 if (!dev.in) { 148 if (!dev.in) {
149 goto autoconf_fail; 149 goto autoconf_fail;
150 } 150 }
151 dev.in->claimed = true; 151 dev.in->claimed = true;
152 logf("usb storage: in: %s", dev.in->name); 152 logf("usb storage: in: %s", dev.in->name);
153 153
154 dev.out = usb_ep_autoconfig(&storage_bulk_out_desc); 154 dev.out = usb_ep_autoconfig(&storage_bulk_out_desc);
155 if (!dev.out) { 155 if (!dev.out) {
156 goto autoconf_fail; 156 goto autoconf_fail;
157 } 157 }
158 dev.out->claimed = true; 158 dev.out->claimed = true;
159 logf("usb storage: out: %s", dev.out->name); 159 logf("usb storage: out: %s", dev.out->name);
160 160
161 return; 161 return;
162 162
163autoconf_fail: 163autoconf_fail:
164 logf("failed to find endpoints"); 164 logf("failed to find endpoints");
165} 165}
166 166
167int usb_storage_driver_request(struct usb_ctrlrequest* request) { 167int usb_storage_driver_request(struct usb_ctrlrequest* request)
168 168{
169 int ret = -EOPNOTSUPP; 169 int ret = -EOPNOTSUPP;
170 logf("usb storage: request"); 170 logf("usb storage: request");
171 171
172 res.length = 0; 172 res.length = 0;
173 res.buf = NULL; 173 res.buf = NULL;
174 174
175 switch (request->bRequestType & USB_TYPE_MASK) { 175 switch (request->bRequestType & USB_TYPE_MASK) {
176 case USB_TYPE_STANDARD: 176 case USB_TYPE_STANDARD:
177 177
@@ -187,12 +187,12 @@ int usb_storage_driver_request(struct usb_ctrlrequest* request) {
187 187
188 case USB_DT_CONFIG: 188 case USB_DT_CONFIG:
189 logf("usb storage: sending config desc"); 189 logf("usb storage: sending config desc");
190 190
191 ret = config_buf(buf, request->wValue >> 8, request->wValue & 0xff); 191 ret = config_buf(buf, request->wValue >> 8, request->wValue & 0xff);
192 if (ret >= 0) { 192 if (ret >= 0) {
193 logf("%d, vs %d", request->wLength, ret); 193 logf("%d, vs %d", request->wLength, ret);
194 ret = MIN(request->wLength, (uint16_t)ret); 194 ret = MIN(request->wLength, (uint16_t)ret);
195 } 195 }
196 res.buf = buf; 196 res.buf = buf;
197 break; 197 break;
198 } 198 }
@@ -202,68 +202,68 @@ int usb_storage_driver_request(struct usb_ctrlrequest* request) {
202 logf("usb storage: set configuration %d", request->wValue); 202 logf("usb storage: set configuration %d", request->wValue);
203 ret = set_config(request->wValue); 203 ret = set_config(request->wValue);
204 break; 204 break;
205 205
206 case USB_REQ_SET_INTERFACE: 206 case USB_REQ_SET_INTERFACE:
207 logf("usb storage: set interface"); 207 logf("usb storage: set interface");
208 ret = 0; 208 ret = 0;
209 break; 209 break;
210 } 210 }
211 211
212 case USB_TYPE_CLASS: 212 case USB_TYPE_CLASS:
213 213
214 switch (request->bRequest) { 214 switch (request->bRequest) {
215 case USB_BULK_RESET_REQUEST: 215 case USB_BULK_RESET_REQUEST:
216 logf("usb storage: bulk reset"); 216 logf("usb storage: bulk reset");
217 break; 217 break;
218 218
219 case USB_BULK_GET_MAX_LUN_REQUEST: 219 case USB_BULK_GET_MAX_LUN_REQUEST:
220 logf("usb storage: get max lun"); 220 logf("usb storage: get max lun");
221 /* we support no LUNs (Logical Unit Number) */ 221 /* we support no LUNs (Logical Unit Number) */
222 buf[0] = 0; 222 buf[0] = 0;
223 ret = 1; 223 ret = 1;
224 break; 224 break;
225 } 225 }
226 break; 226 break;
227 } 227 }
228 228
229 if (ret >= 0) { 229 if (ret >= 0) {
230 res.length = ret; 230 res.length = ret;
231 ret = ops->send(NULL, &res); 231 ret = ops->send(NULL, &res);
232 } 232 }
233 233
234 return ret; 234 return ret;
235} 235}
236 236
237/*-------------------------------------------------------------------------*/ 237/*-------------------------------------------------------------------------*/
238/* S/GET CONFIGURATION helpers */ 238/* S/GET CONFIGURATION helpers */
239 239
240static int config_buf(uint8_t *buf, uint8_t type, unsigned index) { 240static int config_buf(uint8_t *buf, uint8_t type, unsigned index)
241 241{
242 int len; 242 int len;
243
244 /* only one configuration */
245 if (index != 0) {
246 return -EINVAL;
247 }
248
249 len = usb_stack_configdesc(&storage_config_desc, buf, BUFFER_SIZE, storage_fullspeed_function);
250 if (len < 0) {
251 return len;
252 }
253 ((struct usb_config_descriptor *)buf)->bDescriptorType = type;
254 return len;
255}
256 243
257static int set_config(int config) { 244 /* only one configuration */
245 if (index != 0) {
246 return -EINVAL;
247 }
258 248
249 len = usb_stack_configdesc(&storage_config_desc, buf, BUFFER_SIZE, storage_fullspeed_function);
250 if (len < 0) {
251 return len;
252 }
253 ((struct usb_config_descriptor *)buf)->bDescriptorType = type;
254 return len;
255}
256
257static int set_config(int config)
258{
259 /* enable endpoints */ 259 /* enable endpoints */
260 logf("setup %s", dev.in->name); 260 logf("setup %s", dev.in->name);
261 ops->enable(dev.in); 261 ops->enable(dev.in);
262 logf("setup %s", dev.out->name); 262 logf("setup %s", dev.out->name);
263 ops->enable(dev.out); 263 ops->enable(dev.out);
264 264
265 /* setup buffers */ 265 /* setup buffers */
266 266
267 return 0; 267 return 0;
268} 268}
269 269