]> git.donarmstrong.com Git - kiibohd-controller.git/blob - Bootloader/sim.h
dcb4f0c77a82bf8b78e3935206a55e2604df9e5e
[kiibohd-controller.git] / Bootloader / sim.h
1 /* Copyright (c) 2011,2012 Simon Schubert <2@0x2c.org>.
2  * Modifications by Jacob Alexander 2014 <haata@kiibohd.com>
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef __SIM_H
19 #define __SIM_H
20
21 // ----- Local Includes -----
22
23 #include "mchck.h"
24
25
26
27 // ----- Structs -----
28
29 struct SIM_t {
30         struct SIM_SOPT1_t {
31                 UNION_STRUCT_START(32);
32                 uint32_t _rsvd0 : 12;
33                 enum {
34                         SIM_RAMSIZE_8KB = 1,
35                         SIM_RAMSIZE_16KB = 3
36                 } ramsize : 4;
37                 uint32_t _rsvd1 : 2;
38                 enum {
39                         SIM_OSC32KSEL_SYSTEM = 0,
40                         SIM_OSC32KSEL_RTC = 2,
41                         SIM_OSC32KSEL_LPO = 3
42                 } osc32ksel : 2;
43                 uint32_t _rsvd2 : 9;
44                 uint32_t usbvstby : 1;
45                 uint32_t usbsstby : 1;
46                 uint32_t usbregen : 1;
47                 UNION_STRUCT_END;
48         } sopt1;
49         struct SIM_SOPT1CFG_t {
50                 UNION_STRUCT_START(32);
51                 uint32_t _rsvd0 : 24;
52                 uint32_t urwe : 1;
53                 uint32_t uvswe : 1;
54                 uint32_t usswe : 1;
55                 uint32_t _rsvd1 : 5;
56                 UNION_STRUCT_END;
57         } sopt1cfg;
58         uint32_t _pad0[(0x1004 - 0x8) / 4];
59         struct SIM_SOPT2_t {
60                 UNION_STRUCT_START(32);
61                 uint32_t _rsvd0 : 4;
62                 enum {
63                         SIM_RTCCLKOUTSEL_1HZ = 0,
64                         SIM_RTCCLKOUTSEL_32KHZ = 1
65                 } rtcclkoutsel : 1;
66                 enum {
67                         SIM_CLKOUTSEL_FLASH = 2,
68                         SIM_CLKOUTSEL_LPO = 3,
69                         SIM_CLKOUTSEL_MCG = 4,
70                         SIM_CLKOUTSEL_RTC = 5,
71                         SIM_CLKOUTSEL_OSC = 6
72                 } clkoutsel : 3;
73                 uint32_t _rsvd1 : 3;
74                 enum {
75                         SIM_PTD7PAD_SINGLE = 0,
76                         SIM_PTD7PAD_DOUBLE = 1
77                 } ptd7pad : 1;
78                 enum {
79                         SIM_TRACECLKSEL_MCG = 0,
80                         SIM_TRACECLKSEL_CORE = 1
81                 } traceclksel : 1;
82                 uint32_t _rsvd2 : 3;
83                 enum {
84                         SIM_PLLFLLSEL_FLL = 0,
85                         SIM_PLLFLLSEL_PLL = 1
86                 } pllfllsel : 1;
87                 uint32_t _rsvd3 : 1;
88                 enum {
89                         SIM_USBSRC_EXTERNAL = 0,
90                         SIM_USBSRC_MCG = 1
91                 } usbsrc : 1;
92                 uint32_t _rsvd4 : 13;
93                 UNION_STRUCT_END;
94         } sopt2;
95         uint32_t _pad1;
96         struct SIM_SOPT4_t {
97                 UNION_STRUCT_START(32);
98                 enum sim_ftmflt {
99                         SIM_FTMFLT_FTM = 0,
100                         SIM_FTMFLT_CMP = 1
101                 } ftm0flt0 : 1;
102                 enum sim_ftmflt ftm0flt1 : 1;
103                 uint32_t _rsvd0 : 2;
104                 enum sim_ftmflt ftm1flt0 : 1;
105                 uint32_t _rsvd1 : 13;
106                 enum {
107                         SIM_FTMCHSRC_FTM = 0,
108                         SIM_FTMCHSRC_CMP0 = 1,
109                         SIM_FTMCHSRC_CMP1 = 2,
110                         SIM_FTMCHSRC_USBSOF = 3
111                 } ftm1ch0src : 2;
112                 uint32_t _rsvd2 : 4;
113                 enum sim_ftmclksel {
114                         SIM_FTMCLKSEL_CLK0 = 0,
115                         SIM_FTMCLKSEL_CLK1 = 1
116                 } ftm0clksel : 1;
117                 enum sim_ftmclksel ftm1clksel : 1;
118                 uint32_t _rsvd3 : 2;
119                 enum {
120                         SIM_FTMTRGSRC_HSCMP0 = 0,
121                         SIM_FTMTRGSRC_FTM1 = 1
122                 } ftm0trg0src : 1;
123                 uint32_t _rsvd4 : 3;
124                 UNION_STRUCT_END;
125         } sopt4;
126         struct SIM_SOPT5_t {
127                 UNION_STRUCT_START(32);
128                 enum sim_uarttxsrc {
129                         SIM_UARTTXSRC_UART = 0,
130                         SIM_UARTTXSRC_FTM = 1
131                 } uart0txsrc : 1;
132                 uint32_t _rsvd0 : 1;
133                 enum sim_uartrxsrc {
134                         SIM_UARTRXSRC_UART = 0,
135                         SIM_UARTRXSRC_CMP0 = 1,
136                         SIM_UARTRXSRC_CMP1 = 2
137                 } uart0rxsrc : 2;
138                 enum sim_uarttxsrc uart1txsrc : 1;
139                 uint32_t _rsvd1 : 1;
140                 enum sim_uartrxsrc uart1rxsrc : 2;
141                 uint32_t _rsvd2 : 24;
142                 UNION_STRUCT_END;
143         } sopt5;
144         uint32_t _pad2;
145         struct SIM_SOPT7_t {
146                 UNION_STRUCT_START(32);
147                 enum {
148                         SIM_ADCTRGSEL_PDB = 0,
149                         SIM_ADCTRGSEL_HSCMP0 = 1,
150                         SIM_ADCTRGSEL_HSCMP1 = 2,
151                         SIM_ADCTRGSEL_PIT0 = 4,
152                         SIM_ADCTRGSEL_PIT1 = 5,
153                         SIM_ADCTRGSEL_PIT2 = 6,
154                         SIM_ADCTRGSEL_PIT3 = 7,
155                         SIM_ADCTRGSEL_FTM0 = 8,
156                         SIM_ADCTRGSEL_FTM1 = 9,
157                         SIM_ADCTRGSEL_RTCALARM = 12,
158                         SIM_ADCTRGSEL_RTCSECS = 13,
159                         SIM_ADCTRGSEL_LPTIMER = 14
160                 } adc0trgsel : 4;
161                 enum {
162                         SIM_ADCPRETRGSEL_A = 0,
163                         SIM_ADCPRETRGSEL_B = 1
164                 } adc0pretrgsel : 1;
165                 uint32_t _rsvd0 : 2;
166                 enum {
167                         SIM_ADCALTTRGEN_PDB = 0,
168                         SIM_ADCALTTRGEN_ALT = 1
169                 } adc0alttrgen : 1;
170                 uint32_t _rsvd1 : 24;
171                 UNION_STRUCT_END;
172         } sopt7;
173         uint32_t _pad3[(0x1024 - 0x101c) / 4];
174         struct SIM_SDID_t {
175                 UNION_STRUCT_START(32);
176                 enum {
177                         SIM_PINID_32 = 2,
178                         SIM_PINID_48 = 4,
179                         SIM_PINID_64 = 5
180                 } pinid : 4;
181                 enum {
182                         SIM_FAMID_K10 = 0,
183                         SIM_FAMID_K20 = 1
184                 } famid : 3;
185                 uint32_t _rsvd1 : 5;
186                 uint32_t revid : 4;
187                 uint32_t _rsvd2 : 16;
188                 UNION_STRUCT_END;
189         } sdid;
190         uint32_t _pad4[(0x1034 - 0x1028) / 4];
191         struct SIM_SCGC4_t {
192                 UNION_STRUCT_START(32);
193                 uint32_t _rsvd0 : 1;
194                 uint32_t ewm : 1;
195                 uint32_t cmt : 1;
196                 uint32_t _rsvd1 : 3;
197                 uint32_t i2c0 : 1;
198                 uint32_t _rsvd2 : 3;
199                 uint32_t uart0 : 1;
200                 uint32_t uart1 : 1;
201                 uint32_t uart2 : 1;
202                 uint32_t _rsvd3 : 5;
203                 uint32_t usbotg : 1;
204                 uint32_t cmp : 1;
205                 uint32_t vref : 1;
206                 uint32_t _rsvd4 : 11;
207                 UNION_STRUCT_END;
208         } scgc4;
209         struct SIM_SCGC5_t {
210                 UNION_STRUCT_START(32);
211                 uint32_t lptimer : 1;
212                 uint32_t _rsvd0 : 4;
213                 uint32_t tsi : 1;
214                 uint32_t _rsvd1 : 3;
215                 uint32_t porta : 1;
216                 uint32_t portb : 1;
217                 uint32_t portc : 1;
218                 uint32_t portd : 1;
219                 uint32_t porte : 1;
220                 uint32_t _rsvd2 : 18;
221                 UNION_STRUCT_END;
222         } scgc5;
223         struct SIM_SCGC6_t {
224                 UNION_STRUCT_START(32);
225                 uint32_t ftfl : 1;
226                 uint32_t dmamux : 1;
227                 uint32_t _rsvd0 : 10;
228                 uint32_t spi0 : 1;
229                 uint32_t _rsvd1 : 2;
230                 uint32_t i2s : 1;
231                 uint32_t _rsvd2 : 2;
232                 uint32_t crc : 1;
233                 uint32_t _rsvd3 : 2;
234                 uint32_t usbdcd : 1;
235                 uint32_t pdb : 1;
236                 uint32_t pit : 1;
237                 uint32_t ftm0 : 1;
238                 uint32_t ftm1 : 1;
239                 uint32_t _rsvd4 : 1;
240                 uint32_t adc0 : 1;
241                 uint32_t _rsvd5 : 1;
242                 uint32_t rtc : 1;
243                 uint32_t _rsvd6 : 2;
244                 UNION_STRUCT_END;
245         } scgc6;
246         struct SIM_SCGC7_t {
247                 UNION_STRUCT_START(32);
248                 uint32_t _rsvd0 : 1;
249                 uint32_t dma : 1;
250                 uint32_t _rsvd1 : 30;
251                 UNION_STRUCT_END;
252         } scgc7;
253         struct SIM_CLKDIV1_t {
254                 UNION_STRUCT_START(32);
255                 uint32_t _rsvd0 : 16;
256                 uint32_t outdiv4 : 4;
257                 uint32_t _rsvd1 : 4;
258                 uint32_t outdiv2 : 4;
259                 uint32_t outdiv1 : 4;
260                 UNION_STRUCT_END;
261         } clkdiv1;
262         struct SIM_CLKDIV2_t {
263                 UNION_STRUCT_START(32);
264                 uint32_t usbfrac : 1;
265                 uint32_t usbdiv : 3;
266                 uint32_t _rsvd0 : 28;
267                 UNION_STRUCT_END;
268         } clkdiv2;
269         struct SIM_FCFG1_t {
270                 UNION_STRUCT_START(32);
271                 uint32_t flashdis : 1;
272                 uint32_t flashdoze : 1;
273                 uint32_t _rsvd0 : 6;
274
275                 /* the following enum is analogous to enum
276                  * FTFL_FLEXNVM_PARTITION in ftfl.h, but that one is padded
277                  * with four 1-bits to make an 8-bit value.
278                  */
279                 enum SIM_FLEXNVM_PARTITION {
280                         SIM_FLEXNVM_DATA_32_EEPROM_0  = 0x0,
281                         SIM_FLEXNVM_DATA_24_EEPROM_8  = 0x1,
282                         SIM_FLEXNVM_DATA_16_EEPROM_16 = 0x2,
283                         SIM_FLEXNVM_DATA_8_EEPROM_24  = 0x9,
284                         SIM_FLEXNVM_DATA_0_EEPROM_32  = 0x3
285                 } depart : 4;
286
287                 uint32_t _rsvd1 : 4;
288                 enum {
289                         SIM_EESIZE_2KB = 3,
290                         SIM_EESIZE_1KB = 4,
291                         SIM_EESIZE_512B = 5,
292                         SIM_EESIZE_256B = 6,
293                         SIM_EESIZE_128B = 7,
294                         SIM_EESIZE_64B = 8,
295                         SIM_EESIZE_32B = 9,
296                         SIM_EESIZE_0B = 15
297                 } eesize : 4;
298                 uint32_t _rsvd2 : 4;
299                 enum {
300                         SIM_PFSIZE_32KB = 3,
301                         SIM_PFSIZE_64KB = 5,
302                         SIM_PFSIZE_128KB = 7
303                 } pfsize : 4;
304                 enum {
305                         SIM_NVMSIZE_0KB = 0,
306                         SIM_NVMSIZE_32KB = 3
307                 } nvmsize : 4;
308                 UNION_STRUCT_END;
309         } fcfg1;
310         struct SIM_FCFG2_t {
311                 UNION_STRUCT_START(32);
312                 uint32_t _rsvd0 : 16;
313                 uint32_t maxaddr1 : 7;
314                 enum {
315                         SIM_PFLSH_FLEXNVM = 0,
316                         SIM_PFLSH_PROGRAM = 1
317                 } pflsh : 1;
318                 uint32_t maxaddr0 : 7;
319                 uint32_t _rsvd1 : 1;
320                 UNION_STRUCT_END;
321         } fcfg2;
322         uint32_t uidh;
323         uint32_t uidmh;
324         uint32_t uidml;
325         uint32_t uidl;
326 };
327 CTASSERT_SIZE_BYTE(struct SIM_t, 0x1064);
328
329 extern volatile struct SIM_t SIM;
330
331 #endif
332