diff options
Diffstat (limited to 'firmware/target/arm/tcc77x')
20 files changed, 1171 insertions, 30 deletions
diff --git a/firmware/target/arm/tcc77x/app.lds b/firmware/target/arm/tcc77x/app.lds new file mode 100644 index 0000000000..03a427f76b --- /dev/null +++ b/firmware/target/arm/tcc77x/app.lds | |||
@@ -0,0 +1,144 @@ | |||
1 | #include "config.h" | ||
2 | |||
3 | ENTRY(start) | ||
4 | |||
5 | OUTPUT_FORMAT(elf32-littlearm) | ||
6 | OUTPUT_ARCH(arm) | ||
7 | STARTUP(target/arm/tcc77x/crt0.o) | ||
8 | |||
9 | #define PLUGINSIZE PLUGIN_BUFFER_SIZE | ||
10 | #define CODECSIZE CODEC_SIZE | ||
11 | |||
12 | #include "imx31l.h" | ||
13 | |||
14 | #define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - CODECSIZE | ||
15 | |||
16 | #define DRAMORIG 0x20000000 | ||
17 | #define IRAMORIG 0x00000000 | ||
18 | #define IRAMSIZE IRAM_SIZE | ||
19 | |||
20 | /* End of the audio buffer, where the codec buffer starts */ | ||
21 | #define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) | ||
22 | |||
23 | /* Where the codec buffer ends, and the plugin buffer starts */ | ||
24 | #define ENDADDR (ENDAUDIOADDR + CODECSIZE) | ||
25 | |||
26 | MEMORY | ||
27 | { | ||
28 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE | ||
29 | IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE | ||
30 | } | ||
31 | |||
32 | SECTIONS | ||
33 | { | ||
34 | .text : | ||
35 | { | ||
36 | loadaddress = .; | ||
37 | _loadaddress = .; | ||
38 | . = ALIGN(0x200); | ||
39 | *(.init.text) | ||
40 | *(.text*) | ||
41 | *(.glue_7) | ||
42 | *(.glue_7t) | ||
43 | . = ALIGN(0x4); | ||
44 | } > DRAM | ||
45 | |||
46 | .rodata : | ||
47 | { | ||
48 | *(.rodata) /* problems without this, dunno why */ | ||
49 | *(.rodata*) | ||
50 | *(.rodata.str1.1) | ||
51 | *(.rodata.str1.4) | ||
52 | . = ALIGN(0x4); | ||
53 | |||
54 | /* Pseudo-allocate the copies of the data sections */ | ||
55 | _datacopy = .; | ||
56 | } > DRAM | ||
57 | |||
58 | /* TRICK ALERT! For RAM execution, we put the .data section at the | ||
59 | same load address as the copy. Thus, we don't waste extra RAM | ||
60 | when we don't actually need the copy. */ | ||
61 | .data : AT ( _datacopy ) | ||
62 | { | ||
63 | _datastart = .; | ||
64 | *(.data*) | ||
65 | . = ALIGN(0x4); | ||
66 | _dataend = .; | ||
67 | } > DRAM | ||
68 | |||
69 | /DISCARD/ : | ||
70 | { | ||
71 | *(.eh_frame) | ||
72 | } | ||
73 | |||
74 | .vectors 0x0 : | ||
75 | { | ||
76 | _vectorsstart = .; | ||
77 | *(.vectors); | ||
78 | _vectorsend = .; | ||
79 | } AT> DRAM | ||
80 | |||
81 | _vectorscopy = LOADADDR(.vectors); | ||
82 | |||
83 | .iram : | ||
84 | { | ||
85 | _iramstart = .; | ||
86 | *(.icode) | ||
87 | *(.irodata) | ||
88 | *(.idata) | ||
89 | . = ALIGN(0x4); | ||
90 | _iramend = .; | ||
91 | } > DRAM | ||
92 | |||
93 | _iramcopy = LOADADDR(.iram); | ||
94 | |||
95 | .ibss (NOLOAD) : | ||
96 | { | ||
97 | _iedata = .; | ||
98 | *(.ibss) | ||
99 | . = ALIGN(0x4); | ||
100 | _iend = .; | ||
101 | } > DRAM | ||
102 | |||
103 | .stack : | ||
104 | { | ||
105 | *(.stack) | ||
106 | stackbegin = .; | ||
107 | . += 0x2000; | ||
108 | stackend = .; | ||
109 | } > DRAM | ||
110 | |||
111 | .bss : | ||
112 | { | ||
113 | _edata = .; | ||
114 | *(.bss*) | ||
115 | *(COMMON) | ||
116 | . = ALIGN(0x4); | ||
117 | _end = .; | ||
118 | } > DRAM | ||
119 | |||
120 | .audiobuf ALIGN(4) : | ||
121 | { | ||
122 | _audiobuffer = .; | ||
123 | audiobuffer = .; | ||
124 | } > DRAM | ||
125 | |||
126 | .audiobufend ENDAUDIOADDR: | ||
127 | { | ||
128 | audiobufend = .; | ||
129 | _audiobufend = .; | ||
130 | } > DRAM | ||
131 | |||
132 | .codec ENDAUDIOADDR: | ||
133 | { | ||
134 | codecbuf = .; | ||
135 | _codecbuf = .; | ||
136 | } | ||
137 | |||
138 | .plugin ENDADDR: | ||
139 | { | ||
140 | _pluginbuf = .; | ||
141 | pluginbuf = .; | ||
142 | } | ||
143 | } | ||
144 | |||
diff --git a/firmware/target/arm/tcc77x/ata-nand-tcc77x.c b/firmware/target/arm/tcc77x/ata-nand-tcc77x.c index dd0ae7a950..d7ae5d5ed6 100644 --- a/firmware/target/arm/tcc77x/ata-nand-tcc77x.c +++ b/firmware/target/arm/tcc77x/ata-nand-tcc77x.c | |||
@@ -32,6 +32,9 @@ int ata_spinup_time = 0; | |||
32 | 32 | ||
33 | long last_disk_activity = -1; | 33 | long last_disk_activity = -1; |
34 | 34 | ||
35 | /* Used to store (fake?) identify info */ | ||
36 | static unsigned short identify_info[256]; | ||
37 | |||
35 | /** static, private data **/ | 38 | /** static, private data **/ |
36 | static bool initialized = false; | 39 | static bool initialized = false; |
37 | 40 | ||
@@ -91,4 +94,11 @@ void ata_enable(bool on) | |||
91 | 94 | ||
92 | int ata_init(void) | 95 | int ata_init(void) |
93 | { | 96 | { |
97 | return 0; | ||
98 | } | ||
99 | |||
100 | /* TEMP: This will return junk, it's here for compilation only */ | ||
101 | unsigned short* ata_get_identify(void) | ||
102 | { | ||
103 | return identify_info; | ||
94 | } | 104 | } |
diff --git a/firmware/target/arm/tcc77x/boot.lds b/firmware/target/arm/tcc77x/boot.lds index 21fc7db96a..890c4ec785 100644 --- a/firmware/target/arm/tcc77x/boot.lds +++ b/firmware/target/arm/tcc77x/boot.lds | |||
@@ -10,16 +10,11 @@ STARTUP(target/arm/tcc77x/crt0.o) | |||
10 | #define DRAMORIG 0x20000000 | 10 | #define DRAMORIG 0x20000000 |
11 | #define IRAMORIG 0x00000000 | 11 | #define IRAMORIG 0x00000000 |
12 | #define IRAMSIZE 64K | 12 | #define IRAMSIZE 64K |
13 | #define FLASHORIG 0x0000000 | 13 | |
14 | #define FLASHSIZE 1M | ||
15 | 14 | ||
16 | MEMORY | 15 | MEMORY |
17 | { | 16 | { |
18 | #ifdef TCCBOOT | ||
19 | DRAM : ORIGIN = DRAMORIG + DRAMSIZE - 0x100000, LENGTH = 0x100000 | 17 | DRAM : ORIGIN = DRAMORIG + DRAMSIZE - 0x100000, LENGTH = 0x100000 |
20 | #else | ||
21 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE | ||
22 | #endif | ||
23 | IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE | 18 | IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE |
24 | } | 19 | } |
25 | 20 | ||
@@ -52,6 +47,7 @@ SECTIONS | |||
52 | _stackend = .; | 47 | _stackend = .; |
53 | stackend = .; | 48 | stackend = .; |
54 | } > DRAM | 49 | } > DRAM |
50 | |||
55 | .bss : { | 51 | .bss : { |
56 | _edata = .; | 52 | _edata = .; |
57 | *(.bss*); | 53 | *(.bss*); |
diff --git a/firmware/target/arm/tcc77x/crt0.S b/firmware/target/arm/tcc77x/crt0.S index e4ecb05a4e..246d02a1d7 100644 --- a/firmware/target/arm/tcc77x/crt0.S +++ b/firmware/target/arm/tcc77x/crt0.S | |||
@@ -29,6 +29,11 @@ | |||
29 | 29 | ||
30 | .section .init.text,"ax",%progbits | 30 | .section .init.text,"ax",%progbits |
31 | 31 | ||
32 | .extern irq | ||
33 | .extern fiq | ||
34 | .extern UIE | ||
35 | .extern main | ||
36 | |||
32 | .global start | 37 | .global start |
33 | 38 | ||
34 | /* Telechips firmware files start with a 32-byte header, as part of the code. */ | 39 | /* Telechips firmware files start with a 32-byte header, as part of the code. */ |
@@ -44,7 +49,8 @@ start: | |||
44 | .word 0 /* Saved entrypoint of original firmware*/ | 49 | .word 0 /* Saved entrypoint of original firmware*/ |
45 | .word 0 /* Location in RAM of the start of our bootloader */ | 50 | .word 0 /* Location in RAM of the start of our bootloader */ |
46 | #else | 51 | #else |
47 | ldr pc, =start_loc /* jump to the main entry point */ | 52 | // ldr pc, =start_loc /* jump to the main entry point */ |
53 | b start_loc | ||
48 | 54 | ||
49 | .word 0xffff0601 /* Unknown magic */ | 55 | .word 0xffff0601 /* Unknown magic */ |
50 | .word 0x3a726556 /* "Ver:" */ | 56 | .word 0x3a726556 /* "Ver:" */ |
@@ -65,21 +71,40 @@ start: | |||
65 | start_loc: | 71 | start_loc: |
66 | 72 | ||
67 | #ifdef BOOTLOADER | 73 | #ifdef BOOTLOADER |
74 | |||
75 | /* | ||
76 | If we are appended to the OF (i.e. dual-booting), do a simple GPIO | ||
77 | button check, and branch to the OF's entry point (saved by mktccboot) | ||
78 | if not active | ||
79 | */ | ||
80 | |||
68 | #ifdef TCCBOOT | 81 | #ifdef TCCBOOT |
69 | #ifdef LOGIK_DAX | ||
70 | mov r0, #0x80000000 | 82 | mov r0, #0x80000000 |
71 | ldr r0, [r0, #0x300] /* Read GPIO A */ | 83 | #ifdef LOGIK_DAX |
84 | ldr r0, [r0, #0x300] /* Hold button is GPIO A, pin 0x2 */ | ||
72 | tst r0, #0x2 | 85 | tst r0, #0x2 |
73 | ldrne pc, [pc, #-28] /* Jump to original firmware if HOLD button not pressed */ | 86 | #elif defined(SANSA_M200) |
87 | ldr r0, [r0, #0x310] /* Hold button is GPIO B, pin 0x200 */ | ||
88 | tst r0, #0x200 | ||
74 | #else | 89 | #else |
75 | #error No bootup key detection implemented for this target | 90 | #error No bootup key detection implemented for this target |
76 | #endif | 91 | #endif |
77 | 92 | ||
78 | /* Copy bootloader to safe area - 0x21000000 (DRAM) */ | 93 | ldrne pc, [pc, #-28] /* Jump to OF if HOLD button not pressed */ |
79 | /* TODO: Adjust this for other targets - DRAM + DRAMSIZE - 0x100000 */ | 94 | #endif /* TCCBOOT */ |
80 | ldr r0, [pc, #-28] | 95 | |
81 | mov r1, #0x20000000 | 96 | /* We are now definitely executing the bootloader, so we relocate to the |
82 | add r1, r1, #0x100000 | 97 | linked address (see boot.lds) - 1MB from the end of DRAM. |
98 | */ | ||
99 | |||
100 | #ifdef TCCBOOT | ||
101 | ldr r0, [pc, #-28] /* mktccboot fills in the load address */ | ||
102 | #else | ||
103 | mov r0, #0x20000000 /* Otherwise, load address is the start of DRAM */ | ||
104 | #endif | ||
105 | mov r1, #0x20000000 /* Destination: 1MB from end of DRAM */ | ||
106 | add r1, r1, #((MEM - 1) * 0x100000) | ||
107 | |||
83 | ldr r2, =_dataend | 108 | ldr r2, =_dataend |
84 | 1: | 109 | 1: |
85 | cmp r2, r1 | 110 | cmp r2, r1 |
@@ -88,16 +113,14 @@ start_loc: | |||
88 | bhi 1b | 113 | bhi 1b |
89 | 114 | ||
90 | ldr pc, =copied_start /* jump to the relocated start_loc: */ | 115 | ldr pc, =copied_start /* jump to the relocated start_loc: */ |
91 | |||
92 | copied_start: | 116 | copied_start: |
93 | #endif | 117 | #endif /* BOOTLOADER */ |
94 | #else | ||
95 | /* We don't use interrupts in the bootloader */ | ||
96 | 118 | ||
97 | /* Set up stack for IRQ mode */ | 119 | /* Set up stack for IRQ mode */ |
98 | mov r0,#0xd2 | 120 | mov r0,#0xd2 |
99 | msr cpsr, r0 | 121 | msr cpsr, r0 |
100 | ldr sp, =irq_stack | 122 | ldr sp, =irq_stack |
123 | |||
101 | /* Set up stack for FIQ mode */ | 124 | /* Set up stack for FIQ mode */ |
102 | mov r0,#0xd1 | 125 | mov r0,#0xd1 |
103 | msr cpsr, r0 | 126 | msr cpsr, r0 |
@@ -110,13 +133,22 @@ copied_start: | |||
110 | mov r0,#0xdb | 133 | mov r0,#0xdb |
111 | msr cpsr, r0 | 134 | msr cpsr, r0 |
112 | ldr sp, =irq_stack | 135 | ldr sp, =irq_stack |
113 | #endif | ||
114 | 136 | ||
115 | /* Switch to supervisor mode */ | 137 | /* Switch to supervisor mode */ |
116 | mov r0,#0xd3 | 138 | mov r0,#0xd3 |
117 | msr cpsr, r0 | 139 | msr cpsr, r0 |
118 | ldr sp, =stackend | 140 | ldr sp, =stackend |
119 | 141 | ||
142 | /* Copy exception handler code to address 0 */ | ||
143 | mov r2, #0x0 | ||
144 | ldr r3, =vectors_start | ||
145 | ldr r4, =vectors_end | ||
146 | 1: | ||
147 | cmp r4, r3 | ||
148 | ldrhi r5, [r3], #4 | ||
149 | strhi r5, [r2], #4 | ||
150 | bhi 1b | ||
151 | |||
120 | /* Initialise bss section to zero */ | 152 | /* Initialise bss section to zero */ |
121 | ldr r2, =_edata | 153 | ldr r2, =_edata |
122 | ldr r3, =_end | 154 | ldr r3, =_end |
@@ -139,9 +171,68 @@ copied_start: | |||
139 | bl main | 171 | bl main |
140 | /* main() should never return */ | 172 | /* main() should never return */ |
141 | 173 | ||
142 | #ifndef BOOTLOADER | 174 | /* Exception handlers. Will be copied to address 0 after memory remapping */ |
143 | /* We don't use interrupts in the bootloader */ | 175 | vectors_start: |
176 | ldr pc, [pc, #24] | ||
177 | ldr pc, [pc, #24] | ||
178 | ldr pc, [pc, #24] | ||
179 | ldr pc, [pc, #24] | ||
180 | ldr pc, [pc, #24] | ||
181 | ldr pc, [pc, #24] | ||
182 | ldr pc, [pc, #24] | ||
183 | ldr pc, [pc, #24] | ||
184 | |||
185 | /* Exception vectors */ | ||
186 | .global vectors | ||
187 | vectors: | ||
188 | .word start | ||
189 | .word undef_instr_handler | ||
190 | .word software_int_handler | ||
191 | .word prefetch_abort_handler | ||
192 | .word data_abort_handler | ||
193 | .word reserved_handler | ||
194 | .word irq_handler | ||
195 | .word fiq_handler | ||
196 | vectors_end: | ||
197 | |||
198 | .text | ||
199 | |||
200 | /* All illegal exceptions call into UIE with exception address as first | ||
201 | parameter. This is calculated differently depending on which exception | ||
202 | we're in. Second parameter is exception number, used for a string lookup | ||
203 | in UIE. | ||
204 | */ | ||
205 | undef_instr_handler: | ||
206 | mov r0, lr | ||
207 | mov r1, #0 | ||
208 | b UIE | ||
144 | 209 | ||
210 | /* We run supervisor mode most of the time, and should never see a software | ||
211 | exception being thrown. Perhaps make it illegal and call UIE? | ||
212 | */ | ||
213 | software_int_handler: | ||
214 | reserved_handler: | ||
215 | movs pc, lr | ||
216 | |||
217 | prefetch_abort_handler: | ||
218 | sub r0, lr, #4 | ||
219 | mov r1, #1 | ||
220 | b UIE | ||
221 | |||
222 | data_abort_handler: | ||
223 | sub r0, lr, #8 | ||
224 | mov r1, #2 | ||
225 | b UIE | ||
226 | |||
227 | irq_handler: | ||
228 | stmfd sp!, {r0-r3, r12, lr} | ||
229 | bl irq | ||
230 | ldmfd sp!, {r0-r3, r12, lr} | ||
231 | subs pc, lr, #4 | ||
232 | |||
233 | /* Align stacks to cache line boundary */ | ||
234 | .balign 16 | ||
235 | |||
145 | /* 256 words of IRQ stack */ | 236 | /* 256 words of IRQ stack */ |
146 | .space 256*4 | 237 | .space 256*4 |
147 | irq_stack: | 238 | irq_stack: |
@@ -150,4 +241,3 @@ irq_stack: | |||
150 | .space 256*4 | 241 | .space 256*4 |
151 | fiq_stack: | 242 | fiq_stack: |
152 | 243 | ||
153 | #endif | ||
diff --git a/firmware/target/arm/tcc77x/debug-target.h b/firmware/target/arm/tcc77x/debug-target.h new file mode 100644 index 0000000000..07e8fc4322 --- /dev/null +++ b/firmware/target/arm/tcc77x/debug-target.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Karl Kurbjun | ||
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 | |||
20 | bool __dbg_hw_info(void); | ||
21 | bool __dbg_ports(void); | ||
22 | |||
diff --git a/firmware/target/arm/tcc77x/debug-tcc77x.c b/firmware/target/arm/tcc77x/debug-tcc77x.c new file mode 100644 index 0000000000..dc3db3926f --- /dev/null +++ b/firmware/target/arm/tcc77x/debug-tcc77x.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Rob Purchase | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "cpu.h" | ||
22 | #include "system.h" | ||
23 | #include "string.h" | ||
24 | #include <stdbool.h> | ||
25 | #include "button.h" | ||
26 | #include "lcd.h" | ||
27 | #include "sprintf.h" | ||
28 | #include "font.h" | ||
29 | #include "debug-target.h" | ||
30 | #include "adc.h" | ||
31 | |||
32 | bool __dbg_ports(void) | ||
33 | { | ||
34 | return false; | ||
35 | } | ||
36 | |||
37 | bool __dbg_hw_info(void) | ||
38 | { | ||
39 | int line = 0, i, button, oldline; | ||
40 | bool done=false; | ||
41 | char buf[100]; | ||
42 | |||
43 | lcd_setmargins(0, 0); | ||
44 | lcd_setfont(FONT_SYSFIXED); | ||
45 | lcd_clear_display(); | ||
46 | |||
47 | /* Put all the static text before the while loop */ | ||
48 | lcd_puts(0, line++, "[Hardware info]"); | ||
49 | |||
50 | line++; | ||
51 | oldline=line; | ||
52 | while(!done) | ||
53 | { | ||
54 | line = oldline; | ||
55 | button = button_get(false); | ||
56 | |||
57 | button &= ~BUTTON_REPEAT; | ||
58 | |||
59 | if (button == BUTTON_SELECT) | ||
60 | done=true; | ||
61 | |||
62 | snprintf(buf, sizeof(buf), "current tick: %08x Seconds running: %08d", | ||
63 | (unsigned int)current_tick, (unsigned int)current_tick/100); lcd_puts(0, line++, buf); | ||
64 | |||
65 | snprintf(buf, sizeof(buf), "GPIOA: 0x%08x GPIOB: 0x%08x", | ||
66 | (unsigned int)GPIOA, (unsigned int)GPIOB); lcd_puts(0, line++, buf); | ||
67 | snprintf(buf, sizeof(buf), "GPIOC: 0x%08x GPIOD: 0x%08x", | ||
68 | (unsigned int)GPIOC, (unsigned int)GPIOD); lcd_puts(0, line++, buf); | ||
69 | snprintf(buf, sizeof(buf), "GPIOE: 0x%08x", | ||
70 | (unsigned int)GPIOE); lcd_puts(0, line++, buf); | ||
71 | |||
72 | for (i = 0; i<4; i++) | ||
73 | { | ||
74 | snprintf(buf, sizeof(buf), "ADC%d: 0x%04x", i, adc_read(i)); | ||
75 | lcd_puts(0, line++, buf); | ||
76 | } | ||
77 | |||
78 | lcd_update(); | ||
79 | } | ||
80 | return false; | ||
81 | } | ||
diff --git a/firmware/target/arm/tcc77x/i2c-target.h b/firmware/target/arm/tcc77x/i2c-target.h new file mode 100644 index 0000000000..4600b8a576 --- /dev/null +++ b/firmware/target/arm/tcc77x/i2c-target.h | |||
@@ -0,0 +1,37 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Rob Purchase | ||
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 I2C_TARGET_H | ||
20 | #define I2C_TARGET_H | ||
21 | |||
22 | /* Definitions for the TCC77X I2C bus */ | ||
23 | |||
24 | #define SDA_BIT (1<<10) | ||
25 | #define SCL_BIT (1<<11) | ||
26 | |||
27 | #define SCL (GPIOB & SCL_BIT) | ||
28 | #define SCL_HI GPIOB |= SCL_BIT | ||
29 | #define SCL_LO GPIOB &= ~SCL_BIT | ||
30 | |||
31 | #define SDA (GPIOB & SDA_BIT) | ||
32 | #define SDA_HI GPIOB |= SDA_BIT | ||
33 | #define SDA_LO GPIOB &= ~SDA_BIT | ||
34 | #define SDA_INPUT GPIOB_DIR &= ~SDA_BIT | ||
35 | #define SDA_OUTPUT GPIOB_DIR |= SDA_BIT | ||
36 | |||
37 | #endif /* I2C_TARGET_H */ | ||
diff --git a/firmware/target/arm/tcc77x/kernel-tcc77x.c b/firmware/target/arm/tcc77x/kernel-tcc77x.c new file mode 100644 index 0000000000..17c6ff0734 --- /dev/null +++ b/firmware/target/arm/tcc77x/kernel-tcc77x.c | |||
@@ -0,0 +1,45 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Rob Purchase | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "system.h" | ||
22 | #include "kernel.h" | ||
23 | #include "timer.h" | ||
24 | #include "thread.h" | ||
25 | |||
26 | void tick_start(unsigned int interval_in_ms) | ||
27 | { | ||
28 | /* configure Timer T-Clock to 2Mhz (clock source 4 (Xin) divided by 6) */ | ||
29 | PCLKCFG4 = (1 << 31) | (4 << 28) | (5 << 16); | ||
30 | |||
31 | /* disable Timer0 */ | ||
32 | TCFG0 &= ~1; | ||
33 | |||
34 | /* set counter reference value based on 1Mhz tick */ | ||
35 | TREF0 = interval_in_ms * 1000; | ||
36 | |||
37 | /* Timer0 = reset to 0, divide=2, IRQ enable, enable (continuous) */ | ||
38 | TCFG0 = (1<<8) | (0<<4) | (1<<3) | 1; | ||
39 | |||
40 | /* Unmask timer IRQ */ | ||
41 | IEN |= TIMER0_IRQ_MASK; | ||
42 | } | ||
43 | |||
44 | /* NB: Since we are using a single timer IRQ, tick tasks are dispatched as | ||
45 | part of the central timer IRQ processing in timer-tcc77x.c */ | ||
diff --git a/firmware/target/arm/tcc77x/lcd-ssd1815.c b/firmware/target/arm/tcc77x/lcd-ssd1815.c index 4101f6ab7d..feb8bf1765 100644 --- a/firmware/target/arm/tcc77x/lcd-ssd1815.c +++ b/firmware/target/arm/tcc77x/lcd-ssd1815.c | |||
@@ -208,7 +208,7 @@ void lcd_blit_mono(const unsigned char *data, int x, int by, int width, | |||
208 | 208 | ||
209 | /* Performance function that works with an external buffer | 209 | /* Performance function that works with an external buffer |
210 | note that by and bheight are in 8-pixel units! */ | 210 | note that by and bheight are in 8-pixel units! */ |
211 | void lcd_blit_grey_phase_blit(unsigned char *values, unsigned char *phases, | 211 | void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases, |
212 | int x, int by, int width, int bheight, int stride) | 212 | int x, int by, int width, int bheight, int stride) |
213 | { | 213 | { |
214 | (void)values; | 214 | (void)values; |
diff --git a/firmware/target/arm/tcc77x/m200/adc-target.h b/firmware/target/arm/tcc77x/m200/adc-target.h new file mode 100644 index 0000000000..96fb1e44aa --- /dev/null +++ b/firmware/target/arm/tcc77x/m200/adc-target.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 Dave Chapman | ||
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_BUTTONS 1 | ||
25 | |||
26 | #endif /* _ADC_TARGET_H_ */ | ||
diff --git a/firmware/target/arm/tcc77x/m200/backlight-target.h b/firmware/target/arm/tcc77x/m200/backlight-target.h new file mode 100644 index 0000000000..a54aa4686d --- /dev/null +++ b/firmware/target/arm/tcc77x/m200/backlight-target.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Dave Chapman | ||
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 BACKLIGHT_TARGET_H | ||
20 | #define BACKLIGHT_TARGET_H | ||
21 | |||
22 | #include "tcc77x.h" | ||
23 | |||
24 | static inline bool _backlight_init(void) | ||
25 | { | ||
26 | GPIOA_DIR |= 0x40; | ||
27 | return true; | ||
28 | } | ||
29 | |||
30 | static inline void _backlight_on(void) | ||
31 | { | ||
32 | /* Enable backlight */ | ||
33 | GPIOA |= 0x40; | ||
34 | } | ||
35 | |||
36 | static inline void _backlight_off(void) | ||
37 | { | ||
38 | /* Disable backlight */ | ||
39 | GPIOA &= ~0x40; | ||
40 | } | ||
41 | |||
42 | #endif | ||
diff --git a/firmware/target/arm/tcc77x/m200/button-m200.c b/firmware/target/arm/tcc77x/m200/button-m200.c new file mode 100644 index 0000000000..fec745ae99 --- /dev/null +++ b/firmware/target/arm/tcc77x/m200/button-m200.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Dave Chapman | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "cpu.h" | ||
22 | #include "button.h" | ||
23 | #include "adc.h" | ||
24 | |||
25 | /* | ||
26 | |||
27 | Results of button testing (viewing ADC values whilst pressing buttons): | ||
28 | |||
29 | HOLD: GPIOB & 0x0200 (0=hold active, 0x0200 = hold inactive) | ||
30 | |||
31 | ADC[1]: (approx values) | ||
32 | |||
33 | Idle - 0x3ff | ||
34 | MENU - unknown | ||
35 | |||
36 | REPEAT/AB - 0x03? | ||
37 | LEFT - 0x07?-0x08? | ||
38 | SELECT - 0x0c? | ||
39 | RIGHT - 0x11? | ||
40 | |||
41 | PLAY/PAUSE - 0x17?-0x018? | ||
42 | VOL UP - 0x1e?-0x01f? | ||
43 | VOL DOWN - 0x26? | ||
44 | |||
45 | */ | ||
46 | |||
47 | void button_init_device(void) | ||
48 | { | ||
49 | /* Nothing to do */ | ||
50 | } | ||
51 | |||
52 | int button_read_device(void) | ||
53 | { | ||
54 | int btn = BUTTON_NONE; | ||
55 | int adc; | ||
56 | |||
57 | /* TODO - determine how to detect BUTTON_MENU - it doesn't appear to | ||
58 | be connected to a GPIO or to an ADC | ||
59 | */ | ||
60 | |||
61 | adc = adc_read(ADC_BUTTONS); | ||
62 | |||
63 | if (adc < 0x384) { | ||
64 | if (adc < 0x140) { | ||
65 | if (adc < 0x96) { | ||
66 | if (adc < 0x50) { | ||
67 | btn |= BUTTON_REPEATAB; /* 0x00..0x4f */ | ||
68 | } else { | ||
69 | btn |= BUTTON_LEFT; /* 0x50..0x95 */ | ||
70 | } | ||
71 | } else { | ||
72 | if (adc < 0xe0) { | ||
73 | btn |= BUTTON_SELECT; /* 0x96..0xdf */ | ||
74 | } else { | ||
75 | btn |= BUTTON_RIGHT; /* 0xe0..0x13f */ | ||
76 | } | ||
77 | } | ||
78 | } else { | ||
79 | if (adc < 0x208) { | ||
80 | if (adc < 0x1b0) { | ||
81 | btn |= BUTTON_PLAYPAUSE; /* 0x140..0x1af */ | ||
82 | } else { | ||
83 | btn |= BUTTON_VOLUP; /* 0x1b0..0x207 */ | ||
84 | } | ||
85 | } else { | ||
86 | btn |= BUTTON_VOLDOWN; /* 0x209..0x383 */ | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | |||
91 | return btn; | ||
92 | } | ||
93 | |||
94 | bool button_hold(void) | ||
95 | { | ||
96 | return (GPIOB & 0x200)?false:true; | ||
97 | } | ||
diff --git a/firmware/target/arm/tcc77x/m200/button-target.h b/firmware/target/arm/tcc77x/m200/button-target.h new file mode 100644 index 0000000000..da7c82e6b2 --- /dev/null +++ b/firmware/target/arm/tcc77x/m200/button-target.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Dave Chapman | ||
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 | |||
20 | #ifndef _BUTTON_TARGET_H_ | ||
21 | #define _BUTTON_TARGET_H_ | ||
22 | |||
23 | #include <stdbool.h> | ||
24 | #include "config.h" | ||
25 | |||
26 | #define HAS_BUTTON_HOLD | ||
27 | |||
28 | void button_init_device(void); | ||
29 | int button_read_device(void); | ||
30 | bool button_hold(void); | ||
31 | |||
32 | /* Main unit's buttons */ | ||
33 | #define BUTTON_MENU 0x00000001 | ||
34 | #define BUTTON_VOLUP 0x00000002 | ||
35 | #define BUTTON_VOLDOWN 0x00000004 | ||
36 | #define BUTTON_PLAYPAUSE 0x00000008 | ||
37 | #define BUTTON_REPEATAB 0x00000010 | ||
38 | #define BUTTON_LEFT 0x00000020 | ||
39 | #define BUTTON_RIGHT 0x00000040 | ||
40 | #define BUTTON_SELECT 0x00000080 | ||
41 | |||
42 | #define BUTTON_MAIN (BUTTON_MENU|BUTTON_VOLUP|BUTTON_VOLDOWN\ | ||
43 | |BUTTON_PLAYPAUSE|BUTTON_REPEATAB|BUTTON_LEFT\ | ||
44 | |BUTTON_RIGHT|BUTTON_SELECT) | ||
45 | |||
46 | #define BUTTON_REMOTE 0 | ||
47 | |||
48 | /* Software power-off */ | ||
49 | #define POWEROFF_BUTTON BUTTON_MENU | ||
50 | #define POWEROFF_COUNT 40 | ||
51 | |||
52 | #endif /* _BUTTON_TARGET_H_ */ | ||
diff --git a/firmware/target/arm/tcc77x/m200/power-m200.c b/firmware/target/arm/tcc77x/m200/power-m200.c new file mode 100644 index 0000000000..df2ee10d6b --- /dev/null +++ b/firmware/target/arm/tcc77x/m200/power-m200.c | |||
@@ -0,0 +1,66 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 Dave Chapman | ||
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 <stdbool.h> | ||
22 | #include "kernel.h" | ||
23 | #include "system.h" | ||
24 | #include "power.h" | ||
25 | |||
26 | #ifndef SIMULATOR | ||
27 | |||
28 | void power_init(void) | ||
29 | { | ||
30 | } | ||
31 | |||
32 | void ide_power_enable(bool on) | ||
33 | { | ||
34 | } | ||
35 | |||
36 | bool ide_powered(void) | ||
37 | { | ||
38 | return true; | ||
39 | } | ||
40 | |||
41 | void power_off(void) | ||
42 | { | ||
43 | } | ||
44 | |||
45 | #else /* SIMULATOR */ | ||
46 | |||
47 | bool charger_inserted(void) | ||
48 | { | ||
49 | return false; | ||
50 | } | ||
51 | |||
52 | void charger_enable(bool on) | ||
53 | { | ||
54 | (void)on; | ||
55 | } | ||
56 | |||
57 | void power_off(void) | ||
58 | { | ||
59 | } | ||
60 | |||
61 | void ide_power_enable(bool on) | ||
62 | { | ||
63 | (void)on; | ||
64 | } | ||
65 | |||
66 | #endif /* SIMULATOR */ | ||
diff --git a/firmware/target/arm/tcc77x/pcm-tcc77x.c b/firmware/target/arm/tcc77x/pcm-tcc77x.c new file mode 100644 index 0000000000..953f550612 --- /dev/null +++ b/firmware/target/arm/tcc77x/pcm-tcc77x.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by [whoever fills in these functions] | ||
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 "system.h" | ||
20 | #include "kernel.h" | ||
21 | #include "logf.h" | ||
22 | #include "audio.h" | ||
23 | #include "sound.h" | ||
24 | #include "file.h" | ||
25 | |||
26 | void pcm_postinit(void) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | const void * pcm_play_dma_get_peak_buffer(int *count) | ||
31 | { | ||
32 | (void)count; | ||
33 | return 0; | ||
34 | } | ||
35 | |||
36 | void pcm_play_dma_init(void) | ||
37 | { | ||
38 | } | ||
39 | |||
40 | void pcm_apply_settings(void) | ||
41 | { | ||
42 | } | ||
43 | |||
44 | void pcm_set_frequency(unsigned int frequency) | ||
45 | { | ||
46 | (void)frequency; | ||
47 | } | ||
48 | |||
49 | void pcm_play_dma_start(const void *addr, size_t size) | ||
50 | { | ||
51 | (void)addr; | ||
52 | (void)size; | ||
53 | } | ||
54 | |||
55 | void pcm_play_dma_stop(void) | ||
56 | { | ||
57 | } | ||
58 | |||
59 | void pcm_play_lock(void) | ||
60 | { | ||
61 | } | ||
62 | |||
63 | void pcm_play_unlock(void) | ||
64 | { | ||
65 | } | ||
66 | |||
67 | void pcm_play_dma_pause(bool pause) | ||
68 | { | ||
69 | (void)pause; | ||
70 | } | ||
71 | |||
72 | size_t pcm_get_bytes_waiting(void) | ||
73 | { | ||
74 | return 0; | ||
75 | } | ||
diff --git a/firmware/target/arm/tcc77x/powermgmt-tcc77x.c b/firmware/target/arm/tcc77x/powermgmt-tcc77x.c new file mode 100644 index 0000000000..20172c00ce --- /dev/null +++ b/firmware/target/arm/tcc77x/powermgmt-tcc77x.c | |||
@@ -0,0 +1,64 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Karl Kurbjun | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "adc.h" | ||
22 | #include "powermgmt.h" | ||
23 | #include "kernel.h" | ||
24 | #include "pcf50606.h" | ||
25 | |||
26 | unsigned short current_voltage = 3910; | ||
27 | |||
28 | const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] = | ||
29 | { | ||
30 | /* FIXME: calibrate value */ | ||
31 | 3380 | ||
32 | }; | ||
33 | |||
34 | const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] = | ||
35 | { | ||
36 | /* FIXME: calibrate value */ | ||
37 | 3300 | ||
38 | }; | ||
39 | |||
40 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ | ||
41 | const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] = | ||
42 | { | ||
43 | /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ | ||
44 | { 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 } | ||
45 | }; | ||
46 | |||
47 | #if CONFIG_CHARGING | ||
48 | /* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ | ||
49 | const unsigned short percent_to_volt_charge[11] = | ||
50 | { | ||
51 | /* FIXME: calibrate values. Table is "inherited" from iPod-PCF / H100 */ | ||
52 | 3370, 3650, 3700, 3740, 3780, 3820, 3870, 3930, 4000, 4080, 4160 | ||
53 | }; | ||
54 | #endif /* CONFIG_CHARGING */ | ||
55 | |||
56 | #define BATTERY_SCALE_FACTOR 6000 | ||
57 | /* full-scale ADC readout (2^10) in millivolt */ | ||
58 | |||
59 | /* Returns battery voltage from ADC [millivolts] */ | ||
60 | unsigned int battery_adc_voltage(void) | ||
61 | { | ||
62 | return current_voltage; | ||
63 | } | ||
64 | |||
diff --git a/firmware/target/arm/tcc77x/system-tcc77x.c b/firmware/target/arm/tcc77x/system-tcc77x.c index baa1641c78..7323b0ce55 100644 --- a/firmware/target/arm/tcc77x/system-tcc77x.c +++ b/firmware/target/arm/tcc77x/system-tcc77x.c | |||
@@ -21,6 +21,28 @@ | |||
21 | #include "system.h" | 21 | #include "system.h" |
22 | #include "panic.h" | 22 | #include "panic.h" |
23 | 23 | ||
24 | extern void TIMER(void); | ||
25 | |||
26 | void irq(void) | ||
27 | { | ||
28 | int irq = IREQ & 0x7fffffff; | ||
29 | CREQ = irq; /* Clears the corresponding IRQ status */ | ||
30 | |||
31 | if (irq & TIMER0_IRQ_MASK) | ||
32 | { | ||
33 | TIMER(); | ||
34 | } | ||
35 | else | ||
36 | { | ||
37 | panicf("Unhandled IRQ 0x%08X", irq); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | void fiq_handler(void) | ||
42 | { | ||
43 | /* TODO */ | ||
44 | } | ||
45 | |||
24 | void system_reboot(void) | 46 | void system_reboot(void) |
25 | { | 47 | { |
26 | } | 48 | } |
@@ -49,7 +71,7 @@ static void gpio_init(void) | |||
49 | GPIOB_DIR = 0x6ffff; | 71 | GPIOB_DIR = 0x6ffff; |
50 | GPIOB = 0; | 72 | GPIOB = 0; |
51 | GPIOC_FUNC = 1; | 73 | GPIOC_FUNC = 1; |
52 | GPIOC_DIR = 0x03ffffff; /* mvn r2, 0xfc000000 */ | 74 | GPIOC_DIR = 0x03ffffff; /* mvn r2, 0xfc000000 */ |
53 | GPIOC = 0; | 75 | GPIOC = 0; |
54 | } | 76 | } |
55 | #elif defined(IAUDIO_7) | 77 | #elif defined(IAUDIO_7) |
@@ -72,6 +94,11 @@ static void gpio_init(void) | |||
72 | GPIOD_DIR = 0x3e3; | 94 | GPIOD_DIR = 0x3e3; |
73 | GPIOE_DIR = 0x88; | 95 | GPIOE_DIR = 0x88; |
74 | } | 96 | } |
97 | #elif defined(SANSA_M200) | ||
98 | static void gpio_init(void) | ||
99 | { | ||
100 | /* TODO - Implement for M200 */ | ||
101 | } | ||
75 | #endif | 102 | #endif |
76 | 103 | ||
77 | /* Second function called in the original firmware's startup code - we just | 104 | /* Second function called in the original firmware's startup code - we just |
@@ -80,14 +107,16 @@ static void clock_init(void) | |||
80 | { | 107 | { |
81 | unsigned int i; | 108 | unsigned int i; |
82 | 109 | ||
110 | /* STP = 0x1, PW = 0x04 , HLD = 0x0 */ | ||
83 | CSCFG3 = (CSCFG3 &~ 0x3fff) | 0x820; | 111 | CSCFG3 = (CSCFG3 &~ 0x3fff) | 0x820; |
84 | 112 | ||
113 | /* XIN=External main, Fcpu=Fsys, BCKDIV=1 (Fbus = Fsys / 2) */ | ||
85 | CLKCTRL = (CLKCTRL & ~0xff) | 0x14; | 114 | CLKCTRL = (CLKCTRL & ~0xff) | 0x14; |
86 | 115 | ||
87 | if (BMI & 0x20) | 116 | if (BMI & 0x20) |
88 | PCLKCFG0 = 0xc82d7000; | 117 | PCLKCFG0 = 0xc82d7000; /* EN1 = 1, XIN=Ext. main, DIV1 = 0x2d, P1 = 1 */ |
89 | else | 118 | else |
90 | PCLKCFG0 = 0xc8ba7000; | 119 | PCLKCFG0 = 0xc8ba7000; /* EN1 = 1, XIN=Ext. main, DIV1 = 0xba, P1 = 1 */ |
91 | 120 | ||
92 | MCFG |= 0x2000; | 121 | MCFG |= 0x2000; |
93 | 122 | ||
@@ -96,14 +125,20 @@ static void clock_init(void) | |||
96 | SDCFG = (SDCFG & ~0x7000) | 0x2000; | 125 | SDCFG = (SDCFG & ~0x7000) | 0x2000; |
97 | #endif | 126 | #endif |
98 | 127 | ||
128 | /* Disable PLL */ | ||
99 | PLL0CFG |= 0x80000000; | 129 | PLL0CFG |= 0x80000000; |
100 | 130 | ||
131 | /* Enable PLL, M=0xcf, P=0x13. m=M+8, p=P+2, S = 0 | ||
132 | Fout = (215/21)*12MHz = 122857142Hz */ | ||
101 | PLL0CFG = 0x0000cf13; | 133 | PLL0CFG = 0x0000cf13; |
102 | 134 | ||
103 | i = 8000; | 135 | i = 8000; |
104 | while (--i) {}; | 136 | while (--i) {}; |
105 | 137 | ||
106 | CLKDIV0 = 0x81000000; | 138 | /* Enable PLL0 */ |
139 | CLKDIVC = 0x81000000; | ||
140 | |||
141 | /* Fsys = PLL0, Fcpu = Fsys, Fbus=Fsys / 2 */ | ||
107 | CLKCTRL = 0x80000010; | 142 | CLKCTRL = 0x80000010; |
108 | 143 | ||
109 | asm volatile ( | 144 | asm volatile ( |
@@ -112,13 +147,118 @@ static void clock_init(void) | |||
112 | ); | 147 | ); |
113 | } | 148 | } |
114 | 149 | ||
150 | static void cpu_init(void) | ||
151 | { | ||
152 | /* Memory protection - see page 48 of ARM946 TRM | ||
153 | http://infocenter.arm.com/help/topic/com.arm.doc.ddi0201d/DDI0201D_arm946es_r1p1_trm.pdf | ||
154 | */ | ||
155 | asm volatile ( | ||
156 | /* Region 0 - addr=0, size=4GB, enabled */ | ||
157 | "mov r0, #0x3f \n\t" | ||
158 | "mcr p15, 0, r0, c6, c0, 0 \n\t" | ||
159 | "mcr p15, 0, r0, c6, c0, 1 \n\t" | ||
160 | |||
161 | #ifdef LOGIK_DAX | ||
162 | /* Address region 1 - addr 0x2fff0000, size=64KB, enabled*/ | ||
163 | "ldr r0, =0x2fff001f \n\t" | ||
164 | #elif defined(IAUDIO_7) | ||
165 | /* Address region 1 - addr 0x20000000, size=8KB, enabled*/ | ||
166 | "mov r0, #0x19 \n\t" | ||
167 | "add r0, r0, #0x20000000 \n\t" | ||
168 | #elif defined(SANSA_M200) | ||
169 | /* Address region 1 - addr 0x20000000, size=256MB, enabled*/ | ||
170 | "mov r0, #0x37 \n\t" | ||
171 | "add r0, r0, #0x20000000 \n\t" | ||
172 | #endif | ||
173 | "mcr p15, 0, r0, c6, c1, 0 \n\t" | ||
174 | "mcr p15, 0, r0, c6, c1, 1 \n\t" | ||
175 | |||
176 | /* Address region 2 - addr 0x30000000, size=256MB, enabled*/ | ||
177 | "mov r0, #0x37 \n\t" | ||
178 | "add r0, r0, #0x30000000 \n\t" | ||
179 | "mcr p15, 0, r0, c6, c2, 0 \n\t" | ||
180 | "mcr p15, 0, r0, c6, c2, 1 \n\t" | ||
181 | |||
182 | /* Address region 2 - addr 0x40000000, size=512MB, enabled*/ | ||
183 | "mov r0, #0x39 \n\t" | ||
184 | "add r0, r0, #0x40000000 \n\t" | ||
185 | "mcr p15, 0, r0, c6, c3, 0 \n\t" | ||
186 | "mcr p15, 0, r0, c6, c3, 1 \n\t" | ||
187 | |||
188 | /* Address region 4 - addr 0x60000000, size=256MB, enabled*/ | ||
189 | "mov r0, #0x37 \n\t" | ||
190 | "add r0, r0, #0x60000000 \n\t" | ||
191 | "mcr p15, 0, r0, c6, c4, 0 \n\t" | ||
192 | "mcr p15, 0, r0, c6, c4, 1 \n\t" | ||
193 | |||
194 | /* Address region 5 - addr 0x10000000, size=256MB, enabled*/ | ||
195 | "mov r0, #0x37 \n\t" | ||
196 | "add r0, r0, #0x10000000 \n\t" | ||
197 | "mcr p15, 0, r0, c6, c5, 0 \n\t" | ||
198 | "mcr p15, 0, r0, c6, c5, 1 \n\t" | ||
199 | |||
200 | /* Address region 6 - addr 0x80000000, size=2GB, enabled*/ | ||
201 | "mov r0, #0x37 \n\t" | ||
202 | "add r0, r0, #0x80000006 \n\t" | ||
203 | "mcr p15, 0, r0, c6, c6, 0 \n\t" | ||
204 | "mcr p15, 0, r0, c6, c6, 1 \n\t" | ||
205 | |||
206 | /* Address region 7 - addr 0x3000f000, size=4KB, enabled*/ | ||
207 | "ldr r0, =0x3000f017 \n\t" | ||
208 | "mcr p15, 0, r0, c6, c7, 0 \n\t" | ||
209 | "mcr p15, 0, r0, c6, c7, 1 \n\t" | ||
210 | |||
211 | |||
212 | /* Register 5 - Access Permission Registers */ | ||
213 | |||
214 | "ldr r0, =0xffff \n\t" | ||
215 | "mcr p15, 0, r0, c5, c0, 0 \n\t" /* write data access permission bits */ | ||
216 | "mcr p15, 0, r0, c5, c0, 1 \n\t" /* write instruction access permission bits */ | ||
217 | |||
218 | "mov r0, #0xa7 \n\t" | ||
219 | "mcr p15, 0, r0, c3, c0, 0 \n\t" /* set write buffer control register */ | ||
220 | |||
221 | #ifdef LOGIK_DAX | ||
222 | "mov r0, #0xa5 \n\t" | ||
223 | #elif defined(IAUDIO_7) || defined(SANSA_M200) | ||
224 | "mov r0, #0xa7 \n\t" | ||
225 | #elif | ||
226 | #error NOT DEFINED FOR THIS TARGET! | ||
227 | #endif | ||
228 | "mcr p15, 0, r0, c2, c0, 0 \n\t" | ||
229 | "mcr p15, 0, r0, c2, c0, 1 \n\t" | ||
230 | |||
231 | "mov r0, #0xa0000006 \n\t" | ||
232 | "mcr p15, 0, r0, c9, c1, 0 \n\t" | ||
233 | |||
234 | "ldr r1, =0x1107d \n\t" | ||
235 | "mov r0, #0x0 \n\t" | ||
236 | "mcr p15, 0, r0, c7, c5, 0 \n\t" /* Flush instruction cache */ | ||
237 | "mcr p15, 0, r0, c7, c6, 0 \n\t" /* Flush data cache */ | ||
238 | |||
239 | "mcr p15, 0, r1, c1, c0, 0 \n\t" /* CPU control bits */ | ||
240 | : : : "r0", "r1" | ||
241 | ); | ||
242 | } | ||
243 | |||
244 | |||
115 | 245 | ||
116 | void system_init(void) | 246 | void system_init(void) |
117 | { | 247 | { |
118 | /* TODO: cache init - the original firmwares have cache init code which | 248 | /* mask all interrupts */ |
119 | is called at the very start of the firmware */ | 249 | IEN = 0; |
250 | |||
251 | /* Set all interrupts as IRQ for now - some may need to be FIQ in future */ | ||
252 | IRQSEL = 0xffffffff; | ||
253 | |||
254 | /* Set master enable bit */ | ||
255 | IEN = 0x80000000; | ||
256 | |||
257 | cpu_init(); | ||
120 | clock_init(); | 258 | clock_init(); |
121 | gpio_init(); | 259 | gpio_init(); |
260 | |||
261 | enable_irq(); | ||
122 | } | 262 | } |
123 | 263 | ||
124 | int system_memory_guard(int newmode) | 264 | int system_memory_guard(int newmode) |
diff --git a/firmware/target/arm/tcc77x/timer-target.h b/firmware/target/arm/tcc77x/timer-target.h new file mode 100644 index 0000000000..db25df7cd4 --- /dev/null +++ b/firmware/target/arm/tcc77x/timer-target.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Karl Kurbjun | ||
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 TIMER_TARGET_H | ||
20 | #define TIMER_TARGET_H | ||
21 | |||
22 | /* timers are based on XIN (12Mhz) */ | ||
23 | #define TIMER_FREQ (12000000) | ||
24 | |||
25 | bool __timer_set(long cycles, bool set); | ||
26 | bool __timer_register(void); | ||
27 | void __timer_unregister(void); | ||
28 | |||
29 | #define __TIMER_SET(cycles, set) \ | ||
30 | __timer_set(cycles, set) | ||
31 | |||
32 | #define __TIMER_REGISTER(reg_prio, unregister_callback, cycles, \ | ||
33 | int_prio, timer_callback) \ | ||
34 | __timer_register() | ||
35 | |||
36 | #define __TIMER_UNREGISTER(...) \ | ||
37 | __timer_unregister() | ||
38 | |||
39 | #endif /* TIMER_TARGET_H */ | ||
diff --git a/firmware/target/arm/tcc77x/timer-tcc77x.c b/firmware/target/arm/tcc77x/timer-tcc77x.c new file mode 100644 index 0000000000..32010b2d25 --- /dev/null +++ b/firmware/target/arm/tcc77x/timer-tcc77x.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Rob Purchase | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "cpu.h" | ||
22 | #include "system.h" | ||
23 | #include "timer.h" | ||
24 | #include "logf.h" | ||
25 | |||
26 | /* Use the TC32 counter [sourced by Xin:12Mhz] for this timer, as it's the | ||
27 | only one that allows a 32-bit counter (Timer0-5 are 16/20 bit only). */ | ||
28 | |||
29 | bool __timer_set(long cycles, bool start) | ||
30 | { | ||
31 | #warning function not implemented | ||
32 | |||
33 | (void)cycles; | ||
34 | (void)start; | ||
35 | return false; | ||
36 | } | ||
37 | |||
38 | bool __timer_register(void) | ||
39 | { | ||
40 | #warning function not implemented | ||
41 | |||
42 | return false; | ||
43 | } | ||
44 | |||
45 | void __timer_unregister(void) | ||
46 | { | ||
47 | #warning function not implemented | ||
48 | } | ||
49 | |||
50 | |||
51 | /* Timer interrupt processing - all timers (inc. tick) have a single IRQ */ | ||
52 | |||
53 | extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void); | ||
54 | |||
55 | void TIMER(void) | ||
56 | { | ||
57 | if (TIREQ & TF0) /* Timer0 reached ref value */ | ||
58 | { | ||
59 | int i; | ||
60 | |||
61 | /* Run through the list of tick tasks */ | ||
62 | for(i = 0; i < MAX_NUM_TICK_TASKS; i++) | ||
63 | { | ||
64 | if(tick_funcs[i]) | ||
65 | { | ||
66 | tick_funcs[i](); | ||
67 | } | ||
68 | } | ||
69 | current_tick++; | ||
70 | |||
71 | /* reset Timer 0 IRQ & ref flags */ | ||
72 | TIREQ |= TI0 | TF0; | ||
73 | } | ||
74 | |||
75 | if (TC32IRQ & (1<<3)) /* end of TC32 prescale */ | ||
76 | { | ||
77 | /* dispatch timer */ | ||
78 | } | ||
79 | } | ||
diff --git a/firmware/target/arm/tcc77x/usb-tcc77x.c b/firmware/target/arm/tcc77x/usb-tcc77x.c new file mode 100644 index 0000000000..7254b919a7 --- /dev/null +++ b/firmware/target/arm/tcc77x/usb-tcc77x.c | |||
@@ -0,0 +1,36 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by [whoever fills in these functions] | ||
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 | |||
20 | #include "config.h" | ||
21 | #include "usb.h" | ||
22 | |||
23 | void usb_init_device(void) | ||
24 | { | ||
25 | } | ||
26 | |||
27 | void usb_enable(bool on) | ||
28 | { | ||
29 | (void)on; | ||
30 | } | ||
31 | |||
32 | /* Always return false for now */ | ||
33 | int usb_detect(void) | ||
34 | { | ||
35 | return USB_EXTRACTED; | ||
36 | } | ||