Skip to content

Commit ed10313

Browse files
committed
os/arch/arm/src/amebasmart: fix sem_timedwait(&g_read_cmd_done) not being called
1. change condition from receive_cmd_done flag to MIPI_LPTX_IS_READ, resolve the issue when rx isr is called earlier than sem_timedwait. 2. re-initialize semaphore when timeout happen.
1 parent 7700ffd commit ed10313

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

os/arch/arm/src/amebasmart/amebasmart_mipi.c

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
482482
return ret;
483483
}
484484
send_cmd_done = 0;
485+
receive_cmd_done = 1;
485486
rx_data_rdy = FALSE;
486487
if (msg->rx_buf) {
487488
rx_data_ptr = msg->rx_buf;
@@ -500,22 +501,18 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
500501
(void)clock_gettime(CLOCK_REALTIME, &abstime);
501502
abstime.tv_sec += MIPI_TRANSFER_TIMEOUT;
502503
ret = sem_timedwait(&g_send_cmd_done, &abstime);
503-
if (!receive_cmd_done) {
504-
ret = sem_timedwait(&g_read_cmd_done, &abstime);
504+
if (ret != OK) {
505+
goto Fail_case;
505506
}
506-
leave_critical_section(flags);
507-
if (send_cmd_done != 1 || receive_cmd_done != 1) {
508-
#ifdef CONFIG_PM
509-
bsp_pm_domain_control(BSP_MIPI_DRV, 0);
510-
#endif
511-
#ifdef CONFIG_SMP
512-
spin_unlock(&g_rtl8730e_config_dev_s_underflow);
513-
#endif
514-
if (msg->rx_buf && msg->rx_len > 0) {
515-
memset(msg->rx_buf, 0, msg->rx_len);
507+
if (MIPI_LPTX_IS_READ(msg->type)) {
508+
(void)clock_gettime(CLOCK_REALTIME, &abstime);
509+
abstime.tv_sec += MIPI_TRANSFER_TIMEOUT;
510+
ret = sem_timedwait(&g_read_cmd_done, &abstime);
511+
if (ret != OK) {
512+
goto Fail_case;
516513
}
517-
return FAIL;
518514
}
515+
leave_critical_section(flags);
519516
#ifdef CONFIG_SMP
520517
spin_unlock(&g_rtl8730e_config_dev_s_underflow);
521518
#endif
@@ -527,6 +524,26 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
527524
rx_data_len = 0;
528525
}
529526
return OK;
527+
Fail_case:
528+
#ifdef CONFIG_PM
529+
bsp_pm_domain_control(BSP_MIPI_DRV, 0);
530+
#endif
531+
#ifdef CONFIG_SMP
532+
spin_unlock(&g_rtl8730e_config_dev_s_underflow);
533+
#endif
534+
if (send_cmd_done == 0) {
535+
sem_init(&g_send_cmd_done, 0, 0);
536+
}
537+
if (MIPI_LPTX_IS_READ(msg->type)) {
538+
sem_init(&g_read_cmd_done, 0, 0);
539+
}
540+
if (msg->rx_buf && msg->rx_len > 0) {
541+
memset(msg->rx_buf, 0, msg->rx_len);
542+
rx_data_ptr = NULL;
543+
rx_data_len = 0;
544+
}
545+
leave_critical_section(flags);
546+
return FAIL;
530547
}
531548

532549
#ifdef CONFIG_PM

0 commit comments

Comments
 (0)