cores: Now duplicate the global structure
[simavr] / simavr / cores / sim_megax4.h
1 /*
2         sim_megax4.h
3
4         Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
5
6         This file is part of simavr.
7
8         simavr is free software: you can redistribute it and/or modify
9         it under the terms of the GNU General Public License as published by
10         the Free Software Foundation, either version 3 of the License, or
11         (at your option) any later version.
12
13         simavr is distributed in the hope that it will be useful,
14         but WITHOUT ANY WARRANTY; without even the implied warranty of
15         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16         GNU General Public License for more details.
17
18         You should have received a copy of the GNU General Public License
19         along with simavr.  If not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #ifndef __SIM_MEGAX4_H__
23 #define __SIM_MEGAX4_H__
24
25 #include "sim_avr.h"
26 #include "sim_core_declare.h"
27 #include "avr_eeprom.h"
28 #include "avr_flash.h"
29 #include "avr_watchdog.h"
30 #include "avr_extint.h"
31 #include "avr_ioport.h"
32 #include "avr_uart.h"
33 #include "avr_adc.h"
34 #include "avr_timer.h"
35 #include "avr_spi.h"
36 #include "avr_twi.h"
37
38 void mx4_init(struct avr_t * avr);
39 void mx4_reset(struct avr_t * avr);
40
41 /*
42  * This is a template for all of the x4 devices, hopefully
43  */
44 struct mcu_t {
45         avr_t core;
46         avr_eeprom_t    eeprom;
47         avr_flash_t     selfprog;
48         avr_watchdog_t  watchdog;
49         avr_extint_t    extint;
50         avr_ioport_t    porta, portb, portc, portd;
51         avr_uart_t              uart0,uart1;
52         avr_adc_t               adc;
53         avr_timer_t             timer0,timer1,timer2;
54         avr_spi_t               spi;
55         avr_twi_t               twi;
56 };
57
58 #ifdef SIM_CORENAME
59
60 #ifndef SIM_MMCU
61 #error SIM_MMCU is not declared
62 #endif
63
64 const struct mcu_t SIM_CORENAME = {
65         .core = {
66                 .mmcu = SIM_MMCU,
67                 DEFAULT_CORE(4),
68
69                 .init = mx4_init,
70                 .reset = mx4_reset,
71         },
72         AVR_EEPROM_DECLARE(EE_READY_vect),
73         AVR_SELFPROG_DECLARE(SPMCSR, SPMEN, SPM_READY_vect),
74         AVR_WATCHDOG_DECLARE(WDTCSR, WDT_vect),
75         .extint = {
76                 AVR_EXTINT_DECLARE(0, 'D', PD2),
77                 AVR_EXTINT_DECLARE(1, 'D', PD3),
78                 AVR_EXTINT_DECLARE(2, 'B', PB3),
79         },
80         .porta = {
81                 .name = 'A', .r_port = PORTA, .r_ddr = DDRA, .r_pin = PINA,
82                 .pcint = {
83                         .enable = AVR_IO_REGBIT(PCICR, PCIE0),
84                         .raised = AVR_IO_REGBIT(PCIFR, PCIF0),
85                         .vector = PCINT0_vect,
86                 },
87                 .r_pcint = PCMSK0,
88         },
89         .portb = {
90                 .name = 'B', .r_port = PORTB, .r_ddr = DDRB, .r_pin = PINB,
91                 .pcint = {
92                         .enable = AVR_IO_REGBIT(PCICR, PCIE1),
93                         .raised = AVR_IO_REGBIT(PCIFR, PCIF1),
94                         .vector = PCINT1_vect,
95                 },
96                 .r_pcint = PCMSK1,
97         },
98         .portc = {
99                 .name = 'C', .r_port = PORTC, .r_ddr = DDRC, .r_pin = PINC,
100                 .pcint = {
101                         .enable = AVR_IO_REGBIT(PCICR, PCIE2),
102                         .raised = AVR_IO_REGBIT(PCIFR, PCIF2),
103                         .vector = PCINT2_vect,
104                 },
105                 .r_pcint = PCMSK2,
106         },
107         .portd = {
108                 .name = 'D', .r_port = PORTD, .r_ddr = DDRD, .r_pin = PIND,
109                 .pcint = {
110                         .enable = AVR_IO_REGBIT(PCICR, PCIE3),
111                         .raised = AVR_IO_REGBIT(PCIFR, PCIF3),
112                         .vector = PCINT3_vect,
113                 },
114                 .r_pcint = PCMSK3,
115         },
116
117         .uart0 = {
118                 .disabled = AVR_IO_REGBIT(PRR,PRUSART0),
119                 .name = '0',
120                 .r_udr = UDR0,
121
122                 .txen = AVR_IO_REGBIT(UCSR0B, TXEN0),
123                 .rxen = AVR_IO_REGBIT(UCSR0B, RXEN0),
124                 .ucsz = AVR_IO_REGBITS(UCSR0C, UCSZ00, 0x3), // 2 bits
125                 .ucsz2 = AVR_IO_REGBIT(UCSR0B, UCSZ02),         // 1 bits
126
127                 .r_ucsra = UCSR0A,
128                 .r_ucsrb = UCSR0B,
129                 .r_ucsrc = UCSR0C,
130                 .r_ubrrl = UBRR0L,
131                 .r_ubrrh = UBRR0H,
132                 .rxc = {
133                         .enable = AVR_IO_REGBIT(UCSR0B, RXCIE0),
134                         .raised = AVR_IO_REGBIT(UCSR0A, RXC0),
135                         .vector = USART0_RX_vect,
136                 },
137                 .txc = {
138                         .enable = AVR_IO_REGBIT(UCSR0B, TXCIE0),
139                         .raised = AVR_IO_REGBIT(UCSR0A, TXC0),
140                         .vector = USART0_TX_vect,
141                 },
142                 .udrc = {
143                         .enable = AVR_IO_REGBIT(UCSR0B, UDRIE0),
144                         .raised = AVR_IO_REGBIT(UCSR0A, UDRE0),
145                         .vector = USART0_UDRE_vect,
146                 },
147         },
148         .uart1 = {
149                 .disabled = AVR_IO_REGBIT(PRR,PRUSART1),
150                 .name = '1',
151                 .r_udr = UDR1,
152
153                 .txen = AVR_IO_REGBIT(UCSR1B, TXEN1),
154                 .rxen = AVR_IO_REGBIT(UCSR1B, RXEN1),
155                 .ucsz = AVR_IO_REGBITS(UCSR1C, UCSZ10, 0x3), // 2 bits
156                 .ucsz2 = AVR_IO_REGBIT(UCSR1B, UCSZ12),         // 1 bits
157
158                 .r_ucsra = UCSR1A,
159                 .r_ucsrb = UCSR1B,
160                 .r_ucsrc = UCSR1C,
161                 .r_ubrrl = UBRR1L,
162                 .r_ubrrh = UBRR1H,
163                 .rxc = {
164                         .enable = AVR_IO_REGBIT(UCSR1B, RXCIE1),
165                         .raised = AVR_IO_REGBIT(UCSR1A, RXC1),
166                         .vector = USART1_RX_vect,
167                 },
168                 .txc = {
169                         .enable = AVR_IO_REGBIT(UCSR1B, TXCIE1),
170                         .raised = AVR_IO_REGBIT(UCSR1A, TXC1),
171                         .vector = USART1_TX_vect,
172                 },
173                 .udrc = {
174                         .enable = AVR_IO_REGBIT(UCSR1B, UDRIE1),
175                         .raised = AVR_IO_REGBIT(UCSR1A, UDRE1),
176                         .vector = USART1_UDRE_vect,
177                 },
178         },
179         .adc = {
180                 .r_admux = ADMUX,
181                 .mux = { AVR_IO_REGBIT(ADMUX, MUX0), AVR_IO_REGBIT(ADMUX, MUX1),
182                                         AVR_IO_REGBIT(ADMUX, MUX2), AVR_IO_REGBIT(ADMUX, MUX3),
183                                         AVR_IO_REGBIT(ADMUX, MUX4),},
184                 .ref = { AVR_IO_REGBIT(ADMUX, REFS0), AVR_IO_REGBIT(ADMUX, REFS1)},
185                 .ref_values = { [1] = ADC_VREF_AVCC, [2] = ADC_VREF_V110, [3] = ADC_VREF_V256 },
186
187                 .adlar = AVR_IO_REGBIT(ADMUX, ADLAR),
188                 .r_adcsra = ADCSRA,
189                 .aden = AVR_IO_REGBIT(ADCSRA, ADEN),
190                 .adsc = AVR_IO_REGBIT(ADCSRA, ADSC),
191                 .adate = AVR_IO_REGBIT(ADCSRA, ADATE),
192                 .adps = { AVR_IO_REGBIT(ADCSRA, ADPS0), AVR_IO_REGBIT(ADCSRA, ADPS1), AVR_IO_REGBIT(ADCSRA, ADPS2),},
193
194                 .r_adch = ADCH,
195                 .r_adcl = ADCL,
196
197                 .r_adcsrb = ADCSRB,
198                 .adts = { AVR_IO_REGBIT(ADCSRB, ADTS0), AVR_IO_REGBIT(ADCSRB, ADTS1), AVR_IO_REGBIT(ADCSRB, ADTS2),},
199
200                 .muxmode = {
201                         [0] = AVR_ADC_SINGLE(0), [1] = AVR_ADC_SINGLE(1),
202                         [2] = AVR_ADC_SINGLE(2), [3] = AVR_ADC_SINGLE(3),
203                         [4] = AVR_ADC_SINGLE(4), [5] = AVR_ADC_SINGLE(5),
204                         [6] = AVR_ADC_SINGLE(6), [7] = AVR_ADC_SINGLE(7),
205
206                         [ 8] = AVR_ADC_DIFF(0, 0,  10), [ 9] = AVR_ADC_DIFF(1, 0,  10),
207                         [10] = AVR_ADC_DIFF(0, 0, 200), [11] = AVR_ADC_DIFF(1, 0, 200),
208                         [12] = AVR_ADC_DIFF(2, 2,  10), [13] = AVR_ADC_DIFF(3, 2,  10),
209                         [14] = AVR_ADC_DIFF(2, 2, 200), [15] = AVR_ADC_DIFF(3, 2, 200),
210
211                         [16] = AVR_ADC_DIFF(0, 1,   1), [17] = AVR_ADC_DIFF(1, 1,   1),
212                         [18] = AVR_ADC_DIFF(2, 1,   1), [19] = AVR_ADC_DIFF(3, 1,   1),
213                         [20] = AVR_ADC_DIFF(4, 1,   1), [21] = AVR_ADC_DIFF(5, 1,   1),
214                         [22] = AVR_ADC_DIFF(6, 1,   1), [23] = AVR_ADC_DIFF(7, 1,   1),
215
216                         [24] = AVR_ADC_DIFF(0, 2,   1), [25] = AVR_ADC_DIFF(1, 2,   1),
217                         [26] = AVR_ADC_DIFF(2, 2,   1), [27] = AVR_ADC_DIFF(3, 2,   1),
218                         [28] = AVR_ADC_DIFF(4, 2,   1), [29] = AVR_ADC_DIFF(5, 2,   1),
219
220                         [30] = AVR_ADC_REF(1100),       // 1.1V
221                         [31] = AVR_ADC_REF(0),          // GND
222                 },
223
224                 .adc = {
225                         .enable = AVR_IO_REGBIT(ADCSRA, ADIE),
226                         .raised = AVR_IO_REGBIT(ADCSRA, ADIF),
227                         .vector = ADC_vect,
228                 },
229         },
230         .timer0 = {
231                 .name = '0',
232                 .wgm = { AVR_IO_REGBIT(TCCR0A, WGM00), AVR_IO_REGBIT(TCCR0A, WGM01), AVR_IO_REGBIT(TCCR0B, WGM02) },
233                 .wgm_op = {
234                         [0] = AVR_TIMER_WGM_NORMAL8(),
235                         [2] = AVR_TIMER_WGM_CTC(),
236                         [3] = AVR_TIMER_WGM_FASTPWM8(),
237                         [7] = AVR_TIMER_WGM_OCPWM(),
238                 },
239                 .cs = { AVR_IO_REGBIT(TCCR0B, CS00), AVR_IO_REGBIT(TCCR0B, CS01), AVR_IO_REGBIT(TCCR0B, CS02) },
240                 .cs_div = { 0, 0, 3 /* 8 */, 6 /* 64 */, 8 /* 256 */, 10 /* 1024 */ },
241
242                 .r_tcnt = TCNT0,
243
244                 .overflow = {
245                         .enable = AVR_IO_REGBIT(TIMSK0, TOIE0),
246                         .raised = AVR_IO_REGBIT(TIFR0, TOV0),
247                         .vector = TIMER0_OVF_vect,
248                 },
249                 .comp = {
250                         [AVR_TIMER_COMPA] = {
251                                 .r_ocr = OCR0A,
252                                 .com = AVR_IO_REGBITS(TCCR0A, COM0A0, 0x3),
253                                 .com_pin = AVR_IO_REGBIT(PORTB, 3),
254                                 .interrupt = {
255                                         .enable = AVR_IO_REGBIT(TIMSK0, OCIE0A),
256                                         .raised = AVR_IO_REGBIT(TIFR0, OCF0A),
257                                         .vector = TIMER0_COMPA_vect,
258                                 },
259                         },
260                         [AVR_TIMER_COMPB] = {
261                                 .r_ocr = OCR0B,
262                                 .com = AVR_IO_REGBITS(TCCR0A, COM0B0, 0x3),
263                                 .com_pin = AVR_IO_REGBIT(PORTB, 4),
264                                 .interrupt = {
265                                         .enable = AVR_IO_REGBIT(TIMSK0, OCIE0B),
266                                         .raised = AVR_IO_REGBIT(TIFR0, OCF0B),
267                                         .vector = TIMER0_COMPB_vect,
268                                 }
269                         }
270                 }
271         },
272         .timer1 = {
273                 .name = '1',
274                 .disabled = AVR_IO_REGBIT(PRR,PRTIM1),
275                 .wgm = { AVR_IO_REGBIT(TCCR1A, WGM10), AVR_IO_REGBIT(TCCR1A, WGM11),
276                                         AVR_IO_REGBIT(TCCR1B, WGM12), AVR_IO_REGBIT(TCCR1B, WGM13) },
277                 .wgm_op = {
278                         [0] = AVR_TIMER_WGM_NORMAL16(),
279                         [1] = AVR_TIMER_WGM_FCPWM8(),
280                         [2] = AVR_TIMER_WGM_FCPWM9(),
281                         [3] = AVR_TIMER_WGM_FCPWM10(),
282                         [4] = AVR_TIMER_WGM_CTC(),
283                         [5] = AVR_TIMER_WGM_FASTPWM8(),
284                         [6] = AVR_TIMER_WGM_FASTPWM9(),
285                         [7] = AVR_TIMER_WGM_FASTPWM10(),
286                         [12] = AVR_TIMER_WGM_ICCTC(),
287                         [14] = AVR_TIMER_WGM_ICPWM(),
288                         [15] = AVR_TIMER_WGM_OCPWM(),
289                 },
290                 .cs = { AVR_IO_REGBIT(TCCR1B, CS10), AVR_IO_REGBIT(TCCR1B, CS11), AVR_IO_REGBIT(TCCR1B, CS12) },
291                 .cs_div = { 0, 0, 3 /* 8 */, 6 /* 64 */, 8 /* 256 */, 10 /* 1024 */  /* External clock T1 is not handled */},
292
293                 .r_tcnt = TCNT1L,
294                 .r_tcnth = TCNT1H,
295                 .r_icr = ICR1L,
296                 .r_icrh = ICR1H,
297
298                 .ices = AVR_IO_REGBIT(TCCR1B, ICES1),
299                 .icp = AVR_IO_REGBIT(PORTD, 6),
300
301                 .overflow = {
302                         .enable = AVR_IO_REGBIT(TIMSK1, TOIE1),
303                         .raised = AVR_IO_REGBIT(TIFR1, TOV1),
304                         .vector = TIMER1_OVF_vect,
305                 },
306                 .icr = {
307                         .enable = AVR_IO_REGBIT(TIMSK1, ICIE1),
308                         .raised = AVR_IO_REGBIT(TIFR1, ICF1),
309                         .vector = TIMER1_CAPT_vect,
310                 },
311                 .comp = {
312                         [AVR_TIMER_COMPA] = {
313                                 .r_ocr = OCR1AL,
314                                 .r_ocrh = OCR1AH,       // 16 bits timers have two bytes of it
315                                 .com = AVR_IO_REGBITS(TCCR1A, COM1A0, 0x3),
316                                 .com_pin = AVR_IO_REGBIT(PORTD, 5),
317                                 .interrupt = {
318                                         .enable = AVR_IO_REGBIT(TIMSK1, OCIE1A),
319                                         .raised = AVR_IO_REGBIT(TIFR1, OCF1A),
320                                         .vector = TIMER1_COMPA_vect,
321                                 }
322                         },
323                         [AVR_TIMER_COMPB] = {
324                                 .r_ocr = OCR1BL,
325                                 .r_ocrh = OCR1BH,
326                                 .com = AVR_IO_REGBITS(TCCR1A, COM1B0, 0x3),
327                                 .com_pin = AVR_IO_REGBIT(PORTD, 4),
328                                 .interrupt = {
329                                         .enable = AVR_IO_REGBIT(TIMSK1, OCIE1B),
330                                         .raised = AVR_IO_REGBIT(TIFR1, OCF1B),
331                                         .vector = TIMER1_COMPB_vect,
332                                 }
333                         }
334                 }
335         },
336         .timer2 = {
337                 .name = '2',
338                 .wgm = { AVR_IO_REGBIT(TCCR2A, WGM20), AVR_IO_REGBIT(TCCR2A, WGM21), AVR_IO_REGBIT(TCCR2B, WGM22) },
339                 .wgm_op = {
340                         [0] = AVR_TIMER_WGM_NORMAL8(),
341                         [2] = AVR_TIMER_WGM_CTC(),
342                         [3] = AVR_TIMER_WGM_FASTPWM8(),
343                         [7] = AVR_TIMER_WGM_OCPWM(),
344                 },
345                 .cs = { AVR_IO_REGBIT(TCCR2B, CS20), AVR_IO_REGBIT(TCCR2B, CS21), AVR_IO_REGBIT(TCCR2B, CS22) },
346                 .cs_div = { 0, 0, 3 /* 8 */, 5 /* 32 */, 6 /* 64 */, 7 /* 128 */, 8 /* 256 */, 10 /* 1024 */ },
347
348                 .r_tcnt = TCNT2,
349                 
350                 // asynchronous timer source bit.. if set, use 32khz frequency
351                 .as2 = AVR_IO_REGBIT(ASSR, AS2),
352                 
353                 .overflow = {
354                         .enable = AVR_IO_REGBIT(TIMSK2, TOIE2),
355                         .raised = AVR_IO_REGBIT(TIFR2, TOV2),
356                         .vector = TIMER2_OVF_vect,
357                 },
358                 .comp = {
359                         [AVR_TIMER_COMPA] = {
360                                 .r_ocr = OCR2A,
361                                 .com = AVR_IO_REGBITS(TCCR2A, COM2A0, 0x3),
362                                 .com_pin = AVR_IO_REGBIT(PORTD, 7),
363                                 .interrupt = {
364                                         .enable = AVR_IO_REGBIT(TIMSK2, OCIE2A),
365                                         .raised = AVR_IO_REGBIT(TIFR2, OCF2A),
366                                         .vector = TIMER2_COMPA_vect,
367                                 },
368                         },
369                         [AVR_TIMER_COMPB] = {
370                                 .r_ocr = OCR2B,
371                                 .com = AVR_IO_REGBITS(TCCR2A, COM2B0, 0x3),
372                                 .com_pin = AVR_IO_REGBIT(PORTD, 6),
373                                 .interrupt = {
374                                         .enable = AVR_IO_REGBIT(TIMSK2, OCIE2B),
375                                         .raised = AVR_IO_REGBIT(TIFR2, OCF2B),
376                                         .vector = TIMER2_COMPB_vect,
377                                 },
378                         }
379                 }
380         },
381         .spi = {
382                 .disabled = AVR_IO_REGBIT(PRR,PRSPI),
383
384                 .r_spdr = SPDR,
385                 .r_spcr = SPCR,
386                 .r_spsr = SPSR,
387
388                 .spe = AVR_IO_REGBIT(SPCR, SPE),
389                 .mstr = AVR_IO_REGBIT(SPCR, MSTR),
390
391                 .spr = { AVR_IO_REGBIT(SPCR, SPR0), AVR_IO_REGBIT(SPCR, SPR1), AVR_IO_REGBIT(SPSR, SPI2X) },
392                 .spi = {
393                         .enable = AVR_IO_REGBIT(SPCR, SPIE),
394                         .raised = AVR_IO_REGBIT(SPSR, SPIF),
395                         .vector = SPI_STC_vect,
396                 },
397         },
398         
399         .twi = {
400                 .disabled = AVR_IO_REGBIT(PRR,PRTWI),
401
402                 .r_twcr = TWCR,
403                 .r_twsr = TWSR,
404                 .r_twbr = TWBR,
405                 .r_twdr = TWDR,
406                 .r_twar = TWAR,
407                 .r_twamr = TWAMR,
408
409                 .twen = AVR_IO_REGBIT(TWCR, TWEN),
410                 .twea = AVR_IO_REGBIT(TWCR, TWEA),
411                 .twsta = AVR_IO_REGBIT(TWCR, TWSTA),
412                 .twsto = AVR_IO_REGBIT(TWCR, TWSTO),
413                 .twwc = AVR_IO_REGBIT(TWCR, TWWC),
414
415                 .twsr = AVR_IO_REGBITS(TWSR, TWS3, 0x1f),       // 5 bits
416                 .twps = AVR_IO_REGBITS(TWSR, TWPS0, 0x3),       // 2 bits
417
418                 .twi = {
419                         .enable = AVR_IO_REGBIT(TWCR, TWIE),
420                         .raised = AVR_IO_REGBIT(TWCR, TWINT),
421                         .vector = TWI_vect,
422                 },
423         },
424
425 };
426
427 #endif /* SIM_CORENAME */
428
429 #endif /* __SIM_MEGAX4_H__ */