Port AVR Serial_::readBreak() API to SAM core

This commit is contained in:
Sandeep Mistry 2015-11-17 10:09:56 -05:00
parent 86e34b9940
commit 9759f2cc60
2 changed files with 42 additions and 0 deletions

View File

@ -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;
} }

View File

@ -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.