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