Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/bdk/usb/xusbd.c
3694 views
1
/*
2
* eXtensible USB Device driver (XDCI) for Tegra X1
3
*
4
* Copyright (c) 2020-2025 CTCaer
5
*
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms and conditions of the GNU General Public License,
8
* version 2, as published by the Free Software Foundation.
9
*
10
* This program is distributed in the hope it will be useful, but WITHOUT
11
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13
* more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
*/
18
19
#include <string.h>
20
21
#include <usb/usbd.h>
22
#include <usb/usb_descriptor_types.h>
23
#include <usb/usb_t210.h>
24
25
#include <gfx_utils.h>
26
#include <mem/mc.h>
27
#include <soc/bpmp.h>
28
#include <soc/clock.h>
29
#include <soc/fuse.h>
30
#include <soc/pmc.h>
31
#include <soc/timer.h>
32
#include <soc/t210.h>
33
#include <utils/btn.h>
34
35
#include <memory_map.h>
36
37
#define XUSB_TRB_SLOTS 16 //! TODO: Consider upping it.
38
#define XUSB_LINK_TRB_IDX (XUSB_TRB_SLOTS - 1)
39
#define XUSB_LAST_TRB_IDX (XUSB_TRB_SLOTS - 1)
40
41
#define EP_DONT_RING 0
42
#define EP_RING_DOORBELL 1
43
44
typedef enum {
45
XUSB_FULL_SPEED = 1,
46
XUSB_HIGH_SPEED = 3,
47
XUSB_SUPER_SPEED = 4
48
} xusb_speed_t;
49
50
typedef enum {
51
EP_DISABLED = 0,
52
EP_RUNNING = 1,
53
EP_HALTED = 2,
54
EP_STOPPED = 3,
55
EP_ERROR = 4
56
} xusb_ep_status_t;
57
58
typedef enum {
59
EP_TYPE_ISOC_OUT = 1,
60
EP_TYPE_BULK_OUT = 2,
61
EP_TYPE_INTR_OUT = 3,
62
EP_TYPE_CNTRL = 4,
63
EP_TYPE_ISOC_IN = 5,
64
EP_TYPE_BULK_IN = 6,
65
EP_TYPE_INTR_IN = 7
66
} xusb_ep_type_t;
67
68
typedef enum {
69
XUSB_DEFAULT = 0,
70
XUSB_ADDRESSED_STS_WAIT = 1,
71
XUSB_ADDRESSED = 2,
72
XUSB_CONFIGURED_STS_WAIT = 3,
73
XUSB_CONFIGURED = 4,
74
75
XUSB_LUN_CONFIGURED_STS_WAIT = 5,
76
XUSB_LUN_CONFIGURED = 6,
77
XUSB_HID_CONFIGURED_STS_WAIT = 7,
78
XUSB_HID_CONFIGURED = 8,
79
80
// XUSB_CONNECTED = ,
81
// XUSB_DISCONNECTED = ,
82
// XUSB_RESET = ,
83
// XUSB_SUSPENDED = ,
84
} xusb_dev_state_t;
85
86
typedef enum {
87
XUSB_TRB_NONE = 0,
88
XUSB_TRB_NORMAL = 1,
89
XUSB_TRB_DATA = 3,
90
XUSB_TRB_STATUS = 4,
91
XUSB_TRB_LINK = 6,
92
XUSB_TRB_TRANSFER = 32,
93
XUSB_TRB_PORT_CHANGE = 34,
94
XUSB_TRB_SETUP = 63,
95
} xusb_trb_type_t;
96
97
typedef enum {
98
XUSB_COMP_INVALID = 0,
99
XUSB_COMP_SUCCESS = 1,
100
XUSB_COMP_DATA_BUFFER_ERROR = 2,
101
XUSB_COMP_BABBLE_DETECTED_ERROR = 3,
102
XUSB_COMP_USB_TRANSACTION_ERROR = 4,
103
XUSB_COMP_TRB_ERROR = 5,
104
XUSB_COMP_STALL_ERROR = 6,
105
XUSB_COMP_RESOURCE_ERROR = 7,
106
XUSB_COMP_BANDWIDTH_ERROR = 8,
107
XUSB_COMP_NO_SLOTS_AVAILABLE_ERROR = 9,
108
XUSB_COMP_INVALID_STREAM_TYPE_ERROR = 10,
109
XUSB_COMP_SLOT_NOT_ENABLED_ERROR = 11,
110
XUSB_COMP_EP_DISABLED_ERROR = 12,
111
XUSB_COMP_SHORT_PKT = 13,
112
XUSB_COMP_RING_UNDERRUN = 14,
113
XUSB_COMP_RING_OVERRUN = 15,
114
XUSB_COMP_VF_EVENT_RING_FULL_ERROR = 16,
115
XUSB_COMP_PARAMETER_ERROR = 17,
116
XUSB_COMP_BANDWIDTH_OVERRUN_ERROR = 18,
117
XUSB_COMP_CONTEXT_STATE_ERROR = 19,
118
XUSB_COMP_NO_PING_RESPONSE_ERROR = 20,
119
XUSB_COMP_EVENT_RING_FULL_ERROR = 21,
120
XUSB_COMP_INCOMPATIBLE_DEVICE_ERROR = 22,
121
XUSB_COMP_MISSED_SERVICE_ERROR = 23,
122
XUSB_COMP_COMMAND_RING_STOPPED = 24,
123
XUSB_COMP_COMMAND_ABORTED = 25,
124
XUSB_COMP_STOPPED = 26,
125
XUSB_COMP_STOPPED_LENGTH_INVALID = 27,
126
XUSB_COMP_STOPPED_SHORT_PACKET = 28,
127
XUSB_COMP_EXIT_LATENCY_LARGE_ERROR = 29,
128
XUSB_COMP_ISOCH_BUFFER_OVERRUN = 31,
129
XUSB_COMP_EVENT_LOST_ERROR = 32,
130
XUSB_COMP_UNDEFINED_ERROR = 33,
131
XUSB_COMP_INVALID_STREAM_ID_ERROR = 34,
132
XUSB_COMP_SECONDARY_BANDWIDTH_ERROR = 35,
133
XUSB_COMP_SPLIT_TRANSACTION_ERROR = 36,
134
135
XUSB_COMP_CODE_STREAM_NUMP_ERROR = 219,
136
XUSB_COMP_PRIME_PIPE_RECEIVED = 220,
137
XUSB_COMP_HOST_REJECTED = 221,
138
XUSB_COMP_CTRL_DIR_ERROR = 222,
139
XUSB_COMP_CTRL_SEQ_NUM_ERROR = 223
140
} xusb_comp_code_t;
141
142
typedef struct _event_trb_t
143
{
144
u32 rsvd0;
145
u32 rsvd1;
146
147
u32 rsvd2:24;
148
u32 comp_code:8;
149
150
u32 cycle:1;
151
u32 rsvd3:9;
152
u32 trb_type:6;
153
u32 ep_id:5;
154
u32 rsvd4:11;
155
} event_trb_t;
156
157
typedef struct _transfer_event_trb_t {
158
u32 trb_pointer_lo;
159
u32 trb_pointer_hi;
160
161
u32 trb_tx_len:24;
162
u32 comp_code:8;
163
164
u32 cycle:1;
165
u32 rsvddw3_0:1;
166
u32 event_data:1;
167
u32 rsvddw3_1:7;
168
u32 trb_type:6;
169
u32 ep_id:5;
170
u32 rsvddw3_2:11;
171
} transfer_event_trb_t;
172
173
typedef struct _setup_event_trb_t
174
{
175
usb_ctrl_setup_t ctrl_setup_data;
176
177
u32 ctrl_seq_num:16;
178
u32 rsvddw2_0:8;
179
u32 comp_code:8;
180
181
u32 cycle:1;
182
u32 rsvddw3_0:9;
183
u32 trb_type:6;
184
u32 ep_id:5;
185
u32 rsvddw3_1:11;
186
} setup_event_trb_t;
187
188
typedef struct _status_trb_t
189
{
190
u32 rsvd0;
191
u32 rsvd1;
192
193
u32 rsvd2:22;
194
u32 interrupt_target:10;
195
196
u32 cycle:1;
197
u32 ent:1;
198
u32 rsvd3_0:2;
199
u32 chain:1;
200
u32 ioc:1;
201
u32 rsvd3_1:4;
202
u32 trb_type:6;
203
u32 dir:1;
204
u32 rsvd3_2:15;
205
} status_trb_t;
206
207
typedef struct _normal_trb_t
208
{
209
u32 databufptr_lo;
210
u32 databufptr_hi;
211
212
u32 trb_tx_len:17;
213
u32 td_size:5;
214
u32 interrupt_target:10;
215
216
u32 cycle:1;
217
u32 ent:1;
218
u32 isp:1;
219
u32 no_snoop:1;
220
u32 chain:1;
221
u32 ioc:1;
222
u32 idt:1;
223
u32 rsvd0_0:2;
224
u32 bei:1;
225
u32 trb_type:6;
226
u32 rsvd0_1:16;
227
} normal_trb_t;
228
229
typedef struct _data_trb_t
230
{
231
u32 databufptr_lo;
232
u32 databufptr_hi;
233
234
u32 trb_tx_len:17;
235
u32 td_size:5;
236
u32 interrupt_target:10;
237
238
u32 cycle:1;
239
u32 ent:1;
240
u32 isp:1;
241
u32 no_snoop:1;
242
u32 chain:1;
243
u32 ioc:1;
244
u32 rsvd0_0:4;
245
u32 trb_type:6;
246
u32 dir:1;
247
u32 rsvd0_1:15;
248
} data_trb_t;
249
250
typedef struct _link_trb_t
251
{
252
u32 rsvd0_0:4;
253
u32 ring_seg_ptrlo:28;
254
255
u32 ring_seg_ptrhi;
256
257
u32 rsvd1_0:22;
258
u32 interrupt_target:10;
259
260
u32 cycle:1;
261
u32 toggle_cycle:1;
262
u32 rsvd3_0:2;
263
u32 chain:1;
264
u32 ioc:1;
265
u32 rsvd3_1:4;
266
u32 trb_type:6;
267
u32 rsvd3_2:16;
268
} link_trb_t;
269
270
typedef struct _xusb_ep_ctx_t
271
{
272
// Common context.
273
u32 ep_state:3;
274
u32 rsvddW0_0:5;
275
u32 mult:2;
276
u32 max_pstreams:5;
277
u32 lsa:1;
278
u32 interval:8;
279
u32 rsvddW0_1:8;
280
281
u32 rsvddw1_0:1;
282
u32 cerr:2;
283
u32 ep_type:3;
284
u32 rsvddw1_1:1;
285
u32 hid:1;
286
u32 max_burst_size:8;
287
u32 max_packet_size:16;
288
289
u32 dcs:1;
290
u32 rsvddw2_0:3;
291
u32 trd_dequeueptr_lo:28;
292
293
u32 trd_dequeueptr_hi;
294
295
u32 avg_trb_len:16;
296
u32 max_esit_payload:16;
297
298
// Nvidia context.
299
u32 event_data_txlen_acc;
300
301
u32 cprog:8;
302
u32 sbyte:7;
303
u32 tp:2;
304
u32 rec:1;
305
u32 cec:2;
306
u32 ced:1;
307
u32 hsp1:1;
308
u32 rty1:1;
309
u32 std:1;
310
u32 status:8;
311
312
u32 data_offset;
313
314
u32 scratch_pad0;
315
316
u32 scratch_pad1;
317
318
u32 cping:8;
319
u32 sping:8;
320
u32 toggle_cycle:2;
321
u32 no_snoop:1;
322
u32 ro:1;
323
u32 tlm:1;
324
u32 dlm:1;
325
u32 hsp2:1;
326
u32 rty2:1;
327
u32 stop_rec_req:8;
328
329
u32 device_addr:8;
330
u32 hub_addr:8;
331
u32 root_port_num:8;
332
u32 slot_id:8;
333
334
u32 routing_string:20;
335
u32 speed:4;
336
u32 lpu:1;
337
u32 mtt:1;
338
u32 hub:1;
339
u32 dci:5;
340
341
u32 tthub_slot_id:8;
342
u32 ttport_num:8;
343
u32 ssf:4;
344
u32 sps:2;
345
u32 interrupt_target:10;
346
347
u32 frz:1;
348
u32 end:1;
349
u32 elm:1;
350
u32 mrx:1;
351
u32 ep_linklo:28;
352
353
u32 ep_linkhi;
354
} xusb_ep_ctx_t;
355
356
typedef struct _xusbd_controller_t
357
{
358
data_trb_t *cntrl_epenqueue_ptr;
359
data_trb_t *cntrl_epdequeue_ptr;
360
u32 cntrl_producer_cycle;
361
data_trb_t *bulkout_epenqueue_ptr;
362
data_trb_t *bulkout_epdequeue_ptr;
363
u32 bulkout_producer_cycle;
364
data_trb_t *bulkin_epenqueue_ptr;
365
data_trb_t *bulkin_epdequeue_ptr;
366
u32 bulkin_producer_cycle;
367
event_trb_t *event_enqueue_ptr;
368
event_trb_t *event_dequeue_ptr;
369
u32 event_ccs;
370
u32 device_state;
371
u32 tx_bytes[2];
372
u32 tx_count[2];
373
u32 ctrl_seq_num;
374
u32 config_num;
375
u32 interface_num;
376
u32 wait_for_event_trb;
377
u32 port_speed;
378
379
usb_desc_t *desc;
380
usb_gadget_type gadget;
381
382
u8 max_lun;
383
bool max_lun_set;
384
void *hid_rpt_buffer;
385
u32 hid_rpt_size;
386
u32 intr_idle_rate;
387
bool intr_idle_req;
388
bool bulk_reset_req;
389
} xusbd_controller_t;
390
391
extern u32 hid_report_descriptor_jc_size;
392
extern u32 hid_report_descriptor_touch_size;
393
extern u8 hid_report_descriptor_jc[];
394
extern u8 hid_report_descriptor_touch[];
395
extern usb_desc_t usb_gadget_hid_jc_descriptors;
396
extern usb_desc_t usb_gadget_hid_touch_descriptors;
397
extern usb_desc_t usb_gadget_ums_descriptors;
398
399
// All rings and EP context must be aligned to 0x10.
400
typedef struct _xusbd_event_queues_t
401
{
402
event_trb_t xusb_event_ring_seg0[XUSB_TRB_SLOTS];
403
event_trb_t xusb_event_ring_seg1[XUSB_TRB_SLOTS];
404
data_trb_t xusb_cntrl_event_queue[XUSB_TRB_SLOTS];
405
data_trb_t xusb_bulkin_event_queue[XUSB_TRB_SLOTS];
406
data_trb_t xusb_bulkout_event_queue[XUSB_TRB_SLOTS];
407
volatile xusb_ep_ctx_t xusb_ep_ctxt[4];
408
} xusbd_event_queues_t;
409
410
// Set event queues context to a 0x10 aligned address.
411
xusbd_event_queues_t *xusb_evtq = (xusbd_event_queues_t *)XUSB_RING_ADDR;
412
413
xusbd_controller_t *usbd_xotg;
414
xusbd_controller_t usbd_xotg_controller_ctxt;
415
416
static int _xusb_xhci_mask_wait(u32 reg, u32 mask, u32 val, u32 retries)
417
{
418
do
419
{
420
if ((XUSB_DEV_XHCI(reg) & mask) == val)
421
return USB_RES_OK;
422
usleep(1);
423
--retries;
424
}
425
while (retries);
426
427
return USB_ERROR_TIMEOUT;
428
}
429
430
// Event rings aligned to 0x10
431
static void _xusbd_ep_init_event_ring()
432
{
433
memset(xusb_evtq->xusb_event_ring_seg0, 0, sizeof(xusb_evtq->xusb_event_ring_seg0));
434
memset(xusb_evtq->xusb_event_ring_seg1, 0, sizeof(xusb_evtq->xusb_event_ring_seg1));
435
436
//! TODO USB3: enable pcie regulators.
437
438
// Set Event Ring Segment 0 Base Address.
439
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERST0BALO) = (u32)xusb_evtq->xusb_event_ring_seg0;
440
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERST0BAHI) = 0;
441
442
// Set Event Ring Segment 1 Base Address.
443
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERST1BALO) = (u32)xusb_evtq->xusb_event_ring_seg1;
444
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERST1BAHI) = 0;
445
446
// Set Event Ring Segment sizes.
447
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERSTSZ) = (XUSB_TRB_SLOTS << 16) | XUSB_TRB_SLOTS;
448
449
// Set Enqueue and Dequeue pointers.
450
usbd_xotg->event_enqueue_ptr = xusb_evtq->xusb_event_ring_seg0;
451
usbd_xotg->event_dequeue_ptr = xusb_evtq->xusb_event_ring_seg0;
452
usbd_xotg->event_ccs = 1;
453
454
// Event Ring Enqueue Pointer.
455
u32 evt_ring_addr = (u32)xusb_evtq->xusb_event_ring_seg0 & 0xFFFFFFF0;
456
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EREPLO) = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_EREPLO) & 0xE) | evt_ring_addr | XCHI_ECS;
457
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EREPHI) = 0;
458
459
// Set Event Ring Dequeue Pointer.
460
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERDPLO) = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERDPLO) & 0xF) | evt_ring_addr;
461
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERDPHI) = 0;
462
}
463
464
static void _xusb_ep_set_type_and_metrics(u32 ep_idx, volatile xusb_ep_ctx_t *ep_ctxt)
465
{
466
usb_ep_descr_t *ep_desc = NULL;
467
usb_ep_descr_t *endpoints = usbd_xotg->desc->cfg->endpoint;
468
469
switch (ep_idx)
470
{
471
case XUSB_EP_CTRL_IN:
472
// Set EP type.
473
ep_ctxt->ep_type = EP_TYPE_CNTRL;
474
475
// Set max packet size based on port speed.
476
ep_ctxt->avg_trb_len = 8;
477
ep_ctxt->max_packet_size = 64; //! TODO USB3: max_packet_size = 512.
478
break;
479
480
case USB_EP_BULK_OUT:
481
// Set default EP type.
482
ep_ctxt->ep_type = EP_TYPE_BULK_OUT;
483
484
// Check configuration descriptor.
485
if (usbd_xotg->desc->cfg->interface.bInterfaceClass == 0x3) // HID Class.
486
endpoints = (usb_ep_descr_t *)((void *)endpoints + sizeof(usb_hid_descr_t));
487
488
for (u32 i = 0; i < usbd_xotg->desc->cfg->interface.bNumEndpoints; i++)
489
if (endpoints[i].bEndpointAddress == USB_EP_ADDR_BULK_OUT)
490
{
491
ep_desc = &endpoints[i];
492
break;
493
}
494
495
// Set actual EP type.
496
if (ep_desc)
497
{
498
switch (ep_desc->bmAttributes)
499
{
500
case USB_EP_TYPE_ISO:
501
ep_ctxt->ep_type = EP_TYPE_ISOC_OUT;
502
break;
503
case USB_EP_TYPE_BULK:
504
ep_ctxt->ep_type = EP_TYPE_BULK_OUT;
505
break;
506
case USB_EP_TYPE_INTR:
507
ep_ctxt->ep_type = EP_TYPE_INTR_OUT;
508
break;
509
}
510
}
511
512
// Set average TRB length.
513
//TODO: Use ep type instead (we don't expect to calculate avg per gadget)?
514
switch (usbd_xotg->gadget)
515
{
516
case USB_GADGET_UMS:
517
ep_ctxt->avg_trb_len = 3072;
518
break;
519
case USB_GADGET_HID_GAMEPAD:
520
case USB_GADGET_HID_TOUCHPAD:
521
ep_ctxt->avg_trb_len = 1024;
522
break;
523
default:
524
switch (usbd_xotg->port_speed)
525
{
526
case XUSB_SUPER_SPEED:
527
ep_ctxt->avg_trb_len = 1024;
528
break;
529
case XUSB_HIGH_SPEED:
530
case XUSB_FULL_SPEED:
531
ep_ctxt->avg_trb_len = 512;
532
break;
533
}
534
break;
535
}
536
537
// Set max burst rate.
538
ep_ctxt->max_burst_size = (ep_desc->wMaxPacketSize >> 11) & 3;
539
540
// Set max packet size based on port speed.
541
if (usbd_xotg->port_speed == XUSB_SUPER_SPEED)
542
{
543
ep_ctxt->max_packet_size = 1024;
544
545
//! TODO USB3:
546
// If ISO or INTR EP, set Max Esit Payload size.
547
// ep_ctxt->max_burst_size = bMaxBurst;
548
//if (ep_ctxt->ep_type == EP_TYPE_INTR_OUT || ep_ctxt->ep_type == EP_TYPE_ISOC_OUT)
549
// ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size * (ep_ctxt->max_burst_size + 1);
550
}
551
else if (usbd_xotg->port_speed == XUSB_HIGH_SPEED)
552
{
553
ep_ctxt->max_packet_size = 512;
554
555
// If ISO or INTR EP, set Max Esit Payload size.
556
if (ep_ctxt->ep_type == EP_TYPE_INTR_OUT || ep_ctxt->ep_type == EP_TYPE_ISOC_OUT)
557
ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size * (ep_ctxt->max_burst_size + 1);
558
}
559
else
560
{
561
ep_ctxt->max_packet_size = 64;
562
563
// If ISO or INTR EP, set Max Esit Payload size.
564
if (ep_ctxt->ep_type == EP_TYPE_INTR_OUT || ep_ctxt->ep_type == EP_TYPE_ISOC_OUT)
565
ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size;
566
}
567
break;
568
569
case USB_EP_BULK_IN:
570
// Set default EP type.
571
ep_ctxt->ep_type = EP_TYPE_BULK_IN;
572
573
// Check configuration descriptor.
574
if (usbd_xotg->desc->cfg->interface.bInterfaceClass == 0x3) // HID Class.
575
endpoints = (usb_ep_descr_t *)((void *)endpoints + sizeof(usb_hid_descr_t));
576
577
for (u32 i = 0; i < usbd_xotg->desc->cfg->interface.bNumEndpoints; i++)
578
if (endpoints[i].bEndpointAddress == USB_EP_ADDR_BULK_IN)
579
{
580
ep_desc = &endpoints[i];
581
break;
582
}
583
584
// Set actual EP type.
585
if (ep_desc)
586
{
587
switch (ep_desc->bmAttributes)
588
{
589
case USB_EP_TYPE_ISO:
590
ep_ctxt->ep_type = EP_TYPE_ISOC_IN;
591
break;
592
case USB_EP_TYPE_BULK:
593
ep_ctxt->ep_type = EP_TYPE_BULK_IN;
594
break;
595
case USB_EP_TYPE_INTR:
596
ep_ctxt->ep_type = EP_TYPE_INTR_IN;
597
break;
598
}
599
}
600
601
// Set average TRB length.
602
//TODO: Use ep type instead (we don't expect to calculate avg per gadget)?
603
switch (usbd_xotg->gadget)
604
{
605
case USB_GADGET_UMS:
606
ep_ctxt->avg_trb_len = 3072;
607
break;
608
case USB_GADGET_HID_GAMEPAD:
609
case USB_GADGET_HID_TOUCHPAD:
610
ep_ctxt->avg_trb_len = 16; // Normal interrupt avg is 1024KB.
611
break;
612
default:
613
switch (usbd_xotg->port_speed)
614
{
615
case XUSB_SUPER_SPEED:
616
ep_ctxt->avg_trb_len = 1024;
617
break;
618
case XUSB_HIGH_SPEED:
619
case XUSB_FULL_SPEED:
620
ep_ctxt->avg_trb_len = 512;
621
break;
622
}
623
break;
624
}
625
626
// Set max burst rate.
627
ep_ctxt->max_burst_size = (ep_desc->wMaxPacketSize >> 11) & 3;
628
629
// Set max packet size based on port speed.
630
if (usbd_xotg->port_speed == XUSB_SUPER_SPEED)
631
{
632
ep_ctxt->max_packet_size = 1024;
633
634
//! TODO USB3:
635
// If ISO or INTR EP, set Max Esit Payload size.
636
// ep_ctxt->max_burst_size = bMaxBurst;
637
//if (ep_ctxt->ep_type == EP_TYPE_INTR_IN || ep_ctxt->ep_type == EP_TYPE_ISOC_IN)
638
// ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size * (ep_ctxt->max_burst_size + 1);
639
}
640
else if (usbd_xotg->port_speed == XUSB_HIGH_SPEED)
641
{
642
ep_ctxt->max_packet_size = 512;
643
644
// If ISO or INTR EP, set Max Esit Payload size.
645
if (ep_ctxt->ep_type == EP_TYPE_INTR_IN || ep_ctxt->ep_type == EP_TYPE_ISOC_IN)
646
ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size * (ep_ctxt->max_burst_size + 1);
647
}
648
else
649
{
650
ep_ctxt->max_packet_size = 64;
651
652
// If ISO or INTR EP, set Max Esit Payload size.
653
if (ep_ctxt->ep_type == EP_TYPE_INTR_IN || ep_ctxt->ep_type == EP_TYPE_ISOC_IN)
654
ep_ctxt->max_esit_payload = ep_ctxt->max_packet_size;
655
}
656
break;
657
}
658
}
659
660
static int _xusb_ep_init_context(u32 ep_idx)
661
{
662
link_trb_t *link_trb;
663
664
if (ep_idx > USB_EP_BULK_IN)
665
return USB_ERROR_INIT;
666
667
if (ep_idx == XUSB_EP_CTRL_OUT)
668
ep_idx = XUSB_EP_CTRL_IN;
669
670
volatile xusb_ep_ctx_t *ep_ctxt = &xusb_evtq->xusb_ep_ctxt[ep_idx];
671
memset((void *)ep_ctxt, 0, sizeof(xusb_ep_ctx_t));
672
673
ep_ctxt->ep_state = EP_RUNNING;
674
ep_ctxt->dcs = 1;
675
ep_ctxt->cec = 3;
676
ep_ctxt->cerr = 3;
677
ep_ctxt->max_burst_size = 0;
678
679
switch (ep_idx)
680
{
681
case XUSB_EP_CTRL_IN:
682
usbd_xotg->cntrl_producer_cycle = 1;
683
usbd_xotg->cntrl_epenqueue_ptr = xusb_evtq->xusb_cntrl_event_queue;
684
usbd_xotg->cntrl_epdequeue_ptr = xusb_evtq->xusb_cntrl_event_queue;
685
686
_xusb_ep_set_type_and_metrics(ep_idx, ep_ctxt);
687
688
ep_ctxt->trd_dequeueptr_lo = (u32)xusb_evtq->xusb_cntrl_event_queue >> 4;
689
ep_ctxt->trd_dequeueptr_hi = 0;
690
691
link_trb = (link_trb_t *)&xusb_evtq->xusb_cntrl_event_queue[XUSB_LINK_TRB_IDX];
692
link_trb->toggle_cycle = 1;
693
link_trb->ring_seg_ptrlo = (u32)xusb_evtq->xusb_cntrl_event_queue >> 4;
694
link_trb->ring_seg_ptrhi = 0;
695
link_trb->trb_type = XUSB_TRB_LINK;
696
break;
697
698
case USB_EP_BULK_OUT:
699
usbd_xotg->bulkout_producer_cycle = 1;
700
usbd_xotg->bulkout_epenqueue_ptr = xusb_evtq->xusb_bulkout_event_queue;
701
usbd_xotg->bulkout_epdequeue_ptr = xusb_evtq->xusb_bulkout_event_queue;
702
703
_xusb_ep_set_type_and_metrics(ep_idx, ep_ctxt);
704
705
ep_ctxt->trd_dequeueptr_lo = (u32)xusb_evtq->xusb_bulkout_event_queue >> 4;
706
ep_ctxt->trd_dequeueptr_hi = 0;
707
708
link_trb = (link_trb_t *)&xusb_evtq->xusb_bulkout_event_queue[XUSB_LINK_TRB_IDX];
709
link_trb->toggle_cycle = 1;
710
link_trb->ring_seg_ptrlo = (u32)xusb_evtq->xusb_bulkout_event_queue >> 4;
711
link_trb->ring_seg_ptrhi = 0;
712
link_trb->trb_type = XUSB_TRB_LINK;
713
break;
714
715
case USB_EP_BULK_IN:
716
usbd_xotg->bulkin_producer_cycle = 1;
717
usbd_xotg->bulkin_epenqueue_ptr = xusb_evtq->xusb_bulkin_event_queue;
718
usbd_xotg->bulkin_epdequeue_ptr = xusb_evtq->xusb_bulkin_event_queue;
719
720
_xusb_ep_set_type_and_metrics(ep_idx, ep_ctxt);
721
722
ep_ctxt->trd_dequeueptr_lo = (u32)xusb_evtq->xusb_bulkin_event_queue >> 4;
723
ep_ctxt->trd_dequeueptr_hi = 0;
724
725
link_trb = (link_trb_t *)&xusb_evtq->xusb_bulkin_event_queue[XUSB_LINK_TRB_IDX];
726
link_trb->toggle_cycle = 1;
727
link_trb->ring_seg_ptrlo = (u32)xusb_evtq->xusb_bulkin_event_queue >> 4;
728
link_trb->ring_seg_ptrhi = 0;
729
link_trb->trb_type = XUSB_TRB_LINK;
730
break;
731
}
732
733
return USB_RES_OK;
734
}
735
736
static int _xusbd_ep_initialize(u32 ep_idx)
737
{
738
switch (ep_idx)
739
{
740
case XUSB_EP_CTRL_IN:
741
case XUSB_EP_CTRL_OUT:
742
return _xusb_ep_init_context(XUSB_EP_CTRL_IN);
743
case USB_EP_BULK_OUT:
744
case USB_EP_BULK_IN:
745
_xusb_ep_init_context(ep_idx);
746
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_RELOAD) = BIT(ep_idx);
747
int res = _xusb_xhci_mask_wait(XUSB_DEV_XHCI_EP_RELOAD, BIT(ep_idx), 0, 1000);
748
if (!res)
749
{
750
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_PAUSE) &= ~BIT(ep_idx);
751
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) &= ~BIT(ep_idx);
752
}
753
return res;
754
default:
755
return USB_ERROR_INIT;
756
}
757
}
758
759
static void _xusbd_ep1_disable(u32 ep_idx)
760
{
761
volatile xusb_ep_ctx_t *ep_ctxt = &xusb_evtq->xusb_ep_ctxt[ep_idx];
762
u32 ep_mask = BIT(ep_idx);
763
764
switch (ep_idx)
765
{
766
case USB_EP_BULK_OUT:
767
case USB_EP_BULK_IN:
768
// Skip if already disabled.
769
if (!ep_ctxt->ep_state)
770
return;
771
772
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) |= ep_mask;
773
774
// Set EP state to disabled.
775
ep_ctxt->ep_state = EP_DISABLED;
776
777
// Wait for EP status to change.
778
_xusb_xhci_mask_wait(XUSB_DEV_XHCI_EP_STCHG, ep_mask, ep_mask, 1000);
779
780
// Clear status change.
781
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_STCHG) = ep_mask;
782
break;
783
}
784
}
785
786
static void _xusb_disable_ep1()
787
{
788
_xusbd_ep1_disable(USB_EP_BULK_OUT);
789
_xusbd_ep1_disable(USB_EP_BULK_IN);
790
791
// Device mode stop.
792
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) &= ~XHCI_CTRL_RUN;
793
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ST) |= XHCI_ST_RC;
794
795
usbd_xotg->config_num = 0;
796
usbd_xotg->interface_num = 0;
797
usbd_xotg->max_lun_set = false;
798
usbd_xotg->device_state = XUSB_DEFAULT;
799
}
800
801
static void _xusb_init_phy()
802
{
803
// Configure and enable PLLU.
804
clock_enable_pllu();
805
806
// Enable IDDQ control by software and disable UTMIPLL IDDQ.
807
CLOCK(CLK_RST_CONTROLLER_UTMIPLL_HW_PWRDN_CFG0) = (CLOCK(CLK_RST_CONTROLLER_UTMIPLL_HW_PWRDN_CFG0) & 0xFFFFFFFC) | 1;
808
809
// Set UTMIPLL dividers and config based on OSC and enable it to 960 MHz.
810
clock_enable_utmipll();
811
812
// Set UTMIP misc config.
813
CLOCK(CLK_RST_CONTROLLER_UTMIP_PLL_CFG2) = (CLOCK(CLK_RST_CONTROLLER_UTMIP_PLL_CFG2) & 0xFEFFFFE8) | 0x2000008 | 0x20 | 2;
814
usleep(2);
815
816
// Set OTG PAD0 calibration.
817
u32 fuse_usb_calib = FUSE(FUSE_USB_CALIB);
818
// Set HS_CURR_LEVEL.
819
XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_0) = (XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_0) & 0xFFFFFFC0) | (fuse_usb_calib & 0x3F);
820
// Set TERM_RANGE_ADJ and RPD_CTRL.
821
XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_1) = (XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_1) & 0x83FFFF87) | ((fuse_usb_calib & 0x780) >> 4) | ((u32)(FUSE(FUSE_USB_CALIB_EXT) << 27) >> 1);
822
823
// Set VREG_LEV to 1.
824
XUSB_PADCTL(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL1) = (XUSB_PADCTL(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL1) & 0xFFFFFE3F) | 0x80;
825
826
// Disable power down on usb2 ports pads.
827
XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_0) &= 0xDBFFFFFF; // Clear pad power down.
828
XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_1) &= 0xFFFFFFFB; // Clear pad dr power down.
829
XUSB_PADCTL(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL0) &= 0xFFFFFFFE; // Clear charging power down.
830
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_0) &= 0xFFFFF7FF; // Clear bias power down.
831
(void)XUSB_PADCTL(XUSB_PADCTL_USB2_OTG_PAD0_CTL_1); // Commit write.
832
833
// Enable USB2 tracking clock.
834
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_Y_SET) = BIT(CLK_Y_USB2_TRK);
835
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_USB2_HSIC_TRK) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_USB2_HSIC_TRK) & 0xFFFFFF00) | 6; // Set trank divisor to 4.
836
837
// Set tracking parameters and trigger it.
838
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_1) = 0x451E000;
839
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_1) = 0x51E000;
840
usleep(100);
841
842
// TRK cycle done. Force PDTRK input into power down.
843
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_1) = 0x451E000;
844
usleep(3);
845
846
// Re-trigger it.
847
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_1) = 0x51E000;
848
usleep(100);
849
850
// TRK cycle done. Force PDTRK input into power down.
851
XUSB_PADCTL(XUSB_PADCTL_USB2_BIAS_PAD_CTL_1) |= 0x4000000;
852
853
// Disable USB2 tracking clock.
854
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_Y_CLR) = BIT(CLK_Y_USB2_TRK);
855
856
// Wait for XUSB PHY to stabilize.
857
usleep(30);
858
}
859
860
static void _xusbd_init_device_clocks()
861
{
862
// Disable reset to PLLU_OUT1
863
CLOCK(CLK_RST_CONTROLLER_PLLU_OUTA) |= 1;
864
usleep(2);
865
866
// Enable XUSB device clock.
867
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_U_SET) = BIT(CLK_U_XUSB_DEV);
868
869
// Set XUSB device core clock source to PLLP for a 102MHz result.
870
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_CORE_DEV) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_CORE_DEV) & 0x1FFFFF00) | (1 << 29) | 6;
871
usleep(2);
872
873
// Set XUSB Full-Speed logic clock source to FO 48MHz.
874
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_FS) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_FS) & 0x1FFFFFFF) | (2 << 29);
875
876
// Enable XUSB Super-Speed logic clock.
877
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = BIT(CLK_W_XUSB_SS);
878
879
// Set XUSB Super-Speed logic clock source to HSIC 480MHz for 120MHz result and source FS logic clock from Super-Speed.
880
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_SS) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_SS) & 0x1FFFFF00) | (3 << 29) | 6;
881
882
// Clear reset to XUSB device and Super-Speed logic.
883
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_CLR) = BIT(CLK_W_XUSB_SS);
884
CLOCK(CLK_RST_CONTROLLER_RST_DEV_U_CLR) = BIT(CLK_U_XUSB_DEV);
885
usleep(2);
886
}
887
888
int xusb_device_init()
889
{
890
// Ease the stress to APB.
891
bpmp_clk_rate_relaxed(true);
892
893
// Disable USB2 device controller clocks.
894
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_SET) = BIT(CLK_L_USBD);
895
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_CLR) = BIT(CLK_L_USBD);
896
897
// Enable XUSB clock and clear Reset to XUSB Pad Control.
898
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = BIT(CLK_W_XUSB);
899
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_SET) = BIT(CLK_W_XUSB);
900
usleep(2);
901
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_CLR) = BIT(CLK_W_XUSB);
902
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_CLR) = BIT(CLK_W_XUSB_PADCTL);
903
usleep(2);
904
905
// USB2 Pads to XUSB.
906
XUSB_PADCTL(XUSB_PADCTL_USB2_PAD_MUX) =
907
(XUSB_PADCTL(XUSB_PADCTL_USB2_PAD_MUX) & ~(PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_MASK | PADCTL_USB2_PAD_MUX_USB2_OTG_PAD_PORT0_MASK)) |
908
PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB | PADCTL_USB2_PAD_MUX_USB2_OTG_PAD_PORT0_XUSB;
909
910
// Initialize XUSB controller PHY.
911
_xusb_init_phy();
912
913
// Set USB2.0 Port 0 to device mode.
914
XUSB_PADCTL(XUSB_PADCTL_USB2_PORT_CAP) = (XUSB_PADCTL(XUSB_PADCTL_USB2_PORT_CAP) & ~PADCTL_USB2_PORT_CAP_PORT_0_CAP_MASK) | PADCTL_USB2_PORT_CAP_PORT_0_CAP_DEV;
915
916
//! TODO USB3
917
// // Set USB3.0 Port 0 cap to device.
918
// XUSB_PADCTL(XUSB_PADCTL_SS_PORT_CAP) = (XUSB_PADCTL(XUSB_PADCTL_SS_PORT_CAP) & ~PADCTL_SS_PORT_CAP_0_PORT1_CAP_MASK) | PADCTL_SS_PORT_CAP_0_PORT1_CAP_DEVICE_ONLY;
919
920
// Set Super Speed Port 0 to USB2 Port 0.
921
XUSB_PADCTL(XUSB_PADCTL_SS_PORT_MAP) &= ~PADCTL_SS_PORT_MAP_PORT0_MASK; // 0: USB2_PORT0
922
923
// Power Up ID Wake up and Vbus Wake Up for UTMIP
924
PMC(APBDEV_PMC_USB_AO) &= 0xFFFFFFF3;
925
usleep(1);
926
927
// Initialize device clocks.
928
_xusbd_init_device_clocks();
929
930
// Restore OC.
931
bpmp_clk_rate_relaxed(false);
932
933
// Enable AHB redirect for access to IRAM for Event/EP ring buffers.
934
mc_enable_ahb_redirect(1);
935
936
// Enable XUSB device IPFS.
937
XUSB_DEV_DEV(XUSB_DEV_CONFIGURATION) |= DEV_CONFIGURATION_EN_FPCI;
938
939
// Configure PCI and BAR0 address space.
940
XUSB_DEV_PCI(XUSB_CFG_1) |= CFG_1_BUS_MASTER | CFG_1_MEMORY_SPACE | CFG_1_IO_SPACE;
941
usleep(1);
942
XUSB_DEV_PCI(XUSB_CFG_4) = XUSB_DEV_BASE | CFG_4_ADDRESS_TYPE_32_BIT;
943
944
// Mask SATA interrupt to MCORE.
945
XUSB_DEV_DEV(XUSB_DEV_INTR_MASK) |= DEV_INTR_MASK_IP_INT_MASK;
946
947
// AHB USB performance cfg.
948
AHB_GIZMO(AHB_GIZMO_AHB_MEM) |= AHB_MEM_DONT_SPLIT_AHB_WR | AHB_MEM_ENB_FAST_REARBITRATE;
949
AHB_GIZMO(AHB_GIZMO_USB3) |= AHB_GIZMO_IMMEDIATE;
950
AHB_GIZMO(AHB_ARBITRATION_PRIORITY_CTRL) = PRIORITY_CTRL_WEIGHT(7) | PRIORITY_SELECT_USB3;
951
AHB_GIZMO(AHB_AHB_MEM_PREFETCH_CFG1) = MEM_PREFETCH_ENABLE | MEM_PREFETCH_USB3_MST_ID |
952
MEM_PREFETCH_ADDR_BNDRY(12) | 0x1000; // Addr boundary 64KB, Inactivity 4096 cycles.
953
954
// Initialize context.
955
usbd_xotg = &usbd_xotg_controller_ctxt;
956
memset(usbd_xotg, 0, sizeof(xusbd_controller_t));
957
958
// Initialize event and EP rings.
959
_xusbd_ep_init_event_ring();
960
memset(xusb_evtq->xusb_cntrl_event_queue, 0, sizeof(xusb_evtq->xusb_cntrl_event_queue));
961
memset(xusb_evtq->xusb_bulkin_event_queue, 0, sizeof(xusb_evtq->xusb_bulkin_event_queue));
962
memset(xusb_evtq->xusb_bulkout_event_queue, 0, sizeof(xusb_evtq->xusb_bulkout_event_queue));
963
964
// Initialize Control EP.
965
int res = _xusbd_ep_initialize(XUSB_EP_CTRL_IN);
966
if (res)
967
return USB_ERROR_INIT;
968
969
// Enable events and interrupts.
970
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) |= XHCI_CTRL_IE | XHCI_CTRL_LSE;
971
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ECPLO) = (u32)xusb_evtq->xusb_ep_ctxt & 0xFFFFFFF0;
972
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ECPHI) = 0;
973
974
//! TODO USB3:
975
// XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT) |= DEV_XHCI_PORTHALT_STCHG_INTR_EN;
976
977
return USB_RES_OK;
978
}
979
980
//! TODO: Power down more stuff.
981
static void _xusb_device_power_down()
982
{
983
// Disable clock for XUSB Super-Speed and set source to CLK_M.
984
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_SET) = BIT(CLK_W_XUSB_SS);
985
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_SS) &= 0x1FFFFF00;
986
usleep(2);
987
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_CLR) = BIT(CLK_W_XUSB_SS);
988
989
// Put XUSB device into reset.
990
CLOCK(CLK_RST_CONTROLLER_RST_DEV_U_SET) = BIT(CLK_U_XUSB_DEV);
991
usleep(2);
992
993
// Reset Full-Speed clock source to CLK_M and div1.
994
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_XUSB_FS) = 0;
995
usleep(2);
996
997
// Disable XUSB device clock.
998
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_U_CLR) = BIT(CLK_U_XUSB_DEV);
999
1000
// Force UTMIP_PLL power down.
1001
CLOCK(CLK_RST_CONTROLLER_UTMIP_PLL_CFG1) &= (~BIT(15));
1002
CLOCK(CLK_RST_CONTROLLER_UTMIP_PLL_CFG2) |= BIT(4) | BIT(0); // UTMIP_FORCE_PD_SAMP_A/C_POWERDOWN.
1003
1004
// Force enable UTMIPLL IDDQ.
1005
CLOCK(CLK_RST_CONTROLLER_UTMIPLL_HW_PWRDN_CFG0) |= 3;
1006
1007
// Disable PLLU.
1008
clock_disable_pllu();
1009
1010
// Set XUSB_PADCTL clock reset.
1011
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_SET) = BIT(CLK_W_XUSB_PADCTL);
1012
1013
// Disable XUSB clock.
1014
CLOCK(CLK_RST_CONTROLLER_RST_DEV_W_SET) = BIT(CLK_W_XUSB);
1015
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_CLR) = BIT(CLK_W_XUSB);
1016
}
1017
1018
static int _xusb_queue_trb(u32 ep_idx, const void *trb, bool ring_doorbell)
1019
{
1020
int res = USB_RES_OK;
1021
data_trb_t *next_trb;
1022
link_trb_t *link_trb;
1023
1024
// Copy TRB and advance Enqueue list.
1025
switch (ep_idx)
1026
{
1027
case XUSB_EP_CTRL_IN:
1028
memcpy(usbd_xotg->cntrl_epenqueue_ptr, trb, sizeof(data_trb_t));
1029
1030
// Advance queue and if Link TRB set index to 0 and toggle cycle bit.
1031
next_trb = &usbd_xotg->cntrl_epenqueue_ptr[1];
1032
if (next_trb->trb_type == XUSB_TRB_LINK)
1033
{
1034
link_trb = (link_trb_t *)next_trb;
1035
link_trb->cycle = usbd_xotg->cntrl_producer_cycle & 1;
1036
link_trb->toggle_cycle = 1;
1037
1038
next_trb = (data_trb_t *)(link_trb->ring_seg_ptrlo << 4);
1039
1040
usbd_xotg->cntrl_producer_cycle ^= 1;
1041
}
1042
usbd_xotg->cntrl_epenqueue_ptr = next_trb;
1043
break;
1044
1045
case USB_EP_BULK_OUT:
1046
memcpy(usbd_xotg->bulkout_epenqueue_ptr, trb, sizeof(data_trb_t));
1047
1048
// Advance queue and if Link TRB set index to 0 and toggle cycle bit.
1049
next_trb = &usbd_xotg->bulkout_epenqueue_ptr[1];
1050
if (next_trb->trb_type == XUSB_TRB_LINK)
1051
{
1052
link_trb = (link_trb_t *)next_trb;
1053
link_trb->cycle = usbd_xotg->bulkout_producer_cycle & 1;
1054
link_trb->toggle_cycle = 1;
1055
1056
next_trb = (data_trb_t *)(link_trb->ring_seg_ptrlo << 4);
1057
1058
usbd_xotg->bulkout_producer_cycle ^= 1;
1059
}
1060
usbd_xotg->bulkout_epenqueue_ptr = next_trb;
1061
break;
1062
1063
case USB_EP_BULK_IN:
1064
memcpy(usbd_xotg->bulkin_epenqueue_ptr, trb, sizeof(data_trb_t));
1065
1066
// Advance queue and if Link TRB set index to 0 and toggle cycle bit.
1067
next_trb = &usbd_xotg->bulkin_epenqueue_ptr[1];
1068
if (next_trb->trb_type == XUSB_TRB_LINK)
1069
{
1070
link_trb = (link_trb_t *)next_trb;
1071
link_trb->cycle = usbd_xotg->bulkin_producer_cycle & 1;
1072
link_trb->toggle_cycle = 1;
1073
1074
next_trb = (data_trb_t *)(link_trb->ring_seg_ptrlo << 4);
1075
1076
usbd_xotg->bulkin_producer_cycle ^= 1;
1077
}
1078
usbd_xotg->bulkin_epenqueue_ptr = next_trb;
1079
break;
1080
1081
case XUSB_EP_CTRL_OUT:
1082
default:
1083
res = XUSB_ERROR_INVALID_EP;
1084
break;
1085
}
1086
1087
// Ring doorbell.
1088
if (ring_doorbell)
1089
{
1090
// Flush data before transfer.
1091
bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLEAN_WAY, false);
1092
1093
u32 target_id = (ep_idx << 8) & 0xFFFF;
1094
if (ep_idx == XUSB_EP_CTRL_IN)
1095
target_id |= usbd_xotg->ctrl_seq_num << 16;
1096
1097
XUSB_DEV_XHCI(XUSB_DEV_XHCI_DB) = target_id;
1098
}
1099
1100
return res;
1101
}
1102
1103
static void _xusb_create_status_trb(status_trb_t *trb, usb_dir_t direction)
1104
{
1105
trb->cycle = usbd_xotg->cntrl_producer_cycle & 1;
1106
trb->ioc = 1; // Enable interrupt on completion.
1107
trb->trb_type = XUSB_TRB_STATUS;
1108
trb->dir = direction;
1109
}
1110
1111
static void _xusb_create_normal_trb(normal_trb_t *trb, u8 *buf, u32 len, usb_dir_t direction)
1112
{
1113
u8 producer_cycle;
1114
1115
trb->databufptr_lo = (u32)buf;
1116
trb->databufptr_hi = 0;
1117
1118
trb->trb_tx_len = len;
1119
1120
// Single TRB transfer.
1121
trb->td_size = 0;
1122
trb->chain = 0;
1123
1124
if (direction == USB_DIR_IN)
1125
producer_cycle = usbd_xotg->bulkin_producer_cycle & 1;
1126
else
1127
producer_cycle = usbd_xotg->bulkout_producer_cycle & 1;
1128
1129
trb->cycle = producer_cycle;
1130
trb->isp = 1; // Enable interrupt on short packet.
1131
trb->ioc = 1; // Enable interrupt on completion.
1132
trb->trb_type = XUSB_TRB_NORMAL;
1133
}
1134
1135
static void _xusb_create_data_trb(data_trb_t *trb, u8 *buf, u32 len, usb_dir_t direction)
1136
{
1137
trb->databufptr_lo = (u32)buf;
1138
trb->databufptr_hi = 0;
1139
1140
trb->trb_tx_len = len;
1141
1142
// Single TRB transfer.
1143
trb->td_size = 0;
1144
trb->chain = 0;
1145
1146
trb->cycle = usbd_xotg->cntrl_producer_cycle & 1;
1147
trb->isp = 1; // Enable interrupt on short packet.
1148
trb->ioc = 1; // Enable interrupt on completion.
1149
trb->trb_type = XUSB_TRB_DATA;
1150
trb->dir = direction;
1151
}
1152
1153
static int _xusb_issue_status_trb(usb_dir_t direction)
1154
{
1155
int res = USB_RES_OK;
1156
status_trb_t trb = {0};
1157
1158
if (usbd_xotg->cntrl_epenqueue_ptr == usbd_xotg->cntrl_epdequeue_ptr || direction == USB_DIR_OUT)
1159
{
1160
_xusb_create_status_trb(&trb, direction);
1161
1162
res = _xusb_queue_trb(XUSB_EP_CTRL_IN, &trb, EP_RING_DOORBELL);
1163
usbd_xotg->wait_for_event_trb = XUSB_TRB_STATUS;
1164
}
1165
1166
return res;
1167
}
1168
1169
static int _xusb_issue_normal_trb(u8 *buf, u32 len, usb_dir_t direction)
1170
{
1171
normal_trb_t trb = {0};
1172
1173
_xusb_create_normal_trb(&trb, buf, len, direction);
1174
u32 ep_idx = USB_EP_BULK_IN;
1175
if (direction == USB_DIR_OUT)
1176
ep_idx = USB_EP_BULK_OUT;
1177
1178
int res = _xusb_queue_trb(ep_idx, &trb, EP_RING_DOORBELL);
1179
if (!res)
1180
usbd_xotg->wait_for_event_trb = XUSB_TRB_NORMAL;
1181
1182
return res;
1183
}
1184
1185
static int _xusb_issue_data_trb(u8 *buf, u32 len, usb_dir_t direction)
1186
{
1187
data_trb_t trb = {0};
1188
1189
int res = USB_RES_OK;
1190
if (usbd_xotg->cntrl_epenqueue_ptr == usbd_xotg->cntrl_epdequeue_ptr)
1191
{
1192
_xusb_create_data_trb(&trb, buf, len, direction);
1193
1194
res = _xusb_queue_trb(XUSB_EP_CTRL_IN, &trb, EP_RING_DOORBELL);
1195
if (!res)
1196
usbd_xotg->wait_for_event_trb = XUSB_TRB_DATA;
1197
}
1198
return res;
1199
}
1200
1201
int xusb_set_ep_stall(u32 endpoint, int ep_stall)
1202
{
1203
u32 ep_mask = BIT(endpoint);
1204
if (ep_stall)
1205
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) |= ep_mask;
1206
else
1207
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) &= ~ep_mask;
1208
1209
// Wait for EP status to change.
1210
int res = _xusb_xhci_mask_wait(XUSB_DEV_XHCI_EP_STCHG, ep_mask, ep_mask, 1000);
1211
if (res)
1212
return res;
1213
1214
// Clear status change.
1215
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_STCHG) = ep_mask;
1216
1217
return USB_RES_OK;
1218
}
1219
1220
static int _xusb_wait_ep_stopped(u32 endpoint)
1221
{
1222
u32 ep_mask = BIT(endpoint);
1223
1224
// Wait for EP status to change.
1225
_xusb_xhci_mask_wait(XUSB_DEV_XHCI_EP_STOPPED, ep_mask, ep_mask, 1000);
1226
1227
// Clear status change.
1228
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_STOPPED) = ep_mask;
1229
1230
return USB_RES_OK;
1231
}
1232
1233
static int _xusb_handle_transfer_event(const transfer_event_trb_t *trb)
1234
{
1235
// Advance dequeue list.
1236
data_trb_t *next_trb;
1237
switch (trb->ep_id)
1238
{
1239
case XUSB_EP_CTRL_IN:
1240
next_trb = &usbd_xotg->cntrl_epdequeue_ptr[1];
1241
if (next_trb->trb_type == XUSB_TRB_LINK)
1242
next_trb = (data_trb_t *)(next_trb->databufptr_lo & 0xFFFFFFF0);
1243
usbd_xotg->cntrl_epdequeue_ptr = next_trb;
1244
break;
1245
case USB_EP_BULK_OUT:
1246
next_trb = &usbd_xotg->bulkout_epdequeue_ptr[1];
1247
if (next_trb->trb_type == XUSB_TRB_LINK)
1248
next_trb = (data_trb_t *)(next_trb->databufptr_lo & 0xFFFFFFF0);
1249
usbd_xotg->bulkout_epdequeue_ptr = next_trb;
1250
break;
1251
case USB_EP_BULK_IN:
1252
next_trb = &usbd_xotg->bulkin_epdequeue_ptr[1];
1253
if (next_trb->trb_type == XUSB_TRB_LINK)
1254
next_trb = (data_trb_t *)(next_trb->databufptr_lo & 0xFFFFFFF0);
1255
usbd_xotg->bulkin_epdequeue_ptr = next_trb;
1256
break;
1257
default:
1258
// Should never happen.
1259
break;
1260
}
1261
1262
// Handle completion code.
1263
switch (trb->comp_code)
1264
{
1265
case XUSB_COMP_SUCCESS:
1266
case XUSB_COMP_SHORT_PKT:
1267
switch (trb->ep_id)
1268
{
1269
case XUSB_EP_CTRL_IN:
1270
if (usbd_xotg->wait_for_event_trb == XUSB_TRB_DATA)
1271
return _xusb_issue_status_trb(USB_DIR_OUT);
1272
else if (usbd_xotg->wait_for_event_trb == XUSB_TRB_STATUS)
1273
{
1274
switch (usbd_xotg->device_state)
1275
{
1276
case XUSB_ADDRESSED_STS_WAIT:
1277
usbd_xotg->device_state = XUSB_ADDRESSED;
1278
break;
1279
case XUSB_CONFIGURED_STS_WAIT:
1280
usbd_xotg->device_state = XUSB_CONFIGURED;
1281
break;
1282
case XUSB_LUN_CONFIGURED_STS_WAIT:
1283
usbd_xotg->device_state = XUSB_LUN_CONFIGURED;
1284
break;
1285
case XUSB_HID_CONFIGURED_STS_WAIT:
1286
usbd_xotg->device_state = XUSB_HID_CONFIGURED;
1287
break;
1288
}
1289
}
1290
break;
1291
1292
case USB_EP_BULK_IN:
1293
usbd_xotg->tx_bytes[USB_DIR_IN] -= trb->trb_tx_len;
1294
if (usbd_xotg->tx_count[USB_DIR_IN])
1295
usbd_xotg->tx_count[USB_DIR_IN]--;
1296
1297
// If bytes remaining for a Bulk IN transfer, return error.
1298
if (trb->trb_tx_len)
1299
return XUSB_ERROR_XFER_BULK_IN_RESIDUE;
1300
break;
1301
1302
case USB_EP_BULK_OUT:
1303
// If short packet and Bulk OUT, it's not an error because we prime EP for 4KB.
1304
usbd_xotg->tx_bytes[USB_DIR_OUT] -= trb->trb_tx_len;
1305
if (usbd_xotg->tx_count[USB_DIR_OUT])
1306
usbd_xotg->tx_count[USB_DIR_OUT]--;
1307
break;
1308
}
1309
return USB_RES_OK;
1310
/*
1311
case XUSB_COMP_USB_TRANSACTION_ERROR:
1312
case XUSB_COMP_TRB_ERROR:
1313
case XUSB_COMP_RING_UNDERRUN:
1314
case XUSB_COMP_RING_OVERRUN:
1315
case XUSB_COMP_CTRL_DIR_ERROR: // Redefined.
1316
xusb_set_ep_stall(trb->ep_id, USB_EP_CFG_STALL);
1317
return USB_RES_OK;
1318
*/
1319
case XUSB_COMP_BABBLE_DETECTED_ERROR:
1320
_xusb_wait_ep_stopped(trb->ep_id);
1321
xusb_set_ep_stall(trb->ep_id, USB_EP_CFG_STALL);
1322
return XUSB_ERROR_BABBLE_DETECTED;
1323
1324
case XUSB_COMP_CTRL_DIR_ERROR:
1325
return XUSB_ERROR_XFER_DIR;
1326
1327
case XUSB_COMP_CTRL_SEQ_NUM_ERROR:
1328
return XUSB_ERROR_SEQ_NUM; //! TODO: Can mean a new setup packet was received.
1329
1330
default: // Every other completion code.
1331
return USB_ERROR_XFER_ERROR;
1332
}
1333
}
1334
1335
/*
1336
* Other XUSB impl:
1337
* CBT: PR, PRC, WPR, WRC, CSC, REQ, PLC, CEC.
1338
* LNX: REQ, PRC PR, PRC & !PR, WRC, CSC, PLC, CEC.
1339
* BRO: CSC, PR | PRC, WPR | WRC, REQ, PLC, CEC.
1340
*/
1341
1342
static int _xusb_handle_port_change()
1343
{
1344
u32 status = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC);
1345
u32 halt = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT);
1346
u32 clear_mask = XHCI_PORTSC_CEC | XHCI_PORTSC_PLC | XHCI_PORTSC_PRC | XHCI_PORTSC_WRC | XHCI_PORTSC_CSC;
1347
1348
// Port reset (PR).
1349
if (status & XHCI_PORTSC_PR)
1350
{
1351
//! TODO:
1352
// XHCI_PORTSC_PR: device_state = XUSB_RESET
1353
1354
//_disable_usb_wdt4();
1355
}
1356
1357
// Port Reset Change (PRC).
1358
if (status & XHCI_PORTSC_PRC)
1359
{
1360
// Clear PRC bit.
1361
status &= ~clear_mask;
1362
status |= XHCI_PORTSC_PRC;
1363
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = status;
1364
}
1365
1366
// Warm Port Reset (WPR).
1367
if (status & XHCI_PORTSC_WPR)
1368
{
1369
//_disable_usb_wdt4();
1370
1371
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT) &= ~XHCI_PORTHALT_HALT_LTSSM;
1372
(void)XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT);
1373
1374
//! TODO: XHCI_PORTSC_WPR: device_state = XUSB_RESET
1375
}
1376
1377
// Warm Port Reset Change (WRC).
1378
if (status & XHCI_PORTSC_WRC)
1379
{
1380
// Clear WRC bit.
1381
status &= ~clear_mask;
1382
status |= XHCI_PORTSC_WRC;
1383
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = status;
1384
}
1385
1386
// Reread port status to handle more changes.
1387
status = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC);
1388
1389
// Connect Status Change (CSC).
1390
if (status & XHCI_PORTSC_CSC)
1391
{
1392
//! TODO: Check CCS.
1393
// CCS check seems to be
1394
// XHCI_PORTSC_CCS 1: device_state = XUSB_CONNECTED
1395
// XHCI_PORTSC_CCS 0: device_state = XUSB_DISCONNECTED
1396
// Always do XHCI_PORTSC_CSC bit clear.
1397
1398
// Set port speed.
1399
usbd_xotg->port_speed = (status & XHCI_PORTSC_PS) >> 10;
1400
1401
// In case host does not support Super Speed, revert the control EP packet size.
1402
if (usbd_xotg->port_speed != XUSB_SUPER_SPEED)
1403
{
1404
volatile xusb_ep_ctx_t *ep_ctxt = &xusb_evtq->xusb_ep_ctxt[XUSB_EP_CTRL_IN];
1405
ep_ctxt->avg_trb_len = 8;
1406
ep_ctxt->max_packet_size = 64;
1407
//! TODO: If super speed is supported, ep context reload, unpause and unhalt must happen.
1408
}
1409
1410
// Clear CSC bit.
1411
status &= ~clear_mask;
1412
status |= XHCI_PORTSC_CSC;
1413
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = status;
1414
}
1415
1416
// Handle Config Request (STCHG_REQ).
1417
if (halt & XHCI_PORTHALT_STCHG_REQ)
1418
{
1419
// Clear Link Training Status and pending request/reject.
1420
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT) &= ~XHCI_PORTHALT_HALT_LTSSM;
1421
(void)XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT);
1422
}
1423
1424
// Reread port status to handle more changes.
1425
status = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC);
1426
1427
// Port link state change (PLC).
1428
if (status & XHCI_PORTSC_PLC)
1429
{
1430
// check XHCI_PORTSC_PLS_MASK
1431
// if XHCI_PORTSC_PLS_U3
1432
// device_state = XUSB_SUSPENDED
1433
// else if XHCI_PORTSC_PLS_U0 and XUSB_SUSPENDED
1434
// val = XUSB_DEV_XHCI_EP_PAUSE
1435
// XUSB_DEV_XHCI_EP_PAUSE = 0
1436
// XUSB_DEV_XHCI_EP_STCHG = val;
1437
1438
// Clear PLC bit.
1439
status &= ~clear_mask;
1440
status |= XHCI_PORTSC_PLC;
1441
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = status;
1442
}
1443
1444
// Port configuration link error (CEC).
1445
if (status & XHCI_PORTSC_CEC)
1446
{
1447
status = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC);
1448
status &= ~clear_mask;
1449
status |= XHCI_PORTSC_CEC;
1450
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = status;
1451
1452
return XUSB_ERROR_PORT_CFG;
1453
}
1454
1455
return USB_RES_OK;
1456
}
1457
1458
static int _xusb_handle_get_ep_status(u32 ep_idx)
1459
{
1460
u32 ep_mask = BIT(ep_idx);
1461
static u8 xusb_ep_status_descriptor[2] = {0};
1462
1463
xusb_ep_status_descriptor[0] = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) & ep_mask) ? USB_STATUS_EP_HALTED : USB_STATUS_EP_OK;
1464
1465
return _xusb_issue_data_trb(xusb_ep_status_descriptor, 2, USB_DIR_IN);
1466
}
1467
1468
static int _xusb_handle_get_class_request(const usb_ctrl_setup_t *ctrl_setup)
1469
{
1470
u8 _bRequest = ctrl_setup->bRequest;
1471
u16 _wIndex = ctrl_setup->wIndex;
1472
u16 _wValue = ctrl_setup->wValue;
1473
u16 _wLength = ctrl_setup->wLength;
1474
1475
bool valid_interface = _wIndex == usbd_xotg->interface_num;
1476
bool valid_val = (_bRequest >= USB_REQUEST_BULK_GET_MAX_LUN) ? (!_wValue) : true;
1477
1478
if (!valid_interface || !valid_val)
1479
goto stall;
1480
1481
switch (_bRequest)
1482
{
1483
case USB_REQUEST_INTR_GET_REPORT:
1484
if (usbd_xotg->hid_rpt_size != _wLength)
1485
goto stall;
1486
1487
// _wValue unused as there's only one report type and id.
1488
return _xusb_issue_data_trb(usbd_xotg->hid_rpt_buffer, usbd_xotg->hid_rpt_size, USB_DIR_IN);
1489
1490
case USB_REQUEST_INTR_SET_IDLE:
1491
if (_wLength)
1492
goto stall;
1493
1494
usbd_xotg->intr_idle_rate = (_wValue & 0xFF) * 4 * 1000; // Only one interface so upper byte ignored.
1495
usbd_xotg->intr_idle_req = true;
1496
return _xusb_issue_status_trb(USB_DIR_IN); // DELAYED_STATUS;
1497
1498
case USB_REQUEST_BULK_RESET:
1499
if (_wLength)
1500
goto stall;
1501
1502
usbd_xotg->bulk_reset_req = true;
1503
return _xusb_issue_status_trb(USB_DIR_IN); // DELAYED_STATUS;
1504
1505
case USB_REQUEST_BULK_GET_MAX_LUN:
1506
if (_wLength != 1 || !usbd_xotg->max_lun_set)
1507
goto stall;
1508
1509
usbd_xotg->device_state = XUSB_LUN_CONFIGURED_STS_WAIT;
1510
return _xusb_issue_data_trb(&usbd_xotg->max_lun, 1, USB_DIR_IN);
1511
}
1512
1513
stall:
1514
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1515
return USB_RES_OK;
1516
}
1517
1518
static int _xusb_handle_get_descriptor(const usb_ctrl_setup_t *ctrl_setup)
1519
{
1520
u32 size;
1521
void *desc;
1522
1523
u32 wLength = ctrl_setup->wLength;
1524
1525
u8 descriptor_type = ctrl_setup->wValue >> 8;
1526
u8 descriptor_subtype = ctrl_setup->wValue & 0xFF;
1527
1528
switch (descriptor_type)
1529
{
1530
case USB_DESCRIPTOR_DEVICE:
1531
//! TODO USB3: Provide a super speed descriptor.
1532
/*
1533
u32 soc_rev = APB_MISC(APB_MISC_GP_HIDREV);
1534
usb_device_descriptor.idProduct = (soc_rev >> 8) & 0xFF; // chip_id.
1535
usb_device_descriptor.idProduct |= ((soc_rev << 4) | (FUSE(FUSE_SKU_INFO) & 0xF)) << 8; // HIDFAM.
1536
usb_device_descriptor.bcdDevice = (soc_rev >> 16) & 0xF; // MINORREV.
1537
usb_device_descriptor.bcdDevice |= ((soc_rev >> 4) & 0xF) << 8; // MAJORREV.
1538
*/
1539
desc = usbd_xotg->desc->dev;
1540
size = usbd_xotg->desc->dev->bLength;
1541
break;
1542
case USB_DESCRIPTOR_CONFIGURATION:
1543
//! TODO USB3: Provide a super speed descriptor.
1544
if (usbd_xotg->gadget == USB_GADGET_UMS)
1545
{
1546
if (usbd_xotg->port_speed == XUSB_HIGH_SPEED) // High speed. 512 bytes.
1547
{
1548
for (u32 i = 0; i < usbd_xotg->desc->cfg->interface.bNumEndpoints; i++)
1549
usbd_xotg->desc->cfg->endpoint[i].wMaxPacketSize = 0x200; // No burst.
1550
}
1551
else // Full speed. 64 bytes.
1552
{
1553
for (u32 i = 0; i < usbd_xotg->desc->cfg->interface.bNumEndpoints; i++)
1554
usbd_xotg->desc->cfg->endpoint[i].wMaxPacketSize = 0x40;
1555
}
1556
}
1557
else
1558
{
1559
usb_cfg_hid_descr_t *tmp = (usb_cfg_hid_descr_t *)usbd_xotg->desc->cfg;
1560
if (usbd_xotg->port_speed == XUSB_HIGH_SPEED) // High speed. 512 bytes.
1561
{
1562
for (u32 i = 0; i < tmp->interface.bNumEndpoints; i++)
1563
{
1564
tmp->endpoint[i].wMaxPacketSize = 0x200;
1565
tmp->endpoint[i].bInterval = usbd_xotg->gadget == USB_GADGET_HID_GAMEPAD ? 4 : 3; // 8ms : 4ms.
1566
}
1567
}
1568
else // Full speed. 64 bytes.
1569
{
1570
for (u32 i = 0; i < tmp->interface.bNumEndpoints; i++)
1571
{
1572
tmp->endpoint[i].wMaxPacketSize = 0x40;
1573
tmp->endpoint[i].bInterval = usbd_xotg->gadget == USB_GADGET_HID_GAMEPAD ? 8 : 4; // 8ms : 4ms.
1574
}
1575
}
1576
}
1577
desc = usbd_xotg->desc->cfg;
1578
size = usbd_xotg->desc->cfg->config.wTotalLength;
1579
break;
1580
case USB_DESCRIPTOR_STRING:
1581
switch (descriptor_subtype)
1582
{
1583
case 1:
1584
desc = usbd_xotg->desc->vendor;
1585
size = usbd_xotg->desc->vendor[0];
1586
break;
1587
case 2:
1588
desc = usbd_xotg->desc->product;
1589
size = usbd_xotg->desc->product[0];
1590
break;
1591
case 3:
1592
desc = usbd_xotg->desc->serial;
1593
size = usbd_xotg->desc->serial[0];
1594
break;
1595
case 0xEE:
1596
desc = usbd_xotg->desc->ms_os;
1597
size = usbd_xotg->desc->ms_os->bLength;
1598
break;
1599
default:
1600
desc = usbd_xotg->desc->lang_id;
1601
size = 4;
1602
break;
1603
}
1604
break;
1605
case USB_DESCRIPTOR_DEVICE_QUALIFIER:
1606
if (!usbd_xotg->desc->dev_qual)
1607
{
1608
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1609
return USB_RES_OK;
1610
}
1611
usbd_xotg->desc->dev_qual->bNumOtherConfigs = 0;
1612
desc = usbd_xotg->desc->dev_qual;
1613
size = usbd_xotg->desc->dev_qual->bLength;
1614
break;
1615
case USB_DESCRIPTOR_OTHER_SPEED_CONFIGURATION:
1616
if (!usbd_xotg->desc->cfg_other)
1617
{
1618
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1619
return USB_RES_OK;
1620
}
1621
if (usbd_xotg->port_speed == XUSB_HIGH_SPEED)
1622
{
1623
for (u32 i = 0; i < usbd_xotg->desc->cfg_other->interface.bNumEndpoints; i++)
1624
usbd_xotg->desc->cfg_other->endpoint[i].wMaxPacketSize = 0x40;
1625
}
1626
else
1627
{
1628
for (u32 i = 0; i < usbd_xotg->desc->cfg_other->interface.bNumEndpoints; i++)
1629
usbd_xotg->desc->cfg_other->endpoint[i].wMaxPacketSize = 0x200;
1630
}
1631
desc = usbd_xotg->desc->cfg_other;
1632
size = usbd_xotg->desc->cfg_other->config.wTotalLength;
1633
break;
1634
case USB_DESCRIPTOR_DEVICE_BINARY_OBJECT:
1635
desc = usbd_xotg->desc->dev_bot;
1636
size = usbd_xotg->desc->dev_bot->wTotalLength;
1637
break;
1638
default:
1639
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1640
return USB_RES_OK;
1641
}
1642
1643
if (wLength < size)
1644
size = wLength;
1645
1646
return _xusb_issue_data_trb(desc, size, USB_DIR_IN);
1647
}
1648
1649
static void _xusb_handle_set_request_dev_address(const usb_ctrl_setup_t *ctrl_setup)
1650
{
1651
u32 addr = ctrl_setup->wValue & 0xFF;
1652
1653
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) & 0x80FFFFFF) | (addr << 24);
1654
xusb_evtq->xusb_ep_ctxt[XUSB_EP_CTRL_IN].device_addr = addr;
1655
1656
_xusb_issue_status_trb(USB_DIR_IN);
1657
1658
usbd_xotg->device_state = XUSB_ADDRESSED_STS_WAIT;
1659
}
1660
1661
static void _xusb_handle_set_request_configuration(const usb_ctrl_setup_t *ctrl_setup)
1662
{
1663
usbd_xotg->config_num = ctrl_setup->wValue;
1664
1665
// Remove configuration.
1666
if (!usbd_xotg->config_num)
1667
{
1668
//! TODO: Signal that to userspace.
1669
_xusb_disable_ep1();
1670
1671
_xusb_issue_status_trb(USB_DIR_IN);
1672
1673
return;
1674
}
1675
1676
// Initialize BULK EPs.
1677
_xusbd_ep_initialize(USB_EP_BULK_OUT);
1678
_xusbd_ep_initialize(USB_EP_BULK_IN);
1679
1680
// Device mode start.
1681
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) |= XHCI_CTRL_RUN;
1682
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ST) |= XHCI_ST_RC;
1683
1684
_xusb_issue_status_trb(USB_DIR_IN);
1685
usbd_xotg->device_state = XUSB_CONFIGURED_STS_WAIT;
1686
}
1687
1688
static int _xusbd_handle_ep0_control_transfer(usb_ctrl_setup_t *ctrl_setup)
1689
{
1690
u32 size;
1691
u8 *desc;
1692
bool ep_stall = false;
1693
bool transmit_data = false;
1694
1695
u8 _bmRequestType = ctrl_setup->bmRequestType;
1696
u8 _bRequest = ctrl_setup->bRequest;
1697
u16 _wValue = ctrl_setup->wValue;
1698
u16 _wIndex = ctrl_setup->wIndex;
1699
u16 _wLength = ctrl_setup->wLength;
1700
1701
static u8 xusb_dev_status_descriptor[2] = {USB_STATUS_DEV_SELF_POWERED, 0};
1702
static u8 xusb_interface_descriptor[4] = {0};
1703
static u8 xusb_configuration_descriptor[2] = {0};
1704
static u8 xusb_status_descriptor[2] = {0};
1705
1706
//gfx_printf("ctrl: %02X %02X %04X %04X %04X\n", _bmRequestType, _bRequest, _wValue, _wIndex, _wLength);
1707
1708
// Unhalt EP0 IN.
1709
XUSB_DEV_XHCI(XUSB_DEV_XHCI_EP_HALT) &= ~XHCI_EP_HALT_DCI_EP0_IN;
1710
u32 res = _xusb_xhci_mask_wait(XUSB_DEV_XHCI_EP_HALT, XHCI_EP_HALT_DCI_EP0_IN, 0, 1000);
1711
if (res)
1712
return res;
1713
1714
switch (_bmRequestType)
1715
{
1716
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE): // 0x00.
1717
if (_bRequest == USB_REQUEST_SET_ADDRESS)
1718
_xusb_handle_set_request_dev_address(ctrl_setup);
1719
else if (_bRequest == USB_REQUEST_SET_CONFIGURATION)
1720
_xusb_handle_set_request_configuration(ctrl_setup);
1721
return USB_RES_OK; // What about others.
1722
1723
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE): // 0x01.
1724
usbd_xotg->interface_num = _wValue;
1725
return _xusb_issue_status_trb(USB_DIR_IN);
1726
1727
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT): // 0x02.
1728
if ((_wValue & 0xFF) == USB_FEATURE_ENDPOINT_HALT)
1729
{
1730
if (_bRequest == USB_REQUEST_CLEAR_FEATURE || _bRequest == USB_REQUEST_SET_FEATURE)
1731
{
1732
u32 ep = 0;
1733
switch (_wIndex) // endpoint
1734
{
1735
case USB_EP_ADDR_CTRL_OUT:
1736
ep = XUSB_EP_CTRL_OUT;
1737
break;
1738
case USB_EP_ADDR_CTRL_IN:
1739
ep = XUSB_EP_CTRL_IN;
1740
break;
1741
case USB_EP_ADDR_BULK_OUT:
1742
ep = USB_EP_BULK_OUT;
1743
break;
1744
case USB_EP_ADDR_BULK_IN:
1745
ep = USB_EP_BULK_IN;
1746
break;
1747
default:
1748
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1749
return USB_RES_OK;
1750
}
1751
1752
if (_bRequest == USB_REQUEST_CLEAR_FEATURE)
1753
xusb_set_ep_stall(ep, USB_EP_CFG_CLEAR);
1754
else if (_bRequest == USB_REQUEST_SET_FEATURE)
1755
xusb_set_ep_stall(ep, USB_EP_CFG_STALL);
1756
1757
return _xusb_issue_status_trb(USB_DIR_IN);
1758
}
1759
}
1760
ep_stall = true;
1761
break;
1762
1763
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE): // 0x21.
1764
return _xusb_handle_get_class_request(ctrl_setup);
1765
1766
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE): // 0x80.
1767
switch (_bRequest)
1768
{
1769
case USB_REQUEST_GET_STATUS:
1770
desc = xusb_dev_status_descriptor;
1771
size = sizeof(xusb_dev_status_descriptor);
1772
transmit_data = true;
1773
break;
1774
case USB_REQUEST_GET_DESCRIPTOR:
1775
return _xusb_handle_get_descriptor(ctrl_setup);
1776
case USB_REQUEST_GET_CONFIGURATION:
1777
xusb_configuration_descriptor[0] = usbd_xotg->config_num;
1778
desc = xusb_configuration_descriptor;
1779
size = sizeof(xusb_configuration_descriptor);
1780
transmit_data = true;
1781
break;
1782
default:
1783
ep_stall = true;
1784
break;
1785
}
1786
break;
1787
1788
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE): // 0x81.
1789
if (_bRequest == USB_REQUEST_GET_INTERFACE)
1790
{
1791
desc = xusb_interface_descriptor;
1792
size = sizeof(xusb_interface_descriptor);
1793
xusb_interface_descriptor[0] = usbd_xotg->interface_num;
1794
transmit_data = true;
1795
}
1796
else if (_bRequest == USB_REQUEST_GET_STATUS)
1797
{
1798
desc = xusb_status_descriptor;
1799
size = sizeof(xusb_status_descriptor);
1800
transmit_data = true;
1801
}
1802
else if (_bRequest == USB_REQUEST_GET_DESCRIPTOR && (_wValue >> 8) == USB_DESCRIPTOR_HID_REPORT && usbd_xotg->gadget >= USB_GADGET_HID_GAMEPAD)
1803
{
1804
if (usbd_xotg->gadget == USB_GADGET_HID_GAMEPAD)
1805
{
1806
desc = (u8 *)&hid_report_descriptor_jc;
1807
size = hid_report_descriptor_jc_size;
1808
}
1809
else // USB_GADGET_HID_TOUCHPAD
1810
{
1811
desc = (u8 *)&hid_report_descriptor_touch;
1812
size = hid_report_descriptor_touch_size;
1813
}
1814
transmit_data = true;
1815
usbd_xotg->device_state = XUSB_HID_CONFIGURED_STS_WAIT;
1816
}
1817
else
1818
ep_stall = true;
1819
break;
1820
1821
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT): // 0x82.
1822
if (_bRequest == USB_REQUEST_GET_STATUS)
1823
{
1824
u32 ep = 0;
1825
switch (_wIndex) // endpoint
1826
{
1827
case USB_EP_ADDR_CTRL_OUT:
1828
ep = XUSB_EP_CTRL_OUT;
1829
break;
1830
case USB_EP_ADDR_CTRL_IN:
1831
ep = XUSB_EP_CTRL_IN;
1832
break;
1833
case USB_EP_ADDR_BULK_OUT:
1834
ep = USB_EP_BULK_OUT;
1835
break;
1836
case USB_EP_ADDR_BULK_IN:
1837
ep = USB_EP_BULK_IN;
1838
break;
1839
default:
1840
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1841
return USB_RES_OK;
1842
}
1843
return _xusb_handle_get_ep_status(ep);
1844
}
1845
1846
ep_stall = true;
1847
break;
1848
1849
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE): // 0xA1.
1850
return _xusb_handle_get_class_request(ctrl_setup);
1851
1852
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE): // 0xC0.
1853
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_INTERFACE): // 0xC1.
1854
if (_bRequest == USB_REQUEST_GET_MS_DESCRIPTOR)
1855
{
1856
switch (_wIndex)
1857
{
1858
case USB_DESCRIPTOR_MS_COMPAT_ID:
1859
desc = (u8 *)usbd_xotg->desc->ms_cid;
1860
size = usbd_xotg->desc->ms_cid->dLength;
1861
transmit_data = true;
1862
break;
1863
case USB_DESCRIPTOR_MS_EXTENDED_PROPERTIES:
1864
desc = (u8 *)usbd_xotg->desc->mx_ext;
1865
size = usbd_xotg->desc->mx_ext->dLength;
1866
transmit_data = true;
1867
break;
1868
default:
1869
ep_stall = true;
1870
break;
1871
}
1872
}
1873
else
1874
ep_stall = true;
1875
break;
1876
1877
default:
1878
ep_stall = true;
1879
break;
1880
}
1881
1882
if (transmit_data)
1883
{
1884
memcpy((u8 *)USB_EP_CONTROL_BUF_ADDR, desc, size);
1885
if (_wLength < size)
1886
size = _wLength;
1887
return _xusb_issue_data_trb((u8 *)USB_EP_CONTROL_BUF_ADDR, size, USB_DIR_IN);
1888
}
1889
1890
if (ep_stall)
1891
xusb_set_ep_stall(XUSB_EP_CTRL_IN, USB_EP_CFG_STALL);
1892
1893
return USB_RES_OK;
1894
}
1895
1896
static int _xusb_ep_operation(u32 tries)
1897
{
1898
usb_ctrl_setup_t setup_event;
1899
volatile event_trb_t *event_trb;
1900
setup_event_trb_t *setup_event_trb;
1901
1902
// Wait for an interrupt event.
1903
int res = _xusb_xhci_mask_wait(XUSB_DEV_XHCI_ST, XHCI_ST_IP, XHCI_ST_IP, tries);
1904
if (res)
1905
return res;
1906
1907
// Clear interrupt status.
1908
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ST) |= XHCI_ST_IP;
1909
1910
usbd_xotg->event_enqueue_ptr = (event_trb_t *)(XUSB_DEV_XHCI(XUSB_DEV_XHCI_EREPLO) & 0xFFFFFFF0);
1911
event_trb = usbd_xotg->event_dequeue_ptr;
1912
1913
// Check if cycle matches.
1914
if ((event_trb->cycle & 1) != usbd_xotg->event_ccs)
1915
return XUSB_ERROR_INVALID_CYCLE;
1916
1917
while ((event_trb->cycle & 1) == usbd_xotg->event_ccs)
1918
{
1919
switch (event_trb->trb_type)
1920
{
1921
case XUSB_TRB_TRANSFER:
1922
res = _xusb_handle_transfer_event((transfer_event_trb_t *)event_trb);
1923
break;
1924
case XUSB_TRB_PORT_CHANGE:
1925
res = _xusb_handle_port_change();
1926
break;
1927
case XUSB_TRB_SETUP:
1928
setup_event_trb = (setup_event_trb_t *)event_trb;
1929
memcpy(&setup_event, &setup_event_trb->ctrl_setup_data, sizeof(usb_ctrl_setup_t));
1930
usbd_xotg->ctrl_seq_num = setup_event_trb->ctrl_seq_num;
1931
res = _xusbd_handle_ep0_control_transfer(&setup_event);
1932
break;
1933
default:
1934
// TRB not supported.
1935
break;
1936
}
1937
1938
// Check if last event TRB and reset to first one.
1939
if (usbd_xotg->event_dequeue_ptr == &xusb_evtq->xusb_event_ring_seg1[XUSB_LAST_TRB_IDX])
1940
{
1941
usbd_xotg->event_dequeue_ptr = xusb_evtq->xusb_event_ring_seg0;
1942
usbd_xotg->event_ccs ^= 1;
1943
}
1944
else // Advance dequeue to next event.
1945
usbd_xotg->event_dequeue_ptr = &usbd_xotg->event_dequeue_ptr[1];
1946
1947
// Set next event.
1948
event_trb = usbd_xotg->event_dequeue_ptr;
1949
1950
// If events exceed the interrupt time, handle them next interrupt.
1951
if (usbd_xotg->event_dequeue_ptr == usbd_xotg->event_enqueue_ptr)
1952
break;
1953
}
1954
1955
// Clear Event Handler bit if enabled and set Dequeue pointer.
1956
u32 erdp = XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERDPLO) & 0xF;
1957
if (erdp & XHCI_ERDPLO_EHB)
1958
erdp |= XHCI_ERDPLO_EHB;
1959
XUSB_DEV_XHCI(XUSB_DEV_XHCI_ERDPLO) = ((u32)usbd_xotg->event_dequeue_ptr & 0xFFFFFFF0) | erdp;
1960
1961
return res;
1962
}
1963
1964
int xusb_device_enumerate(usb_gadget_type gadget)
1965
{
1966
switch (gadget)
1967
{
1968
case USB_GADGET_UMS:
1969
usbd_xotg->desc = &usb_gadget_ums_descriptors;
1970
break;
1971
case USB_GADGET_HID_GAMEPAD:
1972
usbd_xotg->desc = &usb_gadget_hid_jc_descriptors;
1973
break;
1974
case USB_GADGET_HID_TOUCHPAD:
1975
usbd_xotg->desc = &usb_gadget_hid_touch_descriptors;
1976
break;
1977
}
1978
1979
usbd_xotg->gadget = gadget;
1980
1981
/*
1982
* Set interrupt moderation to 0us.
1983
* This is important because default value creates a 4.62ms latency.
1984
* Effectively hurting transfers by having 15% to 96% performance loss.
1985
*/
1986
XUSB_DEV_XHCI(XUSB_DEV_XHCI_RT_IMOD) = 0;
1987
1988
// Disable Wake events.
1989
XUSB_PADCTL(XUSB_PADCTL_ELPG_PROGRAM_0) = 0;
1990
XUSB_PADCTL(XUSB_PADCTL_ELPG_PROGRAM_1) = 0;
1991
1992
// Enable overrides for VBUS and ID.
1993
XUSB_PADCTL(XUSB_PADCTL_USB2_VBUS_ID) = (XUSB_PADCTL(XUSB_PADCTL_USB2_VBUS_ID) & ~(PADCTL_USB2_VBUS_ID_VBUS_OVR_MASK | PADCTL_USB2_VBUS_ID_SRC_MASK)) |
1994
PADCTL_USB2_VBUS_ID_VBUS_OVR_EN | PADCTL_USB2_VBUS_ID_SRC_ID_OVR_EN;
1995
1996
// Clear halt for LTSSM.
1997
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTHALT) &= ~XHCI_PORTHALT_HALT_LTSSM;
1998
1999
// Enable device mode.
2000
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) |= XHCI_CTRL_ENABLE;
2001
2002
// Override access to High/Full Speed.
2003
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CFG_DEV_FE) = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_CFG_DEV_FE) & ~XHCI_CFG_DEV_FE_PORTREGSEL_MASK) | XHCI_CFG_DEV_FE_PORTREGSEL_HSFS;
2004
2005
XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) = (XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) & ~XHCI_PORTSC_PLS_MASK) | XHCI_PORTSC_LWS | XHCI_PORTSC_PLS_RXDETECT;
2006
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CFG_DEV_FE) &= ~XHCI_CFG_DEV_FE_PORTREGSEL_MASK;
2007
2008
// Enable VBUS and set ID to Float.
2009
XUSB_PADCTL(XUSB_PADCTL_USB2_VBUS_ID) = (XUSB_PADCTL(XUSB_PADCTL_USB2_VBUS_ID) & ~PADCTL_USB2_VBUS_ID_OVR_MASK) |
2010
PADCTL_USB2_VBUS_ID_OVR_FLOAT | PADCTL_USB2_VBUS_ID_VBUS_ON;
2011
2012
usbd_xotg->wait_for_event_trb = XUSB_TRB_SETUP;
2013
usbd_xotg->device_state = XUSB_DEFAULT;
2014
2015
// Timeout if cable or communication isn't started in 1.5 minutes.
2016
u32 timer = get_tmr_ms() + 90000;
2017
while (true)
2018
{
2019
int res = _xusb_ep_operation(USB_XFER_SYNCED_ENUM); // 2s timeout.
2020
if (res && res != USB_ERROR_TIMEOUT)
2021
return res;
2022
2023
if (usbd_xotg->device_state == XUSB_CONFIGURED)
2024
break;
2025
2026
if (timer < get_tmr_ms() || btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
2027
return USB_ERROR_USER_ABORT;
2028
}
2029
2030
return USB_RES_OK;
2031
}
2032
2033
void xusb_end(bool reset_ep, bool only_controller)
2034
{
2035
// Disable endpoints and stop device mode operation.
2036
_xusb_disable_ep1();
2037
2038
// Disable device mode.
2039
XUSB_DEV_XHCI(XUSB_DEV_XHCI_CTRL) = 0;
2040
2041
//! TODO: Add only controller support?
2042
_xusb_device_power_down();
2043
}
2044
2045
int xusb_handle_ep0_ctrl_setup(u32 *data)
2046
{
2047
/*
2048
* EP0 Control handling is done by normal ep operation in XUSB.
2049
* Here we handle the interface only, except if HID.
2050
*/
2051
if (usbd_xotg->gadget >= USB_GADGET_HID_GAMEPAD)
2052
_xusb_ep_operation(1);
2053
2054
if (usbd_xotg->intr_idle_req)
2055
{
2056
if (data)
2057
*data = usbd_xotg->intr_idle_rate;
2058
2059
usbd_xotg->intr_idle_req = false;
2060
return USB_RES_OK;
2061
}
2062
2063
if (usbd_xotg->bulk_reset_req)
2064
{
2065
usbd_xotg->bulk_reset_req = false;
2066
return USB_RES_BULK_RESET;
2067
}
2068
2069
return USB_RES_OK;
2070
}
2071
2072
int xusb_device_ep1_out_read(u8 *buf, u32 len, u32 *bytes_read, u32 sync_tries)
2073
{
2074
if (len > USB_EP_BUFFER_MAX_SIZE)
2075
len = USB_EP_BUFFER_MAX_SIZE;
2076
2077
int res = USB_RES_OK;
2078
usbd_xotg->tx_count[USB_DIR_OUT] = 0;
2079
usbd_xotg->tx_bytes[USB_DIR_OUT] = len;
2080
2081
_xusb_issue_normal_trb(buf, len, USB_DIR_OUT);
2082
usbd_xotg->tx_count[USB_DIR_OUT]++;
2083
2084
if (sync_tries)
2085
{
2086
while (!res && usbd_xotg->tx_count[USB_DIR_OUT])
2087
res = _xusb_ep_operation(sync_tries);
2088
2089
if (bytes_read)
2090
*bytes_read = res ? 0 : usbd_xotg->tx_bytes[USB_DIR_OUT];
2091
}
2092
2093
// Invalidate data after transfer.
2094
bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false);
2095
2096
return res;
2097
}
2098
2099
int xusb_device_ep1_out_read_big(u8 *buf, u32 len, u32 *bytes_read)
2100
{
2101
if (len > USB_EP_BULK_OUT_MAX_XFER)
2102
len = USB_EP_BULK_OUT_MAX_XFER;
2103
2104
u32 bytes = 0;
2105
*bytes_read = 0;
2106
u8 *buf_curr = buf;
2107
2108
while (len)
2109
{
2110
u32 len_ep = MIN(len, USB_EP_BUFFER_MAX_SIZE);
2111
2112
int res = xusb_device_ep1_out_read(buf_curr, len_ep, &bytes, USB_XFER_SYNCED_DATA);
2113
if (res)
2114
return res;
2115
2116
len -= len_ep;
2117
buf_curr += len_ep;
2118
*bytes_read = *bytes_read + bytes;
2119
}
2120
2121
return USB_RES_OK;
2122
}
2123
2124
int xusb_device_ep1_out_reading_finish(u32 *pending_bytes, u32 sync_tries)
2125
{
2126
int res = USB_RES_OK;
2127
while (!res && usbd_xotg->tx_count[USB_DIR_OUT])
2128
res = _xusb_ep_operation(sync_tries); // Infinite retries.
2129
2130
if (pending_bytes)
2131
*pending_bytes = res ? 0 : usbd_xotg->tx_bytes[USB_DIR_OUT];
2132
2133
// Invalidate data after transfer.
2134
bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false);
2135
2136
return res;
2137
}
2138
2139
int xusb_device_ep1_in_write(u8 *buf, u32 len, u32 *bytes_written, u32 sync_tries)
2140
{
2141
if (len > USB_EP_BUFFER_MAX_SIZE)
2142
len = USB_EP_BUFFER_MAX_SIZE;
2143
2144
// Flush data before transfer.
2145
bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLEAN_WAY, false);
2146
2147
int res = USB_RES_OK;
2148
usbd_xotg->tx_count[USB_DIR_IN] = 0;
2149
usbd_xotg->tx_bytes[USB_DIR_IN] = len;
2150
2151
_xusb_issue_normal_trb(buf, len, USB_DIR_IN);
2152
usbd_xotg->tx_count[USB_DIR_IN]++;
2153
2154
if (sync_tries)
2155
{
2156
while (!res && usbd_xotg->tx_count[USB_DIR_IN])
2157
res = _xusb_ep_operation(sync_tries);
2158
2159
if (bytes_written)
2160
*bytes_written = res ? 0 : usbd_xotg->tx_bytes[USB_DIR_IN];
2161
}
2162
else
2163
{
2164
if ((usbd_xotg->port_speed == XUSB_FULL_SPEED && len == 64) ||
2165
(usbd_xotg->port_speed == XUSB_HIGH_SPEED && len == 512) ||
2166
(usbd_xotg->port_speed == XUSB_SUPER_SPEED && len == 1024))
2167
{
2168
_xusb_issue_normal_trb(buf, 0, USB_DIR_IN);
2169
usbd_xotg->tx_count[USB_DIR_IN]++;
2170
}
2171
}
2172
2173
return res;
2174
}
2175
2176
int xusb_device_ep1_in_writing_finish(u32 *pending_bytes, u32 sync_tries)
2177
{
2178
int res = USB_RES_OK;
2179
while (!res && usbd_xotg->tx_count[USB_DIR_IN])
2180
res = _xusb_ep_operation(sync_tries); // Infinite retries.
2181
2182
if (pending_bytes)
2183
*pending_bytes = res ? 0 : usbd_xotg->tx_bytes[USB_DIR_IN];
2184
2185
return res;
2186
}
2187
2188
bool xusb_device_get_port_in_sleep()
2189
{
2190
// Ejection heuristic.
2191
u32 link_mode = XUSB_DEV_XHCI(XUSB_DEV_XHCI_PORTSC) & XHCI_PORTSC_PLS_MASK;
2192
return (link_mode == XHCI_PORTSC_PLS_U3);
2193
}
2194
2195
bool xusb_device_class_send_max_lun(u8 max_lun)
2196
{
2197
// Timeout if get MAX_LUN request doesn't happen in 10s.
2198
u32 timer = get_tmr_ms() + 10000;
2199
2200
usbd_xotg->max_lun = max_lun;
2201
usbd_xotg->max_lun_set = true;
2202
2203
// Wait for request and transfer start.
2204
while (usbd_xotg->device_state != XUSB_LUN_CONFIGURED)
2205
{
2206
_xusb_ep_operation(USB_XFER_SYNCED_CLASS);
2207
if (timer < get_tmr_ms() || btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
2208
return true;
2209
}
2210
2211
usbd_xotg->device_state = XUSB_CONFIGURED;
2212
2213
return false;
2214
}
2215
2216
bool xusb_device_class_send_hid_report(void *rpt_buffer, u32 rpt_size)
2217
{
2218
// Set buffers.
2219
usbd_xotg->hid_rpt_buffer = rpt_buffer;
2220
usbd_xotg->hid_rpt_size = rpt_size;
2221
2222
// Timeout if get GET_HID_REPORT request doesn't happen in 10s.
2223
u32 timer = get_tmr_ms() + 10000;
2224
2225
// Wait for request and transfer start.
2226
while (usbd_xotg->device_state != XUSB_HID_CONFIGURED)
2227
{
2228
_xusb_ep_operation(USB_XFER_SYNCED_CLASS);
2229
if (timer < get_tmr_ms() || btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
2230
return true;
2231
}
2232
2233
usbd_xotg->device_state = XUSB_CONFIGURED;
2234
2235
return false;
2236
}
2237
2238
void xusb_device_get_ops(usb_ops_t *ops)
2239
{
2240
ops->usbd_flush_endpoint = NULL;
2241
ops->usbd_set_ep_stall = xusb_set_ep_stall;
2242
ops->usbd_handle_ep0_ctrl_setup = xusb_handle_ep0_ctrl_setup;
2243
ops->usbd_end = xusb_end;
2244
ops->usb_device_init = xusb_device_init;
2245
ops->usb_device_enumerate = xusb_device_enumerate;
2246
ops->usb_device_class_send_max_lun = xusb_device_class_send_max_lun;
2247
ops->usb_device_class_send_hid_report = xusb_device_class_send_hid_report;
2248
ops->usb_device_get_suspended = xusb_device_get_port_in_sleep;
2249
ops->usb_device_get_port_in_sleep = xusb_device_get_port_in_sleep;
2250
2251
ops->usb_device_ep1_out_read = xusb_device_ep1_out_read;
2252
ops->usb_device_ep1_out_read_big = xusb_device_ep1_out_read_big;
2253
ops->usb_device_ep1_out_reading_finish = xusb_device_ep1_out_reading_finish;
2254
ops->usb_device_ep1_in_write = xusb_device_ep1_in_write;
2255
ops->usb_device_ep1_in_writing_finish = xusb_device_ep1_in_writing_finish;
2256
}
2257
2258