annotate src/cs/drivers/drv_app/ffs/board/amdsbdrv.c @ 72:4484ab3f6ab3

FFS interrupt voodoo: made original TMS470 approach work with gcc
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 20 Jul 2018 03:35:25 +0000
parents 559a8b3ef10b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /******************************************************************************
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Flash File System (ffs)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 *
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * FFS AMD single bank low level flash driver RAM code
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 *
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * $Id: amdsbdrv.c 1.5.1.3 Tue, 06 Jan 2004 10:57:45 +0100 tsj $
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 ******************************************************************************/
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include "ffs.cfg"
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include "ffs/ffs.h"
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include "ffs/board/drv.h"
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include "ffs/board/ffstrace.h"
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 // Due to long branches, we disable all tracing and led function calls.
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 #undef tlw
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #define tlw(contents)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #undef ttw
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 #define ttw(contents)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
25 #ifdef __GNUC__
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
26 asm(".globl ffsdrv_ram_amd_begin");
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
27 asm("ffsdrv_ram_amd_begin:");
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
28 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 asm(" .label _ffsdrv_ram_amd_begin");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 asm(" .def _ffsdrv_ram_amd_begin");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
31 #endif
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 // IMPORTANT! Apparently, placing the int_disable/enable() function code
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 // here instead of at the bottom of the file, makes the code crash or
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 // freeze. Reason is as of yet unknown.
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 uint32 amd_int_disable(void);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 void amd_int_enable(uint32 tmp);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 /******************************************************************************
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 * AMD Single Bank Driver Functions
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 ******************************************************************************/
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 void ffsdrv_ram_amd_sb_write_halfword(volatile uint16 *addr, uint16 value)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 {
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 volatile char *flash = dev.base;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 uint32 cpsr;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 ttw(ttr(TTrDrv, "wh(%x,%x)" NL, addr, value));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 if (~*addr & value) {
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 ttw(ttr(TTrFatal, "wh(%x,%x->%x) fatal" NL, addr, *addr, value));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 return;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 cpsr = amd_int_disable();
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 tlw(led_on(LED_WRITE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 flash[0xAAAA] = 0xAA; // AMD unlock cycle 1
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 flash[0x5555] = 0x55; // AMD unlock cycle 2
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 flash[0xAAAA] = 0xA0;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 *addr = value;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 while ((*addr ^ value) & 0x80)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 ;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 tlw(led_off(LED_WRITE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 amd_int_enable(cpsr);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 // This VERY simple way of erase suspension only works because we run under
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 // a pre-emptive operating system, so whenever an interrupt occurs, another
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 // task takes the CPU, and at the end of the interrupt, FFS gets the CPU
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 // again.
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 void ffsdrv_ram_amd_sb_erase(uint8 block)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 {
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 volatile char *flash = dev.base;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 volatile char *addr;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 uint32 cpsr;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 uint16 flashpoll;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 addr = block2addr(block);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 ttw(ttr(TTrDrvEra, "e(%d)" NL, block));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 cpsr = amd_int_disable();
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 tlw(led_on(LED_ERASE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 flash[0xAAAA] = 0xAA; // AMD unlock cycle 1
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 flash[0x5555] = 0x55; // AMD unlock cycle 2
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 flash[0xAAAA] = 0x80;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 flash[0xAAAA] = 0xAA; // AMD unlock cycle 1
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 flash[0x5555] = 0x55; // AMD unlock cycle 2
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 *addr = 0x30; // AMD erase sector command
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 // Wait for erase to finish.
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 while ((*addr & 0x80) == 0) {
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 tlw(led_toggle(LED_ERASE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 // Poll interrupts, taking interrupt mask into account.
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 if (INT_REQUESTED)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 {
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 // 1. suspend erase
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 // 2. enable interrupts
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 // .. now the interrupt code executes
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 // 3. disable interrupts
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 // 4. resume erase
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 tlw(led_on(LED_ERASE_SUSPEND));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 *addr = 0xB0;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 // wait for erase suspend to finish
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 while ((*addr & 0x80) == 0)
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 ;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 tlw(led_off(LED_ERASE_SUSPEND));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 amd_int_enable(cpsr);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 // Other interrupts and tasks run now...
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 cpsr = amd_int_disable();
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 tlw(led_on(LED_ERASE_SUSPEND));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 // Before resuming erase we must? check if the erase is really
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 // suspended or if it did finish
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 flashpoll = *addr;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 *addr = 0x30;
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 tlw(led_off(LED_ERASE_SUSPEND));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 tlw(led_on(LED_ERASE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 tlw(led_off(LED_ERASE));
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 amd_int_enable(cpsr);
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 /******************************************************************************
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 * Interrupt Enable/Disable
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 ******************************************************************************/
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
144 #ifdef __GNUC__
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
145 #define NOINLINE __attribute__ ((noinline))
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
146 #else
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
147 #define NOINLINE
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
148 #endif
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
149
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
150 uint32 NOINLINE amd_int_disable(void)
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 {
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
152 #ifdef __GNUC__
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
153 asm(" .code 16");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
154 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 asm(" .state16");
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
156 #endif
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 asm(" mov A1, #0xC0");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 asm(" ldr A2, tct_amd_disable");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 asm(" bx A2 ");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
161 #ifdef __GNUC__
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
162 asm(".balign 4");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
163 asm("tct_amd_disable:");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
164 asm(" .word TCT_Control_Interrupts");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
165 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 asm("tct_amd_disable .field _TCT_Control_Interrupts+0,32");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 asm(" .global _TCT_Control_Interrupts");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
168 #endif
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
171 void NOINLINE amd_int_enable(uint32 cpsr)
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 {
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
173 #ifdef __GNUC__
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
174 asm(" .code 16");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
175 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 asm(" .state16");
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
177 #endif
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 asm(" ldr A2, tct_amd_enable");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 asm(" bx A2 ");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180
72
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
181 #ifdef __GNUC__
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
182 asm(".balign 4");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
183 asm("tct_amd_enable:");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
184 asm(" .word TCT_Control_Interrupts");
4484ab3f6ab3 FFS interrupt voodoo: made original TMS470 approach work with gcc
Mychaela Falconia <falcon@freecalypso.org>
parents: 46
diff changeset
185 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 asm("tct_amd_enable .field _TCT_Control_Interrupts+0,32");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 asm(" .global _TCT_Control_Interrupts");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
188 #endif
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 }
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 // Even though we have this end label, we cannot determine the number of
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 // constant/PC-relative data following the code!
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
193 #ifdef __GNUC__
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
194 asm(".globl ffsdrv_ram_amd_end");
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
195 asm("ffsdrv_ram_amd_end:");
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
196 #else
0
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 asm(" .state32");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 asm(" .label _ffsdrv_ram_amd_end");
b6a5e36de839 src/cs: initial import from Magnetite
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 asm(" .def _ffsdrv_ram_amd_end");
46
559a8b3ef10b FFS code: first attempt at non-invasive gcc support
Mychaela Falconia <falcon@freecalypso.org>
parents: 0
diff changeset
200 #endif