@@ -379,3 +379,69 @@ func ReceiveUSBControlPacket() ([cdcLineInfoSize]byte, error) {
379
379
380
380
return b , nil
381
381
}
382
+
383
+ // Set the USB endpoint Packet ID to DATA0 or DATA1.
384
+ // In endpoints must have bit 7 (0x80) set.
385
+ func setEPDataPID (ep uint32 , dataOne bool ) {
386
+ val := ep
387
+ if dataOne {
388
+ val |= USBD_DTOGGLE_VALUE_Data1 << USBD_DTOGGLE_VALUE_Pos
389
+ } else {
390
+ val |= USBD_DTOGGLE_VALUE_Data0 << USBD_DTOGGLE_VALUE_Pos
391
+ }
392
+ nrf .USBD .DTOGGLE .Set (val )
393
+ }
394
+
395
+ // Set ENDPOINT_HALT/stall status on a USB IN endpoint.
396
+ func (dev * USBDevice ) SetStallEPIn (ep uint32 ) {
397
+ if ep & 0x7F == 0 {
398
+ nrf .USBD .TASKS_EP0STALL .Set (1 )
399
+ } else if ep & 0x7F < NumberOfUSBEndpoints {
400
+ // Stall In Endpoint
401
+ val := 0x100 | 0x80 | ep
402
+ nrf .USBD .EPSTALL .Set (val )
403
+ }
404
+ }
405
+
406
+ // Set ENDPOINT_HALT/stall status on a USB OUT endpoint.
407
+ func (dev * USBDevice ) SetStallEPOut (ep uint32 ) {
408
+ if ep == 0 {
409
+ nrf .USBD .TASKS_EP0STALL .Set (1 )
410
+ } else if ep < NumberOfUSBEndpoints {
411
+ // Stall Out Endpoint
412
+ val := 0x100 | 0x00 | ep
413
+ nrf .USBD .EPSTALL .Set (val )
414
+ }
415
+ }
416
+
417
+ // Clear the ENDPOINT_HALT/stall on a USB IN endpoint.
418
+ func (dev * USBDevice ) ClearStallEPIn (ep uint32 ) {
419
+ if ep & 0x7F == 0 {
420
+ nrf .USBD .TASKS_EP0STALL .Set (0 )
421
+ } else if ep & 0x7F < NumberOfUSBEndpoints {
422
+ // Reset the endpoint data PID to DATA0
423
+ ep |= 0x80 // Set endpoint direction bit
424
+ setEPDataPID (ep , false )
425
+
426
+ // No-stall In Endpoint
427
+ val := 0x000 | 0x80 | ep
428
+ nrf .USBD .EPSTALL .Set (val )
429
+ }
430
+ }
431
+
432
+ // Clear the ENDPOINT_HALT/stall on a USB OUT endpoint.
433
+ func (dev * USBDevice ) ClearStallEPOut (ep uint32 ) {
434
+ if ep == 0 {
435
+ nrf .USBD .TASKS_EP0STALL .Set (0 )
436
+ } else if ep < NumberOfUSBEndpoints {
437
+ // Reset the endpoint data PID to DATA0
438
+ setEPDataPID (ep , false )
439
+
440
+ // No-stall Out Endpoint
441
+ val := 0x000 | 0x00 | ep
442
+ nrf .USBD .EPSTALL .Set (val )
443
+
444
+ // Write a value to the SIZE register to allow nRF to ACK/accept data
445
+ nrf .USBD .SIZE .EPOUT [ep ].Set (0 )
446
+ }
447
+ }
0 commit comments