summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-07-12 04:19:21 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-07-12 04:19:21 +0000
commit0257c5b8fcc73edb42d5901dd7781616b52e072f (patch)
treea423f55c23c65aedd69231e12c7983c949e4384d
parent9ac2756e944929a1833f3fd4d8212a1865fd2a8e (diff)
downloadrockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.tar.gz
rockbox-0257c5b8fcc73edb42d5901dd7781616b52e072f.zip
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.c32
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 5e57e4bec5..31321ece37 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 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19#include "adc.h" 19#include "adc.h"
20#include "kernel.h"
20#include "i2c-pp.h" 21#include "i2c-pp.h"
21#include "as3514.h" 22#include "as3514.h"
22 23
24static struct mutex adc_mutex NOCACHEBSS_ATTR;
25
23/* Read 10-bit channel data */ 26/* Read 10-bit channel data */
24unsigned short adc_read(int channel) 27unsigned short adc_read(int channel)
25{ 28{
26 unsigned char buf[2];
27 unsigned short data = 0; 29 unsigned short data = 0;
28 30
29 /* Select channel */ 31 if ((unsigned)channel < NUM_ADC_CHANNELS)
30 pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)); 32 {
31 33 spinlock_lock(&adc_mutex);
32 /* Wait for conversion to be complete */ 34
33 pp_i2c_send( AS3514_I2C_ADDR, IRQ_ENRD2, 0x1); 35 /* Select channel */
34 while( (i2c_readbyte( AS3514_I2C_ADDR, IRQ_ENRD2) & 0x1) == 0); 36 if (pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)) >= 0)
37 {
38 unsigned char buf[2];
39
40 /* Read data */
41 if (i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf) >= 0)
42 {
43 data = (((buf[0] & 0x3) << 8) | buf[1]);
44 }
45 }
35 46
36 /* Read data */ 47 spinlock_unlock(&adc_mutex);
37 i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf); 48 }
38 data = (((buf[0] & 0x3) << 8) | buf[1]);
39 49
40 return data; 50 return data;
41} 51}
42 52
43void adc_init(void) 53void adc_init(void)
44{ 54{
45 /* FIXME: Add initialization of the ADC */ 55 spinlock_init(&adc_mutex);
46} 56}