diff options
Diffstat (limited to 'drivers/phone_svn/ipc_spi/spi_main.c')
-rw-r--r-- | drivers/phone_svn/ipc_spi/spi_main.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/drivers/phone_svn/ipc_spi/spi_main.c b/drivers/phone_svn/ipc_spi/spi_main.c index 6b104fa..bb1765c 100644 --- a/drivers/phone_svn/ipc_spi/spi_main.c +++ b/drivers/phone_svn/ipc_spi/spi_main.c @@ -211,7 +211,6 @@ static void _start_packet_tx(void) if (spi_data_check_tx_queue() == 0) return; - /* check SUB SRDY state */ if (spi_dev_get_gpio(spi_dev_gpio_subsrdy) == SPI_DEV_GPIOLEVEL_HIGH) { @@ -231,6 +230,9 @@ static void _start_packet_tx(void) return; } + if (spi_main_state == SPI_MAIN_STATE_END) + return; + /* change state SPI_MAIN_STATE_IDLE to SPI_MAIN_STATE_TX_WAIT */ spi_main_state = SPI_MAIN_STATE_TX_WAIT; @@ -292,24 +294,37 @@ static void _start_packet_tx(void) static void _start_packet_tx_send(void) { char *spi_packet_buf = NULL; - char *spi_sync_buf = NULL; /* change state SPI_MAIN_STATE_TX_WAIT to SPI_MAIN_STATE_TX_SENDING */ spi_main_state = SPI_MAIN_STATE_TX_SENDING; spi_packet_buf = gspi_data_packet_buf; - spi_sync_buf = gspi_data_sync_buf; spi_os_memset(spi_packet_buf, 0, SPI_DEV_MAX_PACKET_SIZE); - spi_os_memset(spi_sync_buf, 0, SPI_DEV_MAX_PACKET_SIZE); spi_data_prepare_tx_packet(spi_packet_buf); - if (spi_dev_send((void *)spi_packet_buf, (void *)spi_sync_buf, + if (spi_dev_send((void *)spi_packet_buf, SPI_DEV_MAX_PACKET_SIZE) != 0) { /* TODO: save failed packet */ /* back data to each queue */ SPI_OS_ERROR(("[SPI] spi_dev_send fail\n")); - panic("[SPI] spi_dev_send\n"); + + spi_dev_set_gpio(spi_dev_gpio_submrdy, SPI_DEV_GPIOLEVEL_HIGH); + + while (spi_dev_get_gpio(spi_dev_gpio_subsrdy) == + SPI_DEV_GPIOLEVEL_LOW) { + }; + + spi_os_sleep(1); + + if (spi_dev_send((void *)spi_packet_buf, + SPI_DEV_MAX_PACKET_SIZE) != 0) { + panic("[SPI] spi_dev_send\n"); + } else { + SPI_OS_ERROR(("[SPI] spi_dev_send\n")); + } + + spi_dev_set_gpio(spi_dev_gpio_submrdy, SPI_DEV_GPIOLEVEL_LOW); } spi_main_state = SPI_MAIN_STATE_TX_TERMINATE; @@ -331,7 +346,6 @@ static void _start_packet_tx_send(void) static void _start_packet_receive(void) { char *spi_packet_buf = NULL; - char *spi_sync_buf = NULL; struct spi_data_packet_header spi_receive_packet_header = {0, }; int i = 0; @@ -344,12 +358,13 @@ static void _start_packet_receive(void) if (get_console_suspended()) return; - spi_main_state = SPI_MAIN_STATE_RX_WAIT; + if (spi_main_state == SPI_MAIN_STATE_END) + return; + spi_main_state = SPI_MAIN_STATE_RX_WAIT; spi_dev_set_gpio(spi_dev_gpio_submrdy, SPI_DEV_GPIOLEVEL_HIGH); - /* check SUBSRDY state */ while (spi_dev_get_gpio(spi_dev_gpio_subsrdy) == SPI_DEV_GPIOLEVEL_LOW) { @@ -384,12 +399,10 @@ static void _start_packet_receive(void) return; spi_packet_buf = gspi_data_packet_buf; - spi_sync_buf = gspi_data_sync_buf; spi_os_memset(spi_packet_buf, 0, SPI_DEV_MAX_PACKET_SIZE); - spi_os_memset(spi_sync_buf, 0, SPI_DEV_MAX_PACKET_SIZE); - if (spi_dev_receive((void *)spi_sync_buf, (void *)spi_packet_buf, + if (spi_dev_receive((void *)spi_packet_buf, SPI_DEV_MAX_PACKET_SIZE) == 0) { /* parsing SPI packet */ spi_os_memcpy(&spi_receive_packet_header, spi_packet_buf, |