From 0257c5b8fcc73edb42d5901dd7781616b52e072f Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Thu, 12 Jul 2007 04:19:21 +0000 Subject: 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 --- firmware/target/arm/sandisk/sansa-e200/adc-e200.c | 32 +++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'firmware/target/arm/sandisk/sansa-e200/adc-e200.c') 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 @@ * ****************************************************************************/ #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); } -- cgit v1.2.3