Updated usb regs (markdown)
[librecmc/open-ath9k-htc-firmware.wiki.git] / usb-regs.md
1 Assumptions made on source code:
2 * looks like USB block is [FUSB200](http://www.faraday-tech.com/techDocument/FUSB200_ProductBrief_v1_2.pdf).
3 * We have 15 Enddpoints and 15 FIFO buffers.
4 * **FIFO0 - FIFO13, 512 Byte each? FIFO14 - FIFO15 - 64 Byte each?**
5
6 # 0x00 ZM_MAIN_CTRL_OFFSET
7 * BIT7
8 * BIT6 - 1 = HighSpeed is set (read only?)
9 * BIT5
10 * BIT4
11 * BIT3
12 * BIT2 - 1 = enable global Int
13 * BIT1
14 * BIT0 - 1 = set Remote Wake Up;
15
16 # 0x01 ZM_DEVICE_ADDRESS_OFFSET
17 * BIT7 - usb config? (r/w)
18 * BIT6
19 * BIT5
20 * BIT4
21 * BIT3
22 * BIT2
23 * BIT1
24 * BIT0
25
26 # 0x02 ZM_TEST_OFFSET
27 * BIT0 - 1 ?? set on usb 2.0 init
28
29 # 0x08 ZM_PHY_TEST_SELECT_OFFSET
30 * BIT7
31 * BIT6
32 * BIT5
33 * BIT4 - TEST_PKY - Test packed. 
34 * BIT3 - TEST_SE0_NAK
35 * BIT2 - TEST_K
36 * BIT1 - TEST_J
37 * BIT0
38
39 According to FUSB200 doc:  
40 DM(D-) DP(D+) Description  
41 0      0      0: SE0  
42 0      1      1: 'J' State  
43 1      0      2: 'K' State  
44 1      1      3: SE1  
45    0: Control PHY to turn off 1.5K Ohm pull-up resistor  
46    1: Control PHY to turn on 1.5K Ohm pull-up resistor  
47 If TEST_PKY is set, the test packet must be filled into FIFO by DMA first.  
48
49
50 # 0x0A ZM_VDR_SPECIFIC_MODE_OFFSET
51
52 # 0x0B ZM_CX_CONFIG_STATUS_OFFSET
53 * BIT7
54 * BIT6 - EP0 tx stall
55 * BIT5 - indicator that frame was transmitted.
56 * BIT4
57 * BIT3 - set to drom the fram?
58 * BIT2 - set CX_STL to stall Endpoint0 & will also clear FIFO0
59 * BIT1 - 
60 * BIT0 - set CX_DONE to indicate the transmistion of control frame
61
62 # 0x0C ZM_EP0_DATA_OFFSET
63 * Write 32bit data to fifo
64
65 # 0x11 ZM_INTR_MASK_BYTE_0_OFFSET
66 Theoretically INTR_MASK_BYTE should control INTR_SOURCE. Is it correct?
67
68 # 0x12 ZM_INTR_MASK_BYTE_1_OFFSET
69 USB OUT FIFO
70
71 # 0x13 ZM_INTR_MASK_BYTE_2_OFFSET
72 USB OUT FIFO
73
74 # 0x14 ZM_INTR_MASK_BYTE_3_OFFSET
75 USB OUT FIFO
76
77 # 0x15 ZM_INTR_MASK_BYTE_4_OFFSET
78     
79     #define mUSB_REG_OUT_INT_ENABLE() USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_4_OFFSET, \
80                                   USB_BYTE_REG_READ(ZM_INTR_MASK_BYTE_4_OFFSET)&0x3f)
81     #define mUSB_REG_OUT_INT_DISABLE() USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_4_OFFSET, \                    
82                                   USB_BYTE_REG_READ(ZM_INTR_MASK_BYTE_4_OFFSET)&0xc0)
83
84 # 0x16 ZM_INTR_MASK_BYTE_5_OFFSET
85 USB IN FIFO
86
87 # 0x17 ZM_INTR_MASK_BYTE_6_OFFSET
88 USB IN FIFO
89
90     #define mUSB_STATUS_IN_INT_ENABLE()     USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_6_OFFSET, \
91                 USB_BYTE_REG_READ(ZM_INTR_MASK_BYTE_6_OFFSET)&0xbf)
92     #define mUSB_STATUS_IN_INT_DISABLE()    USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_6_OFFSET, \
93                 USB_BYTE_REG_READ(ZM_INTR_MASK_BYTE_6_OFFSET)|0xc0)
94
95 # 0x18 ZM_INTR_MASK_BYTE_7_OFFSET
96
97 # 0x20 ZM_INTR_GROUP_OFFSET
98 * BIT7 - group INTR 7
99 * BIT6 - group INTR 6
100 * BIT5 - group INTR 5
101 * BIT4 - group INTR 4
102 * BIT3 - group INTR 3
103 * BIT2 - group INTR 2
104 * BIT1 - group INTR 1
105 * BIT0 - group INTR 0  
106 These bits indicate if fallowing groups got some interrupt.
107
108 # 0x21 ZM_INTR_SOURCE_0_OFFSET
109 * BIT7 - abort interrupt? should be cleared first?
110 * BIT6 -
111 * BIT5 - 
112 * BIT4 - ep0 CMD_FAIL
113 * BIT3 - ep0 CMD_END
114 * BIT2 - USB EP0 OUT/rx interrupt
115 * BIT1 - USB EP0 IN/tx interrupt
116 * BIT0 - ep0 SETUP
117
118 # 0x22 ZM_INTR_SOURCE_1_OFFSET
119 # 0x23 ZM_INTR_SOURCE_2_OFFSET
120 # 0x24 ZM_INTR_SOURCE_3_OFFSET
121 # 0x25 ZM_INTR_SOURCE_4_OFFSET
122 * BIT7 - End of data.
123 * BIT6 - vUsb_Reg_Out(). Pending data in fifo for EP4. We need to read it out.
124 Comments: we can read only 64bytes per time. If pending data is less then 64bytes or it is end of packet, then BIT6 and BIT7 will be set. If not, then only BIT6 is set. 
125
126 # 0x26 ZM_INTR_SOURCE_5_OFFSET
127 these endpoints are handled by DMA  
128
129 # 0x27 ZM_INTR_SOURCE_6_OFFSET
130 * BIT6 - vUsb_Status_In()?
131
132 # 0x28 ZM_INTR_SOURCE_7_OFFSET
133 * BIT7
134 * BIT6
135 * BIT5
136 * BIT4
137 * BIT3 - USB resume
138 * BIT2 - USB suspend
139 * BIT1 - USB reset interrupt.
140 * BIT0
141
142 # 0x2F mUsbEPMap EP0
143 code use: ZM_FUSB_BASE+0x30+(EPn-1)  
144 (0x0F | FIFOn << 4) = OUT
145 (0xF0 | FIFOn) = IN
146
147 for FIFOn see mUsbFIFOMap registers.
148
149 Current configuration:
150 * 0x2f 0x00                                                                    
151 * 0x30 0x0f <- EP1 = OUT + Start FIFO0                                                                    
152 * 0x31 0xf2 <- EP2 = IN  + Start FIFO2                                                                   
153 * 0x32 0xfe <- EP3 = IN + Start FIFO14                                                                    
154 * 0x33 0xff <- EP4 = OUT + Start FIFO15                                                                    
155 * 0x34 0x4f                                                                     
156 * 0x35 0x6f                                                                     
157 * 0x36 0x00                                                                     
158 * 0x37 0x00                                                                     
159 * 0x38 0x00                                                                     
160 * 0x39 0x00                                                                     
161 * 0x3a 0x00                                                                     
162 * 0x3b 0x00                                                                     
163 * 0x3c 0x00                                                                     
164 * 0x3d 0x00                                                                     
165 * 0x3e 0x00 
166
167 # 0x30 mUsbEPMap EP1
168 # 0x31 mUsbEPMap EP2
169 # 0x32 mUsbEPMap EP3
170 # 0x33 mUsbEPMap EP4
171 # 0x34 mUsbEPMap EP5
172 # 0x35 mUsbEPMap EP6
173 # 0x36 mUsbEPMap EP7                                                                    
174 # 0x37 mUsbEPMap EP8                                                                     
175 # 0x38 mUsbEPMap EP9                                                                   
176 # 0x39 mUsbEPMap EP10                                                                     
177 # 0x3a mUsbEPMap EP11                                                                   
178 # 0x3b mUsbEPMap EP12                                                                  
179 # 0x3c mUsbEPMap EP13                                                                   
180 # 0x3d mUsbEPMap EP14                                                                    
181 # 0x3e mUsbEPMap EP15
182
183 # 0x3E ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP0
184 * BIT0 - BIT7; low size regs. Max size 0x7ff (ZM_EP_IN_MAX_SIZE_LOW_OFFSET + ZM_EP_IN_MAX_SIZE_HIGH_OFFSET)
185
186 # 0x3F ZM_EP_IN_MAX_SIZE_HIGH_OFFSET EP0
187 * BIT7
188 * BIT6
189 * BIT5
190 * BIT4 - mUsbEPinRsTgSet
191 * BIT3 - mUsbEPinStallSet
192 * BIT0 - BIT2; High size regs
193 These offset + 2 Byte step for each endpoint.  
194 For example EP0 = +0x00; EP1 = +0x02; or offset+(EPn << 1). In these address space will fit 15 endpoints.
195
196
197 # 0x40 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP1
198 # 0x42 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP2
199 # 0x44 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP3
200 # 0x46 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP4
201 # 0x48 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP5
202 # 0x4A ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP6
203 # 0x4C ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP7
204 # 0x4E ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP8
205 # 0x50 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP9
206 # 0x52 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP10
207 # 0x54 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP11
208 # 0x56 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP12
209 # 0x58 ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP13
210 # 0x5A ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP14
211 # 0x5C ZM_EP_IN_MAX_SIZE_LOW_OFFSET EP15
212
213 # 0x5E ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP0
214 * BIT0 - BIT7; low size regs. Max size 0x7ff (ZM_EP_OUT_MAX_SIZE_LOW_OFFSET + ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET)
215
216 # 0x5F ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET EP0
217 * BIT7
218 * BIT6
219 * BIT5
220 * BIT4 - mUsbEPoutRsTgSet
221 * BIT3 - mUsbEPoutStallSet
222 * BIT0 - BIT2; High size regs
223
224 These offset + 2 Byte step for each endpoint.  
225 For example EP0 = +0x00; EP1 = +0x02; or offset+(EPn << 1). In these address space will fit 15 endpoints.
226
227 # 0x60 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP1
228 # 0x62 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP2
229 # 0x64 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP3
230 # 0x66 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP4
231 # 0x68 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP5
232 # 0x6A ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP6
233 # 0x6C ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP7
234 # 0x6E ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP8
235 # 0x70 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP9
236 # 0x72 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP10
237 # 0x74 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP11
238 # 0x76 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP12
239 # 0x78 ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP13
240 # 0x7A ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP14
241 # 0x7C ZM_EP_OUT_MAX_SIZE_LOW_OFFSET EP15
242
243 # 0x80 mUsbFIFOMap FIFO0                                                                 
244 * BIT7
245 * BIT6
246 * BIT5
247 * BIT4 - Direction: 0 - OUT; 1 - IN.
248 * BIT0 - BIT3: assigned EP number.
249
250 Current layout:
251 * 0x80 0x01 - EP1 OUT                                                                 
252 * 0x81 0x01 - EP1 OUT                                                                    
253 * 0x82 0x12 - EP2 IN                                                                    
254 * 0x83 0x12 - EP2 IN                                                                    
255 * 0x84 0x05                                                                     
256 * 0x85 0x05                                                                     
257 * 0x86 0x06                                                                     
258 * 0x87 0x06                                                                     
259 * 0x88 0x00                                                                     
260 * 0x89 0x00                                                                     
261 * 0x8a 0x00                                                                     
262 * 0x8b 0x00                                                                     
263 * 0x8c 0x00                                                                     
264 * 0x8d 0x00                                                                     
265 * 0x8e 0x13                                                                     
266 * 0x8f 0x04 
267
268 # 0x81 mUsbFIFOMap FIFO1                                                                  
269 # 0x82 mUsbFIFOMap FIFO2                                                                 
270 # 0x83 mUsbFIFOMap FIFO3                                                            
271 # 0x84 mUsbFIFOMap FIFO4                                                            
272 # 0x85 mUsbFIFOMap FIFO5                                                             
273 # 0x86 mUsbFIFOMap FIFO6                                                                 
274 # 0x87 mUsbFIFOMap FIFO7                                                                 
275 # 0x88 mUsbFIFOMap FIFO8                                                               
276 # 0x89 mUsbFIFOMap FIFO9                                                              
277 # 0x8a mUsbFIFOMap FIFO10                                                              
278 # 0x8b mUsbFIFOMap FIFO11                                                             
279 # 0x8c mUsbFIFOMap FIFO12                                                               
280 # 0x8d mUsbFIFOMap FIFO13                                                               
281 # 0x8e mUsbFIFOMap FIFO14                                                               
282 # 0x8f mUsbFIFOMap FIFO15
283
284 # 0x90 mUsbFIFOConfig FIFO0
285 * BIT7 - If EPn use more then one FIFO, then this bit should be on the first
286 * BIT6
287 * BIT5
288 * BIT4 - Block size: 0 - 64/512; 1 - 128/1024. It depends on initial FIFO size.
289 * BIT2 - BIT3; number of FIFO blocks or better to say extra blocks? 0 - no more blocks; 1 - one block; 2 - two blocks.
290 * BIT0 - BIT1; EP type: 0x1 - Iso; 0x2 - Bulk, 0x3 - Intr;
291
292 * 0x90 0x86 <- FIFO0: Bulk | + one block (0x91) | size 512
293 * 0x91 0x06                                                                     
294 * 0x92 0x86                                                                     
295 * 0x93 0x06                                                                     
296 * 0x94 0x86                                                                     
297 * 0x95 0x06                                                                     
298 * 0x96 0x86                                                                     
299 * 0x97 0x06                                                                     
300 * 0x98 0x00                                                                     
301 * 0x99 0x00                                                                     
302 * 0x9a 0x00                                                                     
303 * 0x9b 0x00                                                                     
304 * 0x9c 0x00                                                                     
305 * 0x9d 0x00                                                                     
306 * 0x9e 0x83                                                                     
307 * 0x9f 0x83 
308
309 # 0x91 mUsbFIFOConfig FIFO1                                                                    
310 # 0x92 mUsbFIFOConfig FIFO2                                                                    
311 # 0x93 mUsbFIFOConfig FIFO3                                                                     
312 # 0x94 mUsbFIFOConfig FIFO4                                                                     
313 # 0x95 mUsbFIFOConfig FIFO5                                                                     
314 # 0x96 mUsbFIFOConfig FIFO6                                                                     
315 # 0x97 mUsbFIFOConfig FIFO7                                                                     
316 # 0x98 mUsbFIFOConfig FIFO8                                                                     
317 # 0x99 mUsbFIFOConfig FIFO9                                                                     
318 # 0x9a mUsbFIFOConfig FIFO10                                                                     
319 # 0x9b mUsbFIFOConfig FIFO11                                                                     
320 # 0x9c mUsbFIFOConfig FIFO12                                                                     
321 # 0x9d mUsbFIFOConfig FIFO13                                                                     
322 # 0x9e mUsbFIFOConfig FIFO14                                                                     
323 # 0x9f mUsbFIFOConfig FIFO15  
324
325 # 0xAE ZM_EP3_BYTE_COUNT_HIGH_OFFSET
326     BIT3 - 1 xfer done?
327     comments: after sending data from target to host, set BIT3
328
329 # 0xAF ZM_EP4_BYTE_COUNT_HIGH_OFFSET
330     BIT4 - 1 - reset fifo; 0 - disable reset?
331     comments: probably compatible with ZM_EP3_BYTE_COUNT_HIGH_OFFSET.  
332 **These name reg do not fit to pattern!!!** Compare with 0x3e, 0x3f and 0x5e, 0x5f.
333 If we have 0x3e, 0x3f and 0x5e, 0x5f, why do we need this register?
334
335 # 0xBE ZM_EP3_BYTE_COUNT_LOW_OFFSET
336     size of data in fifo buffer? never used?
337
338 # 0xBF ZM_EP4_BYTE_COUNT_LOW_OFFSET
339     size of data in fifo buffer. Maximum size of EP4 should be 64 Bytes. If reported value is bigger, then buffer is defiantly corrupt.
340
341 # 0xc0 FIFO0 DATA OFFSET?
342 # 0xc4 FIFO1 DATA OFFSET?
343 # 0xc8 FIFO2 DATA OFFSET?
344 # 0xcc FIFO3 DATA OFFSET?
345 # 0xd0 FIFO4 DATA OFFSET?
346 # 0xd4 FIFO5 DATA OFFSET?
347 # 0xd8 FIFO6 DATA OFFSET?
348 # 0xdc FIFO7 DATA OFFSET?
349 # 0xe0 FIFO8 DATA OFFSET?
350 # 0xe4 FIFO9 DATA OFFSET?
351 # 0xe8 FIFO10 DATA OFFSET?
352 # 0xec FIFO11 DATA OFFSET?
353 # 0xf0 FIFO12 DATA OFFSET?
354 # 0xf4 FIFO13 DATA OFFSET?
355 # 0xf8 FIFO14 DATA OFFSET?
356 # 0xfc FIFO15 DATA OFFSET?
357
358 # 0xF8 ZM_EP3_DATA_OFFSET
359 32bit data. Probably FIFO14 offset.. not EP
360
361 # 0xFC ZM_EP4_DATA_OFFSET
362 32bit data. Probably FIFO15 offset.. not EP
363
364 # 0x100 ZM_CBUS_FIFO_SIZE_REG
365 0x1 - 1 Byte, 0x3 - 2 Byte, 0x7 - 3 Byte; 0xf - 4 Byte.
366
367 **we miss 7 bytes here**
368
369 # 0x108 ZM_SOC_USB_MODE_CTRL_OFFSET
370     BIT10 - 1 - enable MP (EP6) downstream stream mode
371     BIT9 - 1 - enable MP (EP6) downstream DMA mode
372     BIT8 - 1 - enable HP (EP5) downstream DMA mode
373     BIT7 - 1 - enable HP (EP5) downstream stream mode
374     BIT6 - 1 - enable LP downstream stream mode
375     BIT5 - define the host dma buffer size - 4096(00) 8192 (01) 16384(10) 32768(11) bytes
376     BIT4 - ^
377     BIT3 - 0 - enable upstream stream mode: 1 - enable upstream packed mode;
378     BIT2 - 0 - Set into 64 byte mode (full speed) 1 - Set into 512 byte mode (usb highspeed)
379     BIT1 - 0 - disable upstream dma mode; 1 - enable upstream dma mode
380     BIT0 - 0 - disable LP down stream dma mode; 1 - eanble LP down stream dma mode
381 comments:
382 ryan: 04/01: bit0 could disable lpdn dma, which is good at debugging while async_fifo have problem,    we could disable this and check the fifo_rcv_size to see if we have correct at fifo or not
383 LP - lo priotiry; MP - middle priority; HP - High priority;
384     
385
386 # 0x110 ZM_SOC_USB_MAX_AGGREGATE_OFFSET
387     set stream mode packet buffer critirea
388     0x0 = disable stream mode or 1 packet. So 0x9 is 10 packets?
389 # 0x114 ZM_SOC_USB_TIME_CTRL_OFFSET
390     set stream mode timeout critirea. the unit is 32 USB (30Mhz) clock cycles.
391
392 # 0x1f0 ZM_CBUS_CTRL_REG