void poll_inserted() { const auto card_present_now = sdc_lld_is_card_inserted(&SDCD1); if( card_present_now != card_present ) { card_present = card_present_now; Status new_status { card_present ? Status::Present : Status::NotPresent }; if( card_present ) { if( sdcConnect(&SDCD1) == CH_SUCCESS ) { if( mount() == FR_OK ) { new_status = Status::Mounted; } else { new_status = Status::MountError; } } else { new_status = Status::ConnectError; } } else { sdcDisconnect(&SDCD1); } status_ = new_status; status_signal.emit(status_); } }
bool sdioConnect (void) { if (!sdc_lld_is_card_inserted (NULL)) { return false; } if (cnxState == CONNECT) { return true; } /* * Initializes the SDIO drivers. */ const uint32_t mode = PAL_MODE_ALTERNATE(12) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING | PAL_STM32_MODE_ALTERNATE; palSetPadMode (GPIOC, GPIOC_SDIO_D0, mode | PAL_STM32_PUDR_PULLUP); palSetPadMode (GPIOC, GPIOC_SDIO_D1, mode | PAL_STM32_PUDR_PULLUP); palSetPadMode (GPIOC, GPIOC_SDIO_D2, mode | PAL_STM32_PUDR_PULLUP); palSetPadMode (GPIOC, GPIOC_SDIO_D3, mode | PAL_STM32_PUDR_PULLUP); palSetPadMode (GPIOC, GPIOC_SDIO_CK, mode); palSetPadMode (GPIOD, GPIOD_SDIO_CMD, mode | PAL_STM32_PUDR_PULLUP); // palSetPadMode (GPIOD, GPIOD_SDIO_CMD, mode); chThdSleepMilliseconds(100); sdcStart(&SDCD1, NULL); while (sdcConnect(&SDCD1) != CH_SUCCESS) { chThdSleepMilliseconds(100); } cnxState = CONNECT; return true; }
//----------------------------------------------------------------------------- // just checks up on the current status, and if there's no card, makes sure // on_remove() is called static uint8_t sd_card_status(void) { uint8_t ret = KB_OK; blkstate_t state = blkGetDriverState(&SDCD1); if ((state != BLK_READING) && (state != BLK_WRITING)) { if (!sdc_lld_is_card_inserted(&SDCD1)) { on_remove(); logger_state = LS_WAIT_FOR_SD; } } return ret; }
//----------------------------------------------------------------------------- // This is called by the writer thread, and doesn't return until the SD // is in a known state, the inital header is written out, and all is ready to // go for normal writing. It will exit if we have requested the thread should // terminate (for shutdown) static uint8_t wait_for_sd(void) { uint8_t sd_det_count = POLLING_COUNT; while(1) { if (chThdShouldTerminateX()) { logger_state = LS_EXITING; break; } if (sdc_lld_is_card_inserted(&SDCD1)) { if (--sd_det_count == 0) { if ( on_insert() == KB_OK ) { break; } else { sd_det_count = POLLING_COUNT; continue; } } } else { kbs_setFName(KUROBOX_BLANK_FNAME); sd_det_count = POLLING_COUNT; } chThdSleepMilliseconds(POLLING_DELAY); } return KB_OK; }
bool isCardInserted (void) { return sdc_lld_is_card_inserted (NULL); }