From 856152a1dd24bfc6a12bc7f94d6361cabc365898 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 25 Jul 2012 21:21:45 +0000 Subject: [PATCH] Fix logic error in configuring PGA11x devices in a daisy chain. Add logic interface with individual PGA11x chips in a daisy-chain git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4979 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/drivers/analog/pga11x.c | 337 +++++++++++++++++++++++----- nuttx/include/nuttx/analog/pga11x.h | 223 ++++++++++++------ 2 files changed, 433 insertions(+), 127 deletions(-) diff --git a/nuttx/drivers/analog/pga11x.c b/nuttx/drivers/analog/pga11x.c index 18dcfc5ba..7bb4a11bb 100644 --- a/nuttx/drivers/analog/pga11x.c +++ b/nuttx/drivers/analog/pga11x.c @@ -65,16 +65,16 @@ #define PGA11X_CMD_READ 0x6a00 #define PGA11X_CMD_WRITE 0x2a00 -#define PGA11X_CMA_NOOP 0x0000 -#define PGA11X_CMA_SDN_DIS 0xe100 -#define PGA11X_CMA_SDN_EN 0xe1f1 +#define PGA11X_CMD_NOOP 0x0000 +#define PGA11X_CMD_SDN_DIS 0xe100 +#define PGA11X_CMD_SDN_EN 0xe1f1 /* SPI Daisy-Chain Commands (PGA116/PGA117) */ #define PGA11X_DCCMD_SELECTOR 0x8000 -#define PGA11X_DCCMD_NOOP (PGA11X_DCCMD_SELECTOR | PGA11X_CMA_NOOP) -#define PGA11X_DCCMA_SDN_DIS (PGA11X_DCCMD_SELECTOR | PGA11X_CMA_SDN_DIS) -#define PGA11X_DCCMA_SDN_EN (PGA11X_DCCMD_SELECTOR | PGA11X_CMA_SDN_EN) +#define PGA11X_DCCMD_NOOP (PGA11X_DCCMD_SELECTOR | PGA11X_CMD_NOOP) +#define PGA11X_DCCMD_SDN_DIS (PGA11X_DCCMD_SELECTOR | PGA11X_CMD_SDN_DIS) +#define PGA11X_DCCMD_SDN_EN (PGA11X_DCCMD_SELECTOR | PGA11X_CMD_SDN_EN) #define PGA11X_DCCMD_READ (PGA11X_DCCMD_SELECTOR | PGA11X_CMD_READ) #define PGA11X_DCCMD_WRITE (PGA11X_DCCMD_SELECTOR | PGA11X_CMD_WRITE) @@ -101,7 +101,7 @@ #define SPI_DUMMY 0xff -/* Debug ****************************************************************************/ +/* Debug ********************************************************************/ /* Check if (non-standard) SPI debug is enabled */ #ifndef CONFIG_DEBUG @@ -110,9 +110,9 @@ #endif #ifdef CONFIG_DEBUG_SPI -# define spidbg lldbg +# define spidbg dbg # ifdef CONFIG_DEBUG_VERBOSE -# define spivdbg lldbg +# define spivdbg dbg # else # define spivdbg(x...) # endif @@ -245,7 +245,7 @@ static void pga11x_send16(FAR struct spi_dev_s *spi, uint16_t word) * * Send the MS byte first. Then the LS byte. */ - + SPI_SEND(spi, word >> 8); SPI_SEND(spi, word & 0xff); } @@ -277,7 +277,7 @@ static uint16_t pga11x_recv16(FAR struct spi_dev_s *spi) * * Send a dummy byte and receive MS byte first. Then the LS byte. */ - + msb = SPI_SEND(spi, SPI_DUMMY); lsb = SPI_SEND(spi, SPI_DUMMY); spivdbg("Received %02x %02x\n", msb, lsb); @@ -293,6 +293,9 @@ static uint16_t pga11x_recv16(FAR struct spi_dev_s *spi) * * Input Parameters: * spi - PGA11X driver instance + * cmd - PGA11X command (non-daisy chained) + * u1cmd - PGA11X U1 command (daisy chained) + * u2cmd - PGA11X U2 command (daisy chained) * * Returned Value: * The received 16-bit value @@ -316,17 +319,18 @@ static void pga11x_write(FAR struct spi_dev_s *spi, uint16_t cmd) pga11x_unlock(spi); } #else +static void pga11x_write(FAR struct spi_dev_s *spi, uint16_t u1cmd, uint16_t u2cmd) { - spivdbg("cmd %04x\n", cmd); + spivdbg("U1 cmd: %04x U2 cmd: %04x\n", u1cmd, u2cmd); - /* Lock, select, send the 16-bit command, the 16-bit daisy-chain command, - * de-select, and un-lock. + /* Lock, select, send the U2 16-bit command, the U1 16-bit command, de-select, + * and un-lock. */ pga11x_lock(spi); SPI_SELECT(spi, SPIDEV_MUX, true); - pga11x_send16(spi, cmd); - pga11x_send16(spi, cmd | PGA11X_DCCMD_SELECTOR); + pga11x_send16(spi, u2cmd); + pga11x_send16(spi, u1cmd); SPI_SELECT(spi, SPIDEV_MUX, false); pga11x_unlock(spi); } @@ -340,7 +344,7 @@ static void pga11x_write(FAR struct spi_dev_s *spi, uint16_t cmd) * Name: pga11x_initialize * * Description: - * Initialize the PGA117 amplifier/multiplexer. + * Initialize the PGA117 amplifier/multiplexer(s). * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -368,7 +372,7 @@ PGA11X_HANDLE pga11x_initialize(FAR struct spi_dev_s *spi) * as the handle. This gives us a place to extend functionality in the * future if neccessary. */ - + return (PGA11X_HANDLE)spi; } @@ -376,61 +380,149 @@ PGA11X_HANDLE pga11x_initialize(FAR struct spi_dev_s *spi) * Name: pga11x_select * * Description: - * Select an input channel and gain. + * Select an input channel and gain for all PGA11xs. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_select() configures + * both chips in the daisy-chain. pga11x_uselect() is provided to support + * configuring the parts in the daisychain independently. * * Input Parameters: - * spi - An SPI "bottom half" device driver instance - * channel - See the PGA11X_CHAN_* definitions above - * gain - See the PGA11X_GAIN_* definitions above + * spi - An SPI "bottom half" device driver instance + * settings - New channel and gain settings * * Returned Value: * Zero on sucess; a negated errno value on failure. * ****************************************************************************/ -int pga11x_select(PGA11X_HANDLE handle, uint8_t channel, uint8_t gain) +int pga11x_select(PGA11X_HANDLE handle, + FAR const struct pga11x_settings_s *settings) { +#ifndef CONFIG_PGA11X_DAISYCHAIN FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; uint16_t cmd; - spivdbg("channel: %d gain: %d\n"); - DEBUGASSERT(handle); + DEBUGASSERT(handle && settings); + spivdbg("channel: %d gain: %d\n", settings->channel, settings->gain); /* Format the command */ cmd = PGA11X_CMD_WRITE | - (channel << PGA11X_CHAN_SHIFT) | - (gain << PGA11X_GAIN_SHIFT); + ((uint16_t)settings->channel << PGA11X_CHAN_SHIFT) | + ((uint16_t)settings->gain << PGA11X_GAIN_SHIFT); - /* Lock the bus and send the command */ + /* Send the command */ pga11x_write(spi, cmd); return OK; +#else + FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; + uint16_t u1cmd; + uint16_t u2cmd; + + DEBUGASSERT(handle && settings); + spivdbg("U1 channel: %d gain: %d\n", settings->u1.channel, settings->u1.gain); + spivdbg("U1 channel: %d gain: %d\n", settings->u1.channel, settings->u1.gain); + + /* Format the commands */ + + u1cmd = PGA11X_CMD_WRITE | + ((uint16_t)settings->u1.channel << PGA11X_CHAN_SHIFT) | + ((uint16_t)settings->u1.gain << PGA11X_GAIN_SHIFT); + + u2cmd = PGA11X_DCCMD_WRITE | + ((uint16_t)settings->u2.channel << PGA11X_CHAN_SHIFT) | + ((uint16_t)settings->u2.gain << PGA11X_GAIN_SHIFT); + + /* Send the command */ + + pga11x_write(spi, u1cmd, u2cmd); + return OK; +#endif } +/**************************************************************************** + * Name: pga11x_uselect + * + * Description: + * Select an input channel and gain for one PGA11x. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_uselect() configures + * one chips in the daisy-chain. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * settings - New channel and gain settings + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +int pga11x_uselect(PGA11X_HANDLE handle, int pos, + FAR const struct pga11x_usettings_s *settings) +{ + FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; + uint16_t u1cmd; + uint16_t u2cmd; + + spivdbg("channel: %d gain: %d\n", settings->channel, settings->gain); + DEBUGASSERT(handle); + + /* Format the commands */ + + if (pos == 0) + { + u1cmd = PGA11X_CMD_WRITE | + ((uint16_t)settings->channel << PGA11X_CHAN_SHIFT) | + ((uint16_t)settings->gain << PGA11X_GAIN_SHIFT); + u2cmd = PGA11X_DCCMD_NOOP; + } + else /* if (pos == 1) */ + { + u1cmd = PGA11X_CMD_NOOP; + u2cmd = PGA11X_DCCMD_WRITE | + ((uint16_t)settings->channel << PGA11X_CHAN_SHIFT) | + ((uint16_t)settings->gain << PGA11X_GAIN_SHIFT); + } + + /* Send the command */ + + pga11x_write(spi, u1cmd, u2cmd); + return OK; +} +#endif + /**************************************************************************** * Name: pga11x_read * * Description: - * Read from the PGA117 amplifier/multiplexer. + * Read from all PGA117 amplifier/multiplexers. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_read() reads from + * both chips in the daisy-chain. pga11x_uread() is provided to support + * accessing the parts independently. * * Input Parameters: - * spi - An SPI "bottom half" device driver instance + * spi - An SPI "bottom half" device driver instance + * settings - Returned channel and gain settings * * Returned Value: - * 16-bit value read from the device (32-bits in daisy chain mode) + * Zero on sucess; a negated errno value on failure. * ****************************************************************************/ -#ifdef CONFIG_PGA11X_DAISYCHAIN -uint32_t pga11x_read(PGA11X_HANDLE handle) +int pga11x_read(PGA11X_HANDLE handle, FAR struct pga11x_settings_s *settings) { +#ifdef CONFIG_PGA11X_DAISYCHAIN FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; - uint16_t msvalue; - uint16_t lsvalue; + uint16_t u1value; + uint16_t u2value; spivdbg("Entry\n"); - DEBUGASSERT(handle); + DEBUGASSERT(handle && settings); /* Lock the bus and read the configuration */ @@ -450,17 +542,20 @@ uint32_t pga11x_read(PGA11X_HANDLE handle) /* Re-select, get the returned values, de-select, and unlock */ SPI_SELECT(spi, SPIDEV_MUX, true); - msvalue = pga11x_recv16(spi); - mssvalue = pga11x_recv16(spi); + u2value = pga11x_recv16(spi); + u1value = pga11x_recv16(spi); SPI_SELECT(spi, SPIDEV_MUX, false); pga11x_unlock(spi); - spivdbg("Returning %04x %04x\n", msvalue, lsvalue); - return (uint32_t)msvalue << 16 | (uint32_t)lsvalue; -} + /* Decode the returned value */ + + spivdbg("Returning %04x %04x\n", u2value, u1value); + settings->u1.channel = (uint8_t)((u1value & PGA11X_CHAN_MASK) >> PGA11X_CHAN_SHIFT); + settings->u1.gain = (uint8_t)((u1value & PGA11X_GAIN_MASK) >> PGA11X_GAIN_SHIFT); + settings->u2.channel = (uint8_t)((u2value & PGA11X_CHAN_MASK) >> PGA11X_CHAN_SHIFT); + settings->u2.gain = (uint8_t)((u2value & PGA11X_GAIN_MASK) >> PGA11X_GAIN_SHIFT); + return OK; #else -uint16_t pga11x_read(PGA11X_HANDLE handle) -{ FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; uint16_t value; @@ -487,43 +582,67 @@ uint16_t pga11x_read(PGA11X_HANDLE handle) SPI_SELECT(spi, SPIDEV_MUX, false); pga11x_unlock(spi); + /* Decode the returned value */ + spivdbg("Returning: %04x\n", value); - return value; -} + settings->channel = (uint8_t)((value & PGA11X_CHAN_MASK) >> PGA11X_CHAN_SHIFT); + settings->gain = (uint8_t)((value & PGA11X_GAIN_MASK) >> PGA11X_GAIN_SHIFT); + return OK; #endif +} /**************************************************************************** - * Name: pga11x_noop + * Name: pga11x_uread * * Description: - * Perform PGA11x no-operation. + * Read from one PGA117 amplifier/multiplexer. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_read() reads + * the parts independently. * * Input Parameters: - * spi - An SPI "bottom half" device driver instance + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * settings - Returned channel and gain settings * * Returned Value: * Zero on sucess; a negated errno value on failure. * ****************************************************************************/ -int pga11x_noop(PGA11X_HANDLE handle) +#ifdef CONFIG_PGA11X_DAISYCHAIN +int pga11x_uread(PGA11X_HANDLE handle, int pos, + FAR struct pga11x_usettings_s *settings) { - FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; + struct pga11x_settings_s both; + int ret = pga11x_read(handle, &both); + if (ret == OK) + { + if (pos == 0) + { + settings->channel = both.u1.channel; + settings->gain = both.u1.gain; + } + else /* if (pos == 1) */ + { + settings->channel = both.u2.channel; + settings->gain = both.u2.gain; + } + } - spivdbg("Entry\n"); - DEBUGASSERT(handle); - - /* Lock the bus and send the NOOP command */ - - pga11x_write(spi, PGA11X_CMA_NOOP); - return OK; + return ret; } +#endif /**************************************************************************** * Name: pga11x_shutdown * * Description: - * Put the PGA11x in shutdown down mode. + * Put all PGA11x's in shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_shutdown() controls + * both chips in the daisy-chain. pga11x_ushutdown() is provided to + * control the parts independently. * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -540,17 +659,66 @@ int pga11x_shutdown(PGA11X_HANDLE handle) spivdbg("Entry\n"); DEBUGASSERT(handle); - /* Lock the bus and enter shutdown mode by issuing an SDN_EN command */ + /* Enter shutdown mode by issuing an SDN_EN command */ - pga11x_write(spi, PGA11X_CMA_SDN_EN); +#ifdef CONFIG_PGA11X_DAISYCHAIN + pga11x_write(spi, PGA11X_CMD_SDN_EN, PGA11X_DCCMD_SDN_EN); +#else + pga11x_write(spi, PGA11X_CMD_SDN_EN); +#endif return OK; } +/**************************************************************************** + * Name: pga11x_ushutdown + * + * Description: + * Put one PGA11x in shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_ushutdown() is + * provided to shutdown the parts independently. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +int pga11x_ushutdown(PGA11X_HANDLE handle, int pos) +{ + FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; + + spivdbg("Entry\n"); + DEBUGASSERT(handle); + + /* Enter shutdown mode by issuing an SDN_EN command */ + + if (pos == 0) + { + pga11x_write(spi, PGA11X_CMD_SDN_EN, PGA11X_DCCMD_NOOP); + } + else + { + pga11x_write(spi, PGA11X_CMD_NOOP, PGA11X_DCCMD_SDN_EN); + } + + return OK; +} +#endif + /**************************************************************************** * Name: pga11x_enable * * Description: - * Take the PGA11x out of shutdown down mode. + * Take all PGA11x's out of shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_enable() controls + * both chips in the daisy-chain. pga11x_uenable() is provided to + * control the parts independently. * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -572,9 +740,54 @@ int pga11x_enable(PGA11X_HANDLE handle) * command or by any valid Write command */ - pga11x_write(spi, PGA11X_CMA_SDN_DIS); +#ifdef CONFIG_PGA11X_DAISYCHAIN + pga11x_write(spi, PGA11X_CMD_SDN_DIS, PGA11X_DCCMD_SDN_DIS); +#else + pga11x_write(spi, PGA11X_CMD_SDN_DIS); +#endif return OK; } +/**************************************************************************** + * Name: pga11x_uenable + * + * Description: + * Take one PGA11x out of shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_uenable() is + * provided to enable the parts independently. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +int pga11x_uenable(PGA11X_HANDLE handle, int pos) +{ + FAR struct spi_dev_s *spi = (FAR struct spi_dev_s *)handle; + + spivdbg("Entry\n"); + DEBUGASSERT(handle); + + /* Enter shutdown mode by issuing an SDN_EN command */ + + if (pos == 0) + { + pga11x_write(spi, PGA11X_CMD_SDN_DIS, PGA11X_DCCMD_NOOP); + } + else + { + pga11x_write(spi, PGA11X_CMD_NOOP, PGA11X_DCCMD_SDN_DIS); + } + + return OK; +} +#endif + #endif /* CONFIG_ADC && CONFIG_ADC_PGA11X */ diff --git a/nuttx/include/nuttx/analog/pga11x.h b/nuttx/include/nuttx/analog/pga11x.h index 1d26feff4..dc8a8bb95 100644 --- a/nuttx/include/nuttx/analog/pga11x.h +++ b/nuttx/include/nuttx/analog/pga11x.h @@ -76,7 +76,7 @@ * CONFIG_SPI_OWNBUS -- If the PGA117 is enabled, this must be set to 'y' * if the PGA117 is the only device on the SPI bus; * CONFIG_DEBUG_SPI -- With CONFIG_DEBUG and CONFIG_DEBUG_VERBOSE, -* this will enable debug output from the PGA117 driver. +* this will enable debug output from the PGA117 driver. */ #ifndef CONFIG_PGA11X_SPIFREQUENCY @@ -132,39 +132,6 @@ #define PGA11X_CHAN_CAL3 (14) /* CAL3: connects to 0.1VCAL */ #define PGA11X_CHAN_CAL4 (15) /* CAL4: connects to VREF */ -/* These macros may be used to decode the value returned by pga11x_read() */ - - -#define PGA11X_GAIN_SHIFT (4) /* B*/ -#define PGA11X_GAIN_MASK (15 << PGA11X_GAIN_SHIFT) - -/* Write command Mux Channel Selection Bits - * - * The PGA112/PGA113 have a two-channel input MUX; the PGA116/PGA117 have a - * 10-channel input MUX. - */ - -#ifndef CONFIG_PGA11X_DAISYCHAIN -/* Bits 0-3: Channel Selection Bits - * Bits 4-7: Gain Selection Bits - */ - -# define PGA11X_CHAN(value) ((uint16_t)value & 0x000f) -# define PGA11X_GAIN(value) (((uint16_t)value >> 4) & 0x000f) - -#else -/* Bits 0-3: U1 Channel Selection Bits - * Bits 4-7: U1 Gain Selection Bits - * Bits 16-19: U2 Channel Selection Bits - * Bits 20-23: U2 Gain Selection Bits - */ - -# define PGA11X_U1_CHAN(value) ((uint32_t)value & 0x0000000f) -# define PGA11X_U1_GAIN(value) (((uint32_t)value >> 4) & 0x0000000f) -# define PGA11X_U2_CHAN(value) (((uint32_t)value >> 16) & 0x0000000f) -# define PGA11X_U2_GAIN(value) (((uint32_t)value >> 20) & 0x0000000f) -#endif - /**************************************************************************** * Public Types ****************************************************************************/ @@ -173,6 +140,42 @@ typedef FAR void *PGA11X_HANDLE; +/* Settings for one device in a daisy-chain */ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +struct pga11x_usettings_s +{ + uint8_t channel; /* See PGA11X_CHAN_* definitions */ + uint8_t gain; /* See PGA11X_GAIN_* definitions */ +}; +#endif + +/* These structures are used to encode gain and channel settings. This + * includes both devices in the case of a daisy-chained configuration. + * NOTE: This this logic is currently limited to only 2 devices in the + * daisy-chain. + */ + +struct pga11x_settings_s +{ +#ifndef CONFIG_PGA11X_DAISYCHAIN + uint8_t channel; /* See PGA11X_CHAN_* definitions */ + uint8_t gain; /* See PGA11X_GAIN_* definitions */ +#else + struct + { + uint8_t channel; /* See PGA11X_CHAN_* definitions */ + uint8_t gain; /* See PGA11X_GAIN_* definitions */ + } u1; + + struct + { + uint8_t channel; /* See PGA11X_CHAN_* definitions */ + uint8_t gain; /* See PGA11X_GAIN_* definitions */ + } u2; +#endif +}; + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ @@ -188,7 +191,7 @@ extern "C" { * Name: pga11x_initialize * * Description: - * Initialize the PGA117 amplifier/multiplexer. + * Initialize the PGA117 amplifier/multiplexer(s). * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -206,61 +209,103 @@ EXTERN PGA11X_HANDLE pga11x_initialize(FAR struct spi_dev_s *spi); * Name: pga11x_select * * Description: - * Select an input channel and gain. + * Select an input channel and gain for all PGA11xs. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_select() configures + * both chips in the daisy-chain. pga11x_uselect() is provided to support + * configuring the parts in the daisychain independently. * * Input Parameters: - * spi - An SPI "bottom half" device driver instance - * channel - See the PGA11X_CHAN_* definitions above - * gain - See the PGA11X_GAIN_* definitions above + * spi - An SPI "bottom half" device driver instance + * settings - New channel and gain settings * * Returned Value: * Zero on sucess; a negated errno value on failure. * ****************************************************************************/ -EXTERN int pga11x_select(PGA11X_HANDLE handle, uint8_t channel, uint8_t gain); +EXTERN int pga11x_select(PGA11X_HANDLE handle, + FAR const struct pga11x_settings_s *settings); + +/**************************************************************************** + * Name: pga11x_uselect + * + * Description: + * Select an input channel and gain for one PGA11x. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_uselect() configures + * one chips in the daisy-chain. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * settings - New channel and gain settings + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +EXTERN int pga11x_uselect(PGA11X_HANDLE handle, int pos, + FAR const struct pga11x_usettings_s *settings); +#endif /**************************************************************************** * Name: pga11x_read * * Description: - * Read from the PGA117 amplifier/multiplexer. + * Read from all PGA117 amplifier/multiplexers. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_read() reads from + * both chips in the daisy-chain. pga11x_uread() is provided to support + * accessing the parts independently. * * Input Parameters: - * spi - An SPI "bottom half" device driver instance - * - * Returned Value: - * 16-bit value read from the device (32-bits in daisy chain mode) - * - ****************************************************************************/ - -#ifdef CONFIG_PGA11X_DAISYCHAIN -EXTERN uint32_t pga11x_read(PGA11X_HANDLE handle); -#else -EXTERN uint16_t pga11x_read(PGA11X_HANDLE handle); -#endif - -/**************************************************************************** - * Name: pga11x_noop - * - * Description: - * Perform PGA11x no-operation. - * - * Input Parameters: - * spi - An SPI "bottom half" device driver instance + * spi - An SPI "bottom half" device driver instance + * settings - Returned channel and gain settings * * Returned Value: * Zero on sucess; a negated errno value on failure. * ****************************************************************************/ -EXTERN int pga11x_noop(PGA11X_HANDLE handle); +EXTERN int pga11x_read(PGA11X_HANDLE handle, + FAR struct pga11x_settings_s *settings); + +/**************************************************************************** + * Name: pga11x_uread + * + * Description: + * Read from one PGA117 amplifier/multiplexer. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_read() reads + * the parts independently. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * settings - Returned channel and gain settings + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +EXTERN int pga11x_uread(PGA11X_HANDLE handle, int pos, + FAR struct pga11x_usettings_s *settings); +#endif /**************************************************************************** * Name: pga11x_shutdown * * Description: - * Put the PGA11x in shutdown down mode. + * Put all PGA11x;'s in shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_shutdown() controls + * both chips in the daisy-chain. pga11x_ushutdown() is provided to + * control the parts independently. * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -272,11 +317,37 @@ EXTERN int pga11x_noop(PGA11X_HANDLE handle); EXTERN int pga11x_shutdown(PGA11X_HANDLE handle); +/**************************************************************************** + * Name: pga11x_ushutdown + * + * Description: + * Put one PGA11x in shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_ushutdown() is + * provided to shutdown the parts independently. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +EXTERN int pga11x_ushutdown(PGA11X_HANDLE handle, int pos); +#endif + /**************************************************************************** * Name: pga11x_enable * * Description: - * Take the PGA11x out of shutdown down mode. + * Take all PGA11x's out of shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_enable() controls + * both chips in the daisy-chain. pga11x_uenable() is provided to + * control the parts independently. * * Input Parameters: * spi - An SPI "bottom half" device driver instance @@ -288,6 +359,28 @@ EXTERN int pga11x_shutdown(PGA11X_HANDLE handle); EXTERN int pga11x_enable(PGA11X_HANDLE handle); +/**************************************************************************** + * Name: pga11x_uenable + * + * Description: + * Take one PGA11x out of shutdown down mode. + * + * If CONFIG_PGA11X_DAISYCHAIN is defined, then pga11x_uenable() is + * provided to enable the parts independently. + * + * Input Parameters: + * spi - An SPI "bottom half" device driver instance + * pos - Position of the chip in the daisy chain (0 or 1) + * + * Returned Value: + * Zero on sucess; a negated errno value on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_PGA11X_DAISYCHAIN +EXTERN int pga11x_uenable(PGA11X_HANDLE handle, int pos); +#endif + #undef EXTERN #ifdef __cplusplus }