mirror of https://github.com/ARMmbed/mbed-os.git
Update deep sleep locks according to enabled state
parent
a3107062d9
commit
1c907e6db9
|
@ -86,6 +86,11 @@ int SerialBase::writeable()
|
|||
void SerialBase::attach(Callback<void()> func, IrqType type)
|
||||
{
|
||||
lock();
|
||||
const bool enabled { (_rx_enabled &&(type == RxIrq)) || (_tx_enabled &&(type == TxIrq)) };
|
||||
// If corresponding direction is not enabled only update the handler
|
||||
if (!enabled) {
|
||||
_irq[type] = func;
|
||||
} else {
|
||||
// Disable interrupts when attaching interrupt handler
|
||||
core_util_critical_section_enter();
|
||||
if (func) {
|
||||
|
@ -104,6 +109,7 @@ void SerialBase::attach(Callback<void()> func, IrqType type)
|
|||
serial_irq_set(&_serial, (SerialIrq)type, 0);
|
||||
}
|
||||
core_util_critical_section_exit();
|
||||
}
|
||||
unlock();
|
||||
}
|
||||
|
||||
|
@ -153,14 +159,21 @@ void SerialBase::enable_input(bool enable)
|
|||
|
||||
core_util_critical_section_enter();
|
||||
if (enable) {
|
||||
// Enable rx IRQ if attached (indicated by rx IRQ callback not NULL)
|
||||
// Enable rx IRQ and lock deep sleep if a rx handler is attached
|
||||
// (indicated by rx IRQ callback not NULL)
|
||||
if (_irq[RxIrq]) {
|
||||
_irq[RxIrq].call();
|
||||
sleep_manager_lock_deep_sleep();
|
||||
serial_irq_set(&_serial, (SerialIrq)RxIrq, 1);
|
||||
}
|
||||
} else {
|
||||
// Disable rx IRQ
|
||||
serial_irq_set(&_serial, (SerialIrq)RxIrq, 0);
|
||||
// Unlock deep sleep if a rx handler is attached
|
||||
// (indicated by rx IRQ callback not NULL)
|
||||
if (_irq[RxIrq]) {
|
||||
sleep_manager_unlock_deep_sleep();
|
||||
}
|
||||
}
|
||||
core_util_critical_section_exit();
|
||||
|
||||
|
@ -183,14 +196,21 @@ void SerialBase::enable_output(bool enable)
|
|||
|
||||
core_util_critical_section_enter();
|
||||
if (enable) {
|
||||
// Enable tx IRQ if attached (indicated by tx IRQ callback not NULL)
|
||||
// Enable tx IRQ and lock deep sleep if a tx handler is attached
|
||||
// (indicated by tx IRQ callback not NULL)
|
||||
if (_irq[TxIrq]) {
|
||||
_irq[TxIrq].call();
|
||||
sleep_manager_lock_deep_sleep();
|
||||
serial_irq_set(&_serial, (SerialIrq)TxIrq, 1);
|
||||
}
|
||||
} else {
|
||||
// Disable tx IRQ
|
||||
serial_irq_set(&_serial, (SerialIrq)TxIrq, 0);
|
||||
// Unlock deep sleep if a tx handler is attached
|
||||
// (indicated by tx IRQ callback not NULL)
|
||||
if (_irq[TxIrq]) {
|
||||
sleep_manager_unlock_deep_sleep();
|
||||
}
|
||||
}
|
||||
core_util_critical_section_exit();
|
||||
|
||||
|
|
Loading…
Reference in New Issue