diff options
Diffstat (limited to 'firmware/target/sh')
-rw-r--r-- | firmware/target/sh/adc-sh.c | 108 | ||||
-rw-r--r-- | firmware/target/sh/archos/fm_v2/adc-target.h | 39 | ||||
-rw-r--r-- | firmware/target/sh/archos/ondio/adc-target.h | 35 | ||||
-rw-r--r-- | firmware/target/sh/archos/player/adc-target.h | 33 | ||||
-rw-r--r-- | firmware/target/sh/archos/player/button-player.c | 8 | ||||
-rw-r--r-- | firmware/target/sh/archos/recorder/adc-target.h | 39 |
6 files changed, 258 insertions, 4 deletions
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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #include "config.h" | ||
20 | #include "cpu.h" | ||
21 | #include "system.h" | ||
22 | #include "kernel.h" | ||
23 | #include "thread.h" | ||
24 | #include "string.h" | ||
25 | #include "adc.h" | ||
26 | |||
27 | /************************************************************************** | ||
28 | ** The A/D conversion is done every tick, in three steps: | ||
29 | ** | ||
30 | ** 1) On the tick interrupt, the conversion of channels 0-3 is started, and | ||
31 | ** the A/D interrupt is enabled. | ||
32 | ** | ||
33 | ** 2) After the conversion is done (approx. 256*4 cycles later), an interrupt | ||
34 | ** is generated at level 1, which is the same level as the tick interrupt | ||
35 | ** itself. This interrupt will be pending until the tick interrupt is | ||
36 | ** finished. | ||
37 | ** When the A/D interrupt is finally served, it will read the results | ||
38 | ** from the first conversion and start the conversion of channels 4-7. | ||
39 | ** | ||
40 | ** 3) When the conversion of channels 4-7 is finished, the interrupt is | ||
41 | ** triggered again, and the results are read. This time, no new | ||
42 | ** conversion is started, it will be done in the next tick interrupt. | ||
43 | ** | ||
44 | ** Thus, each channel will be updated HZ times per second. | ||
45 | ** | ||
46 | *************************************************************************/ | ||
47 | |||
48 | static int current_channel; | ||
49 | static unsigned short adcdata[NUM_ADC_CHANNELS]; | ||
50 | |||
51 | static void adc_tick(void) | ||
52 | { | ||
53 | /* Start a conversion of channel group 0. This will trigger an interrupt, | ||
54 | and the interrupt handler will take care of group 1. */ | ||
55 | |||
56 | current_channel = 0; | ||
57 | ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 3; | ||
58 | } | ||
59 | |||
60 | void ADITI(void) __attribute__((interrupt_handler)); | ||
61 | void ADITI(void) | ||
62 | { | ||
63 | if(ADCSR & ADCSR_ADF) | ||
64 | { | ||
65 | ADCSR = 0; | ||
66 | |||
67 | if(current_channel == 0) | ||
68 | { | ||
69 | adcdata[0] = ADDRA >> 6; | ||
70 | adcdata[1] = ADDRB >> 6; | ||
71 | adcdata[2] = ADDRC >> 6; | ||
72 | adcdata[3] = ADDRD >> 6; | ||
73 | current_channel = 4; | ||
74 | |||
75 | /* Convert the next group */ | ||
76 | ADCSR = ADCSR_ADST | ADCSR_ADIE | ADCSR_SCAN | 7; | ||
77 | } | ||
78 | else | ||
79 | { | ||
80 | adcdata[4] = ADDRA >> 6; | ||
81 | adcdata[5] = ADDRB >> 6; | ||
82 | adcdata[6] = ADDRC >> 6; | ||
83 | adcdata[7] = ADDRD >> 6; | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | |||
88 | unsigned short adc_read(int channel) | ||
89 | { | ||
90 | return adcdata[channel]; | ||
91 | } | ||
92 | |||
93 | void adc_init(void) | ||
94 | { | ||
95 | ADCR = 0x7f; /* No external trigger; other bits should be 1 according | ||
96 | to the manual... */ | ||
97 | |||
98 | ADCSR = 0; | ||
99 | |||
100 | current_channel = 0; | ||
101 | |||
102 | /* Enable the A/D IRQ on level 1 */ | ||
103 | IPRE = (IPRE & 0xf0ff) | 0x0100; | ||
104 | |||
105 | tick_add_task(adc_tick); | ||
106 | |||
107 | sleep(2); /* Ensure valid readings when adc_init returns */ | ||
108 | } | ||
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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #ifndef _ADC_TARGET_H_ | ||
20 | #define _ADC_TARGET_H_ | ||
21 | |||
22 | #define NUM_ADC_CHANNELS 8 | ||
23 | |||
24 | #define ADC_BATTERY 0 /* Battery voltage always reads 0x3FF due to | ||
25 | silly scaling */ | ||
26 | #define ADC_CHARGE_REGULATOR 0 /* Uh, we read the battery voltage? */ | ||
27 | #define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ | ||
28 | #define ADC_BUTTON_OFF 2 /* the off button, high value if pressed */ | ||
29 | #define ADC_BUTTON_ON 3 /* the on button, low value if pressed */ | ||
30 | #define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different | ||
31 | voltages for different keys */ | ||
32 | #define ADC_BUTTON_ROW2 5 /* Used for scanning the keys, different | ||
33 | voltages for different keys */ | ||
34 | #define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ | ||
35 | #define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ | ||
36 | |||
37 | #define EXT_SCALE_FACTOR 14800 | ||
38 | |||
39 | #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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #ifndef _ADC_TARGET_H_ | ||
20 | #define _ADC_TARGET_H_ | ||
21 | |||
22 | #define NUM_ADC_CHANNELS 8 | ||
23 | |||
24 | #define ADC_MMC_SWITCH 0 /* low values if MMC inserted */ | ||
25 | #define ADC_USB_POWER 1 /* USB, reads 0x000 when USB is inserted */ | ||
26 | #define ADC_BUTTON_OPTION 2 /* the option button, low value if pressed */ | ||
27 | #define ADC_BUTTON_ONOFF 3 /* the on/off button, high value if pressed */ | ||
28 | #define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different | ||
29 | voltages for different keys */ | ||
30 | #define ADC_USB_ACTIVE 5 /* USB bridge activity */ | ||
31 | #define ADC_UNREG_POWER 7 /* Battery voltage */ | ||
32 | |||
33 | #define EXT_SCALE_FACTOR 14800 | ||
34 | |||
35 | #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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #ifndef _ADC_TARGET_H_ | ||
20 | #define _ADC_TARGET_H_ | ||
21 | |||
22 | #define NUM_ADC_CHANNELS 8 | ||
23 | |||
24 | #define ADC_BUTTON_LEFT 0 | ||
25 | #define ADC_BUTTON_MENU 1 | ||
26 | #define ADC_BUTTON_RIGHT 2 | ||
27 | #define ADC_BUTTON_PLAY 3 | ||
28 | #define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ | ||
29 | #define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ | ||
30 | |||
31 | #define EXT_SCALE_FACTOR 14800 | ||
32 | |||
33 | #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) | |||
54 | int data; | 54 | int data; |
55 | 55 | ||
56 | /* buttons are active low */ | 56 | /* buttons are active low */ |
57 | if (adc_read(0) < 0x180) | 57 | if (adc_read(ADC_BUTTON_LEFT) < 0x180) |
58 | btn = BUTTON_LEFT; | 58 | btn = BUTTON_LEFT; |
59 | if (adc_read(1) < 0x180) | 59 | if (adc_read(ADC_BUTTON_MENU) < 0x180) |
60 | btn |= BUTTON_MENU; | 60 | btn |= BUTTON_MENU; |
61 | if (adc_read(2) < 0x180) | 61 | if (adc_read(ADC_BUTTON_RIGHT) < 0x180) |
62 | btn |= BUTTON_RIGHT; | 62 | btn |= BUTTON_RIGHT; |
63 | if (adc_read(3) < 0x180) | 63 | if (adc_read(ADC_BUTTON_PLAY) < 0x180) |
64 | btn |= BUTTON_PLAY; | 64 | btn |= BUTTON_PLAY; |
65 | 65 | ||
66 | /* check port A pins for ON and STOP */ | 66 | /* 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 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | #ifndef _ADC_TARGET_H_ | ||
20 | #define _ADC_TARGET_H_ | ||
21 | |||
22 | #define NUM_ADC_CHANNELS 8 | ||
23 | |||
24 | /* normal JBR channel assignment */ | ||
25 | #define ADC_BATTERY 0 /* Battery voltage always reads 0x3FF due to | ||
26 | silly scaling */ | ||
27 | #define ADC_CHARGE_REGULATOR 1 /* Regulator reference voltage, should read | ||
28 | about 0x1c0 when charging, else 0x3FF */ | ||
29 | #define ADC_USB_POWER 2 /* USB, reads 0x3FF when USB is inserted */ | ||
30 | #define ADC_BUTTON_ROW1 4 /* Used for scanning the keys, different | ||
31 | voltages for different keys */ | ||
32 | #define ADC_BUTTON_ROW2 5 /* Used for scanning the keys, different | ||
33 | voltages for different keys */ | ||
34 | #define ADC_UNREG_POWER 6 /* Battery voltage with a better scaling */ | ||
35 | #define ADC_EXT_POWER 7 /* The external power voltage, 0v or 2.7v */ | ||
36 | |||
37 | #define EXT_SCALE_FACTOR 14800 | ||
38 | |||
39 | #endif /* _ADC_TARGET_H_ */ | ||