atsamd5x: avoid infinite loop when USBCDC is disconnected

Этот коммит содержится в:
sago35 2021-02-19 08:26:32 +09:00 коммит произвёл Ron Evans
родитель ba634c4cc7
коммит 1aac8a0cb1

Просмотреть файл

@ -1734,17 +1734,19 @@ func (pwm PWM) getMux() PinMode {
// USBCDC is the USB CDC aka serial over USB interface on the SAMD21. // USBCDC is the USB CDC aka serial over USB interface on the SAMD21.
type USBCDC struct { type USBCDC struct {
Buffer *RingBuffer Buffer *RingBuffer
TxIdx volatile.Register8 TxIdx volatile.Register8
waitTxc bool waitTxc bool
sent bool waitTxcRetryCount uint8
sent bool
} }
const ( const (
usbcdcTxSizeMask uint8 = 0x3F usbcdcTxSizeMask uint8 = 0x3F
usbcdcTxBankMask uint8 = ^usbcdcTxSizeMask usbcdcTxBankMask uint8 = ^usbcdcTxSizeMask
usbcdcTxBank1st uint8 = 0x00 usbcdcTxBank1st uint8 = 0x00
usbcdcTxBank2nd uint8 = usbcdcTxSizeMask + 1 usbcdcTxBank2nd uint8 = usbcdcTxSizeMask + 1
usbcdcTxMaxRetriesAllowed uint8 = 5
) )
// Flush flushes buffered data. // Flush flushes buffered data.
@ -1760,6 +1762,7 @@ func (usbcdc *USBCDC) Flush() error {
return nil return nil
} }
usbcdc.waitTxc = true usbcdc.waitTxc = true
usbcdc.waitTxcRetryCount = 0
// set the data // set the data
usbEndpointDescriptors[usb_CDC_ENDPOINT_IN].DeviceDescBank[1].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_in_cache_buffer[usb_CDC_ENDPOINT_IN][bk])))) usbEndpointDescriptors[usb_CDC_ENDPOINT_IN].DeviceDescBank[1].ADDR.Set(uint32(uintptr(unsafe.Pointer(&udd_ep_in_cache_buffer[usb_CDC_ENDPOINT_IN][bk]))))
@ -1806,6 +1809,14 @@ func (usbcdc *USBCDC) WriteByte(c byte) error {
if ok { if ok {
break break
} else if usbcdcTxMaxRetriesAllowed < UART0.waitTxcRetryCount {
mask := interrupt.Disable()
UART0.waitTxc = false
UART0.waitTxcRetryCount = 0
usbcdc.TxIdx.Set(0)
usbLineInfo.lineState = 0
interrupt.Restore(mask)
break
} else { } else {
mask := interrupt.Disable() mask := interrupt.Disable()
if UART0.sent { if UART0.sent {
@ -2035,6 +2046,10 @@ func handleUSBIRQ(interrupt.Interrupt) {
} }
} }
} }
if i == usb_CDC_ENDPOINT_IN && UART0.waitTxc {
UART0.waitTxcRetryCount++
}
} }
UART0.Flush() UART0.Flush()