From 7a5d4011f56334c05b55bb511c2f1f6a4639c8c1 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sun, 15 Apr 2007 23:35:56 +0000 Subject: Moved SH1 ADC to target tree. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13174 a1c6a512-1295-4272-9138-f99709370657 --- firmware/SOURCES | 4 +- firmware/drivers/adc.c | 112 ----------------------- firmware/export/adc.h | 44 --------- firmware/target/sh/adc-sh.c | 108 ++++++++++++++++++++++ firmware/target/sh/archos/fm_v2/adc-target.h | 39 ++++++++ firmware/target/sh/archos/ondio/adc-target.h | 35 +++++++ firmware/target/sh/archos/player/adc-target.h | 33 +++++++ firmware/target/sh/archos/player/button-player.c | 8 +- firmware/target/sh/archos/recorder/adc-target.h | 39 ++++++++ 9 files changed, 260 insertions(+), 162 deletions(-) delete mode 100644 firmware/drivers/adc.c create mode 100644 firmware/target/sh/adc-sh.c create mode 100644 firmware/target/sh/archos/fm_v2/adc-target.h create mode 100644 firmware/target/sh/archos/ondio/adc-target.h create mode 100644 firmware/target/sh/archos/player/adc-target.h create mode 100644 firmware/target/sh/archos/recorder/adc-target.h (limited to 'firmware') diff --git a/firmware/SOURCES b/firmware/SOURCES index 43519ffb3c..86438d43be 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -93,7 +93,6 @@ drivers/lcd-remote-2bit-vi.c /* Misc. */ drivers/led.c #ifndef TARGET_TREE -drivers/adc.c drivers/power.c #endif /* TARGET_TREE */ #ifndef SIMULATOR @@ -232,6 +231,7 @@ drivers/arcotg_udc.c bitswap.S descramble.S drivers/i2c.c +target/sh/adc-sh.c target/sh/crt0.S target/sh/memcpy-sh.S target/sh/memmove-sh.S @@ -328,7 +328,7 @@ target/sh/archos/player/usb-player.c target/sh/archos/ata-archos.c target/sh/archos/ata-as-archos.S target/sh/archos/lcd-archos-bitmap.c -target/sh/archos/lcd-as-archos-bitmap.S +target/sh/archos/lcd-as-archos-bitmap.S target/sh/archos/recorder/button-recorder.c target/sh/archos/recorder/usb-recorder.c #endif /* SIMULATOR */ diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c deleted file mode 100644 index f002be96b4..0000000000 --- a/firmware/drivers/adc.c +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** - * __________ __ ___. - * Open \______ \ ____ ____ | | _\_ |__ _______ ___ - * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / - * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < - * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ - * \/ \/ \/ \/ \/ - * $Id$ - * - * Copyright (C) 2002 by Linus Nielsen Feltzing - * - * All files in this archive are subject to the GNU General Public License. - * See the file COPYING in the source tree root for full license agreement. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ****************************************************************************/ -#include "config.h" -#include "cpu.h" -#include "system.h" -#include "kernel.h" -#include "thread.h" -#include "string.h" -#include "adc.h" -#include "pcf50606.h" - -#if CONFIG_CPU == SH7034 -/************************************************************************** - ** The A/D conversion is done every tick, in three steps: - ** - ** 1) On the tick interrupt, the conversion of channels 0-3 is started, and - ** the A/D interrupt is enabled. - ** - ** 2) After the conversion is done (approx. 256*4 cycles later), an interrupt - ** is generated at level 1, which is the same level as the tick interrupt - ** itself. This interrupt will be pending until the tick interrupt is - ** finished. - ** When the A/D interrupt is finally served, it will read the results - ** from the first conversion and start the conversion of channels 4-7. - ** - ** 3) When the conversion of channels 4-7 is finished, the interrupt is - ** triggered again, and the results are read. This time, no new - ** conversion is started, it will be done in the next tick interrupt. - ** - ** Thus, each channel will be updated HZ times per second. - ** - *************************************************************************/ - -static int current_channel; -static unsigned short adcdata[NUM_ADC_CHANNELS]; - -static void adc_tick(void) -{ - /* Start a conversion of channel group 0. This will trigger an interrupt, - and the interrupt handler will take care of group 1. */ - - current_channel = 0; - ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 3; -} - -void ADITI(void) __attribute__((interrupt_handler)); -void ADITI(void) -{ - if(ADCSR & ADCSR_ADF) - { - ADCSR = 0; - - if(current_channel == 0) - { - adcdata[0] = ADDRA >> 6; - adcdata[1] = ADDRB >> 6; - adcdata[2] = ADDRC >> 6; - adcdata[3] = ADDRD >> 6; - current_channel = 4; - - /* Convert the next group */ - ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 7; - } - else - { - adcdata[4] = ADDRA >> 6; - adcdata[5] = ADDRB >> 6; - adcdata[6] = ADDRC >> 6; - adcdata[7] = ADDRD >> 6; - } - } -} - -unsigned short adc_read(int channel) -{ - return adcdata[channel]; -} - -void adc_init(void) -{ - ADCR = 0x7f; /* No external trigger; other bits should be 1 according - to the manual... */ - - ADCSR = 0; - - current_channel = 0; - - /* Enable the A/D IRQ on level 1 */ - IPRE = (IPRE & 0xf0ff) | 0x0100; - - tick_add_task(adc_tick); - - sleep(2); /* Ensure valid readings when adc_init returns */ -} - -#endif diff --git a/firmware/export/adc.h b/firmware/export/adc.h index d8e3b7078f..e10cce0d27 100644 --- a/firmware/export/adc.h +++ b/firmware/export/adc.h @@ -20,52 +20,8 @@ #define _ADC_H_ #include "config.h" - -#ifdef TARGET_TREE #include "adc-target.h" -#else - -#define NUM_ADC_CHANNELS 8 - -#ifdef HAVE_ONDIO_ADC - -#define ADC_MMC_SWITCH 0 /* low values if MMC inserted */ -#define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ -#define ADC_BUTTON_OPTION 2 /* the option button, low value if pressed */ -#define ADC_BUTTON_ONOFF 3 /* the on/off button, high value if pressed */ -#define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different - voltages for different keys */ -#define ADC_USB_ACTIVE 5 /* USB bridge activity */ -#define ADC_UNREG_POWER 7 /* Battery voltage */ - -#else -/* normal JBR channel assignment */ -#define ADC_BATTERY 0 /* Battery voltage always reads 0x3FF due to - silly scaling */ -#ifdef HAVE_FMADC -#define ADC_CHARGE_REGULATOR 0 /* Uh, we read the battery voltage? */ -#define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ -#define ADC_BUTTON_OFF 2 /* the off button, high value if pressed */ -#define ADC_BUTTON_ON 3 /* the on button, low value if pressed */ -#else -#define ADC_CHARGE_REGULATOR 1 /* Regulator reference voltage, should read - about 0x1c0 when charging, else 0x3FF */ -#define ADC_USB_POWER 2 /* USB, reads 0x3FF when USB is inserted */ -#endif - -#define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different - voltages for different keys */ -#define ADC_BUTTON_ROW2 5 /* Used for scanning the keys, different - voltages for different keys */ -#define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ -#define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ - -#endif - -#define EXT_SCALE_FACTOR 14800 -#endif - unsigned short adc_read(int channel); void adc_init(void); diff --git a/firmware/target/sh/adc-sh.c b/firmware/target/sh/adc-sh.c new file mode 100644 index 0000000000..d36624f913 --- /dev/null +++ b/firmware/target/sh/adc-sh.c @@ -0,0 +1,108 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "config.h" +#include "cpu.h" +#include "system.h" +#include "kernel.h" +#include "thread.h" +#include "string.h" +#include "adc.h" + +/************************************************************************** + ** The A/D conversion is done every tick, in three steps: + ** + ** 1) On the tick interrupt, the conversion of channels 0-3 is started, and + ** the A/D interrupt is enabled. + ** + ** 2) After the conversion is done (approx. 256*4 cycles later), an interrupt + ** is generated at level 1, which is the same level as the tick interrupt + ** itself. This interrupt will be pending until the tick interrupt is + ** finished. + ** When the A/D interrupt is finally served, it will read the results + ** from the first conversion and start the conversion of channels 4-7. + ** + ** 3) When the conversion of channels 4-7 is finished, the interrupt is + ** triggered again, and the results are read. This time, no new + ** conversion is started, it will be done in the next tick interrupt. + ** + ** Thus, each channel will be updated HZ times per second. + ** + *************************************************************************/ + +static int current_channel; +static unsigned short adcdata[NUM_ADC_CHANNELS]; + +static void adc_tick(void) +{ + /* Start a conversion of channel group 0. This will trigger an interrupt, + and the interrupt handler will take care of group 1. */ + + current_channel = 0; + ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 3; +} + +void ADITI(void) __attribute__((interrupt_handler)); +void ADITI(void) +{ + if(ADCSR & ADCSR_ADF) + { + ADCSR = 0; + + if(current_channel == 0) + { + adcdata[0] = ADDRA >> 6; + adcdata[1] = ADDRB >> 6; + adcdata[2] = ADDRC >> 6; + adcdata[3] = ADDRD >> 6; + current_channel = 4; + + /* Convert the next group */ + ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 7; + } + else + { + adcdata[4] = ADDRA >> 6; + adcdata[5] = ADDRB >> 6; + adcdata[6] = ADDRC >> 6; + adcdata[7] = ADDRD >> 6; + } + } +} + +unsigned short adc_read(int channel) +{ + return adcdata[channel]; +} + +void adc_init(void) +{ + ADCR = 0x7f; /* No external trigger; other bits should be 1 according + to the manual... */ + + ADCSR = 0; + + current_channel = 0; + + /* Enable the A/D IRQ on level 1 */ + IPRE = (IPRE & 0xf0ff) | 0x0100; + + tick_add_task(adc_tick); + + sleep(2); /* Ensure valid readings when adc_init returns */ +} diff --git a/firmware/target/sh/archos/fm_v2/adc-target.h b/firmware/target/sh/archos/fm_v2/adc-target.h new file mode 100644 index 0000000000..e4f24c88ce --- /dev/null +++ b/firmware/target/sh/archos/fm_v2/adc-target.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _ADC_TARGET_H_ +#define _ADC_TARGET_H_ + +#define NUM_ADC_CHANNELS 8 + +#define ADC_BATTERY 0 /* Battery voltage always reads 0x3FF due to + silly scaling */ +#define ADC_CHARGE_REGULATOR 0 /* Uh, we read the battery voltage? */ +#define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ +#define ADC_BUTTON_OFF 2 /* the off button, high value if pressed */ +#define ADC_BUTTON_ON 3 /* the on button, low value if pressed */ +#define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different + voltages for different keys */ +#define ADC_BUTTON_ROW2 5 /* Used for scanning the keys, different + voltages for different keys */ +#define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ +#define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ + +#define EXT_SCALE_FACTOR 14800 + +#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/sh/archos/ondio/adc-target.h b/firmware/target/sh/archos/ondio/adc-target.h new file mode 100644 index 0000000000..ee9ca4a7c8 --- /dev/null +++ b/firmware/target/sh/archos/ondio/adc-target.h @@ -0,0 +1,35 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _ADC_TARGET_H_ +#define _ADC_TARGET_H_ + +#define NUM_ADC_CHANNELS 8 + +#define ADC_MMC_SWITCH 0 /* low values if MMC inserted */ +#define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ +#define ADC_BUTTON_OPTION 2 /* the option button, low value if pressed */ +#define ADC_BUTTON_ONOFF 3 /* the on/off button, high value if pressed */ +#define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different + voltages for different keys */ +#define ADC_USB_ACTIVE 5 /* USB bridge activity */ +#define ADC_UNREG_POWER 7 /* Battery voltage */ + +#define EXT_SCALE_FACTOR 14800 + +#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/sh/archos/player/adc-target.h b/firmware/target/sh/archos/player/adc-target.h new file mode 100644 index 0000000000..21969dbec7 --- /dev/null +++ b/firmware/target/sh/archos/player/adc-target.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _ADC_TARGET_H_ +#define _ADC_TARGET_H_ + +#define NUM_ADC_CHANNELS 8 + +#define ADC_BUTTON_LEFT 0 +#define ADC_BUTTON_MENU 1 +#define ADC_BUTTON_RIGHT 2 +#define ADC_BUTTON_PLAY 3 +#define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ +#define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ + +#define EXT_SCALE_FACTOR 14800 + +#endif /* _ADC_TARGET_H_ */ diff --git a/firmware/target/sh/archos/player/button-player.c b/firmware/target/sh/archos/player/button-player.c index fbc940f7de..f979e76575 100644 --- a/firmware/target/sh/archos/player/button-player.c +++ b/firmware/target/sh/archos/player/button-player.c @@ -54,13 +54,13 @@ int button_read_device(void) int data; /* buttons are active low */ - if (adc_read(0) < 0x180) + if (adc_read(ADC_BUTTON_LEFT) < 0x180) btn = BUTTON_LEFT; - if (adc_read(1) < 0x180) + if (adc_read(ADC_BUTTON_MENU) < 0x180) btn |= BUTTON_MENU; - if (adc_read(2) < 0x180) + if (adc_read(ADC_BUTTON_RIGHT) < 0x180) btn |= BUTTON_RIGHT; - if (adc_read(3) < 0x180) + if (adc_read(ADC_BUTTON_PLAY) < 0x180) btn |= BUTTON_PLAY; /* check port A pins for ON and STOP */ diff --git a/firmware/target/sh/archos/recorder/adc-target.h b/firmware/target/sh/archos/recorder/adc-target.h new file mode 100644 index 0000000000..9d7230d2cb --- /dev/null +++ b/firmware/target/sh/archos/recorder/adc-target.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _ADC_TARGET_H_ +#define _ADC_TARGET_H_ + +#define NUM_ADC_CHANNELS 8 + +/* normal JBR channel assignment */ +#define ADC_BATTERY 0 /* Battery voltage always reads 0x3FF due to + silly scaling */ +#define ADC_CHARGE_REGULATOR 1 /* Regulator reference voltage, should read + about 0x1c0 when charging, else 0x3FF */ +#define ADC_USB_POWER 2 /* USB, reads 0x3FF when USB is inserted */ +#define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different + voltages for different keys */ +#define ADC_BUTTON_ROW2 5 /* Used for scanning the keys, different + voltages for different keys */ +#define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ +#define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ + +#define EXT_SCALE_FACTOR 14800 + +#endif /* _ADC_TARGET_H_ */ -- cgit v1.2.3