mirror of
https://github.com/arduino/Arduino.git
synced 2025-03-01 23:29:28 +01:00
Port AVR Serial_::readBreak() API to SAM core
This commit is contained in:
parent
86e34b9940
commit
9759f2cc60
@ -55,6 +55,8 @@ static volatile LineInfo _usbLineInfo = {
|
|||||||
0x00 // lineState
|
0x00 // lineState
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static volatile int32_t breakValue = -1;
|
||||||
|
|
||||||
_Pragma("pack(1)")
|
_Pragma("pack(1)")
|
||||||
static const CDCDescriptor _cdcInterface =
|
static const CDCDescriptor _cdcInterface =
|
||||||
{
|
{
|
||||||
@ -144,6 +146,7 @@ bool WEAK CDC_Setup(USBSetup& setup)
|
|||||||
|
|
||||||
if (CDC_SEND_BREAK == r)
|
if (CDC_SEND_BREAK == r)
|
||||||
{
|
{
|
||||||
|
breakValue = ((uint16_t)setup.wValueH << 8) | setup.wValueL;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -305,6 +308,28 @@ Serial_::operator bool()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t Serial_::readBreak() {
|
||||||
|
uint8_t enableInterrupts = ((__get_PRIMASK() & 0x1) == 0 &&
|
||||||
|
(__get_FAULTMASK() & 0x1) == 0);
|
||||||
|
|
||||||
|
// disable interrupts,
|
||||||
|
// to avoid clearing a breakValue that might occur
|
||||||
|
// while processing the current break value
|
||||||
|
__disable_irq();
|
||||||
|
|
||||||
|
int ret = breakValue;
|
||||||
|
|
||||||
|
breakValue = -1;
|
||||||
|
|
||||||
|
if (enableInterrupts)
|
||||||
|
{
|
||||||
|
// re-enable the interrupts
|
||||||
|
__enable_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long Serial_::baud() {
|
unsigned long Serial_::baud() {
|
||||||
return _usbLineInfo.dwDTERate;
|
return _usbLineInfo.dwDTERate;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,23 @@ public:
|
|||||||
using Print::write; // pull in write(str) from Print
|
using Print::write; // pull in write(str) from Print
|
||||||
operator bool();
|
operator bool();
|
||||||
|
|
||||||
|
// This method allows processing "SEND_BREAK" requests sent by
|
||||||
|
// the USB host. Those requests indicate that the host wants to
|
||||||
|
// send a BREAK signal and are accompanied by a single uint16_t
|
||||||
|
// value, specifying the duration of the break. The value 0
|
||||||
|
// means to end any current break, while the value 0xffff means
|
||||||
|
// to start an indefinite break.
|
||||||
|
// readBreak() will return the value of the most recent break
|
||||||
|
// request, but will return it at most once, returning -1 when
|
||||||
|
// readBreak() is called again (until another break request is
|
||||||
|
// received, which is again returned once).
|
||||||
|
// This also mean that if two break requests are received
|
||||||
|
// without readBreak() being called in between, the value of the
|
||||||
|
// first request is lost.
|
||||||
|
// Note that the value returned is a long, so it can return
|
||||||
|
// 0-0xffff as well as -1.
|
||||||
|
int32_t readBreak();
|
||||||
|
|
||||||
// These return the settings specified by the USB host for the
|
// These return the settings specified by the USB host for the
|
||||||
// serial port. These aren't really used, but are offered here
|
// serial port. These aren't really used, but are offered here
|
||||||
// in case a sketch wants to act on these settings.
|
// in case a sketch wants to act on these settings.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user