summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire
diff options
context:
space:
mode:
authorMarcin Bukat <marcin.bukat@gmail.com>2012-01-24 11:53:22 +0100
committerMarcin Bukat <marcin.bukat@gmail.com>2012-01-24 12:05:07 +0100
commite94d1b0ab0042b71a4e0c7609b412185c53dcded (patch)
treefc518c03051560c8a84fca6a7fcbe93a9ff17472 /firmware/target/coldfire
parent2ab2857b5830770ba0499e6139417335fbacbf88 (diff)
downloadrockbox-e94d1b0ab0042b71a4e0c7609b412185c53dcded.tar.gz
rockbox-e94d1b0ab0042b71a4e0c7609b412185c53dcded.zip
MPIO HD200/HD300: Decrease ADC scanrate.
The adclk is decreased 4x. This solves problems with battery readout drop during system startup. Change-Id: I46d7c4b9ffcfdc812a6dd2a932c9e397d33c1168
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r--firmware/target/coldfire/mpio/adc-mpio.c30
-rw-r--r--firmware/target/coldfire/mpio/system-mpio.c12
2 files changed, 11 insertions, 31 deletions
diff --git a/firmware/target/coldfire/mpio/adc-mpio.c b/firmware/target/coldfire/mpio/adc-mpio.c
index 92b9479279..4c796d5d15 100644
--- a/firmware/target/coldfire/mpio/adc-mpio.c
+++ b/firmware/target/coldfire/mpio/adc-mpio.c
@@ -28,17 +28,11 @@
28 28
29volatile unsigned short adc_data[NUM_ADC_CHANNELS] IBSS_ATTR; 29volatile unsigned short adc_data[NUM_ADC_CHANNELS] IBSS_ATTR;
30 30
31/* Reading takes 4096 adclk ticks
32 * 1) tick task is created that enables ADC interrupt
33 * 2) On interrupt single channel is readed and
34 * ADC is prepared for next channel
35 * 3) When all 4 channels are scanned ADC interrupt is disabled
36 */
37
38void ADC(void) __attribute__ ((interrupt_handler,section(".icode"))); 31void ADC(void) __attribute__ ((interrupt_handler,section(".icode")));
39void ADC(void) 32void ADC(void)
40{ 33{
41 static unsigned char channel IBSS_ATTR; 34 static unsigned char channel IBSS_ATTR;
35
42 /* read current value */ 36 /* read current value */
43 adc_data[(channel&0x03)] = ADVALUE; 37 adc_data[(channel&0x03)] = ADVALUE;
44 38
@@ -48,15 +42,10 @@ void ADC(void)
48 * ADCONFIG is 16bit wide so we have to shift data by 16bits left 42 * ADCONFIG is 16bit wide so we have to shift data by 16bits left
49 * thats why we shift <<24 instead of <<8 43 * thats why we shift <<24 instead of <<8
50 */ 44 */
51
52 channel++; 45 channel++;
53 46
54 and_l(~(0x03<<24),&ADCONFIG); 47 and_l(~(0x03<<24),&ADCONFIG);
55 or_l( (((channel&0x03) << 8 )|(1<<7))<<16, &ADCONFIG); 48 or_l( (((channel&0x03) << 8 )|(1<<7))<<16, &ADCONFIG);
56
57 if ( (channel & 0x03) == 0 )
58 /* disable ADC interrupt */
59 and_l((~(1<<6))<<16,&ADCONFIG);
60} 49}
61 50
62unsigned short adc_scan(int channel) 51unsigned short adc_scan(int channel)
@@ -65,12 +54,6 @@ unsigned short adc_scan(int channel)
65 return adc_data[(channel&0x03)]; 54 return adc_data[(channel&0x03)];
66} 55}
67 56
68void adc_tick(void)
69{
70 /* enable ADC interrupt */
71 or_l( ((1<<6))<<16, &ADCONFIG);
72}
73
74void adc_init(void) 57void adc_init(void)
75{ 58{
76 /* GPIO38 GPIO39 */ 59 /* GPIO38 GPIO39 */
@@ -79,19 +62,16 @@ void adc_init(void)
79 /* ADOUT_SEL = 01 62 /* ADOUT_SEL = 01
80 * SOURCE SELECT = 000 63 * SOURCE SELECT = 000
81 * CLEAR INTERRUPT FLAG 64 * CLEAR INTERRUPT FLAG
82 * ENABLE INTERRUPT = 0 65 * ENABLE INTERRUPT = 1
83 * ADOUT_DRIVE = 00 66 * ADOUT_DRIVE = 00
84 * ADCLK_SEL = 011 (busclk/8) 67 * ADCLK_SEL = 011 (busclk/64)
85 */ 68 */
86 69
87 ADCONFIG = (1<<10)|(1<<8)|(1<<7)|0x03; 70 ADCONFIG = (1<<10)|(1<<7)|(1<<6)|0x06;
88 71
89 /* ADC interrupt level 4.0 */ 72 /* ADC interrupt level 4.0 */
90 or_l((4<<28), &INTPRI8); 73 or_l((4<<28), &INTPRI8);
91 74
92 /* create tick task which enables ADC interrupt */
93 tick_add_task(adc_tick);
94
95 /* let the interrupt handler fill readout array */ 75 /* let the interrupt handler fill readout array */
96 sleep(2); 76 sleep(HZ/10);
97} 77}
diff --git a/firmware/target/coldfire/mpio/system-mpio.c b/firmware/target/coldfire/mpio/system-mpio.c
index ef291dbe0d..846f77b56e 100644
--- a/firmware/target/coldfire/mpio/system-mpio.c
+++ b/firmware/target/coldfire/mpio/system-mpio.c
@@ -80,8 +80,8 @@ void cf_set_cpu_frequency(long frequency)
80 /* BUFEN2 enable on /CS2 | CS2Post 1 clock| CS2Pre 3 clocks*/ 80 /* BUFEN2 enable on /CS2 | CS2Post 1 clock| CS2Pre 3 clocks*/
81 IDECONFIG2 = (1<<18)|(1<<16)|(1<<8)|(1<<0); /* TA /CS2 enable + CS2wait */ 81 IDECONFIG2 = (1<<18)|(1<<16)|(1<<8)|(1<<0); /* TA /CS2 enable + CS2wait */
82 82
83 and_l(~(0x07<<16), &ADCONFIG); 83 and_l(~(0x0f<<16), &ADCONFIG);
84 or_l((0x05)<<16, &ADCONFIG); /* adclk = busclk/32 */ 84 or_l((0x08)<<16, &ADCONFIG); /* adclk = busclk/256 */
85 break; 85 break;
86 86
87 case CPUFREQ_NORMAL: 87 case CPUFREQ_NORMAL:
@@ -100,8 +100,8 @@ void cf_set_cpu_frequency(long frequency)
100 IDECONFIG1 = (1<<28)|(1<<20)|(1<<18)|(1<<13)|(1<<10); 100 IDECONFIG1 = (1<<28)|(1<<20)|(1<<18)|(1<<13)|(1<<10);
101 IDECONFIG2 = (1<<18)|(1<<16); 101 IDECONFIG2 = (1<<18)|(1<<16);
102 102
103 and_l(~(0x07<<16), &ADCONFIG); 103 and_l(~(0x0f<<16), &ADCONFIG);
104 or_l((0x03)<<16, &ADCONFIG); /* adclk = busclk/8 */ 104 or_l((0x06)<<16, &ADCONFIG); /* adclk = busclk/64 */
105 break; 105 break;
106 106
107 default: 107 default:
@@ -118,8 +118,8 @@ void cf_set_cpu_frequency(long frequency)
118 IDECONFIG1 = (1<<28)|(1<<20)|(1<<18)|(1<<13)|(1<<10); 118 IDECONFIG1 = (1<<28)|(1<<20)|(1<<18)|(1<<13)|(1<<10);
119 IDECONFIG2 = (1<<18)|(1<<16); 119 IDECONFIG2 = (1<<18)|(1<<16);
120 120
121 and_l(~(0x07<<16), &ADCONFIG); 121 and_l(~(0x0f<<16), &ADCONFIG);
122 or_l((0x01)<<16, &ADCONFIG); /* adclk = busclk/2 */ 122 or_l((0x04)<<16, &ADCONFIG); /* adclk = busclk/16 */
123 break; 123 break;
124 } 124 }
125} 125}