1/*
2 * Copyright (c) 2007-2013 ETH Zurich.
3 * All rights reserved.
4 *
5 * This file is distributed under the terms in the attached LICENSE file.
6 * If you do not find this file, copies can be found by writing to:
7 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 */
9
10#ifndef USB_REQUEST_H_
11#define USB_REQUEST_H_
12
13struct usb_manager_binding;
14struct usb_device;
15struct usb_device_request;
16
17/// struct for managing the request state
18struct usb_request_state {
19    usb_error_t error;
20    struct usb_manager_binding *bind;
21    void (*callback)(void *a);
22    void *data;
23    struct usb_device_request *req;
24    uint16_t data_length;
25    struct usb_xfer *xfer;
26};
27
28/*
29 * Flounder Callback Functions
30 */
31void usb_rx_request_read_call(struct usb_manager_binding *_binding,
32        const uint8_t *request, size_t req_length);
33void usb_rx_request_write_call(struct usb_manager_binding *_binding,
34        const uint8_t *request, size_t req_length, const uint8_t *data,
35        size_t data_length);
36void usb_rx_request_call(struct usb_manager_binding *_binding,
37        const uint8_t *request, size_t req_length);
38
39/*
40 * Handle the requests
41 */
42usb_error_t usb_handle_request(struct usb_device *device, uint16_t flags,
43        struct usb_device_request *req, struct usb_request_state *req_state,
44        void *data, uint16_t *ret_length);
45
46usb_error_t usb_exec_request(struct usb_device *device, uint16_t flags,
47        struct usb_device_request *request, void *data, uint16_t *ret_length);
48
49/* handler function for new device initialization */
50usb_error_t usb_req_set_address(struct usb_device *udev, uint16_t addr);
51usb_error_t usb_req_get_descriptor(struct usb_device *dev,
52        uint16_t *actual_lenght, void *desc, uint16_t min_length,
53        uint16_t max_length, uint16_t id, uint8_t type, uint8_t index,
54        uint8_t retries);
55usb_error_t usb_req_get_device_descriptor(struct usb_device *dev,
56        struct usb_device_descriptor *desc);
57usb_error_t usb_req_get_config_descriptor(struct usb_device *dev,
58        struct usb_config_descriptor **cdesc, uint8_t index);
59usb_error_t usb_req_get_string_desc(struct usb_device *dev, void *sdesc,
60        uint16_t max_len, uint16_t lang_id, uint8_t string_index);
61usb_error_t usb_req_get_string(struct usb_device *dev, char *buf, uint16_t len,
62        uint8_t string_index);
63usb_error_t usb_req_set_config(struct usb_device *dev, uint8_t config);
64
65#endif /* USB_REQUEST_H_ */
66