diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2005-01-09 23:26:39 +0000 |
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2005-01-09 23:26:39 +0000 |
| commit | 00328982298d9f515257e412c740c61ea7315c92 (patch) | |
| tree | d8dafe3f0afd92d0bdfa40349f4484b8865506bf | |
| parent | 3fce85735ee8142268be5f8bdae994fa2caff86a (diff) | |
| download | rockbox-00328982298d9f515257e412c740c61ea7315c92.zip rockbox-00328982298d9f515257e412c740c61ea7315c92.tar.gz rockbox-00328982298d9f515257e412c740c61ea7315c92.tar.bz2 rockbox-00328982298d9f515257e412c740c61ea7315c92.tar.xz | |
Jean-Philippe Bernardy: ADC support for TCC730
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5547 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/drivers/adc.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c index 46890ba..5ef5f76 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 |