a stab at turning on rudimentary logging for telefiretwo
[fw/altos] / src / kernel / ao_usb.h
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #ifndef _AO_USB_H_
20 #define _AO_USB_H_
21
22 /*
23  * ao_usb.c
24  */
25
26 /* Put one character to the USB output queue */
27 void
28 ao_usb_putchar(char c);
29
30 /* Get one character from the USB input queue */
31 char
32 ao_usb_getchar(void);
33
34 /* Poll for a charcter on the USB input queue.
35  * returns AO_READ_AGAIN if none are available
36  */
37 int
38 ao_usb_pollchar(void);
39
40 /* Flush the USB output queue */
41 void
42 ao_usb_flush(void);
43
44 /* Enable the USB controller */
45 void
46 ao_usb_enable(void);
47
48 /* Disable the USB controller */
49 void
50 ao_usb_disable(void);
51
52 /* Initialize the USB system */
53 void
54 ao_usb_init(void);
55
56 extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
57
58 #define AO_USB_SETUP_DIR_MASK   (0x01 << 7)
59 #define AO_USB_SETUP_TYPE_MASK  (0x03 << 5)
60 #define AO_USB_SETUP_RECIP_MASK (0x1f)
61
62 #define AO_USB_DIR_OUT                  0
63 #define AO_USB_DIR_IN                   (1 << 7)
64
65 #define AO_USB_TYPE_STANDARD            0
66 #define AO_USB_TYPE_CLASS               (1 << 5)
67 #define AO_USB_TYPE_VENDOR              (2 << 5)
68 #define AO_USB_TYPE_RESERVED            (3 << 5)
69
70 #define AO_USB_RECIP_DEVICE             0
71 #define AO_USB_RECIP_INTERFACE          1
72 #define AO_USB_RECIP_ENDPOINT           2
73 #define AO_USB_RECIP_OTHER              3
74
75 /* standard requests */
76 #define AO_USB_REQ_GET_STATUS           0x00
77 #define AO_USB_REQ_CLEAR_FEATURE        0x01
78 #define AO_USB_REQ_SET_FEATURE          0x03
79 #define AO_USB_REQ_SET_ADDRESS          0x05
80 #define AO_USB_REQ_GET_DESCRIPTOR       0x06
81 #define AO_USB_REQ_SET_DESCRIPTOR       0x07
82 #define AO_USB_REQ_GET_CONFIGURATION    0x08
83 #define AO_USB_REQ_SET_CONFIGURATION    0x09
84 #define AO_USB_REQ_GET_INTERFACE        0x0A
85 #define AO_USB_REQ_SET_INTERFACE        0x0B
86 #define AO_USB_REQ_SYNCH_FRAME          0x0C
87
88 #define AO_USB_DESC_DEVICE              1
89 #define AO_USB_DESC_CONFIGURATION       2
90 #define AO_USB_DESC_STRING              3
91 #define AO_USB_DESC_INTERFACE           4
92 #define AO_USB_DESC_ENDPOINT            5
93 #define AO_USB_DESC_DEVICE_QUALIFIER    6
94 #define AO_USB_DESC_OTHER_SPEED         7
95 #define AO_USB_DESC_INTERFACE_POWER     8
96
97 #define AO_USB_GET_DESC_TYPE(x)         (((x)>>8)&0xFF)
98 #define AO_USB_GET_DESC_INDEX(x)        ((x)&0xFF)
99
100 #define AO_USB_CONTROL_EP       0
101 #define AO_USB_CONTROL_SIZE     32
102
103 #define AO_USB_INT_EP           1
104 #define AO_USB_INT_SIZE         8
105
106 #ifndef AO_USB_OUT_EP
107 #define AO_USB_OUT_EP           4
108 #define AO_USB_IN_EP            5
109 #define AO_USB_IN2_EP           6
110 #endif
111
112 #ifndef AO_USB_HAS_OUT
113 #define AO_USB_HAS_OUT  1
114 #endif
115
116 #ifndef AO_USB_HAS_IN
117 #define AO_USB_HAS_IN   1
118 #endif
119
120 #ifndef AO_USB_HAS_INT
121 #define AO_USB_HAS_INT  1
122 #endif
123
124 #ifndef AO_USB_HAS_IN2
125 #define AO_USB_HAS_IN2  0
126 #endif
127
128 /*
129  * USB bulk packets can only come in 8, 16, 32 and 64
130  * byte sizes, so we'll use 64 for everything
131  */
132 #define AO_USB_IN_SIZE          64
133 #define AO_USB_OUT_SIZE         64
134
135 #define AO_USB_EP0_IDLE         0
136 #define AO_USB_EP0_DATA_IN      1
137 #define AO_USB_EP0_DATA_OUT     2
138 #define AO_USB_EP0_STALL        3
139
140 #define LE_WORD(x)    ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8))
141
142 /* CDC definitions */
143 #define AO_USB_CS_INTERFACE             0x24
144 #define AO_USB_CS_ENDPOINT              0x25
145
146 #define AO_USB_SET_LINE_CODING          0x20
147 #define AO_USB_GET_LINE_CODING          0x21
148 #define AO_USB_SET_CONTROL_LINE_STATE   0x22
149
150 /* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */
151 struct ao_usb_line_coding {
152         uint32_t        rate;
153         uint8_t         char_format;
154         uint8_t         parity;
155         uint8_t         data_bits;
156 } ;
157
158 extern __pdata uint8_t ao_usb_running;
159
160 #endif /* _AO_USB_H_ */