From 00328982298d9f515257e412c740c61ea7315c92 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 9 Jan 2005 23:26:39 +0000 Subject: Jean-Philippe Bernardy: ADC support for TCC730 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5547 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/adc.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c index 46890badd4..5ef5f76a31 100644 --- a/firmware/drivers/adc.c +++ b/firmware/drivers/adc.c @@ -205,4 +205,51 @@ void adc_init(void) adcdata[3] = adc_scan(3); } +#elif CONFIG_CPU == TCC730 + + +/************************************************************************** + ** + ** Each channel will be updated HZ/CHANNEL_ORDER_SIZE times per second. + ** + *************************************************************************/ + +static int current_channel; +static int current_channel_idx; +static unsigned short adcdata[NUM_ADC_CHANNELS]; + +#define CHANNEL_ORDER_SIZE 2 +static int channel_order[CHANNEL_ORDER_SIZE] = {6,7}; + +static void adc_tick(void) +{ + if (ADCON & (1 << 3)) { + /* previous conversion finished? */ + adcdata[current_channel] = ADDATA >> 6; + emu_debugf("ADC[%x] = %x", current_channel, adcdata[current_channel]); + if (++current_channel_idx >= CHANNEL_ORDER_SIZE) + current_channel_idx = 0; + current_channel = channel_order[current_channel_idx]; + int adcon = (current_channel << 4) | 1; + ADCON = adcon; + } +} + +unsigned short adc_read(int channel) +{ + return adcdata[channel]; +} + +void adc_init(void) +{ + current_channel_idx = 0; + current_channel = channel_order[current_channel_idx]; + + ADCON = (current_channel << 4) | 1; + + tick_add_task(adc_tick); + + sleep(2); /* Ensure valid readings when adc_init returns */ +} + #endif -- cgit v1.2.3