Update USB and Chopstx
[gnuk/neug.git] / src / usb_lld.h
1 #define STANDARD_ENDPOINT_DESC_SIZE             0x09
2
3 /* endpoints enumeration */
4 #define ENDP0       ((uint8_t)0)
5 #define ENDP1       ((uint8_t)1)
6 #define ENDP2       ((uint8_t)2)
7 #define ENDP3       ((uint8_t)3)
8 #define ENDP4       ((uint8_t)4)
9 #define ENDP5       ((uint8_t)5)
10 #define ENDP6       ((uint8_t)6)
11 #define ENDP7       ((uint8_t)7)
12
13 /* EP_TYPE[1:0] EndPoint TYPE */
14 #define EP_BULK        (0x0000) /* EndPoint BULK        */
15 #define EP_CONTROL     (0x0200) /* EndPoint CONTROL     */
16 #define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */
17 #define EP_INTERRUPT   (0x0600) /* EndPoint INTERRUPT   */
18
19 enum RECIPIENT_TYPE
20 {
21   DEVICE_RECIPIENT = 0, /* Recipient device    */
22   INTERFACE_RECIPIENT,  /* Recipient interface */
23   ENDPOINT_RECIPIENT,   /* Recipient endpoint  */
24   OTHER_RECIPIENT
25 };
26
27 enum DESCRIPTOR_TYPE
28 {
29   DEVICE_DESCRIPTOR = 1,
30   CONFIG_DESCRIPTOR,
31   STRING_DESCRIPTOR,
32   INTERFACE_DESCRIPTOR,
33   ENDPOINT_DESCRIPTOR
34 };
35
36 #define REQUEST_DIR       0x80  /* Mask to get request dir  */
37 #define REQUEST_TYPE      0x60  /* Mask to get request type */
38 #define STANDARD_REQUEST  0x00  /* Standard request         */
39 #define CLASS_REQUEST     0x20  /* Class request            */
40 #define VENDOR_REQUEST    0x40  /* Vendor request           */
41 #define RECIPIENT         0x1F  /* Mask to get recipient    */
42
43 #define USB_SETUP_SET(req) ((req & REQUEST_DIR) == 0)
44 #define USB_SETUP_GET(req) ((req & REQUEST_DIR) != 0)
45
46 enum
47 {
48   USB_UNSUPPORT = 0,
49   USB_SUCCESS = 1,
50 };
51
52 struct req_args {
53   uint16_t value;
54   uint16_t index;
55   uint16_t len;
56 };
57
58 void usb_cb_device_reset (void);
59 int usb_cb_setup (uint8_t req, uint8_t req_no, struct req_args *arg);
60 int usb_cb_interface (uint8_t cmd, struct req_args *arg);
61 int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index,
62                            struct req_args *arg);
63 int usb_cb_handle_event (uint8_t event_type, uint16_t value);
64 void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no,
65                                struct req_args *arg);
66 void usb_cb_tx_done (uint8_t ep_num);
67 void usb_cb_rx_ready (uint8_t ep_num);
68
69 enum {
70   USB_EVENT_ADDRESS,
71   USB_EVENT_CONFIG,
72   USB_EVENT_SUSPEND,
73   USB_EVENT_WAKEUP,
74   USB_EVENT_STALL,
75 };
76
77 enum {
78   USB_SET_INTERFACE,
79   USB_GET_INTERFACE,
80   USB_QUERY_INTERFACE,
81 };
82
83 enum DEVICE_STATE
84 {
85   UNCONNECTED,
86   ATTACHED,
87   POWERED,
88   SUSPENDED,
89   ADDRESSED,
90   CONFIGURED
91 };
92
93 void usb_lld_init (uint8_t feature);
94 void usb_lld_to_pmabuf (const void *src, uint16_t addr, size_t n);
95 void usb_lld_from_pmabuf (void *dst, uint16_t addr, size_t n);
96 void usb_lld_stall_tx (int ep_num);
97 void usb_lld_stall_rx (int ep_num);
98 int usb_lld_tx_data_len (int ep_num);
99 void usb_lld_txcpy (const void *src, int ep_num, int offset, size_t len);
100 void usb_lld_tx_enable (int ep_num, size_t len);
101 void usb_lld_write (uint8_t ep_num, const void *buf, size_t len);
102 int usb_lld_reply_request (const void *buf, size_t buflen,
103                            struct req_args *arg);
104 void usb_lld_rx_enable (int ep_num);
105 int usb_lld_rx_data_len (int ep_num);
106 void usb_lld_rxcpy (uint8_t *dst, int ep_num, int offset, size_t len);
107 void usb_lld_reset (uint8_t feature);
108 void usb_lld_setup_endpoint (int ep_num, int ep_type, int ep_kind,
109                              int ep_rx_addr, int ep_tx_addr,
110                              int ep_rx_memory_size);
111 void usb_lld_set_configuration (uint8_t config);
112 uint8_t usb_lld_current_configuration (void);
113 void usb_lld_set_data_to_recv (void *p, size_t len);
114
115 void usb_lld_prepare_shutdown (void);
116 void usb_lld_shutdown (void);
117
118 void usb_interrupt_handler (void);