What is the recommended UART SUSPEND sequence to use the PM_DEVICE_RUNTIME?
I am having trouble using the PM capabilities with the UARTe driver.
I am developing on the 52833, using sdk 2.5.2 for UART0 w/UARTe driver.
My prj.conf has:
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_PINCTRL=y
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
CONFIG_BOOT_BANNER=n
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
I use the RTT for my console and logs. The RTT clearly illustrates that I'm disabling the UART but not Suspending...
The rest of the program is working except when I try to SUSPEND the UART in between transmissions.
uart_rx_enable() and uart_rx_disable() are working as expected.
I am handling flags in the ISR to keep it quick...
I do see the buffers being requested and released as expected.
I do see UART_RX_DISABLED when expected, as expected.
case UART_RX_DISABLED: // receiver has been stopped, disabled or finished its operation (receive buffer filled)
if (RX_DisableRequested) {
RX_Enabled = false;
printk("UART_RX_DISABLED - As Requested\r\n\n"); }
But, when I try to pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND), it fails to successfully shutdown and then blocks me from doing an rx_enable()
Here is my procedure... What am I missing?
Thanks in advance!
Jim
void SuspendUART (void) {
int ret;
if (RX_Enabled) {
if ((uart_rx_disable(uart)) < 0) {
printk("\n UART RX Disable failed - SuspendUART\n");
RX_Enabled = true;
} else {
printk("\n UART RX Disable - SuspendUART\n");
RX_Enabled = false;
}
}
if ((!PM_Suspend) && (!RX_Enabled)) {
ret = pm_device_state_get(uart, ¤t_state);
if (ret != PM_DEVICE_STATE_SUSPENDED) { // UART is currently suspended, resume it if necessary
if ((ret = pm_device_action_run(uart, PM_DEVICE_ACTION_SUSPEND)) != 0) {
LOG_ERR("UART PM SUSPEND failed - SuspendUART");
}
k_msleep(100);
ret = pm_device_state_get(uart, ¤t_state);
if (ret == PM_DEVICE_STATE_SUSPENDED) { // UART is currently suspended, resume it if necessary
PM_Suspend = true;
printk(" UART PM Suspend - SuspendUART\n");
} else {
PM_Suspend = false;
printk(" UART PM Suspend FAIL - SuspendUART\n");
}
}
}
}
void ResumeUART (void) {
int ret;
ret = 0;
if (PM_Suspend) {
ret = pm_device_state_get(uart, ¤t_state);
if (ret == PM_DEVICE_STATE_SUSPENDED) {
PM_Suspend = true; // UART is currently suspended, resume it if necessary
if (ret += pm_device_action_run(uart, PM_DEVICE_ACTION_RESUME) != 0) {
// LOG_ERR("UART PM RESUME failed - 3");
printk("UART PM Resume FAIL - SendTempC\n");
}
} else if (ret == PM_DEVICE_STATE_SUSPENDING) {
PM_Suspend = true;
} else {
PM_Suspend = false;
printk("UART PM Resume - SendTempC\n");
}
k_msleep(100);
ret = pm_device_state_get(uart, ¤t_state);
if (ret == PM_DEVICE_STATE_SUSPENDED) {
PM_Suspend = true; // UART is currently suspended, resume it if necessary
if (ret += pm_device_action_run(uart, PM_DEVICE_ACTION_RESUME) != 0) {
// LOG_ERR("UART PM RESUME failed - 3");
printk("UART PM Resume FAIL - SendTempC\n");
}
} else if (ret == PM_DEVICE_STATE_SUSPENDING) {
PM_Suspend = true;
} else {
PM_Suspend = false;
printk("UART PM Resume - SendTempC\n");
}
}
if (!RX_Enabled) {
RX_Enabled = true;
if (RX_Buffer1) {
if (uart_rx_enable(uart, rx_buf2, sizeof rx_buf1, RECEIVE_TIMEOUT) != 0) {
LOG_ERR("UART RX Enable failed - SendTempC rx_buf2");
RX_Enabled = false;
} else {
printk(" UART RX Enable - SendTempC rx_buf2\r\n");
RX_Buffer1 = false;
}
} else {
if (uart_rx_enable(uart, rx_buf1, sizeof rx_buf1, RECEIVE_TIMEOUT) != 0) {
LOG_ERR("UART RX Enable failed - SendTempC rx_buf1");
RX_Enabled = false;
} else {
printk(" UART RX Enable - SendTempC rx_buf1\r\n");
RX_Buffer1 = true;
}
}
}
}