diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2007-07-12 04:19:21 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2007-07-12 04:19:21 +0000 |
| commit | 0257c5b8fcc73edb42d5901dd7781616b52e072f (patch) | |
| tree | a423f55c23c65aedd69231e12c7983c949e4384d | |
| parent | 9ac2756e944929a1833f3fd4d8212a1865fd2a8e (diff) | |
| download | rockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.zip rockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.tar.gz rockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.tar.bz2 rockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.tar.xz | |
e200: adc_read needs mutex since it is accessed from multiple threads and yields. Remove polling for conversion completion since it will always have completed by the time it can be read out.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13861 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/adc-e200.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/firmware/target/arm/sandisk/sansa-e200/adc-e200.c b/firmware/target/arm/sandisk/sansa-e200/adc-e200.c index 5e57e4b..31321ec 100644 --- a/firmware/target/arm/sandisk/sansa-e200/adc-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/adc-e200.c @@ -17,30 +17,40 @@ * ****************************************************************************/ #include "adc.h" +#include "kernel.h" #include "i2c-pp.h" #include "as3514.h" +static struct mutex adc_mutex NOCACHEBSS_ATTR; + /* Read 10-bit channel data */ unsigned short adc_read(int channel) { - unsigned char buf[2]; unsigned short data = 0; - /* Select channel */ - pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)); - - /* Wait for conversion to be complete */ - pp_i2c_send( AS3514_I2C_ADDR, IRQ_ENRD2, 0x1); - while( (i2c_readbyte( AS3514_I2C_ADDR, IRQ_ENRD2) & 0x1) == 0); + if ((unsigned)channel < NUM_ADC_CHANNELS) + { + spinlock_lock(&adc_mutex); + + /* Select channel */ + if (pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)) >= 0) + { + unsigned char buf[2]; + + /* Read data */ + if (i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf) >= 0) + { + data = (((buf[0] & 0x3) << 8) | buf[1]); + } + } - /* Read data */ - i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf); - data = (((buf[0] & 0x3) << 8) | buf[1]); + spinlock_unlock(&adc_mutex); + } return data; } void adc_init(void) { - /* FIXME: Add initialization of the ADC */ + spinlock_init(&adc_mutex); } |