aboutsummaryrefslogtreecommitdiff
path: root/nuttx/drivers/input/ads7843e.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-09-27 15:29:53 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-09-27 15:29:53 +0000
commitc3bc22f07cb203c5a577b80467c8469d2a5ae9cb (patch)
treeef6f6626dbdbf7939d763ff9c2b6bf019b85126f /nuttx/drivers/input/ads7843e.c
parent9a0be89531cef3fb41ac68412693529607dd0ca3 (diff)
downloadpx4-firmware-c3bc22f07cb203c5a577b80467c8469d2a5ae9cb.tar.gz
px4-firmware-c3bc22f07cb203c5a577b80467c8469d2a5ae9cb.tar.bz2
px4-firmware-c3bc22f07cb203c5a577b80467c8469d2a5ae9cb.zip
Definitions for ARMv7-M AIRCR register, Fixes for ADS7843 and SSD1289 driver, Missing build logic for examples/watchdog
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5198 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/drivers/input/ads7843e.c')
-rw-r--r--nuttx/drivers/input/ads7843e.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/nuttx/drivers/input/ads7843e.c b/nuttx/drivers/input/ads7843e.c
index 07e5e515d..679c25113 100644
--- a/nuttx/drivers/input/ads7843e.c
+++ b/nuttx/drivers/input/ads7843e.c
@@ -555,6 +555,7 @@ static void ads7843e_worker(FAR void *arg)
FAR struct ads7843e_dev_s *priv = (FAR struct ads7843e_dev_s *)arg;
FAR struct ads7843e_config_s *config;
bool pendown;
+ int ret;
ASSERT(priv != NULL);
@@ -565,10 +566,26 @@ static void ads7843e_worker(FAR void *arg)
config = priv->config;
DEBUGASSERT(config != NULL);
- /* Disable the watchdog timer */
+ /* Disable the watchdog timer. This is safe because it is started only
+ * by this function and this function is serialized on the worker thread.
+ */
wd_cancel(priv->wdog);
+ /* Get exclusive access to the driver data structure */
+
+ do
+ {
+ ret = sem_wait(&priv->devsem);
+
+ /* This should only fail if the wait was canceled by an signal
+ * (and the worker thread will receive a lot of signals).
+ */
+
+ DEBUGASSERT(ret == OK || errno == EINTR);
+ }
+ while (ret < 0);
+
/* Check for pen up or down by reading the PENIRQ GPIO. */
pendown = config->pendown(config);
@@ -645,6 +662,10 @@ static void ads7843e_worker(FAR void *arg)
errout:
(void)ads7843e_sendcmd(priv, ADS7843_CMD_ENABPINIRQ);
config->enable(config, true);
+
+ /* Release our lock on the state structure */
+
+ sem_post(&priv->devsem);
}
/****************************************************************************