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_);
	}
}
Example #2
0
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;
}
Example #3
0
//-----------------------------------------------------------------------------
// 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;
}
Example #4
0
//-----------------------------------------------------------------------------
// 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;
}
Example #5
0
bool isCardInserted  (void)
{
  return sdc_lld_is_card_inserted (NULL);
}