summaryrefslogtreecommitdiff
path: root/firmware/target/arm/sandisk/sansa-e200
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/sandisk/sansa-e200')
-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}