atsamd2x: avoid infinite loop when USBCDC is disconnected
Этот коммит содержится в:
родитель
1aac8a0cb1
коммит
52a20cf3bb
1 изменённых файлов: 23 добавлений и 8 удалений
|
@ -1468,6 +1468,7 @@ type USBCDC struct {
|
|||
Buffer *RingBuffer
|
||||
TxIdx volatile.Register8
|
||||
waitTxc bool
|
||||
waitTxcRetryCount uint8
|
||||
sent bool
|
||||
}
|
||||
|
||||
|
@ -1476,6 +1477,7 @@ const (
|
|||
usbcdcTxBankMask uint8 = ^usbcdcTxSizeMask
|
||||
usbcdcTxBank1st uint8 = 0x00
|
||||
usbcdcTxBank2nd uint8 = usbcdcTxSizeMask + 1
|
||||
usbcdcTxMaxRetriesAllowed uint8 = 5
|
||||
)
|
||||
|
||||
// Flush flushes buffered data.
|
||||
|
@ -1491,6 +1493,7 @@ func (usbcdc *USBCDC) Flush() error {
|
|||
return nil
|
||||
}
|
||||
usbcdc.waitTxc = true
|
||||
usbcdc.waitTxcRetryCount = 0
|
||||
|
||||
// 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]))))
|
||||
|
@ -1537,6 +1540,14 @@ func (usbcdc *USBCDC) WriteByte(c byte) error {
|
|||
|
||||
if ok {
|
||||
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 {
|
||||
mask := interrupt.Disable()
|
||||
if UART0.sent {
|
||||
|
@ -1764,6 +1775,10 @@ func handleUSB(intr interrupt.Interrupt) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if i == usb_CDC_ENDPOINT_IN && UART0.waitTxc {
|
||||
UART0.waitTxcRetryCount++
|
||||
}
|
||||
}
|
||||
|
||||
UART0.Flush()
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче