git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3025 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2011-06-04 13:30:13 +00:00
parent ac3795ec52
commit 2d4aff80dc
3 changed files with 110 additions and 0 deletions

View File

@ -1890,6 +1890,9 @@
<file> <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\ch.h</name> <name>$PROJ_DIR$\..\..\..\os\kernel\include\ch.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chbsem.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chcond.h</name> <name>$PROJ_DIR$\..\..\..\os\kernel\include\chcond.h</name>
</file> </file>
@ -1902,6 +1905,9 @@
<file> <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chevents.h</name> <name>$PROJ_DIR$\..\..\..\os\kernel\include\chevents.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chfiles.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chheap.h</name> <name>$PROJ_DIR$\..\..\..\os\kernel\include\chheap.h</name>
</file> </file>

View File

@ -22,6 +22,89 @@
#include "hal.h" #include "hal.h"
#include "test.h" #include "test.h"
/*===========================================================================*/
/* Card insertion monitor. */
/*===========================================================================*/
#define SDC_POLLING_INTERVAL 10
#define SDC_POLLING_DELAY 10
/**
* @brief Card monitor timer.
*/
static VirtualTimer tmr;
/**
* @brief Debounce counter.
*/
static unsigned cnt;
/**
* @brief Card event sources.
*/
static EventSource inserted_event, removed_event;
/**
* @brief Inserion monitor function.
*
* @param[in] sdcp pointer to the @p SDCDriver object
*
* @notapi
*/
static bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp) {
return TRUE;
}
/**
* @brief Inserion monitor timer callback function.
*
* @param[in] p pointer to the @p SDCDriver object
*
* @notapi
*/
static void tmrfunc(void *p) {
SDCDriver *sdcp = p;
if (cnt > 0) {
if (sdcIsCardInserted(sdcp)) {
if (--cnt == 0) {
chEvtBroadcastI(&inserted_event);
}
}
else
cnt = SDC_POLLING_INTERVAL;
}
else {
if (!sdcIsCardInserted(sdcp)) {
cnt = SDC_POLLING_INTERVAL;
chEvtBroadcastI(&removed_event);
}
}
chVTSetI(&tmr, MS2ST(SDC_POLLING_DELAY), tmrfunc, sdcp);
}
/**
* @brief Polling monitor start.
*
* @param[in] sdcp pointer to the @p SDCDriver object
*
* @notapi
*/
static void tmr_init(SDCDriver *sdcp) {
chEvtInit(&inserted_event);
chEvtInit(&removed_event);
chSysLock();
cnt = SDC_POLLING_INTERVAL;
chVTSetI(&tmr, MS2ST(SDC_POLLING_DELAY), tmrfunc, sdcp);
chSysUnlock();
}
/*===========================================================================*/
/* Main and generic code. */
/*===========================================================================*/
/* /*
* Red LED blinker thread, times are in milliseconds. * Red LED blinker thread, times are in milliseconds.
*/ */
@ -65,6 +148,11 @@ int main(void) {
*/ */
sdStart(&SD1, NULL); sdStart(&SD1, NULL);
/*
* Activates the card insertion monitor.
*/
tmr_init(&SDCD1);
/* /*
* Creates the blinker thread. * Creates the blinker thread.
*/ */

View File

@ -173,6 +173,22 @@ typedef enum {
*/ */
#define sdcGetDriverState(sdcp) ((sdcp)->state) #define sdcGetDriverState(sdcp) ((sdcp)->state)
/**
* @brief Returns the card insertion status.
* @note This macro wraps a low level function named
* @p sdc_lld_is_card_inserted(), this function must be
* provided by the application because it is not part of the
* SDC driver.
*
* @param[in] sdcp pointer to the @p SDCDriver object
* @return The card state.
* @retval FALSE card not inserted.
* @retval TRUE card inserted.
*
* @api
*/
#define sdcIsCardInserted(sdcp) (sdc_lld_is_card_inserted(sdcp))
/** /**
* @brief Returns the write protect status. * @brief Returns the write protect status.
* @note This macro wraps a low level function named * @note This macro wraps a low level function named