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
This commit is contained in:
parent
9ac2756e94
commit
0257c5b8fc
1 changed files with 21 additions and 11 deletions
|
@ -17,30 +17,40 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
#include "kernel.h"
|
||||||
#include "i2c-pp.h"
|
#include "i2c-pp.h"
|
||||||
#include "as3514.h"
|
#include "as3514.h"
|
||||||
|
|
||||||
|
static struct mutex adc_mutex NOCACHEBSS_ATTR;
|
||||||
|
|
||||||
/* Read 10-bit channel data */
|
/* Read 10-bit channel data */
|
||||||
unsigned short adc_read(int channel)
|
unsigned short adc_read(int channel)
|
||||||
{
|
{
|
||||||
unsigned char buf[2];
|
|
||||||
unsigned short data = 0;
|
unsigned short data = 0;
|
||||||
|
|
||||||
/* Select channel */
|
if ((unsigned)channel < NUM_ADC_CHANNELS)
|
||||||
pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4));
|
{
|
||||||
|
spinlock_lock(&adc_mutex);
|
||||||
/* 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);
|
|
||||||
|
|
||||||
/* Read data */
|
/* Select channel */
|
||||||
i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf);
|
if (pp_i2c_send( AS3514_I2C_ADDR, ADC_0, (channel << 4)) >= 0)
|
||||||
data = (((buf[0] & 0x3) << 8) | buf[1]);
|
{
|
||||||
|
unsigned char buf[2];
|
||||||
|
|
||||||
|
/* Read data */
|
||||||
|
if (i2c_readbytes( AS3514_I2C_ADDR, ADC_0, 2, buf) >= 0)
|
||||||
|
{
|
||||||
|
data = (((buf[0] & 0x3) << 8) | buf[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spinlock_unlock(&adc_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_init(void)
|
void adc_init(void)
|
||||||
{
|
{
|
||||||
/* FIXME: Add initialization of the ADC */
|
spinlock_init(&adc_mutex);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue