00001
00041 #ifndef USB_UDC_H_INCLUDED
00042 #define USB_UDC_H_INCLUDED
00043
00044 #include <bitops.h>
00045 #include <usb/usb_protocol.h>
00046
00047 struct usb_request;
00048
00067 typedef int8_t usb_ep_id_t;
00068
00072 enum udc_flag {
00073 UDC_IS_ENABLED,
00074 UDC_AUTOATTACH,
00075 UDC_HAS_POWER,
00076 UDC_IS_SUSPENDED,
00077 };
00078
00086 struct udc {
00088 enum usb_device_speed speed;
00095 uint8_t config;
00097 uint8_t flags;
00104 uint8_t address;
00105 };
00106
00107 #if defined(CONFIG_USBB_UDC)
00108 # include <usb/udc_usbb.h>
00109 #elif defined(CONFIG_AT90USB_UDC)
00110 # include <usb/udc_at90usb.h>
00111 #else
00112
00113 extern void udc_set_address(struct udc *udc, unsigned int addr);
00114 #endif
00115
00117
00118
00132 extern struct udc *udc_init(void);
00133
00135
00143
00155 static inline bool udc_is_high_speed(struct udc *udc)
00156 {
00157 #ifdef CONFIG_UDC_HIGH_SPEED
00158 return udc->speed == USB_SPEED_HIGH;
00159 #else
00160 return false;
00161 #endif
00162 }
00163
00176 static inline bool udc_is_full_speed(struct udc *udc)
00177 {
00178 #ifdef CONFIG_UDC_FULL_SPEED
00179 return udc->speed == USB_SPEED_FULL;
00180 #else
00181 return false;
00182 #endif
00183 }
00184
00198 static inline bool udc_is_low_speed(struct udc *udc)
00199 {
00200 #ifdef CONFIG_UDC_LOW_SPEED
00201 return udc->speed == USB_SPEED_LOW;
00202 #else
00203 return false;
00204 #endif
00205 }
00206
00214 static inline enum usb_device_state udc_state(struct udc *udc)
00215 {
00216 int state;
00217
00218 if (!test_bit(UDC_HAS_POWER, &udc->flags))
00219 state = USB_STATE_ATTACHED;
00220 else if (udc->speed == USB_SPEED_UNKNOWN)
00221 state = USB_STATE_POWERED;
00222 else if (!udc->address)
00223 state = USB_STATE_DEFAULT;
00224 else if (!udc->config)
00225 state = USB_STATE_ADDRESS;
00226 else
00227 state = USB_STATE_CONFIGURED;
00228
00229 if (test_bit(UDC_IS_SUSPENDED, &udc->flags))
00230 state |= USB_STATE_SUSPENDED;
00231
00232 return state;
00233 }
00234
00245 extern void udc_attach(struct udc *udc);
00246
00254 extern void udc_detach(struct udc *udc);
00255
00257
00273
00292 extern usb_ep_id_t udc_ep_create_bulk(struct udc *udc, uint8_t addr,
00293 uint16_t max_packet_size);
00294
00313 extern usb_ep_id_t udc_ep_create_interrupt(struct udc *udc, uint8_t addr,
00314 uint16_t max_packet_size);
00315
00325 extern void udc_ep_destroy(struct udc *udc, usb_ep_id_t ep);
00326
00340 extern status_t udc_ep_clear_halt(struct udc *udc, usb_ep_id_t ep);
00354 extern status_t udc_ep_set_halt(struct udc *udc, usb_ep_id_t ep);
00367 extern status_t udc_ep_is_halted(struct udc *udc, usb_ep_id_t ep);
00368
00385 extern void udc_ep_clear_wedge(struct udc *udc, usb_ep_id_t ep);
00399 extern void udc_ep_set_wedge(struct udc *udc, usb_ep_id_t ep);
00415 extern bool udc_ep_is_wedged(struct udc *udc, usb_ep_id_t ep);
00416
00428 extern void udc_ep_flush(struct udc *udc, usb_ep_id_t ep);
00429
00431
00442
00455 extern void udc_ep0_submit_out_req(struct udc *udc, struct usb_request *req);
00468 extern void udc_ep0_submit_in_req(struct udc *udc, struct usb_request *req);
00469
00490 extern status_t udc_ep0_write_sync(struct udc *udc,
00491 const void *data, size_t len);
00505 extern void udc_ep0_send_status(struct udc *udc);
00518 extern void udc_ep0_expect_status(struct udc *udc);
00519
00521
00531
00545 extern void udc_ep_submit_out_req(struct udc *udc, usb_ep_id_t ep,
00546 struct usb_request *req);
00560 extern void udc_ep_submit_in_req(struct udc *udc, usb_ep_id_t ep,
00561 struct usb_request *req);
00562
00564
00566
00567
00568 #endif