From 4e9b28ce15b8772727445b758d4c9f5c94509369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 17 Aug 2020 22:10:04 +0200 Subject: [PATCH] Improve SDIO handling --- .../shimatta_sdio_driver/shimatta_sdio.c | 60 +++++++++++++++---- .../shimatta_sdio_driver/shimatta_sdio.h | 2 +- .../reflow-controller/safety/safety-config.h | 2 +- stm-firmware/main.c | 9 ++- stm-firmware/shell.c | 1 - 5 files changed, 60 insertions(+), 14 deletions(-) diff --git a/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.c b/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.c index c5e0dde..593a7b0 100644 --- a/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.c +++ b/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.c @@ -417,6 +417,26 @@ static int sdio_send_go_idle_cmd0() { return 0; } +static int sdio_send_stop_transmission_cmd12() +{ + int res; + uint32_t response; + + sdio_send_cmd(12, 0, SHORT_ANS); + res = sdio_get_response(12, SHORT_ANS, &response); + return res; +} + +static int sdio_send_write_multiple_blocks_cmd25(uint32_t address) +{ + int res; + uint32_t response; + + sdio_send_cmd(25, address, SHORT_ANS); + res = sdio_get_response(25, SHORT_ANS, &response); + return res; +} + static enum cmd8_ret sdio_send_iface_condition_cmd8() { uint32_t response; @@ -606,6 +626,11 @@ DSTATUS sdio_initialize(){ return 0; } +void sdio_stop_clk() +{ + SDIO->POWER = 0UL; +} + DRESULT sdio_disk_read(BYTE *buff, DWORD sector, UINT count){ uint32_t addr; uint32_t sdio_status; @@ -713,27 +738,39 @@ DRESULT sdio_disk_write(const BYTE *buff, DWORD sector, UINT count) union sdio_status_conv status; uint32_t buff_offset = 0; int ret; + UINT count_backup = count; if (sdio_check_write_protection()) return RES_WRPRT; addr = (card_info.type == SD_V2_HC ? (sector) : (sector * 512)); - while (count) { - ret = sdio_check_status_register_cmd13(card_info.rca, &status.value); + ret = sdio_check_status_register_cmd13(card_info.rca, &status.value); + if (ret) + return RES_ERROR; + if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) { + if (sdio_send_select_card_cmd7(card_info.rca)) + return RES_ERROR; + } + + while (status.statusstruct.READY_FOR_DATA != 1) { + ret = sdio_check_status_register_cmd13(card_info.rca, &status.value); if (ret) return RES_ERROR; + } - if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) { - if (sdio_send_select_card_cmd7(card_info.rca)) - return RES_ERROR; - } - + if (count > 1) + ret = sdio_send_write_multiple_blocks_cmd25(addr); + else if (count == 1) ret = sdio_send_write_block_cmd24(addr); - if (ret) { - return RES_ERROR; - } + else + ret = RES_PARERR; + if (ret) + return RES_ERROR; + + while (count) { + sdio_write_buffer(512, 9, &buff[buff_offset]); buff_offset += 512; @@ -741,5 +778,8 @@ DRESULT sdio_disk_write(const BYTE *buff, DWORD sector, UINT count) count--; } + if (count_backup > 1) + (void)sdio_send_stop_transmission_cmd12(); + return RES_OK; } diff --git a/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.h b/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.h index 3592e6e..2ae3e86 100644 --- a/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.h +++ b/stm-firmware/fatfs/shimatta_sdio_driver/shimatta_sdio.h @@ -21,7 +21,7 @@ DRESULT sdio_disk_ioctl(BYTE cmd, void* buff); DWORD get_fattime(); int sdio_check_inserted(); - +void sdio_stop_clk(); //Defines for Card Status in struct _CardStatus #define CURRENT_STATE_IDLE 0 diff --git a/stm-firmware/include/reflow-controller/safety/safety-config.h b/stm-firmware/include/reflow-controller/safety/safety-config.h index 4ae7f96..2d5c82b 100644 --- a/stm-firmware/include/reflow-controller/safety/safety-config.h +++ b/stm-firmware/include/reflow-controller/safety/safety-config.h @@ -69,7 +69,7 @@ enum analog_value_monitor { #define WATCHDOG_HALT_DEBUG (0) #endif -#define WATCHDOG_PRESCALER 4 +#define WATCHDOG_PRESCALER 8 #define SAFETY_MIN_STACK_FREE 0x100 diff --git a/stm-firmware/main.c b/stm-firmware/main.c index e804f77..5f8bfce 100644 --- a/stm-firmware/main.c +++ b/stm-firmware/main.c @@ -115,13 +115,20 @@ static inline void setup_shell_uart(struct stm_uart *uart) static bool mount_sd_card_if_avail(bool mounted) { FRESULT res; + static uint8_t inserted_counter = 0; if (sdio_check_inserted() && mounted) { memset(fs_ptr, 0, sizeof(FATFS)); + sdio_stop_clk(); + inserted_counter = 0; return false; } - if (!sdio_check_inserted() && !mounted) { + if (!sdio_check_inserted() && inserted_counter < 255) + inserted_counter++; + + if (!sdio_check_inserted() && !mounted && inserted_counter > 4) { + inserted_counter = 0; res = f_mount(fs_ptr, "0:/", 1); if (res == FR_OK) return true; diff --git a/stm-firmware/shell.c b/stm-firmware/shell.c index c7ac91a..f0f815d 100644 --- a/stm-firmware/shell.c +++ b/stm-firmware/shell.c @@ -230,7 +230,6 @@ static shellmatta_retCode_t shell_cmd_rot(const shellmatta_handle_t handle, { (void)arguments; (void)length; - uint32_t rot_val; rot_val = rotary_encoder_get_abs_val();