diff options
author | Karl Kurbjun <kkurbjun@gmail.com> | 2009-12-12 18:36:52 +0000 |
---|---|---|
committer | Karl Kurbjun <kkurbjun@gmail.com> | 2009-12-12 18:36:52 +0000 |
commit | e087751b107982eeaa001e92c2dd1f24f1af6809 (patch) | |
tree | 05b984cc09e7e268d1885d9ee06c7274fbc4b4e2 /firmware/target/arm/tms320dm320 | |
parent | de159ceb3d1b852ee97be15ae707056ec995bf2d (diff) | |
download | rockbox-e087751b107982eeaa001e92c2dd1f24f1af6809.tar.gz rockbox-e087751b107982eeaa001e92c2dd1f24f1af6809.zip |
M:Robe 500: Fix FIQ's and make the audio DMA a FIQ, simplify the ADC code and make it more reliable. Fix ADC problems on initial boot.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23948 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/tms320dm320')
6 files changed, 30 insertions, 47 deletions
diff --git a/firmware/target/arm/tms320dm320/app.lds b/firmware/target/arm/tms320dm320/app.lds index 3437984f55..4e23b533a9 100644 --- a/firmware/target/arm/tms320dm320/app.lds +++ b/firmware/target/arm/tms320dm320/app.lds | |||
@@ -126,7 +126,7 @@ SECTIONS | |||
126 | .fiqstack (NOLOAD) : | 126 | .fiqstack (NOLOAD) : |
127 | { | 127 | { |
128 | *(.stack) | 128 | *(.stack) |
129 | . += 0x100; | 129 | . += 0x400; |
130 | fiq_stack = .; | 130 | fiq_stack = .; |
131 | } > IRAM | 131 | } > IRAM |
132 | 132 | ||
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c index 5df764620d..2acce7a695 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/adc-mr500.c | |||
@@ -42,6 +42,9 @@ void adc_init(void) | |||
42 | 42 | ||
43 | /* Enable the tsc2100 interrupt */ | 43 | /* Enable the tsc2100 interrupt */ |
44 | IO_INTC_EINT2 |= (1<<3); /* IRQ_GIO14 */ | 44 | IO_INTC_EINT2 |= (1<<3); /* IRQ_GIO14 */ |
45 | |||
46 | /* Read all registers to make sure they are clear */ | ||
47 | tsc2100_read_data(); | ||
45 | } | 48 | } |
46 | 49 | ||
47 | /* Touchscreen data available interupt */ | 50 | /* Touchscreen data available interupt */ |
@@ -49,31 +52,11 @@ void GIO14(void) | |||
49 | { | 52 | { |
50 | /* Interrupts work properly when cleared first */ | 53 | /* Interrupts work properly when cleared first */ |
51 | IO_INTC_IRQ2 = (1<<3); /* IRQ_GIO14 == 35 */ | 54 | IO_INTC_IRQ2 = (1<<3); /* IRQ_GIO14 == 35 */ |
52 | 55 | ||
53 | short tsadc = tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS); | ||
54 | short adscm = (tsadc&TSADC_ADSCM_MASK)>>TSADC_ADSCM_SHIFT; | ||
55 | |||
56 | /* Always read all registers in one go to clear any missed flags */ | 56 | /* Always read all registers in one go to clear any missed flags */ |
57 | tsc2100_read_data(); | 57 | tsc2100_read_data(); |
58 | 58 | ||
59 | switch (adscm) | 59 | /* Stop the scan, firmware will initiate another scan with a mode set */ |
60 | { | 60 | tsc2100_set_mode(true, 0x00); |
61 | case 0x01: | ||
62 | case 0x02: | ||
63 | case 0x03: | ||
64 | case 0x04: | ||
65 | case 0x05: | ||
66 | /* do a battery read - this will shutdown the adc till the next tick | ||
67 | */ | ||
68 | // tsc2100_set_mode(true, 0x0B); | ||
69 | break; | ||
70 | case 0x06: | ||
71 | case 0x07: | ||
72 | case 0x08: | ||
73 | case 0x09: | ||
74 | case 0x0B: | ||
75 | tsc2100_set_mode(true, 0x01); | ||
76 | break; | ||
77 | } | ||
78 | } | 61 | } |
79 | 62 | ||
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c index 7d9a43f902..3aa6009c9e 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c | |||
@@ -128,7 +128,7 @@ int button_read_device(int *data) | |||
128 | button_read |= touchscreen_to_pixels(touch_x, touch_y, data); | 128 | button_read |= touchscreen_to_pixels(touch_x, touch_y, data); |
129 | } | 129 | } |
130 | 130 | ||
131 | tsc2100_set_mode(true, 0x01); | 131 | tsc2100_set_mode(true, 0x02); |
132 | 132 | ||
133 | /* Handle power button */ | 133 | /* Handle power button */ |
134 | if ((IO_GIO_BITSET0&0x01) == 0) { | 134 | if ((IO_GIO_BITSET0&0x01) == 0) { |
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c index cdec2ab77c..02294100ac 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c | |||
@@ -61,6 +61,9 @@ void pcm_play_dma_init(void) | |||
61 | IO_INTC_IRQ0 = 1 << 11; | 61 | IO_INTC_IRQ0 = 1 << 11; |
62 | IO_INTC_EINT0 |= 1 << 11; | 62 | IO_INTC_EINT0 |= 1 << 11; |
63 | 63 | ||
64 | /* Set this as a FIQ */ | ||
65 | IO_INTC_FISEL0 |= 1 << 11; | ||
66 | |||
64 | IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0; | 67 | IO_DSPC_HPIB_CONTROL = 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7 | 1 << 3 | 1 << 0; |
65 | 68 | ||
66 | dsp_reset(); | 69 | dsp_reset(); |
@@ -133,7 +136,7 @@ void DSPHINT(void) | |||
133 | 136 | ||
134 | unsigned int i; | 137 | unsigned int i; |
135 | 138 | ||
136 | IO_INTC_IRQ0 = 1 << 11; | 139 | IO_INTC_FIQ0 = 1 << 11; |
137 | 140 | ||
138 | switch (dsp_message.msg) | 141 | switch (dsp_message.msg) |
139 | { | 142 | { |
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c index 6e361aac15..d0f1a0bf59 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/powermgmt-mr500.c | |||
@@ -68,17 +68,14 @@ unsigned int battery_adc_voltage(void) | |||
68 | current_bat2=((short)((int)(bat2<<10)/4096*6*2.5)); | 68 | current_bat2=((short)((int)(bat2<<10)/4096*6*2.5)); |
69 | current_aux=((short)((int)(aux<<10)/4096*6*2.5)); | 69 | current_aux=((short)((int)(aux<<10)/4096*6*2.5)); |
70 | } | 70 | } |
71 | 71 | ||
72 | if (TIME_BEFORE(last_tick+2*HZ, current_tick) || last_tick==0) | 72 | tsadc=tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS); |
73 | |||
74 | /* Set the TSC2100 to read voltages if not busy with pen */ | ||
75 | if(!(tsadc & TSADC_PSTCM)) | ||
73 | { | 76 | { |
74 | tsadc=tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS); | 77 | tsc2100_set_mode(true, 0x0B); |
75 | 78 | last_tick = current_tick; | |
76 | /* Set the TSC2100 to read voltages if not busy with pen */ | ||
77 | if(!(tsadc & TSADC_PSTCM)) | ||
78 | { | ||
79 | tsc2100_set_mode(true, 0x0B); | ||
80 | last_tick = current_tick; | ||
81 | } | ||
82 | } | 79 | } |
83 | 80 | ||
84 | return current_voltage; | 81 | return current_voltage; |
diff --git a/firmware/target/arm/tms320dm320/system-dm320.c b/firmware/target/arm/tms320dm320/system-dm320.c index 434b0065a5..9dff1afc20 100644 --- a/firmware/target/arm/tms320dm320/system-dm320.c +++ b/firmware/target/arm/tms320dm320/system-dm320.c | |||
@@ -155,17 +155,17 @@ void fiq_handler(void) | |||
155 | * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c | 155 | * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c |
156 | */ | 156 | */ |
157 | 157 | ||
158 | asm volatile ( | 158 | asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */ |
159 | "sub lr, lr, #4 \r\n" | 159 | "sub sp, sp, #8 \n"); /* Reserve stack */ |
160 | "stmfd sp!, {r0-r3, ip, lr} \r\n" | 160 | unsigned short addr = IO_INTC_FIQENTRY0>>2; |
161 | "mov r0, #0x00030000 \r\n" | 161 | if(addr != 0) |
162 | "ldr r0, [r0, #0x510] \r\n" /* Fetch value from IO_INTC_FIQENTRY0 */ | 162 | { |
163 | "sub r0, r0, #1 \r\n" | 163 | addr--; |
164 | "ldr r1, =irqvector \r\n" | 164 | irqvector[addr](); |
165 | "ldr r1, [r1, r0, lsl #2] \r\n" /* Divide value by 4 (TBA0/TBA1 is set to 0) and load appropriate pointer from the vector list */ | 165 | } |
166 | "blx r1 \r\n" /* Jump to handler */ | 166 | asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */ |
167 | "ldmfd sp!, {r0-r3, ip, pc}^ \r\n" /* Return from FIQ */ | 167 | "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */ |
168 | ); | 168 | "subs pc, lr, #4 \n"); /* Return from FIQ */ |
169 | } | 169 | } |
170 | 170 | ||
171 | void system_reboot(void) | 171 | void system_reboot(void) |