3 Copyright 2008 Fred Cooke
5 This file is part of the FreeEMS project.
7 FreeEMS software is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 FreeEMS software is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with any FreeEMS software. If not, see <http://www.gnu.org/licenses/>.
20 We ask that if you make any changes to this file you send them upstream to us at admin@diyefi.org
22 Thank you for choosing FreeEMS to run your engine! */
24 /* Full basic register definitions for the Freescale S912XDP512 processor */
25 /* MC9S12XDP512V2.pdf Appendix G */
28 /* see if we've seen this, if not, mark seen and process */
29 #ifndef FILE_9S12XDP512_H_SEEN
30 #define FILE_9S12XDP512_H_SEEN
33 /* shortcuts to speed formatting */
34 /* www.atmel.com/dyn/resources/prod_documents/avr_3_04.pdf First page, second column */
35 /* http://www.ee.nmt.edu/~rison/ee308_spr06/homepage.html */
36 /* extra parentheses for clarity and guarantee of precedence */
38 /* Dereferenced Volatile Unsigned Char Pointer */
39 #define DVUCP(address) (*((volatile unsigned char*)(address)))
40 /* Dereferenced Volatile Unsigned Short Pointer */
41 #define DVUSP(address) (*((volatile unsigned short*)(address)))
43 /* Address Volatile Unsigned Char Pointer */
44 #define AVUCP(address) ((volatile unsigned char*)(address))
45 /* Address Volatile Unsigned Short Pointer */
46 #define AVUSP(address) ((volatile unsigned short*)(address))
50 /* Port Integration Module - Reordered within sections for clarity */
51 /* PIM information from 5 tables the last of which is spread over three pages */
53 /* Plain ports output switch, input state registers */
54 #define PORTS_BA DVUSP(0x0001) /* Both A and B combined as a 16 bit register for ignition access */
55 #define PORTA DVUCP(0x0000)
56 #define PORTB DVUCP(0x0001)
57 #define PORTE DVUCP(0x0008)
58 #define PORTK DVUCP(0x0032)
59 /* #define PORTC DVUCP(0x0004) these pins are not bonded on the 112 pin package */
60 /* #define PORTD DVUCP(0x0005) these pins are not bonded on the 112 pin package */
63 /* Plain ports Data Direction Registers */
64 #define DDRA DVUCP(0x0002)
65 #define DDRB DVUCP(0x0003)
66 #define DDRE DVUCP(0x0009)
67 #define DDRK DVUCP(0x0033)
70 #define DDRC DVUCP(0x0006) /* these pins are not bonded on the 112 pin package but need switching to output */
71 #define DDRD DVUCP(0x0007) /* these pins are not bonded on the 112 pin package but need switching to output */
76 /* TODO NOTE: the sixth bit controls pull up on BKGD and VREGEN pins set this to ???? */
77 /* NOTE: pull up on port E is for 0-4 and 7, ports 5 and 6 are pulled down during reset and never pulled up. */
78 #define PUCR DVUCP(0x000C) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
83 /* NOTE: reduced drive affects all pins of all ports listed above. */
84 #define RDRIV DVUCP(0x000D) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
87 #define ECLKCTL DVUCP(0x001C) /* Comes up 0b_1100_0000 = both pins off in normal single chip mode */
88 #define IRQCR DVUCP(0x001E) /* 0 in bit 7 makes it ultra sensitive, 1 makes it falling edge sensitive. 0 in bit 6 turns interrupts off, 1 in bit 6 turns them on. */
91 /* Port T registers */
92 #define PTT DVUCP(0x0240) /* GPIO output register, can not be read from reliably, use PTIT instead */
93 #define PORTT DVUCP(0x0240) /* Duplicate definition for consistency */
94 #define PTIT DVUCP(0x0241) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
95 #define DDRT DVUCP(0x0242) /* TODO configure all IO as outputs until we need it */
96 #define RDRT DVUCP(0x0243) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
97 #define PERT DVUCP(0x0244) /* pull up/down enable when used as an input, 0 = no pull up, 1 = pull up on */
98 #define PPST DVUCP(0x0245) /* 0 = pull up, 1 = pull down */
101 /* Port S registers */
102 #define PTS DVUCP(0x0248)
103 #define PORTS DVUCP(0x0248) /* Duplicate definition for consistency */
104 #define PTIS DVUCP(0x0249) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
105 #define DDRS DVUCP(0x024A) /* TODO configure all IO as outputs until we need it */
106 #define RDRS DVUCP(0x024B) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
107 #define PERS DVUCP(0x024C) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
108 #define PPSS DVUCP(0x024D) /* 0 = pull up, 1 = pull down */
109 #define WOMS DVUCP(0x024E) /* wired OR mode TODO find out what this actually means in real terms. */
112 /* Port M registers */
113 #define PTM DVUCP(0x0250)
114 #define PORTM DVUCP(0x0250) /* Duplicate definition for consistency */
115 #define PTIM DVUCP(0x0251) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
116 #define DDRM DVUCP(0x0252) /* TODO configure all IO as outputs until we need it */
117 #define RDRM DVUCP(0x0253) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
118 #define PERM DVUCP(0x0254) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
119 #define PPSM DVUCP(0x0255) /* 0 = pull up, 1 = pull down */
120 #define WOMM DVUCP(0x0256) /* wired OR mode TODO find out what this actually means in real terms. */
123 /* this should be set to the following bit mask xx????00 */
124 #define MODRR DVUCP(0x0257)
127 /* Port P registers */
128 #define PTP DVUCP(0x0258)
129 #define PORTP DVUCP(0x0258) /* Duplicate definition for consistency */
130 #define PTIP DVUCP(0x0259) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
131 #define DDRP DVUCP(0x025A) /* TODO configure all IO as outputs until we need it */
132 #define RDRP DVUCP(0x025B) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
133 #define PERP DVUCP(0x025C) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
134 #define PPSP DVUCP(0x025D) /* 0 = pull up, 1 = pull down AND when IE pull down means I on rising edge and pull up means I on falling edge */
135 #define PIEP DVUCP(0x025E) /* interrupt enable, turns on interrupts */
136 #define PIFP DVUCP(0x025F) /* interrupt flag, write a 1 to clear it */
139 /* Port H registers */
140 #define PTH DVUCP(0x0260)
141 #define PORTH DVUCP(0x0260) /* Duplicate definition for consistency */
142 #define PTIH DVUCP(0x0261) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
143 #define DDRH DVUCP(0x0262) /* TODO configure all IO as outputs until we need it */
144 #define RDRH DVUCP(0x0263) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
145 #define PERH DVUCP(0x0264) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
146 #define PPSH DVUCP(0x0265) /* 0 = pull up, 1 = pull down AND when IE pull down means I on rising edge and pull up means I on falling edge */
147 #define PIEH DVUCP(0x0266) /* interrupt enable, turns on interrupts */
148 #define PIFH DVUCP(0x0267) /* interrupt flag, write a 1 to clear it */
151 /* Port J registers */
152 #define PTJ DVUCP(0x0268)
153 #define PORTJ DVUCP(0x0268) /* Duplicate definition for consistency */
154 #define PTIJ DVUCP(0x0269) /* read only port state bits, always return the state of the pin, can be used to detect overload on outputs */
155 #define DDRJ DVUCP(0x026A) /* TODO configure all IO as outputs until we need it */
156 #define RDRJ DVUCP(0x026B) /* reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
157 #define PERJ DVUCP(0x026C) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
158 #define PPSJ DVUCP(0x026D) /* 0 = pull up, 1 = pull down AND when IE pull down means I on rising edge and pull up means I on falling edge */
159 #define PIEJ DVUCP(0x026E) /* interrupt enable, turns on interrupts */
160 #define PIFJ DVUCP(0x026F) /* interrupt flag, write a 1 to clear it */
163 /* #define ATD0PT1 DVUCP(0x0271) we don't want to use valuable ATD pins as normal IO, but if we did, r/w here */
164 /* #define ATD0DDR1 DVUCP(0x0273) for use as an input, ATD0DIEN has to be set to 1. for use as an output? */
165 /* #define ATD0RDR1 DVUCP(0x0275) reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
166 #define ATD0PER1 DVUCP(0x0277) /* pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
168 /* #define ATD1PT1 DVUCP(0x0279) we don't want to use valuable ATD pins as normal IO, but if we did, r/w here */
169 /* #define ATD1DDR1 DVUCP(0x027B) for use as an input, ATD1DIEN1 has to be set to 1. for use as an output? */
170 /* #define ATD1RDR1 DVUCP(0x027D) reduced drive register when used as output, 0 = full drive, 1 = reduced drive */
171 /* #define ATD1PER1 DVUCP(0x027F) pull up enable when used as an input, 0 = no pull up, 1 = pull up on */
173 /* Not available on 112 pin version */
174 /* #define ATD1DDR0 DVUCP(0x027A) */
175 /* 0x0278 #define ATD1PT0 DVUCP() */
176 /* 0x027C #define ATD1RDR0 DVUCP() */
177 /* 0x027E #define ATD1PER0 DVUCP() */
180 /* Memory Mapping Control registers TODO configure these to suit our application. */
182 //0x000B MODE DVUCP()
183 //0x000A MMCCTL0 DVUCP()
184 //0x0013 MMCCTL1 DVUCP()
187 /* Page control registers */
188 #define RPAGE DVUCP(0x0016) /* Used to page table data in and out of visible memory. */
189 //0x0017 EPAGE DVUCP() /* /* TODO similar to above if we need another 2k of eeprom. what are advantages/disadvantages of eeprom over flash?? */
190 #define PPAGE DVUCP(0x0030) /* TODO look at the best way to use the flash space in a complete system with a lot of code and data. used by compiler and maybe us to switch flash pages for loading/unloading data. */
191 //0x0010 GPAGE DVUCP() /* /* Global page register for global instruction addressing. I doubt we will use this. */
192 //0x0011 DIRECT DVUCP() /* /* Direct addressing mode control register. I doubt we will use this. */
196 //0x011C RAMWPC /* RAM Write Protection register, the pdf document appears to be incorrect for this, best not to touch it. */
197 //0x011D RAMXGU /* XGATE Upper region limit, this defines how much RAM we give the xgate to work with. */
198 //0x011E RAMSHL /* Shared memory lower boundary register, this defines the lower limit of the overlap between XGATE RAM and CPU RAM */
199 //0x011F RAMSHU /* Shared memory upper boundary register, this defines the upper limit of the overlap between XGATE RAM and CPU RAM */
203 //0x000E EBICTL0 DVUCP() /*
204 //0x000F EBICTL1 DVUCP() /*
208 //0x001A PARTIDH DVUCP() /*
209 //0x001B PARTIDL DVUCP() /*
212 /* Clock and Reset Generator */
213 #define SYNR DVUCP(0x0034) /* Multiplier of result of division by REFDV below, output is new PLL/Bus freqency. */
214 #define REFDV DVUCP(0x0035) /* Divisor of external clock frequency pre being multiplied by SYNR above. */
215 //0x0036 CTFLG DVUCP() /*
216 #define CRGFLG DVUCP(0x0037) /* Clock and Reset Generator flags, we use this to determine when the PLL is stable and ready to use. Also to reset the RTI flag. */
217 #define CRGINT DVUCP(0x0038) /* Bit 7 is RTIE RTI enable bit. */
218 #define CLKSEL DVUCP(0x0039) /* Clock select register, choose PLL or external clock with this. */
219 #define PLLCTL DVUCP(0x003A) /* PLL frequency generator control register, used for setting the bus frequency. */
220 #define RTICTL DVUCP(0x003B) /* Divider select register */
221 #define COPCTL DVUCP(0x003C) /* COP watch dog control register */
222 //0x003D FORBYP DVUCP() /*
223 #define ARMCOP DVUCP(0x003F) /* Computer operating properly timer, we won't be using this at least until we have profiled the running application. it will just cause headaches otherwise. */
226 /* Enhanced Capture Timer */
227 /* see reference document from Huang course overview/notes : http://www.ee.nmt.edu/~rison/ee308_spr06/lectures.html */
228 /* see this link for a discussion of the old 68hc12 timer http://www.seattlerobotics.org/encoder/nov97/68hc12.html */
230 #define TCNT DVUSP(0x0044) /* Timer counter 16 bit (0x0044 TCNT (hi), 0x0045 TCNT (lo)) */
232 /* Behavioural control registers (dual purpose) */
233 #define TIOS DVUCP(0x0040) /* Selects input capture or output compare mode for each timer pin */
234 #define TIE DVUCP(0x004C) /* Timer channel interrupt enable register */
235 #define TSCR1 DVUCP(0x0046) /* Timer System Control Register 1 */
236 #define TSCR2 DVUCP(0x004D) /* Timer System Control Register 2 */
237 #define TFLG DVUCP(0x004E) /* Timer channel flags */
238 #define TFLGOF DVUCP(0x004F) /* Timer over flow flag */
239 #define PTPSR DVUCP(0x006E) /* Precision prescaler for the main timer */
241 /* Output compare control registers */
242 #define TTOV DVUCP(0x0047) /* Timer Toggle on Overflow output compare control */
243 #define CFORC DVUCP(0x0041) /* Output compare force, write a 1 to make the programmed action occur now */
244 #define OC7M DVUCP(0x0042) /* Channel 7 output compare other pins control mask */
245 #define OC7D DVUCP(0x0043) /* Channel 7 output compare other pins states */
247 /* Timer output compare action control registers
249 * 0 0 Timer disconnected from output pin logic
250 * 0 1 Toggle OCx output line
251 * 1 0 Clear OCx output line to zero
252 * 1 1 Set OCx output line to one */
253 #define TCTL1 DVUCP(0x0048) /* (M,L) 77,66,55,44 */
254 #define TCTL2 DVUCP(0x0049) /* (M,L) 33,22,11,00 */
255 #define TCTL1_ADDR AVUCP(0x0048) /* (M,L) 77,66,55,44 */
256 #define TCTL2_ADDR AVUCP(0x0049) /* (M,L) 33,22,11,00 */
259 /* Input capture control registers */
260 #define DLYCT DVUCP(0x0069) /* Delay counter control register (minimum tooth width) */
261 #define ICSYS DVUCP(0x006B) /* Input capture behaviour control register */
262 #define ICOVW DVUCP(0x006A) /* Input capture overwrite allow */
264 /* Timer input capture edge detection control registers
265 * EDGxB EDGxA Configuration
266 * 0 0 Capture disabled
267 * 0 1 Capture on rising edges only
268 * 1 0 Capture on falling edges only
269 * 1 1 Capture on any edge (rising or falling) */
270 #define TCTL3 DVUCP(0x004A) /* (B,A) 77,66,55,44 */
271 #define TCTL4 DVUCP(0x004B) /* (B,A) 33,22,11,00 */
273 /* Input capture holding registers for 0 - 3 */
274 #define TC0H DVUSP(0x0078) /* 16 bit (0x0078 TC0H (hi), 0x0079 TC0H (lo)) */
275 #define TC1H DVUSP(0x007A) /* 16 bit (0x007A TC1H (hi), 0x007B TC1H (lo)) */
276 #define TC2H DVUSP(0x007C) /* 16 bit (0x007C TC2H (hi), 0x007D TC2H (lo)) */
277 #define TC3H DVUSP(0x007E) /* 16 bit (0x007E TC3H (hi), 0x007F TC3H (lo)) */
279 /* Time value comparison/storage registers for each timer channel */
280 #define TC0 DVUSP(0x0050) /* 16 bit (0x0050 TC0 (hi), 0x0051 TC0 (lo)) */
281 #define TC1 DVUSP(0x0052) /* 16 bit (0x0052 TC1 (hi), 0x0053 TC1 (lo)) */
282 #define TC2 DVUSP(0x0054) /* 16 bit (0x0054 TC2 (hi), 0x0055 TC2 (lo)) */
283 #define TC3 DVUSP(0x0056) /* 16 bit (0x0056 TC3 (hi), 0x0057 TC3 (lo)) */
284 #define TC4 DVUSP(0x0058) /* 16 bit (0x0058 TC4 (hi), 0x0059 TC4 (lo)) */
285 #define TC5 DVUSP(0x005A) /* 16 bit (0x005A TC5 (hi), 0x005B TC5 (lo)) */
286 #define TC6 DVUSP(0x005C) /* 16 bit (0x005C TC6 (hi), 0x005D TC6 (lo)) */
287 #define TC7 DVUSP(0x005E) /* 16 bit (0x005E TC7 (hi), 0x005F TC7 (lo)) */
289 #define TC2_ADDR AVUSP(0x0054) /* 16 bit (0x0054 TC2 (hi), 0x0055 TC2 (lo)) */
290 #define TC3_ADDR AVUSP(0x0056) /* 16 bit (0x0056 TC3 (hi), 0x0057 TC3 (lo)) */
291 #define TC4_ADDR AVUSP(0x0058) /* 16 bit (0x0058 TC4 (hi), 0x0059 TC4 (lo)) */
292 #define TC5_ADDR AVUSP(0x005A) /* 16 bit (0x005A TC5 (hi), 0x005B TC5 (lo)) */
293 #define TC6_ADDR AVUSP(0x005C) /* 16 bit (0x005C TC6 (hi), 0x005D TC6 (lo)) */
294 #define TC7_ADDR AVUSP(0x005E) /* 16 bit (0x005E TC7 (hi), 0x005F TC7 (lo)) */
298 /* Pulse accumulator control registers */
299 //0x0068 ICPAR DVUCP() /*
300 //0x0060 PACTL DVUCP() /*
301 //0x0061 PAFLG DVUCP() /*
302 //0x0070 PBCTL DVUCP() /*
303 //0x0071 PBFLG DVUCP() /*
304 // one short for each hi lo par based on hi address.
305 /* Pulse accumulator registers */
310 /* Pulse accumulator holding registers */
311 //0x0072 PA3H DVUCP() /* hi?
312 //0x0073 PA2H DVUCP() /* lo?
313 //0x0074 PA1H DVUCP() /* hi?
314 //0x0075 PA0H DVUCP() /* lo?
317 /* Modulus down counter control registers */
318 #define MCCTL DVUCP(0x0066) /* Modulus control register */
319 #define MCFLG DVUCP(0x0067) /* Modulus flag (high bit) and input edge indicators (low 4 bits) */
320 #define MCCNT DVUSP(0x0076) /* 16 bit (0x0076 MCCNT (hi), 0x0077 MCCNT (lo)) */
321 #define PTMCPSR DVUCP(0x006F) /* Precision prescaler for the modulus down counter */
324 /* Analog To Digital converter 1 */
325 /* TODO Configure these and disable the non functional 16 - 23 144 pin section! */
326 #define ATD1CTL0 DVUCP(0x0080) /* 0 - 3 define which ADC channel to wrap on when doing multiple channels */
327 #define ATD1CTL1 DVUCP(0x0081) /* External trigger select when enabled in other control register */
328 #define ATD1CTL2 DVUCP(0x0082) /* bit 7 turns the ADC block on. */
329 #define ATD1CTL3 DVUCP(0x0083) /* bit 6 means conversion length is 8, bit 2 controls how the registers are used, bits 0 - 1 define freeze mode behaviour */
330 #define ATD1CTL4 DVUCP(0x0084) /* bit 7 should be zero meaning 10bit ADC, bits 6,5 are the sample period, and 4,3,2,1,0 are the sample frequency clock scaler */
331 #define ATD1CTL5 DVUCP(0x0085) /* bit 7 sets right justify, bit 5 sets scan mode, bit 4 sets multiplex mode */
332 //0x0086 ATD1STAT0 DVUCP() /*
333 //0x0088 ATD1TEST0 DVUCP() /*
334 //0x0089 ATD1TEST1 DVUCP() /*
335 //0x008A ATD1STAT2 DVUCP() /*
336 //0x008B ATD1STAT1 DVUCP() /*
337 #define ATD1DIEN0 DVUCP(0x008C) /* Digital input enable - these pins are not bonded on the 112 pin package */
338 #define ATD1DIEN1 DVUCP(0x008D) /* Digital input enable */
339 //0x008E ATD1PTAD0 DVUCP() /* digital use only */
340 //0x008F ATD1PTAD1 DVUCP() /* digital use only */
341 // one short for each hi lo par based on hi address. label with WORD for consistency
342 #define ATD1_BASE 0x0090
343 #define ATD1DR0 DVUSP(ATD1_BASE + 0x0) /* 16 bit (0x0090 ATD1DR0H, 0x0091 ATD1DR0L) */ /* SpareADC (NC) */
344 #define ATD1DR1 DVUSP(ATD1_BASE + 0x2) /* 16 bit (0x0092 ATD1DR1H, 0x0093 ATD1DR1L) */ /* SpareADC (NC) */
345 #define ATD1DR2 DVUSP(ATD1_BASE + 0x4) /* 16 bit (0x0094 ATD1DR2H, 0x0095 ATD1DR2L) */ /* SpareADC (NC) */
346 #define ATD1DR3 DVUSP(ATD1_BASE + 0x6) /* 16 bit (0x0096 ATD1DR3H, 0x0097 ATD1DR3L) */ /* SpareADC (NC) */
347 #define ATD1DR4 DVUSP(ATD1_BASE + 0x8) /* 16 bit (0x0098 ATD1DR4H, 0x0099 ATD1DR4L) */ /* SpareADC (NC) */
348 #define ATD1DR5 DVUSP(ATD1_BASE + 0xA) /* 16 bit (0x009A ATD1DR5H, 0x009B ATD1DR5L) */ /* SpareADC (NC) */
349 #define ATD1DR6 DVUSP(ATD1_BASE + 0xC) /* 16 bit (0x009C ATD1DR6H, 0x009D ATD1DR6L) */ /* SpareADC (NC) */
350 #define ATD1DR7 DVUSP(ATD1_BASE + 0xE) /* 16 bit (0x009E ATD1DR7H, 0x009F ATD1DR7L) */ /* SpareADC (NC) */
353 /* NOT bonded on the 112 pin package!! Left here in case of 144 pin FreeEMS later on. */
370 /* NOT bonded on the 112 pin package!! Left here in case of 144 pin FreeEMS later on. */
373 /* IIC1 - Inter Intergrated Circuit interface 1 TODO configure and use */
374 //0x00B0 IBAD DVUCP() /*
375 //0x00B1 IBFD DVUCP() /*
376 //0x00B2 IBCR DVUCP() /*
377 //0x00B3 IBSR DVUCP() /*
378 //0x00B4 IBDR DVUCP() /*
409 /* SCI0 debug/comms/datalogging TODO this is our primary serial interface for flash loading, setup serial comms software to communicate with MTX or similar for testing. */
410 #define SCI0_BASE 0x00C8
412 #define SCI0BD DVUSP(SCI0_BASE + 0x0) /* #define SCI0BDH DVUCP(0x00C8), #define SCI0BDL DVUCP(0x00C9) (IR and baud control) */
413 #define SCI0CR1 DVUCP(SCI0_BASE + 0x2) /* Control reg 1 */
415 #define SCI0ASR1 DVUCP(SCI0_BASE + 0x0) /* Status reg 1a (rx flags) */
416 #define SCI0ACR1 DVUCP(SCI0_BASE + 0x1) /* Control reg 1a (rx conf) */
417 #define SCI0ACR2 DVUCP(SCI0_BASE + 0x2) /* Control reg 2a (rx conf) */
419 #define SCI0CR2 DVUCP(SCI0_BASE + 0x3) /* Control reg 2 */
420 #define SCI0SR1 DVUCP(SCI0_BASE + 0x4) /* Status reg 1 (isr flags) */
421 #define SCI0SR2 DVUCP(SCI0_BASE + 0x5) /* Status reg 2 (config/control) */
422 #define SCI0DRH DVUCP(SCI0_BASE + 0x6) /* Data reg high (9th bit bit 7 receive bit 6 send) */
423 #define SCI0DRL DVUCP(SCI0_BASE + 0x7) /* Data reg low (read and write for receive and send respectively)*/
426 /* SCI1 debug/comms/datalogging TODO this is our secondary serial interface, setup serial comms software to communicate with MTX or similar for testing. */
474 /* Flash Control Registers */
475 #define FCLKDIV DVUCP(0x0100) /* Flash Clock Divider Register R/W */
476 #define FSEC DVUCP(0x0101) /* Flash Security Register R */
477 #define FCNFG DVUCP(0x0103) /* Flash Configuration Register R/W */
478 #define FPROT DVUCP(0x0104) /* Flash Protection Register R/W */
479 #define FSTAT DVUCP(0x0105) /* Flash Status Register R/W */
480 #define FCMD DVUCP(0x0106) /* Flash Command Register R/W */
481 #define FCTL DVUCP(0x0107) /* Flash Control Register R */
483 #define FADDR DVUSP(0x0108) /* Flash Low Address Register R (0x0108 FADDRHI, 0x0109 FADDRLO) */
484 #define FDATA DVUSP(0x010A) /* Flash High Data Register R (0x010A FDATAHI, 0x010B FDATALO) */
487 /* EEPROM Control Registers TODO learn how to use these to write data to the eeprom through serial comms. */
500 #define IVBR DVUCP(0x0121) /* Interrupt vector table base location first byte (second is always 0x00) */
541 /* CAN0 don't want this for now, leave it disabled too. CAN0CTL1 bit 7 should be set to zero to disable this. */
543 #define CAN0CTL1 DVUCP(0x0141)
557 //0x0150 – 0x0153 : CAN0IDAR0 – CAN0IDAR3
558 //0x0154 – 0x0157 : CAN0IDMR0 – CAN0IDMR3
559 //0x0158 – 0x015B : CAN0IDAR4 – CAN0IDAR7
560 //0x015C – 0x015F : CAN0IDMR4 – CAN0IDMR7
561 //0x0160 – 0x016F : CAN0RXFG
562 //0x0170 – 0x017F : CAN0TXFG
565 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
566 //this block applies to all can maps!!!
622 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&77
625 /* CAN1 don't want this for now, leave it disabled too. CAN1CTL1 bit 7 should be set to zero to disable this. */
627 #define CAN1CTL1 DVUCP(0x0181)
657 //0x01A0 – 0x01AF : CAN1RXFG
658 //0x01B0 – 0x01BF : CAN1TXFG
661 /* CAN2 CAN2CTL1 bit 7 should be set to zero to disable this. */
693 //0x01E0 – 0x01EF : CAN2RXFG
694 //0x01F0 – 0x01FF : CAN2TXFG
697 /* CAN3 CAN3CTL1 bit 7 should be set to zero to disable this. */
699 #define CAN3CTL1 DVUCP(0x0201)
728 //0x0220 – 0x022F : CAN3RXFG
729 //0x0230 – 0x023F : CAN3TXFG
732 /* CAN4 CAN4CTL1 bit 7 should be set to zero to disable this. */
734 #define CAN4CTL1 DVUCP(0x0281)
764 //0x02A0 – 0x02AF : CAN4RXFG
765 //0x02B0 – 0x02BF : CAN4TXFG
768 /* ATD0 TODO configure this as ATD inputs and try them out to control rate of flashing of leds etc, or even, which LED's are flashing etc */
769 #define ATD0CTL0 DVUCP(0x02C0) /* 0 - 2 define which ADC channel to wrap on when doing multiple channels */
770 #define ATD0CTL1 DVUCP(0x02C1) /* External trigger select when enabled in other control register */
771 #define ATD0CTL2 DVUCP(0x02C2) /* bit 7 turns the ADC block on. */
772 #define ATD0CTL3 DVUCP(0x02C3) /* bit 6 means conversion length is 8, bit 2 controls how the registers are used, bits 0 - 1 define freeze mode behaviour */
773 #define ATD0CTL4 DVUCP(0x02C4) /* bit 7 should be zero meaning 10bit ADC, bits 6,5 are the sample period, and 4,3,2,1,0 are the sample frequency clock scaler */
774 #define ATD0CTL5 DVUCP(0x02C5) /* bit 7 sets right justify, bit 5 sets scan mode, bit 4 sets multiplex mode */
777 #define ATD0DIEN DVUCP(0x02CD) /* Digital input enable */
778 //0x02CF ATD0PTAD0 digital use only
779 #define ATD0_BASE 0x02D0 /* Maybe use this with a loop to sample them in a compact way. */
780 #define ATD0DR0 DVUSP(ATD0_BASE + 0x0) /* 16 bit (0x02D0 ATD0DR0H, 0x02D1 ATD0DR0L) */ /* IAT/MAT on my JimStim setup */
781 #define ATD0DR1 DVUSP(ATD0_BASE + 0x2) /* 16 bit (0x02D2 ATD0DR1H, 0x02D3 ATD0DR1L) */ /* CHT/CLT on my JimStim setup */
782 #define ATD0DR2 DVUSP(ATD0_BASE + 0x4) /* 16 bit (0x02D4 ATD0DR2H, 0x02D5 ATD0DR2L) */ /* TPS/TPS on my JimStim setup */
783 #define ATD0DR3 DVUSP(ATD0_BASE + 0x6) /* 16 bit (0x02D6 ATD0DR3H, 0x02D7 ATD0DR3L) */ /* EGO/O2 on my JimStim setup */
784 #define ATD0DR4 DVUSP(ATD0_BASE + 0x8) /* 16 bit (0x02D8 ATD0DR4H, 0x02D9 ATD0DR4L) */ /* BRV left of 3 one end of my h1 board */
785 #define ATD0DR5 DVUSP(ATD0_BASE + 0xA) /* 16 bit (0x02DA ATD0DR5H, 0x02DB ATD0DR5L) */ /* MAP mid of 3 one end of my h1 board */
786 #define ATD0DR6 DVUSP(ATD0_BASE + 0xC) /* 16 bit (0x02DC ATD0DR6H, 0x02DD ATD0DR6L) */ /* AAP right of 3 one end of my h1 board */
787 #define ATD0DR7 DVUSP(ATD0_BASE + 0xE) /* 16 bit (0x02DE ATD0DR7H, 0x02DF ATD0DR7L) */ /* SpareADC/SPARE on my JimStim setup */
790 /* VREG unit, Low Voltage Interrupt and Autonomous Periodical Interrupt */
791 #define VREGCTRL DVUCP(0x02F1) /* VReg Control Register */
792 #define VREGAPICL DVUCP(0x02F2) /* Autonomous Periodical Interrupt Control Register */
793 #define VREGAPITR DVUCP(0x02F3) /* Autonomous Periodical Interrupt Trimming Register */
794 #define VREGAPIR DVUSP(0x02F4) /* Autonomous Periodical Interrupt Rate High and Low Registers (VREGAPIRH DVUCP(0x02F4), VREGAPIRL DVUCP(0x02F5)) */
797 #define PWME DVUCP(0x0300) /* PWM enable register */
798 #define PWMPOL DVUCP(0x0301) /* PWM polarity register */
799 #define PWMCLK DVUCP(0x0302) /* PWM clock choice register */
800 #define PWMPRCLK DVUCP(0x0303) /* PWM Clock prescalers (bits 0,1,2 and bits 4,5,6 control 4 pins each) */
801 #define PWMCAE DVUCP(0x0304) /* PWM Center Align Enable Register */
802 #define PWMCTL DVUCP(0x0305) /* PWM Concatenate, stop, wait, freeze register */
803 #define PWMSCLA DVUCP(0x0308) /* PWM Scale A register */
804 #define PWMSCLB DVUCP(0x0309) /* PWM Scale B register */
805 #define PWMCNT0 DVUCP(0x030C) /* PWM 8 bit counter */
806 #define PWMCNT1 DVUCP(0x030D) /* */
807 #define PWMCNT2 DVUCP(0x030E) /* */
808 #define PWMCNT3 DVUCP(0x030F) /* */
809 #define PWMCNT4 DVUCP(0x0310) /* */
810 #define PWMCNT5 DVUCP(0x0311) /* */
811 #define PWMCNT6 DVUCP(0x0312) /* */
812 #define PWMCNT7 DVUCP(0x0313) /* PWM 8 bit counter */
813 #define PWMPER0 DVUCP(0x0314) /* PWM period value */ /* Ign LED 6 on my JimStim */
814 #define PWMPER1 DVUCP(0x0315) /* */ /* Ign LED 4 on my JimStim */
815 #define PWMPER2 DVUCP(0x0316) /* */ /* Ign LED 2 on my JimStim */
816 #define PWMPER3 DVUCP(0x0317) /* */ /* Ign LED 1 on my JimStim */
817 #define PWMPER4 DVUCP(0x0318) /* */ /* Ign LED 3 on my JimStim */
818 #define PWMPER5 DVUCP(0x0319) /* */ /* Ign LED 5 on my JimStim */
819 #define PWMPER6 DVUCP(0x031A) /* */ /* NC yet */
820 #define PWMPER7 DVUCP(0x031B) /* PWM period value */ /* NC yet */
821 #define PWMDTY0 DVUCP(0x031C) /* PWM duty cycle value */
822 #define PWMDTY1 DVUCP(0x031D) /* */
823 #define PWMDTY2 DVUCP(0x031E) /* */
824 #define PWMDTY3 DVUCP(0x031F) /* */
825 #define PWMDTY4 DVUCP(0x0320) /* */
826 #define PWMDTY5 DVUCP(0x0321) /* */
827 #define PWMDTY6 DVUCP(0x0322) /* */
828 #define PWMDTY7 DVUCP(0x0323) /* PWM duty cycle value */
829 #define PWMSDN DVUCP(0x0324) /* PWM shutdown behaviour register */
832 /* Periodic Interupt Timer with down counter */
833 #define PITCFLMT DVUCP(0x0340) /* PIT Control and Force Load Micro Timer Register, high bit enables, low 2 bits force load micro timers */
834 #define PITFLT DVUCP(0x0341) /* PIT Force Load Timer Register, low 4 bits force load timers */
835 #define PITCE DVUCP(0x0342) /* PIT Channel Enable Register, low 4 bits let the channel count */
836 #define PITMUX DVUCP(0x0343) /* PIT Multiplex Register, low 4 bits set which micro time base is used */
837 #define PITINTE DVUCP(0x0344) /* PIT Interrupt Enable Register, low four bits control the ISRs */
838 #define PITTF DVUCP(0x0345) /* PIT Time-Out Flag Register, low 4 bits set when each counter reaches 0 */
839 #define PITMTLD0 DVUCP(0x0346) /* PIT Micro Timer Load Register 0, time to start counting from when reaching zero */
840 #define PITMTLD1 DVUCP(0x0347) /* PIT Micro Timer Load Register 1, time to start counting from when reaching zero */
841 #define PITLD0 DVUSP(0x0348) /* PIT Load Register 0, time to start counting from when reaching zero (0x0348 PITLD0 (hi), 0x0349 PITLD0 (lo)) */
842 #define PITLD1 DVUSP(0x034C) /* PIT Load Register 1, time to start counting from when reaching zero (0x034C PITLD1 (hi), 0x034D PITLD1 (lo)) */
843 #define PITLD2 DVUSP(0x0350) /* PIT Load Register 2, time to start counting from when reaching zero (0x0350 PITLD2 (hi), 0x0351 PITLD2 (lo)) */
844 #define PITLD3 DVUSP(0x0354) /* PIT Load Register 3, time to start counting from when reaching zero (0x0354 PITLD3 (hi), 0x0355 PITLD3 (lo)) */
845 #define PITCNT0 DVUSP(0x034A) /* PIT Count Register 0, current value of down counter (0x034A PITCNT0 (hi), 0x034B PITCNT0 (lo)) */
846 #define PITCNT1 DVUSP(0x034E) /* PIT Count Register 1, current value of down counter (0x034E PITCNT1 (hi), 0x034F PITCNT1 (lo)) */
847 #define PITCNT2 DVUSP(0x0352) /* PIT Count Register 2, current value of down counter (0x0352 PITCNT2 (hi), 0x0353 PITCNT2 (lo)) */
848 #define PITCNT3 DVUSP(0x0356) /* PIT Count Register 3, current value of down counter (0x0356 PITCNT3 (hi), 0x0357 PITCNT3 (lo)) */
851 // TODO XGATE Set up stuff
852 #define XGMCTL DVUSP(0x0380) /* TODO: 7th bit of this should be set to 0 for now to turn the XGATE off */
853 #define XGMCTLHI DVUCP(0x0380)
854 #define XGMCTLLO DVUCP(0x0381) /* TODO: or 7th bit of this should be set to 0 for now to turn the XGATE off */
863 //0x023B XGIF /* TODO WRONG value 0x023B stated in the manual as being both xgate and can3!!!!! should be 0x038B i believe!!!!! */
864 //0x023C XGIF /* TODO WRONG value 0x023C stated in the manual as being both xgate and can3!!!!! should be 0x038C i believe!!!!! */
900 //0x0020 DBGC1 DVUCP() /*
901 //0x0021 DBGSR DVUCP() /*
902 //0x0022 DBGTCR DVUCP() /*
903 //0x0023 DBGC2 DVUCP() /*
904 //0x0024 DBGTBH DVUCP() /*
905 //0x0025 DBGTBL DVUCP() /*
906 //0x0026 DBGCNT DVUCP() /*
907 //0x0027 DBGSCRX DVUCP() /*
908 //COMPA 0x0028 DVUCP() /*
909 //COMPC 0x0028 DVUCP() /*
910 //DBGXCTL 0x0028 DVUCP() /*
911 //COMPB 0x0028 DVUCP() /*
912 //COMPD 0x0028 DVUCP() /*
913 //0x0029 DBGXAH DVUCP() /*
914 //0x002A DBGXAM DVUCP() /*
915 //0x002B DBGXAL DVUCP() /*
916 //0x002C DBGXDH DVUCP() /*
917 //0x002D DBGXDL DVUCP() /*
918 //0x002E DBGXDHM DVUCP() /*
919 //0x002F DBGXDLM DVUCP() /*
922 /* All reserved registers/blocks are listed here for reference */
924 /* 0x003E CTCTL COP test register */
925 /* 0x006D TIMTST Timer test register */
926 /* 0x0102 FTSTMOD Flash test register */
927 /* 0x02C8 ATD0TEST0 ADC test register */
928 /* 0x02C9 ATD0TEST1 ADC test register */
929 /* 0x02F0 VREGHTCL VReg test register */
930 /* 0x0306 PWMTST PWM test register */
931 /* 0x0307 PWMPRSC PWM test register 2 */
932 /* 0x030A PWMSCNTA PWM test register 3 */
933 /* 0x030B PWMSCNTB PWM test register 4 */
936 /* 0x001D Reserved */
937 /* 0x001F Reserved */
938 /* 0x0012 Reserved */
939 /* 0x0014 - 0x0015 : Reserved */
940 /* 0x0018 - 0x0019 : Reserved */
941 /* 0x0031 Reserved */
942 /* 0x006C Reserved */
943 /* 0x00B5 - 0x00B7 : Reserved */
944 /* 0x0087 Reserved */
945 /* 0x00DC Reserved */
946 /* 0x00DE - 0x00DF : Reserved */
947 /* 0x00E5 - 0x00EF : Reserved */
948 /* 0x00F4 Reserved */
949 /* 0x00F6 Reserved */
950 /* 0x00F7 Reserved */
951 /* 0x00FC Reserved */
952 /* 0x00FE - 0x00FF : Reserved */
953 /* 0x010C - 0x010F : Reserved */
954 /* 0x0111 Reserved */
955 /* 0x0112 Reserved */
956 /* 0x0117 Reserved */
957 /* 0x0120 Reserved */
958 /* 0x0122 - 0x0125 : Reserved */
959 /* 0x014C Reserved */
960 /* 0x018C Reserved */
961 /* 0x01CC Reserved */
962 /* 0x020C - 0x020D : Reserved */
963 /* 0x0246 - 0x0247 : Reserved */
964 /* 0x024F Reserved */
965 /* 0x0270 Reserved */
966 /* 0x0272 Reserved */
967 /* 0x0274 Reserved */
968 /* 0x0276 Reserved */
969 /* 0x028C Reserved */
970 /* 0x02C7 Reserved */
971 /* 0x02CA Reserved */
972 /* 0x02CC Reserved */
973 /* 0x02CE Reserved */
974 /* 0x02E0 – 0x02EF : Reserved */
975 /* 0x02F6 – 0x02FF : Reserved */
976 /* 0x0325 – 0x033F : Reserved */
977 /* 0x0358 – 0x037F : Reserved */
978 /* 0x0383 Reserved */
979 /* 0x039C Reserved */
980 /* 0x03A0 Reserved */
981 /* 0x03A1 Reserved */
982 /* 0x03B0 – 0x07FF : Reserved */
985 /* Clear any accidental use of Reserved from typing mistakes. */
987 #error "We have accidentally defined reserved as Reserved in here, find it and fix it."
991 /* let us know if we are being untidy with headers */
992 #warning "Header file 9S12XDP512_H seen before, sort it out!"
993 /* end of the wrapper ifdef from the very top */