diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-09-27 15:29:53 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-09-27 15:29:53 +0000 |
commit | c3bc22f07cb203c5a577b80467c8469d2a5ae9cb (patch) | |
tree | ef6f6626dbdbf7939d763ff9c2b6bf019b85126f /nuttx/drivers | |
parent | 9a0be89531cef3fb41ac68412693529607dd0ca3 (diff) | |
download | px4-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')
-rw-r--r-- | nuttx/drivers/input/ads7843e.c | 23 | ||||
-rw-r--r-- | nuttx/drivers/lcd/ssd1289.c | 20 |
2 files changed, 41 insertions, 2 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); } /**************************************************************************** diff --git a/nuttx/drivers/lcd/ssd1289.c b/nuttx/drivers/lcd/ssd1289.c index 3d5ba96d3..f5f11b87d 100644 --- a/nuttx/drivers/lcd/ssd1289.c +++ b/nuttx/drivers/lcd/ssd1289.c @@ -931,9 +931,27 @@ static inline int ssd1289_hwinitialize(FAR struct ssd1289_dev_s *priv) lcd->select(lcd); + /* Read the device ID. Skip verification of the device ID is the LCD is + * write-only. What choice do we have? + */ + #ifndef CONFIG_LCD_NOGETRUN id = ssd1289_readreg(lcd, SSD1289_DEVCODE); - lcddbg("LCD ID: %04x\n", id); + if (id != 0) + { + lcddbg("LCD ID: %04x\n", id); + } + + /* If we could not get the ID, then let's just assume that this is an SSD1289. + * Perhaps we have some early register access issues. This seems to happen. + * But then perhaps we should not even bother to read the device ID at all? + */ + + else + { + lcddbg("No LCD ID, assuming SSD1289\n"); + id = SSD1289_DEVCODE_VALUE; + } /* Check if the ID is for the SSD1289 */ |