aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-06-04 13:30:13 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2011-06-04 13:30:13 +0000
commit2d4aff80dcd0db460c00d0efa398a06e9bf522eb (patch)
treeb0dfd72d2dd30e294c62f9dac82dde9ba6a4f93a
parentac3795ec527571f697892d6b0622de7cdd9f6964 (diff)
downloadChibiOS-2d4aff80dcd0db460c00d0efa398a06e9bf522eb.tar.gz
ChibiOS-2d4aff80dcd0db460c00d0efa398a06e9bf522eb.tar.bz2
ChibiOS-2d4aff80dcd0db460c00d0efa398a06e9bf522eb.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3025 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp6
-rw-r--r--demos/ARMCM3-STM32F103ZG-FATFS/main.c88
-rw-r--r--os/hal/include/sdc.h16
3 files changed, 110 insertions, 0 deletions
diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp b/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp
index 711931abd..a66a70295 100644
--- a/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp
+++ b/demos/ARMCM3-STM32F103ZG-FATFS/iar/ch.ewp
@@ -1891,6 +1891,9 @@
<name>$PROJ_DIR$\..\..\..\os\kernel\include\ch.h</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\os\kernel\include\chbsem.h</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chcond.h</name>
</file>
<file>
@@ -1903,6 +1906,9 @@
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chevents.h</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\os\kernel\include\chfiles.h</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\os\kernel\include\chheap.h</name>
</file>
<file>
diff --git a/demos/ARMCM3-STM32F103ZG-FATFS/main.c b/demos/ARMCM3-STM32F103ZG-FATFS/main.c
index 5e1ac9863..374cf7c4a 100644
--- a/demos/ARMCM3-STM32F103ZG-FATFS/main.c
+++ b/demos/ARMCM3-STM32F103ZG-FATFS/main.c
@@ -22,6 +22,89 @@
#include "hal.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.
*/
@@ -66,6 +149,11 @@ int main(void) {
sdStart(&SD1, NULL);
/*
+ * Activates the card insertion monitor.
+ */
+ tmr_init(&SDCD1);
+
+ /*
* Creates the blinker thread.
*/
chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
diff --git a/os/hal/include/sdc.h b/os/hal/include/sdc.h
index 3f0634fc5..afc3a6aba 100644
--- a/os/hal/include/sdc.h
+++ b/os/hal/include/sdc.h
@@ -174,6 +174,22 @@ typedef enum {
#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.
* @note This macro wraps a low level function named
* @p sdc_lld_is_write_protected(), this function must be