This repository has been archived by the owner on Feb 2, 2020. It is now read-only.
/
AT91SAM9X35.h
1545 lines (1252 loc) · 89.8 KB
/
AT91SAM9X35.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// Copyright Microsoft Corporation
// Copyright GHI Electronics, LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <stdio.h>
#include <string.h>
#include <TinyCLR.h>
#include <Device.h>
#define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0]))
#define CONCAT2(a, b) a##b
#define CONCAT(a, b) CONCAT2(a, b)
#define CHARIZE2(c) #c
#define CHARIZE(c) (CHARIZE2(c)[0])
//
// PERIPHERAL ID DEFINITIONS FOR AT91SAM9X35
//
#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ)
#define AT91C_ID_SYS ((unsigned int) 1) // System Interrupt
#define AT91C_ID_PIOA_PIOB ((unsigned int) 2) // Parallel IO Controller A and B
#define AT91C_ID_PIOC_PIOD ((unsigned int) 3) // Parallel IO Controller C and D
#define AT91C_ID_SMD ((unsigned int) 4) // SMD Soft Modem - not yet supported
#define AT91C_ID_USART0 ((unsigned int) 5) // USART 0
#define AT91C_ID_USART1 ((unsigned int) 6) // USART 1
#define AT91C_ID_USART2 ((unsigned int) 7) // USART 2
#define AT91C_ID_TWI AT91C_ID_TWI0 // only support one I2C
#define AT91C_ID_TWI0 ((unsigned int) 9) // Two-Wire Interface 0
#define AT91C_ID_TWI1 ((unsigned int) 10) // Two-Wire Interface 1
#define AT91C_ID_TWI2 ((unsigned int) 11) // Two-Wire Interface 2
#define AT91C_ID_HSMCI0 ((unsigned int) 12) // High Speed Multimedia Card Interface 0
#define AT91C_ID_SPI0 ((unsigned int) 13) // Serial Peripheral Interface
#define AT91C_ID_SPI1 ((unsigned int) 14) // Serial Peripheral Interface
#define AT91C_ID_UART0 ((unsigned int) 15) // UART 0
#define AT91C_ID_UART1 ((unsigned int) 16) // UART 1
#define AT91C_ID_TC0_TC1 ((unsigned int) 17) // Timer Counter 0, 1, 2, 3, 4, 5
#define AT91C_ID_PWM ((unsigned int) 18) // Pulse Width Modulation Controller
#define AT91C_ID_ADC ((unsigned int) 19) // ADC Controller
#define AT91C_ID_DMAC0 ((unsigned int) 20) // DMA Controller 0
#define AT91C_ID_DMAC1 ((unsigned int) 21) // DMA Controller 1
#define AT91C_ID_UHPHS ((unsigned int) 22) // USB Host High Speed
#define AT91C_ID_UDPHS ((unsigned int) 23) // USB Device High Speed
#define AT91C_ID_EMAC ((unsigned int) 24) // Ethernet MAC
#define AT91C_ID_LCDC ((unsigned int) 25) // LCD Controller
#define AT91C_ID_HSMCI1 ((unsigned int) 26) // High Speed Multimedia Card Interface 1
#define AT91C_ID_SSC ((unsigned int) 28) // Synchronous Serial Controller
#define AT91C_ID_CAN0 ((unsigned int) 29) // CAN Controller 0
#define AT91C_ID_CAN1 ((unsigned int) 30) // CAN Controller 1
#define AT91C_ID_IRQ0 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ0)
//
// BASE ADDRESS DEFINITIONS FOR AT91SAM9RL64
//
#define AT91C_BASE_SYS 0xFFFFE600 // (SYS) Base Address
#define AT91C_BASE_DMAC0 0xFFFFEC00 // Hydra original address 0xFFFFE600 // (DMAC)Address - Not same Memory Address
#define AT91C_BASE_DDRS 0xFFFFE800 // (DDRS) Address
#define AT91C_BASE_SDRAMC 0xFFFFEA00 // (SDRAMC) Base Address
#define AT91C_BASE_SMC 0xFFFFEC00 // (SMC) Base Address
#define AT91C_BASE_MATRIX 0xFFFFEE00 // (MATRIX) Base Address - Not same Memory Address
#define AT91C_BASE_AIC 0xFFFFF000 // (AIC) Base Address
#define AT91C_BASE_PDC_DBGU 0xFFFFF300 // (PDC_DBGU) Base Address
#define AT91C_BASE_DBGU 0xFFFFF200 // (DBGU) Base Address
#define AT91C_BASE_PIOA 0xFFFFF400 // (PIOA) Base Address
#define AT91C_BASE_PIOB 0xFFFFF600 // (PIOB) Base Address
#define AT91C_BASE_PIOC 0xFFFFF800 // (PIOC) Base Address
#define AT91C_BASE_PIOD 0xFFFFFA00 // (PIOD) Base Address
#define AT91C_BASE_CKGR 0xFFFFFC20 // (CKGR) Base Address
#define AT91C_BASE_PMC 0xFFFFFC00 // (PMC) Base Address
#define AT91C_BASE_RSTC 0xFFFFFE00 // (RSTC) Base Address - Not same Memory Address
#define AT91C_BASE_RSTC_SR 0xFFFFFD04
#define AT91C_BASE_RSTC_MR 0xFFFFFD08
#define AT91C_BASE_SHDWC 0xFFFFFD10 // (SHDWC) Base Address
#define AT91C_BASE_RTTC 0xFFFFFD20 // (RTTC) Base Address
#define AT91C_BASE_PITC 0xFFFFFE30 // (PITC) Base Address
#define AT91C_BASE_WDTC 0xFFFFFE40 // (WDTC) Base Address
#define AT91C_BASE_SCKCR 0xFFFFFE50 // (SCKCR) Base Address
#define AT91C_BASE_GPBR 0xFFFFFD60 // (GPBR) Base Address
#define AT91C_BASE_TC0 0xF8008000 // Hydra original address 0xFFFA0000 // (TC0) Base Address
#define AT91C_BASE_TC1 0xFFFA0040 // (TC1) Base Address
#define AT91C_BASE_TC2 0xFFFA0080 // (TC2) Base Address
#define AT91C_BASE_TCB0 0xFFFA0000 // (TCB0) Base Address
#define AT91C_BASE_PDC_MCI 0xFFFA4100 // (PDC_MCI) Base Address
#define AT91C_BASE_MCI 0xF0008000 // Hydra original address 0xFFFA4000 // (MCI) Base Address
#define AT91C_BASE_TWI0 0xF8010000 // Hydra original address 0xFFFA8000 // (TWI1) Base Address
#define AT91C_BASE_TWI1 0xF8014000 // Hydra original address 0xFFFAC000 // (TWI2) Base Address
#define AT91C_BASE_TWI2 0xF8018000 // (TWI3) Base Address
#define AT91C_BASE_TWI AT91C_BASE_TWI0 // Support one I2C controller only
#define AT91C_BASE_USART0 0xF801C000 // Hydra original address 0xFFFB0000 // (US0) Base Address - Not same Memory Address
#define AT91C_BASE_USART1 0xF8020000 // Hydra original address 0xFFFB4000 // (US1) Base Address - Not same Memory Address
#define AT91C_BASE_USART2 0xF8024000 // Hydra original address 0xFFFB8000 // (US2) Base Address - Not same Memory Address
#define AT91C_BASE_UART0 0xF8040000
#define AT91C_BASE_UART1 0xF8044000
#define AT91C_BASE_PDC_US3 0xFFFBC100 // (PDC_US3) Base Address
#define AT91C_BASE_US3 0xF8008000 // Hydra original address 0xFFFBC000 // (US3) Base Address - Not same Memory Address
#define AT91C_BASE_PDC_SSC0 0xFFFC0100 // (PDC_SSC0) Base Address
#define AT91C_BASE_SSC0 0xFFFC0000 // (SSC0) Base Address
#define AT91C_BASE_PDC_SSC1 0xFFFC4100 // (PDC_SSC1) Base Address
#define AT91C_BASE_SSC1 0xFFFC4000 // (SSC1) Base Address
#define AT91C_BASE_PWMC 0xF8034000 // Hydra original address 0xFFFC8000 // (PWMC) Base Address - Not same Memory Address
#define AT91C_BASE_PDC_SPI0 0xFFFCC100 // (PDC_SPI0) Base Address
#define AT91C_BASE_SPI0 0xF0000000 // (SPI0) Base Address // Hydra original address 0xFFFCC000
#define AT91C_BASE_SPI1 0xF0004000 // (SPI1) Base Address
#define AT91C_BASE_TSADCC 0xFFFD0000 // (ADC touch screen) Base Address
#define AT91C_BASE_UDP 0xF803C000 // 0xFFFD4000 // (UDP) Base Address - Changed on G400
#define AT91C_BASE_AC97 0xFFFD8000 // (UDP) Base Address
#define AT91C_BASE_ITCM 0x00100000 // (ITCM) Base Address
#define AT91C_BASE_DTCM 0x00200000 // (DTCM) Base Address
#define AT91C_BASE_LCDC 0xF8038000 // Hydra original address 0x00500000 // (LCDC) Base Address
#define AT91C_BASE_UDP_DMA 0x00500000 // Hydra original address 0x00600000 // (UDP DMA) Base Address
#define AT91C_BASE_UHP_OHCI 0x00600000 // USB OHCI
#define AT91C_BASE_EMAC 0xF802C000
// RTSC bit defines
#define AT91C_RTSC__PROCRST 0x01 // processor reset bit
#define AT91C_RTSC__PERRST 0x04 // Peripheral reset bit
#define AT91C_RTSC__EXTRST 0x08 // asserts NRST pin
#define AT91C_RSTC__RESET_KEY 0xA5000000 // reset key
#define AT91C_RTSC_SR__SRCMP (1ul < 17) // Software Reset Command in progress
#define AT91C_RTSC_SR__NRSTL (1ul < 16) // Registers the NRST Pin Level at Master Clock (MCK)
#define AT91C_RTSC_SR__RSTTYP (7ul < 8) // Reset Type mask
#define AT91C_RTSC_SR__BODSTS (1ul < 1) // Brownout Detection Status
#define AT91C_RTSC_SR__URSTS (1ul < 0) // User Reset Status
// SHDWC bit defines
#define AT91C_SHDWC__SHUTDOWN_KEY 0xA5000000 // reset key
#define AT91C_SHDWC__SHDW 0x01 // processor reset bit
extern const TinyCLR_Api_Manager* apiManager;
struct AT91_DDRS {
static const uint32_t c_Base = AT91C_BASE_DDRS;
volatile uint32_t DDRSDRC_MR; // 0xFFFFE800 DDRSDRC Mode Register
volatile uint32_t DDRSDRC_RTR; // 0xFFFFE804 DDRSDRC Refresh Timer Register
volatile uint32_t DDRSDRC_CR; // 0xFFFFE808 DDRSDRC Configuration Register
volatile uint32_t DDRSDRC_TPR0; // 0xFFFFE80C DDRSDRC Timing Parameter 0 Register
volatile uint32_t DDRSDRC_TPR1; //0xFFFFE810 DDRSDRC Timing Parameter 1 Register
volatile uint32_t DDRSDRC_TPR2; // 0xFFFFE814 DDRSDRC Timing Parameter 2 Register
volatile uint32_t Reserved[1]; //Reserved
volatile uint32_t DDRSDRC_LPR; //0xFFFFE81C DDRSDRC Low-power Register
volatile uint32_t DDRSDRC_MD; // 0xFFFFE820DDRSDRC Memory Device Register
volatile uint32_t DDRSDRC_DLL; //0xFFFFE824 DDRSDRC DLL Register
volatile uint32_t DDRSDRC_HS; //0xFFFFE82C DDRSDRC High Speed Register
volatile uint32_t DDRSDRC_WPMR; //DDRSDRC Write Protect Mode Register
volatile uint32_t DDRSDRC_WPSR; //DDRSDRC Write Protect Status Register
};
struct AT91SAM9X35_PMC {
static const uint32_t c_Base = AT91C_BASE_PMC;
volatile uint32_t PMC_SCER; // System Clock Enable Register
volatile uint32_t PMC_SCDR; // System Clock Disable Register
volatile uint32_t PMC_SCSR; // System Clock Status Register
volatile uint32_t Reserved0[1];
volatile uint32_t PMC_PCER; // Peripheral Clock Enable Register
volatile uint32_t PMC_PCDR; // Peripheral Clock Disable Register
volatile uint32_t PMC_PCSR; // Peripheral Clock Status Register
volatile uint32_t PMC_CKGR_UCKR; // UTMI Clock Register
volatile uint32_t PMC_CKGR_MOR; // Main Oscillator Register
static const uint32_t CKGR_MOSCEN = (0x1 << 0); // (CKGR) Main Oscillator Enable
static const uint32_t CKGR_OSCBYPASS = (0x1 << 1); // (CKGR) Main Oscillator Bypass
static const uint32_t CKGR_OSCOUNT = (0xFF << 8); // (CKGR) Main Oscillator Start-up Time
volatile uint32_t PMC_CKGR_MCFR; // Main Clock Frequency Register
static const uint32_t CKGR_MAINF = (0xFFFF << 0); // (CKGR) Main Clock Frequency
static const uint32_t CKGR_MAINRDY = (0x1 << 16); // (CKGR) Main Clock Ready
volatile uint32_t PMC_CKGR_PLLAR; // PLL Register
static const uint32_t CKGR_DIV = (0xFF << 0); // (CKGR) Divider Selected
static const uint32_t CKGR_DIV_0 = (0x0); // (CKGR) Divider output is 0
static const uint32_t CKGR_DIV_BYPASS = (0x1); // (CKGR) Divider is bypassed
static const uint32_t CKGR_PLLCOUNT = (0x3F << 8); // (CKGR) PLL Counter
static const uint32_t CKGR_OUT = (0x3 << 14); // (CKGR) PLL Output Frequency Range
static const uint32_t CKGR_OUT_0 = (0x0 << 14); // (CKGR) Please refer to the PLL datasheet
static const uint32_t CKGR_OUT_1 = (0x1 << 14); // (CKGR) Please refer to the PLL datasheet
static const uint32_t CKGR_OUT_2 = (0x2 << 14); // (CKGR) Please refer to the PLL datasheet
static const uint32_t CKGR_OUT_3 = (0x3 << 14); // (CKGR) Please refer to the PLL datasheet
static const uint32_t CKGR_MUL = (0x7FF << 16); // (CKGR) PLL Multiplier
static const uint32_t CKGR_USBDIV = (0x3 << 28); // (CKGR) Divider for USB Clocks
static const uint32_t CKGR_USBDIV_0 = (0x0 << 28); // (CKGR) Divider output is PLL clock output
static const uint32_t CKGR_USBDIV_1 = (0x1 << 28); // (CKGR) Divider output is PLL clock output divided by 2
static const uint32_t CKGR_USBDIV_2 = (0x2 << 28); // (CKGR) Divider output is PLL clock output divided by 4
volatile uint32_t Reserved1[1];
volatile uint32_t PMC_MCKR; // Master Clock Register
static const uint32_t PMC_CSS = (0x3 << 0); // (PMC) Programmable Clock Selection
static const uint32_t PMC_CSS_SLOW_CLK = (0x0); // (PMC) Slow Clock is selected
static const uint32_t PMC_CSS_MAIN_CLK = (0x1); // (PMC) Main Clock is selected
static const uint32_t PMC_CSS_PLLA_CLK = (0x2); // (PMC) Clock from PLL1 is selected = (SAM9 only);
static const uint32_t PMC_CSS_PLL_CLK = (0x3); // (PMC) Clock from PLL is selected
static const uint32_t PMC_PRES = (0x7 << 2); // (PMC) Programmable Clock Prescaler
static const uint32_t PMC_PRES_CLK = (0x0 << 2); // (PMC) Selected clock
static const uint32_t PMC_PRES_CLK_2 = (0x1 << 2); // (PMC) Selected clock divided by 2
static const uint32_t PMC_PRES_CLK_4 = (0x2 << 2); // (PMC) Selected clock divided by 4
static const uint32_t PMC_PRES_CLK_8 = (0x3 << 2); // (PMC) Selected clock divided by 8
static const uint32_t PMC_PRES_CLK_16 = (0x4 << 2); // (PMC) Selected clock divided by 16
static const uint32_t PMC_PRES_CLK_32 = (0x5 << 2); // (PMC) Selected clock divided by 32
static const uint32_t PMC_PRES_CLK_64 = (0x6 << 2); // (PMC) Selected clock divided by 64
static const uint32_t PMC_MDIV = (0x3 << 8); // (PMC) Master Clock Division
static const uint32_t PMC_MDIV_1 = (0x0 << 8); // (PMC) The master clock and the processor clock are the same
static const uint32_t PMC_MDIV_2 = (0x1 << 8); // (PMC) The processor clock is twice as fast as the master clock
static const uint32_t PMC_MDIV_3 = (0x2 << 8); // (PMC) The processor clock is four times faster than the master clock
volatile uint32_t Reserved3[3]; // TQD: Just a note PMC_USB and PMC_SMD are in here
volatile uint32_t PMC_PCKR[2]; // Programmable Clock Register
volatile uint32_t Reserved4[6];
volatile uint32_t PMC_IER; // Interrupt Enable Register
static const uint32_t PMC_MOSCS = (0x1 << 0); // (PMC) MOSC Status/Enable/Disable/Mask
static const uint32_t PMC_LOCKA = (0x1 << 1); // (PMC) PLL Status/Enable/Disable/Mask =(SAM9 Only);
static const uint32_t PMC_LOCK = (0x1 << 2); // (PMC) PLL Status/Enable/Disable/Mask
static const uint32_t PMC_MCKRDY = (0x1 << 3); // (PMC) MCK_RDY Status/Enable/Disable/Mask
static const uint32_t PMC_PCK0RDY = (0x1 << 8); // (PMC) PCK0_RDY Status/Enable/Disable/Mask
static const uint32_t PMC_PCK1RDY = (0x1 << 9); // (PMC) PCK1_RDY Status/Enable/Disable/Mask
static const uint32_t PMC_PCK2RDY = (0x1 << 10); // (PMC) PCK2_RDY Status/Enable/Disable/Mask
static const uint32_t PMC_PCK3RDY = (0x1 << 11); // (PMC) PCK3_RDY Status/Enable/Disable/Mask
static const uint32_t PMC_LOCKU = (0x1 << 6); //(PMC) USB clock locked
volatile uint32_t PMC_IDR; // Interrupt Disable Register
volatile uint32_t PMC_SR; // Status Register
volatile uint32_t PMC_IMR; // Interrupt Mask Register
volatile uint32_t Reserved5[3]; // Reserved
volatile uint32_t PMC_PLLICPR; // Charge Pump Current Register
static const uint32_t PMC_PLLICPR__PLLA = (0x1 << 0);
static const uint32_t PMC_PLLICPR__PLLB = (0x1 << 16);
__inline void EnableSystemClock(uint32_t clkIds) {
PMC_SCER = clkIds;
}
__inline void DisableSystemClock(uint32_t clkIds) {
PMC_SCDR = clkIds;
}
__inline void EnablePeriphClock(uint32_t periphIds) {
PMC_PCER = (1 << periphIds);
}
__inline void DisablePeriphClock(uint32_t periphIds) {
PMC_PCDR = (1 << periphIds);
}
};
// MMU
struct ARM9_MMU {
static const uint32_t c_TTB_size = 0x4000;
static const uint32_t c_MMU_L1_Fault = 0x00;
static const uint32_t c_MMU_L1_Coarse = 0x11;
static const uint32_t c_MMU_L1_Section = 0x12;
static const uint32_t c_MMU_L1_Fine = 0x13;
static const uint32_t c_MMU_L1_size = 1 << 20;
static const uint32_t c_AP__NoAccess = 0;
static const uint32_t c_AP__Client = 1;
static const uint32_t c_AP__Reserved = 2;
static const uint32_t c_AP__Manager = 3;
//--//
static uint32_t* GetL1Entry(uint32_t* base, uint32_t address);
static void InitializeL1(uint32_t* baseOfTTBs);
static uint32_t GenerateL1_Section(uint32_t address, uint32_t AP, uint32_t domain, bool Cachable, bool Buffered, bool Xtended = false);
static void GenerateL1_Sections(uint32_t* baseOfTTBs, uint32_t mappedAddress, uint32_t physAddress, int32_t size, uint32_t AP, uint32_t domain, bool Cachable, bool Buffered, bool Xtended = false);
};
void AT91SAM9X35_MMU_Initialize();
void AT91SAM9X35_CPU_InvalidateTLBs();
void AT91SAM9X35_CPU_EnableMMU(void* TTB);
void AT91SAM9X35_CPU_DisableMMU();
bool AT91SAM9X35_CPU_IsMMUEnabled();
void AT91SAM9X35_CPU_BootstrapCode();
// Cache
void AT91SAM9X35_Cache_FlushCaches();
void AT91SAM9X35_Cache_DrainWriteBuffers();
void AT91SAM9X35_Cache_InvalidateCaches();
void AT91SAM9X35_Cache_EnableCaches();
void AT91SAM9X35_Cache_DisableCaches();
template <typename T> void AT91SAM9X35_Cache_InvalidateAddress(T* address);
size_t AT91SAM9X35_Cache_GetCachableAddress(size_t address);
size_t AT91SAM9X35_Cache_GetUncachableAddress(size_t address);
// GPIO
//////////////////////////////////////////////////////////////////////////////
// AT91SAM9X35_GPIO
//
struct AT91SAM9X35_PIO {
static const uint32_t c_Base = AT91C_BASE_PIOA;
static const uint32_t c_Base_Offset = 0x200;
volatile uint32_t PIO_PER; /**< \brief (Pio Offset: 0x0000) PIO Enable Register */
volatile uint32_t PIO_PDR; /**< \brief (Pio Offset: 0x0004) PIO Disable Register */
volatile uint32_t PIO_PSR; /**< \brief (Pio Offset: 0x0008) PIO Status Register */
volatile uint32_t Reserved1[1];
volatile uint32_t PIO_OER; /**< \brief (Pio Offset: 0x0010) Output Enable Register */
volatile uint32_t PIO_ODR; /**< \brief (Pio Offset: 0x0014) Output Disable Register */
volatile uint32_t PIO_OSR; /**< \brief (Pio Offset: 0x0018) Output Status Register */
volatile uint32_t Reserved2[1];
volatile uint32_t PIO_IFER; /**< \brief (Pio Offset: 0x0020) Glitch Input Filter Enable Register */
volatile uint32_t PIO_IFDR; /**< \brief (Pio Offset: 0x0024) Glitch Input Filter Disable Register */
volatile uint32_t PIO_IFSR; /**< \brief (Pio Offset: 0x0028) Glitch Input Filter Status Register */
volatile uint32_t Reserved3[1];
volatile uint32_t PIO_SODR; /**< \brief (Pio Offset: 0x0030) Set Output Data Register */
volatile uint32_t PIO_CODR; /**< \brief (Pio Offset: 0x0034) Clear Output Data Register */
volatile uint32_t PIO_ODSR; /**< \brief (Pio Offset: 0x0038) Output Data Status Register */
volatile uint32_t PIO_PDSR; /**< \brief (Pio Offset: 0x003C) Pin Data Status Register */
volatile uint32_t PIO_IER; /**< \brief (Pio Offset: 0x0040) Interrupt Enable Register */
volatile uint32_t PIO_IDR; /**< \brief (Pio Offset: 0x0044) Interrupt Disable Register */
volatile uint32_t PIO_IMR; /**< \brief (Pio Offset: 0x0048) Interrupt Mask Register */
volatile uint32_t PIO_ISR; /**< \brief (Pio Offset: 0x004C) Interrupt Status Register */
volatile uint32_t PIO_MDER; /**< \brief (Pio Offset: 0x0050) Multi-state Enable Register */
volatile uint32_t PIO_MDDR; /**< \brief (Pio Offset: 0x0054) Multi-state Disable Register */
volatile uint32_t PIO_MDSR; /**< \brief (Pio Offset: 0x0058) Multi-state Status Register */
volatile uint32_t Reserved4[1];
volatile uint32_t PIO_PUDR; /**< \brief (Pio Offset: 0x0060) Pull-up Disable Register */
volatile uint32_t PIO_PUER; /**< \brief (Pio Offset: 0x0064) Pull-up Enable Register */
volatile uint32_t PIO_PUSR; /**< \brief (Pio Offset: 0x0068) Pad Pull-up Status Register */
volatile uint32_t Reserved5[1];
volatile uint32_t PIO_ABCDSR[2]; /**< \brief (Pio Offset: 0x0070) Peripheral Select Register */
volatile uint32_t Reserved6[2];
volatile uint32_t PIO_IFSCDR; /**< \brief (Pio Offset: 0x0080) Input Filter Slow Clock Disable Register */
volatile uint32_t PIO_IFSCER; /**< \brief (Pio Offset: 0x0084) Input Filter Slow Clock Enable Register */
volatile uint32_t PIO_IFSCSR; /**< \brief (Pio Offset: 0x0088) Input Filter Slow Clock Status Register */
volatile uint32_t PIO_SCDR; /**< \brief (Pio Offset: 0x008C) Slow Clock Divider Debouncing Register */
volatile uint32_t PIO_PPDDR; /**< \brief (Pio Offset: 0x0090) Pad Pull-down Disable Register */
volatile uint32_t PIO_PPDER; /**< \brief (Pio Offset: 0x0094) Pad Pull-down Enable Register */
volatile uint32_t PIO_PPDSR; /**< \brief (Pio Offset: 0x0098) Pad Pull-down Status Register */
volatile uint32_t Reserved7[1];
volatile uint32_t PIO_OWER; /**< \brief (Pio Offset: 0x00A0) Output Write Enable */
volatile uint32_t PIO_OWDR; /**< \brief (Pio Offset: 0x00A4) Output Write Disable */
volatile uint32_t PIO_OWSR; /**< \brief (Pio Offset: 0x00A8) Output Write Status Register */
volatile uint32_t Reserved8[1];
volatile uint32_t PIO_AIMER; /**< \brief (Pio Offset: 0x00B0) Additional Interrupt Modes Enable Register */
volatile uint32_t PIO_AIMDR; /**< \brief (Pio Offset: 0x00B4) Additional Interrupt Modes Disables Register */
volatile uint32_t PIO_AIMMR; /**< \brief (Pio Offset: 0x00B8) Additional Interrupt Modes Mask Register */
volatile uint32_t Reserved9[1];
volatile uint32_t PIO_ESR; /**< \brief (Pio Offset: 0x00C0) Edge Select Register */
volatile uint32_t PIO_LSR; /**< \brief (Pio Offset: 0x00C4) Level Select Register */
volatile uint32_t PIO_ELSR; /**< \brief (Pio Offset: 0x00C8) Edge/Level Status Register */
volatile uint32_t Reserved10[1];
volatile uint32_t PIO_FELLSR; /**< \brief (Pio Offset: 0x00D0) Falling Edge/Low Level Select Register */
volatile uint32_t PIO_REHLSR; /**< \brief (Pio Offset: 0x00D4) Rising Edge/ High Level Select Register */
volatile uint32_t PIO_FRLHSR; /**< \brief (Pio Offset: 0x00D8) Fall/Rise - Low/High Status Register */
volatile uint32_t Reserved11[1];
volatile uint32_t PIO_LOCKSR; /**< \brief (Pio Offset: 0x00E0) Lock Status */
volatile uint32_t PIO_WPMR; /**< \brief (Pio Offset: 0x00E4) Write Protect Mode Register */
volatile uint32_t PIO_WPSR; /**< \brief (Pio Offset: 0x00E8) Write Protect Status Register */
volatile uint32_t Reserved12[5];
volatile uint32_t PIO_SCHMITT; /**< \brief (Pio Offset: 0x0100) Schmitt Trigger Register */
volatile uint32_t Reserved13[3];
volatile uint32_t PIO_DELAYR; /**< \brief (Pio Offset: 0x0110) IO Delay Register */
volatile uint32_t PIO_DRIVER1; /**< \brief (Pio Offset: 0x0114) I/O Drive Register 1 */
volatile uint32_t PIO_DRIVER2; /**< \brief (Pio Offset: 0x0118) I/O Drive Register 2 */
};
// --//
enum class AT91SAM9X35_Gpio_PeripheralSelection : uint8_t {
None = 0,
PeripheralA = 1,
PeripheralB = 2,
PeripheralC = 3,
PeripheralD = 4
};
enum class AT91SAM9X35_Gpio_Direction : uint8_t {
Input = 0,
Output = 1
};
enum class AT91SAM9X35_Gpio_ResistorMode : uint8_t {
Inactive = 0,
PullUp = 1,
PullDown = 2,
};
enum class AT91SAM9X35_Gpio_MultiDriver : uint8_t {
Disable = 0,
Enable = 1
};
enum class AT91SAM9X35_Gpio_Filter : uint8_t {
Disable = 0,
Enable = 1
};
enum class AT91SAM9X35_Gpio_FilterSlowClock : uint8_t {
Disable = 0,
Enable = 1
};
enum class AT91SAM9X35_Gpio_Schmitt : uint8_t {
Enable = 0,
Disable = 1
};
enum class AT91SAM9X35_Gpio_DriveSpeed : uint8_t {
High = 0,
Medium = 1,
Low = 2,
Reserved = 3
};
struct AT91SAM9X35_Gpio_Pin {
uint32_t number;
AT91SAM9X35_Gpio_PeripheralSelection peripheralSelection;
};
struct AT91SAM9X35_Gpio_PinConfiguration {
AT91SAM9X35_Gpio_Direction direction;
AT91SAM9X35_Gpio_ResistorMode resistorMode;
AT91SAM9X35_Gpio_MultiDriver multiDriver;
AT91SAM9X35_Gpio_Filter filter;
AT91SAM9X35_Gpio_FilterSlowClock filterSlowClock;
AT91SAM9X35_Gpio_Schmitt schmitt;
AT91SAM9X35_Gpio_DriveSpeed speed;
AT91SAM9X35_Gpio_PeripheralSelection peripheralSelection;
bool outputDirection;
bool apply;
};
#define PIN(port, pin) ((CHARIZE(port) - 'A') * 32 + pin)
#define PIN_NONE 0xFFFFFFFF
#define PS(num) (CONCAT(AT91SAM9X35_Gpio_PeripheralSelection::Peripheral, num))
#define PS_NONE AT91SAM9X35_Gpio_PeripheralSelection::None
#define INIT(pinDirection, resistorMode, peripheralSelection, outputDirection, apply) { AT91SAM9X35_Gpio_Direction::pinDirection, AT91SAM9X35_Gpio_ResistorMode::resistorMode, AT91SAM9X35_Gpio_MultiDriver::Disable, AT91SAM9X35_Gpio_Filter::Disable, AT91SAM9X35_Gpio_FilterSlowClock::Disable, AT91SAM9X35_Gpio_Schmitt::Disable, AT91SAM9X35_Gpio_DriveSpeed::High, AT91SAM9X35_Gpio_PeripheralSelection::peripheralSelection, outputDirection, apply }
#define ALTFUN(direction, resistorMode, peripheralSelection) { AT91SAM9X35_Gpio_Direction::direction, AT91SAM9X35_Gpio_ResistorMode::resistorMode, AT91SAM9X35_Gpio_MultiDriver::Disable, AT91SAM9X35_Gpio_Filter::Disable, AT91SAM9X35_Gpio_FilterSlowClock::Disable, AT91SAM9X35_Gpio_Schmitt::Disable, AT91SAM9X35_Gpio_DriveSpeed::High, AT91SAM9X35_Gpio_PeripheralSelection::peripheralSelection, true }
#define INPUT(resistorMode) { AT91SAM9X35_Gpio_Direction::Input, AT91SAM9X35_Gpio_ResistorMode::resistorMode, AT91SAM9X35_Gpio_MultiDriver::Disable, AT91SAM9X35_Gpio_Filter::Disable, AT91SAM9X35_Gpio_FilterSlowClock::Disable, AT91SAM9X35_Gpio_Schmitt::Disable, AT91SAM9X35_Gpio_DriveSpeed::High, AT91SAM9X35_Gpio_PeripheralSelection::None, true }
#define DEFAULT() INIT(Input, PullUp, None, false, true)
#define NO_INIT() INIT(Input, Inactive, None, false, false)
void AT91SAM9X35_Gpio_Reset();
void AT91SAM9X35_Gpio_AddApi(const TinyCLR_Api_Manager* apiManager);
const TinyCLR_Api_Info* AT91SAM9X35_Gpio_GetRequiredApi();
TinyCLR_Result AT91SAM9X35_Gpio_Acquire(const TinyCLR_Gpio_Controller* self);
TinyCLR_Result AT91SAM9X35_Gpio_Release(const TinyCLR_Gpio_Controller* self);
TinyCLR_Result AT91SAM9X35_Gpio_EnableAlternatePin(int32_t pin, TinyCLR_Gpio_PinDriveMode resistor, uint32_t alternate);
TinyCLR_Result AT91SAM9X35_Gpio_Read(const TinyCLR_Gpio_Controller* self, uint32_t pin, TinyCLR_Gpio_PinValue& value);
TinyCLR_Result AT91SAM9X35_Gpio_Write(const TinyCLR_Gpio_Controller* self, uint32_t pin, TinyCLR_Gpio_PinValue value);
TinyCLR_Result AT91SAM9X35_Gpio_SetDebounceTimeout(const TinyCLR_Gpio_Controller* self, uint32_t pin, uint64_t debounceTicks);
TinyCLR_Result AT91SAM9X35_Gpio_SetDriveMode(const TinyCLR_Gpio_Controller* self, uint32_t pin, TinyCLR_Gpio_PinDriveMode mode);
TinyCLR_Result AT91SAM9X35_Gpio_OpenPin(const TinyCLR_Gpio_Controller* self, uint32_t pin);
bool AT91SAM9X35_Gpio_IsDriveModeSupported(const TinyCLR_Gpio_Controller* self, uint32_t pin, TinyCLR_Gpio_PinDriveMode mode);
TinyCLR_Gpio_PinDriveMode AT91SAM9X35_Gpio_GetDriveMode(const TinyCLR_Gpio_Controller* self, uint32_t pin);
uint64_t AT91SAM9X35_Gpio_GetDebounceTimeout(const TinyCLR_Gpio_Controller* self, uint32_t pin);
uint32_t AT91SAM9X35_Gpio_GetPinCount(const TinyCLR_Gpio_Controller* self);
TinyCLR_Result AT91SAM9X35_Gpio_SetPinChangedHandler(const TinyCLR_Gpio_Controller* self, uint32_t pin, TinyCLR_Gpio_PinChangeEdge edge, TinyCLR_Gpio_PinChangedHandler handler);
TinyCLR_Result AT91SAM9X35_Gpio_ClosePin(const TinyCLR_Gpio_Controller* self, uint32_t pin);
void AT91SAM9X35_GpioInternal_EnableOutputPin(int32_t pin, bool initialState);
void AT91SAM9X35_GpioInternal_EnableInputPin(int32_t pin, TinyCLR_Gpio_PinDriveMode resistor);
bool AT91SAM9X35_GpioInternal_OpenPin(int32_t pin);
bool AT91SAM9X35_GpioInternal_ClosePin(int32_t pin);
bool AT91SAM9X35_GpioInternal_ReadPin(int32_t pin);
void AT91SAM9X35_GpioInternal_WritePin(int32_t pin, bool value);
bool AT91SAM9X35_GpioInternal_ConfigurePin(int32_t pin, AT91SAM9X35_Gpio_Direction pinDir, AT91SAM9X35_Gpio_PeripheralSelection peripheralSelection, AT91SAM9X35_Gpio_ResistorMode resistorMode);
bool AT91SAM9X35_GpioInternal_ConfigurePin(int32_t pin, AT91SAM9X35_Gpio_Direction pinDir, AT91SAM9X35_Gpio_PeripheralSelection peripheralSelection, AT91SAM9X35_Gpio_ResistorMode resistorMode, AT91SAM9X35_Gpio_MultiDriver multiDrive, AT91SAM9X35_Gpio_Filter filter, AT91SAM9X35_Gpio_FilterSlowClock filterSlowClock, AT91SAM9X35_Gpio_Schmitt schmitt, AT91SAM9X35_Gpio_DriveSpeed driveSpeed);
bool AT91SAM9X35_GpioInternal_OpenMultiPins(const AT91SAM9X35_Gpio_Pin* pins, size_t count);
// ADC
void AT91SAM9X35_Adc_AddApi(const TinyCLR_Api_Manager* apiManager);
void AT91SAM9X35_Adc_Reset();
int32_t AT91SAM9X35_Adc_GetPin(int32_t channel);
AT91SAM9X35_Gpio_PeripheralSelection AT91SAM9X35_Adc_GetPeripheralSelection(int32_t channel);
TinyCLR_Result AT91SAM9X35_Adc_Acquire(const TinyCLR_Adc_Controller* self);
TinyCLR_Result AT91SAM9X35_Adc_Release(const TinyCLR_Adc_Controller* self);
TinyCLR_Result AT91SAM9X35_Adc_OpenChannel(const TinyCLR_Adc_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Adc_CloseChannel(const TinyCLR_Adc_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Adc_ReadChannel(const TinyCLR_Adc_Controller* self, uint32_t channel, int32_t& value);
uint32_t AT91SAM9X35_Adc_GetChannelCount(const TinyCLR_Adc_Controller* self);
uint32_t AT91SAM9X35_Adc_GetResolutionInBits(const TinyCLR_Adc_Controller* self);
int32_t AT91SAM9X35_Adc_GetMinValue(const TinyCLR_Adc_Controller* self);
int32_t AT91SAM9X35_Adc_GetMaxValue(const TinyCLR_Adc_Controller* self);
TinyCLR_Adc_ChannelMode AT91SAM9X35_Adc_GetChannelMode(const TinyCLR_Adc_Controller* self);
TinyCLR_Result AT91SAM9X35_Adc_SetChannelMode(const TinyCLR_Adc_Controller* self, TinyCLR_Adc_ChannelMode mode);
bool AT91SAM9X35_Adc_IsChannelModeSupported(const TinyCLR_Adc_Controller* self, TinyCLR_Adc_ChannelMode mode);
// CAN
void AT91SAM9X35_Can_AddApi(const TinyCLR_Api_Manager* apiManager);
TinyCLR_Result AT91SAM9X35_Can_Acquire(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_Release(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_SoftReset(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_WriteMessage(const TinyCLR_Can_Controller* self, const TinyCLR_Can_Message* messages, size_t& length);
TinyCLR_Result AT91SAM9X35_Can_ReadMessage(const TinyCLR_Can_Controller* self, TinyCLR_Can_Message* messages, size_t& length);
TinyCLR_Result AT91SAM9X35_Can_SetBitTiming(const TinyCLR_Can_Controller* self, const TinyCLR_Can_BitTiming* timing);
size_t AT91SAM9X35_Can_GetMessagesToRead(const TinyCLR_Can_Controller* self);
size_t AT91SAM9X35_Can_GetMessagesToWrite(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_SetMessageReceivedHandler(const TinyCLR_Can_Controller* self, TinyCLR_Can_MessageReceivedHandler handler);
TinyCLR_Result AT91SAM9X35_Can_SetErrorReceivedHandler(const TinyCLR_Can_Controller* self, TinyCLR_Can_ErrorReceivedHandler handler);
TinyCLR_Result AT91SAM9X35_Can_SetExplicitFilters(const TinyCLR_Can_Controller* self, const uint32_t* filters, size_t count);
TinyCLR_Result AT91SAM9X35_Can_SetGroupFilters(const TinyCLR_Can_Controller* self, const uint32_t* lowerBounds, const uint32_t* upperBounds, size_t count);
TinyCLR_Result AT91SAM9X35_Can_ClearReadBuffer(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_IsWritingAllowed(const TinyCLR_Can_Controller* self, bool& allowed);
size_t AT91SAM9X35_Can_GetWriteErrorCount(const TinyCLR_Can_Controller* self);
size_t AT91SAM9X35_Can_GetReadErrorCount(const TinyCLR_Can_Controller* self);
uint32_t AT91SAM9X35_Can_GetSourceClock(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_SetReadBufferSize(const TinyCLR_Can_Controller* self, size_t size);
size_t AT91SAM9X35_Can_GetReadBufferSize(const TinyCLR_Can_Controller* self);
size_t AT91SAM9X35_Can_GetWriteBufferSize(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_SetWriteBufferSize(const TinyCLR_Can_Controller* self, size_t size);
TinyCLR_Result AT91SAM9X35_Can_Enable(const TinyCLR_Can_Controller* self);
TinyCLR_Result AT91SAM9X35_Can_Disable(const TinyCLR_Can_Controller* self);
bool AT91SAM9X35_Can_CanWriteMessage(const TinyCLR_Can_Controller* self);
bool AT91SAM9X35_Can_CanReadMessage(const TinyCLR_Can_Controller* self);
void AT91SAM9X35_Can_Reset();
// MCI
typedef struct _AT91S_MCI {
uint32_t MCI_CR;
uint32_t MCI_MR;
uint32_t MCI_DTOR;
uint32_t MCI_SDCR;
uint32_t MCI_ARGR;
uint32_t MCI_CMDR;
uint32_t MCI_BLKR;
uint32_t MCI_CSTOR;
uint32_t MCI_RSPR[4];
uint32_t MCI_RDR;
uint32_t MCI_TDR;
uint32_t Reserved1[2];
uint32_t MCI_SR;
uint32_t MCI_IER;
uint32_t MCI_IDR;
uint32_t MCI_IMR;
uint32_t MCI_DMA;
uint32_t MCI_CFG;
uint32_t Reserved2[35];
uint32_t MCI_WPMR;
uint32_t MCI_WPSR;
uint32_t Reserved3[69];
uint32_t MCI_FIFO[256];
} AT91S_MCI, *AT91PS_MCI;
//DAC
void AT91SAM9X35_Dac_AddApi(const TinyCLR_Api_Manager* apiManager);
void AT91SAM9X35_Dac_Reset();
TinyCLR_Result AT91SAM9X35_Dac_Acquire(const TinyCLR_Dac_Controller* self);
TinyCLR_Result AT91SAM9X35_Dac_Release(const TinyCLR_Dac_Controller* self);
TinyCLR_Result AT91SAM9X35_Dac_OpenChannel(const TinyCLR_Dac_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Dac_CloseChannel(const TinyCLR_Dac_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Dac_WriteValue(const TinyCLR_Dac_Controller* self, uint32_t channel, int32_t value);
uint32_t AT91SAM9X35_Dac_GetChannelCount(const TinyCLR_Dac_Controller* self);
uint32_t AT91SAM9X35_Dac_GetResolutionInBits(const TinyCLR_Dac_Controller* self);
int32_t AT91SAM9X35_Dac_GetMinValue(const TinyCLR_Dac_Controller* self);
int32_t AT91SAM9X35_Dac_GetMaxValue(const TinyCLR_Dac_Controller* self);
// PWM
struct PwmState {
int32_t controllerIndex;
uint32_t *channelModeReg;
uint32_t *dutyCycleReg;
uint32_t *channelUpdateReg;
AT91SAM9X35_Gpio_Pin gpioPin[MAX_PWM_PER_CONTROLLER];
TinyCLR_Pwm_PulsePolarity invert[MAX_PWM_PER_CONTROLLER];
bool isOpened[MAX_PWM_PER_CONTROLLER];
double frequency;
double dutyCycle[MAX_PWM_PER_CONTROLLER];
uint16_t initializeCount;
};
void AT91SAM9X35_Pwm_AddApi(const TinyCLR_Api_Manager* apiManager);
void AT91SAM9X35_Pwm_Reset();
void AT91SAM9X35_Pwm_ResetController(int32_t controller);
AT91SAM9X35_Gpio_Pin AT91SAM9X35_Pwm_GetPins(int32_t controller, int32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_Acquire(const TinyCLR_Pwm_Controller* self);
TinyCLR_Result AT91SAM9X35_Pwm_Release(const TinyCLR_Pwm_Controller* self);
uint32_t AT91SAM9X35_Pwm_GetGpioPinForChannel(const TinyCLR_Pwm_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_SetDesiredFrequency(const TinyCLR_Pwm_Controller* self, double& frequency);
TinyCLR_Result AT91SAM9X35_Pwm_OpenChannel(const TinyCLR_Pwm_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_CloseChannel(const TinyCLR_Pwm_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_EnableChannel(const TinyCLR_Pwm_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_DisableChannel(const TinyCLR_Pwm_Controller* self, uint32_t channel);
TinyCLR_Result AT91SAM9X35_Pwm_SetPulseParameters(const TinyCLR_Pwm_Controller* self, uint32_t channel, double dutyCycle, TinyCLR_Pwm_PulsePolarity polarity);
double AT91SAM9X35_Pwm_GetMinFrequency(const TinyCLR_Pwm_Controller* self);
double AT91SAM9X35_Pwm_GetMaxFrequency(const TinyCLR_Pwm_Controller* self);
double AT91SAM9X35_Pwm_GetActualFrequency(const TinyCLR_Pwm_Controller* self);
uint32_t AT91SAM9X35_Pwm_GetChannelCount(const TinyCLR_Pwm_Controller* self);
//RTC
void AT91SAM9X35_Rtc_AddApi(const TinyCLR_Api_Manager* apiManager);
TinyCLR_Result AT91SAM9X35_Rtc_Acquire(const TinyCLR_Rtc_Controller* self);
TinyCLR_Result AT91SAM9X35_Rtc_Release(const TinyCLR_Rtc_Controller* self);
TinyCLR_Result AT91SAM9X35_Rtc_IsValid(const TinyCLR_Rtc_Controller* self, bool& value);
TinyCLR_Result AT91SAM9X35_Rtc_GetTime(const TinyCLR_Rtc_Controller* self, TinyCLR_Rtc_DateTime& value);
TinyCLR_Result AT91SAM9X35_Rtc_SetTime(const TinyCLR_Rtc_Controller* self, TinyCLR_Rtc_DateTime value);
////////////////////////////////////////////////////////////////////////////////
//SD
////////////////////////////////////////////////////////////////////////////////
void AT91SAM9X35_SdCard_AddApi(const TinyCLR_Api_Manager* apiManager);
TinyCLR_Result AT91SAM9X35_SdCard_Acquire(const TinyCLR_Storage_Controller* self);
TinyCLR_Result AT91SAM9X35_SdCard_Release(const TinyCLR_Storage_Controller* self);
TinyCLR_Result AT91SAM9X35_SdCard_Read(const TinyCLR_Storage_Controller* self, uint64_t address, size_t& count, uint8_t* data, uint64_t timeout);
TinyCLR_Result AT91SAM9X35_SdCard_Write(const TinyCLR_Storage_Controller* self, uint64_t address, size_t& count, const uint8_t* data, uint64_t timeout);
TinyCLR_Result AT91SAM9X35_SdCard_IsErased(const TinyCLR_Storage_Controller* self, uint64_t address, size_t count, bool& erased);
TinyCLR_Result AT91SAM9X35_SdCard_Erases(const TinyCLR_Storage_Controller* self, uint64_t address, size_t& count, uint64_t timeout);
TinyCLR_Result AT91SAM9X35_SdCard_GetDescriptor(const TinyCLR_Storage_Controller* self, const TinyCLR_Storage_Descriptor*& descriptor);
TinyCLR_Result AT91SAM9X35_SdCard_Open(const TinyCLR_Storage_Controller* self);
TinyCLR_Result AT91SAM9X35_SdCard_Close(const TinyCLR_Storage_Controller* self);
TinyCLR_Result AT91SAM9X35_SdCard_Reset();
//SPI
//////////////////////////////////////////////////////////////////////////////
// AT91SAM9X35_SPI
//
struct AT91SAM9X35_SPI {
static const uint32_t c_Base_1 = AT91C_BASE_SPI0;
static const uint32_t c_Base_2 = AT91C_BASE_SPI1;
static const uint32_t c_MAX_SPI = 2;
volatile uint32_t SPI_CR; // Control Register
static const uint32_t SPI_CR_ENABLE_SPI = (0x1 << 0); // enable SPI
static const uint32_t SPI_CR_DISABLE_SPI = (0x1 << 1); // disable SPI
static const uint32_t SPI_CR_SW_RESET = (0x1 << 7); // Software reset SPI
volatile uint32_t SPI_MR; // Mode Register
static const uint32_t SPI_MR_MSTR = (0x1 << 0); // 1--Master mode\0--Slave mode
static const uint32_t SPI_MR_PS = (0x1 << 1); // peripheral select 1--varable\0--fixed
static const uint32_t SPI_MR_MODFDIS = (0x1 << 4); // peripheral select 1--varable\0--fixed
static const uint32_t SPI_MR_CS0 = (0x0 << 16);
static const uint32_t SPI_MR_CS1 = (0x1 << 16);
static const uint32_t SPI_MR_CS2 = (0x3 << 16);
static const uint32_t SPI_MR_CS3 = (0x7 << 16);
volatile uint32_t SPI_RDR; // Receive Data Register
volatile uint32_t SPI_TDR; // Transmit Data Register
volatile uint32_t SPI_SR; // Status Register
static const uint32_t SPI_SR_RDRF = (0x1 << 0); // RDR full
static const uint32_t SPI_SR_TDRE = (0x1 << 1); // TDR empty
static const uint32_t SPI_SR_RXBUFF = (0x1 << 6); // receive buffer full
static const uint32_t SPI_SR_TXBUFE = (0x1 << 7); // transmit buffer empty
static const uint32_t SPI_SR_NSSR = (0x1 << 8); // Slave mode control
static const uint32_t SPI_SR_TXEMPTY = (0x1 << 9); // transmit register and internal shifters are empty
static const uint32_t SPI_SR_SPIENS = (0x1 << 16); // SPI enable status
volatile uint32_t SPI_IER; // Interrupt Enable Register
volatile uint32_t SPI_IDR; // Interrupt Disable Register
volatile uint32_t SPI_IMR; // Interrupt MaskRegister
volatile uint32_t Reserved1[4];
volatile uint32_t SPI_CSR0; // Chip Select Register 0
static const uint32_t SPI_CSR_CPOL = (0x1 << 0); // clock polarity
static const uint32_t SPI_CSR_NCPHA = (0x1 << 1); // clock phase
static const uint32_t SPI_CSR_BITS_MASK = (0xF << 4); // bits per transfer
static const uint32_t SPI_CSR_8BITS = (0x0 << 4);
static const uint32_t SPI_CSR_16BITS = (0x8 << 4);
static const uint32_t SPI_CSR_SCBR_MASK = (0xFF << 8); // serial clock baud rate
static const uint32_t SPI_CSR_SCBR_SHIFT = (0x8); // serial clock baud rate
static const uint32_t SPI_CSR_DLYBS_MASK = (0xFF << 16); // delay before SPCK
static const uint32_t SPI_CSR_DLYBS_SHIFT = (16); // delay before SPCK
static const uint32_t SPI_CSR_DLYBCT_MASK = ((uint32_t)0xFF << 24); // delay between transfer
static const uint32_t SPI_CSR_DLYBCT_SHIFT = (24); // delay between transfer
volatile uint32_t SPI_CSR1; // Chip Select Register 1
volatile uint32_t SPI_CSR2; // Chip Select Register 2
volatile uint32_t SPI_CSR3; // Chip Select Register 3
__inline static uint32_t ConvertClockRateToDivisor(uint32_t clockKHz) {
uint32_t mckKHz = AT91SAM9X35_SYSTEM_PERIPHERAL_CLOCK_HZ / 1000;
uint32_t divisor = mckKHz / clockKHz;
while ((divisor > 0) && ((mckKHz / divisor) > clockKHz)) {
divisor++;
if (divisor > 0xFF)
break;
}
if (divisor > 0xFF)
divisor = 0xFF;
return divisor;
}
// no data in TX FIFO
__inline bool TransmitBufferEmpty(AT91SAM9X35_SPI & _SPI) {
return (_SPI.SPI_SR & SPI_SR_TXEMPTY) != 0;
}
};
void AT91SAM9X35_Spi_AddApi(const TinyCLR_Api_Manager* apiManager);
const TinyCLR_Api_Info* AT91SAM9X35_Spi_GetRequiredApi();
void AT91SAM9X35_Spi_Reset();
bool AT91SAM9X35_Spi_Transaction_Start(int32_t controller);
bool AT91SAM9X35_Spi_Transaction_Stop(int32_t controller);
bool AT91SAM9X35_Spi_Transaction_nWrite8_nRead8(int32_t controller);
TinyCLR_Result AT91SAM9X35_Spi_Acquire(const TinyCLR_Spi_Controller* self);
TinyCLR_Result AT91SAM9X35_Spi_Release(const TinyCLR_Spi_Controller* self);
TinyCLR_Result AT91SAM9X35_Spi_SetActiveSettings(const TinyCLR_Spi_Controller* self, const TinyCLR_Spi_Settings* settings);
TinyCLR_Result AT91SAM9X35_Spi_Read(const TinyCLR_Spi_Controller* self, uint8_t* buffer, size_t& length);
TinyCLR_Result AT91SAM9X35_Spi_Write(const TinyCLR_Spi_Controller* self, const uint8_t* buffer, size_t& length);
TinyCLR_Result AT91SAM9X35_Spi_WriteRead(const TinyCLR_Spi_Controller* self, const uint8_t* writeBuffer, size_t& writeLength, uint8_t* readBuffer, size_t& readLength, bool deselectAfter);
TinyCLR_Result AT91SAM9X35_Spi_TransferSequential(const TinyCLR_Spi_Controller* self, const uint8_t* writeBuffer, size_t& writeLength, uint8_t* readBuffer, size_t& readLength, bool deselectAfter);
uint32_t AT91SAM9X35_Spi_GetChipSelectLineCount(const TinyCLR_Spi_Controller* self);
uint32_t AT91SAM9X35_Spi_GetMinClockFrequency(const TinyCLR_Spi_Controller* self);
uint32_t AT91SAM9X35_Spi_GetMaxClockFrequency(const TinyCLR_Spi_Controller* self);
TinyCLR_Result AT91SAM9X35_Spi_GetSupportedDataBitLengths(const TinyCLR_Spi_Controller* self, uint32_t* dataBitLengths, size_t& dataBitLengthsCount);
//Uart
//////////////////////////////////////////////////////////////////////////////
// AT91SAM9X35_USART
//
struct AT91SAM9X35_USART {
static const uint32_t c_Base_dbg = AT91C_BASE_DBGU;
static const uint32_t c_Base_usart = AT91C_BASE_USART0;
static const uint32_t c_Base_uart = AT91C_BASE_UART0;
static const uint32_t c_Base_offset = 0x4000;
static const uint32_t c_MAX_BAUDRATE = ((AT91SAM9X35_SYSTEM_PERIPHERAL_CLOCK_HZ * 10) / 16);
static const uint32_t c_MIN_BAUDRATE = 0;
volatile uint32_t US_CR; // Control Register
static const uint32_t US_RSTRX = ((unsigned int)0x1 << 2); // (DBGU) Reset Receiver
static const uint32_t US_RSTTX = ((unsigned int)0x1 << 3); // (DBGU) Reset Transmitter
static const uint32_t US_RXEN = ((unsigned int)0x1 << 4); // (DBGU) Receiver Enable
static const uint32_t US_RXDIS = ((unsigned int)0x1 << 5); // (DBGU) Receiver Disable
static const uint32_t US_TXEN = ((unsigned int)0x1 << 6); // (DBGU) Transmitter Enable
static const uint32_t US_TXDIS = ((unsigned int)0x1 << 7); // (DBGU) Transmitter Disable
static const uint32_t US_RSTSTA = ((unsigned int)0x1 << 8); // (DBGU) Reset Status Bits
static const uint32_t US_STTBRK = ((unsigned int)0x1 << 9); // (USART) Start Break
static const uint32_t US_STPBRK = ((unsigned int)0x1 << 10); // (USART) Stop Break
static const uint32_t US_STTTO = ((unsigned int)0x1 << 11); // (USART) Start Time-out
static const uint32_t US_SENDA = ((unsigned int)0x1 << 12); // (USART) Send Address
static const uint32_t US_RSTIT = ((unsigned int)0x1 << 13); // (USART) Reset Iterations
static const uint32_t US_RSTNACK = ((unsigned int)0x1 << 14); // (USART) Reset Non Acknowledge
static const uint32_t US_RETTO = ((unsigned int)0x1 << 15); // (USART) Rearm Time-out
static const uint32_t US_DTREN = ((unsigned int)0x1 << 16); // (USART) Data Terminal ready Enable
static const uint32_t US_DTRDIS = ((unsigned int)0x1 << 17); // (USART) Data Terminal ready Disable
static const uint32_t US_RTSEN = ((unsigned int)0x1 << 18); // (USART) Request to Send enable
static const uint32_t US_RTSDIS = ((unsigned int)0x1 << 19); // (USART) Request to Send Disable
volatile uint32_t US_MR; // Mode Register
static const uint32_t US_USMODE = ((unsigned int)0xF << 0); // (USART) Usart mode
static const uint32_t US_USMODE_NORMAL = ((unsigned int)0x0); // (USART) Normal
static const uint32_t US_USMODE_RS485 = ((unsigned int)0x1); // (USART) RS485
static const uint32_t US_USMODE_HWHSH = ((unsigned int)0x2); // (USART) Hardware Handshaking
static const uint32_t US_USMODE_MODEM = ((unsigned int)0x3); // (USART) Modem
static const uint32_t US_USMODE_ISO7816_0 = ((unsigned int)0x4); // (USART) ISO7816 protocol: T = 0
static const uint32_t US_USMODE_ISO7816_1 = ((unsigned int)0x6); // (USART) ISO7816 protocol: T = 1
static const uint32_t US_USMODE_IRDA = ((unsigned int)0x8); // (USART) IrDA
static const uint32_t US_USMODE_SWHSH = ((unsigned int)0xC); // (USART) Software Handshaking
static const uint32_t US_CLKS = ((unsigned int)0x3 << 4); // (USART) Clock Selection = (Baud Rate generator Input Clock
static const uint32_t US_CLKS_CLOCK = ((unsigned int)0x0 << 4); // (USART) Clock
static const uint32_t US_CLKS_FDIV1 = ((unsigned int)0x1 << 4); // (USART) fdiv1
static const uint32_t US_CLKS_SLOW = ((unsigned int)0x2 << 4); // (USART) slow_clock = (ARM);
static const uint32_t US_CLKS_EXT = ((unsigned int)0x3 << 4); // (USART) External = (SCK);
static const uint32_t US_CHRL = ((unsigned int)0x3 << 6); // (USART) Clock Selection = (Baud Rate generator Input Clock
static const uint32_t US_CHRL_5_BITS = ((unsigned int)0x0 << 6); // (USART) Character Length: 5 bits
static const uint32_t US_CHRL_6_BITS = ((unsigned int)0x1 << 6); // (USART) Character Length: 6 bits
static const uint32_t US_CHRL_7_BITS = ((unsigned int)0x2 << 6); // (USART) Character Length: 7 bits
static const uint32_t US_CHRL_8_BITS = ((unsigned int)0x3 << 6); // (USART) Character Length: 8 bits
static const uint32_t US_SYNC = ((unsigned int)0x1 << 8); // (USART) Synchronous Mode Select
static const uint32_t US_NBSTOP = ((unsigned int)0x3 << 12); // (USART) Number of Stop bits
static const uint32_t US_NBSTOP_1_BIT = ((unsigned int)0x0 << 12); // (USART) 1 stop bit
static const uint32_t US_NBSTOP_15_BIT = ((unsigned int)0x1 << 12); // (USART) Asynchronous = (SYNC=0); 2 stop bits Synchronous = (SYNC=1); 2 stop bits
static const uint32_t US_NBSTOP_2_BIT = ((unsigned int)0x2 << 12); // (USART) 2 stop bits
static const uint32_t US_MSBF = ((unsigned int)0x1 << 16); // (USART) Bit Order
static const uint32_t US_MODE9 = ((unsigned int)0x1 << 17); // (USART) 9-bit Character length
static const uint32_t US_CKLO = ((unsigned int)0x1 << 18); // (USART) Clock Output Select
static const uint32_t US_OVER = ((unsigned int)0x1 << 19); // (USART) Over Sampling Mode
static const uint32_t US_INACK = ((unsigned int)0x1 << 20); // (USART) Inhibit Non Acknowledge
static const uint32_t US_DSNACK = ((unsigned int)0x1 << 21); // (USART) Disable Successive NACK
static const uint32_t US_MAX_ITER = ((unsigned int)0x1 << 24); // (USART) Number of Repetitions
static const uint32_t US_FILTER = ((unsigned int)0x1 << 28); // (USART) Receive Line Filter
static const uint32_t US_PAR = (0x7 << 9); // = (DBGU); Parity type
static const uint32_t US_PAR_EVEN = (0x0 << 9); // = (DBGU); Even Parity
static const uint32_t US_PAR_ODD = (0x1 << 9); // = (DBGU); Odd Parity
static const uint32_t US_PAR_SPACE = (0x2 << 9); // = (DBGU); Parity forced to 0 = (Space);
static const uint32_t US_PAR_MARK = (0x3 << 9); // = (DBGU); Parity forced to 1 = (Mark);
static const uint32_t US_PAR_NONE = (0x4 << 9); // = (DBGU); No Parity
static const uint32_t US_PAR_MULTI_DROP = (0x6 << 9); // = (DBGU); Multi-drop mode
static const uint32_t US_CHMODE = (0x3 << 14); // = (DBGU); Channel Mode
static const uint32_t US_CHMODE_NORMAL = (0x0 << 14); // = (DBGU); Normal Mode: The USART channel operates as an RX/TX USART.
static const uint32_t US_CHMODE_AUTO = (0x1 << 14); // = (DBGU); Automatic Echo: Receiver Data Input is connected to the TXD pin.
static const uint32_t US_CHMODE_LOCAL = (0x2 << 14); // = (DBGU); Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal.
static const uint32_t US_CHMODE_REMOTE = (0x3 << 14); // = (DBGU); Remote Loopback: RXD pin is internally connected to TXD pin.
volatile uint32_t US_IER; // Interrupt Enable Register
static const uint32_t US_RXBRK = ((unsigned int)0x1 << 2); // (USART) Break Received/End of Break
static const uint32_t US_TIMEOUT = ((unsigned int)0x1 << 8); // (USART) Receiver Time-out
static const uint32_t US_ITERATION = ((unsigned int)0x1 << 10); // (USART) Max number of Repetitions Reached
static const uint32_t US_NACK = ((unsigned int)0x1 << 13); // (USART) Non Acknowledge
static const uint32_t US_RIIC = ((unsigned int)0x1 << 16); // (USART) Ring INdicator Input Change Flag
static const uint32_t US_DSRIC = ((unsigned int)0x1 << 17); // (USART) Data Set Ready Input Change Flag
static const uint32_t US_DCDIC = ((unsigned int)0x1 << 18); // (USART) Data Carrier Flag
static const uint32_t US_CTSIC = ((unsigned int)0x1 << 19); // (USART) Clear To Send Input Change Flag
static const uint32_t US_RXRDY = (0x1 << 0); // = (DBGU); RXRDY Interrupt
static const uint32_t US_TXRDY = (0x1 << 1); // = (DBGU); TXRDY Interrupt
static const uint32_t US_ENDRX = (0x1 << 3); // = (DBGU); End of Receive Transfer Interrupt
static const uint32_t US_ENDTX = (0x1 << 4); // = (DBGU); End of Transmit Interrupt
static const uint32_t US_OVRE = (0x1 << 5); // = (DBGU); Overrun Interrupt
static const uint32_t US_FRAME = (0x1 << 6); // = (DBGU); Framing Error Interrupt
static const uint32_t US_PARE = (0x1 << 7); // = (DBGU); Parity Error Interrupt
static const uint32_t US_TXEMPTY = (0x1 << 9); // = (DBGU); TXEMPTY Interrupt
static const uint32_t US_TXBUFE = (0x1 << 11); // = (DBGU); TXBUFE Interrupt
static const uint32_t US_RXBUFF = (0x1 << 12); // = (DBGU); RXBUFF Interrupt
static const uint32_t US_COMM_TX = (0x1 << 30); // = (DBGU); COMM_TX Interrupt
static const uint32_t US_COMM_RX = ((uint32_t)0x1 << 31); // = (DBGU); COMM_RX Interrupt
volatile uint32_t US_IDR; // Interrupt Disable Register
volatile uint32_t US_IMR; // Interrupt Mask Register
volatile uint32_t US_CSR; // Channel Status Register
static const uint32_t US_RI = ((unsigned int)0x1 << 20); // (USART) Image of RI Input
static const uint32_t US_DSR = ((unsigned int)0x1 << 21); // (USART) Image of DSR Input
static const uint32_t US_DCD = ((unsigned int)0x1 << 22); // (USART) Image of DCD Input
static const uint32_t US_CTS = ((unsigned int)0x1 << 23); // (USART) Image of CTS Input
volatile uint32_t US_RHR; // Receiver Holding Register
volatile uint32_t US_THR; // Transmitter Holding Register
volatile uint32_t US_BRGR; // Baud Rate Generator Register
volatile uint32_t US_RTOR; // Receiver Time-out Register
volatile uint32_t US_TTGR; // Transmitter Time-guard Register
volatile uint32_t Reserved0[5]; //
volatile uint32_t US_FIDI; // FI_DI_Ratio Register
volatile uint32_t US_NER; // Nb Errors Register
volatile uint32_t Reserved1[1]; //
volatile uint32_t US_IF; // IRDA_FILTER Register
#if defined(PLATFORM_ARM_SAM9RL64_ANY)
volatile uint32_t US_MAN; // Manchester Encoder Decoder Register
volatile uint32_t Reserved2[43];
#else
volatile uint32_t Reserved2[44];
#endif
volatile uint32_t US_RPR; // Receive Pointer Register
volatile uint32_t US_RCR; // Receive Counter Register
volatile uint32_t US_TPR; // Transmit Pointer Register
volatile uint32_t US_TCR; // Transmit Counter Register
volatile uint32_t US_RNPR; // Receive Next Pointer Register
volatile uint32_t US_RNCR; // Receive Next Counter Register
volatile uint32_t US_TNPR; // Transmit Next Pointer Register
volatile uint32_t US_TNCR; // Transmit Next Counter Register
volatile uint32_t US_PTCR; // PDC Transfer Control Register
volatile uint32_t US_PTSR; // PDC Transfer Status Register
};
void AT91SAM9X35_Uart_AddApi(const TinyCLR_Api_Manager* apiManager);
const TinyCLR_Api_Info* AT91SAM9X35_Uart_GetRequiredApi();
void AT91SAM9X35_Uart_Reset();
int32_t AT91SAM9X35_Uart_GetTxPin(int32_t controller);
int32_t AT91SAM9X35_Uart_GetRxPin(int32_t controller);
int32_t AT91SAM9X35_Uart_GetRtsPin(int32_t controller);
int32_t AT91SAM9X35_Uart_GetCtsPin(int32_t controller);
AT91SAM9X35_Gpio_PeripheralSelection AT91SAM9X35_Uart_GetTxAlternateFunction(int32_t controller);
AT91SAM9X35_Gpio_PeripheralSelection AT91SAM9X35_Uart_GetRxAlternateFunction(int32_t controller);
AT91SAM9X35_Gpio_PeripheralSelection AT91SAM9X35_Uart_GetRtsAlternateFunction(int32_t controller);
AT91SAM9X35_Gpio_PeripheralSelection AT91SAM9X35_Uart_GetCtsAlternateFunction(int32_t controller);
bool AT91SAM9X35_Uart_CanSend(int controller);
void AT91SAM9X35_Uart_TxBufferEmptyInterruptEnable(int controller, bool enable);
void AT91SAM9X35_Uart_RxBufferFullInterruptEnable(int controller, bool enable);
TinyCLR_Result AT91SAM9X35_Uart_Acquire(const TinyCLR_Uart_Controller* self);
TinyCLR_Result AT91SAM9X35_Uart_Release(const TinyCLR_Uart_Controller* self);
TinyCLR_Result AT91SAM9X35_Uart_Enable(const TinyCLR_Uart_Controller* self);
TinyCLR_Result AT91SAM9X35_Uart_Disable(const TinyCLR_Uart_Controller* self);
TinyCLR_Result AT91SAM9X35_Uart_SetActiveSettings(const TinyCLR_Uart_Controller* self, const TinyCLR_Uart_Settings* settings);
TinyCLR_Result AT91SAM9X35_Uart_Flush(const TinyCLR_Uart_Controller* self);
TinyCLR_Result AT91SAM9X35_Uart_Read(const TinyCLR_Uart_Controller* self, uint8_t* buffer, size_t& length);
TinyCLR_Result AT91SAM9X35_Uart_Write(const TinyCLR_Uart_Controller* self, const uint8_t* buffer, size_t& length);
TinyCLR_Result AT91SAM9X35_Uart_SetErrorReceivedHandler(const TinyCLR_Uart_Controller* self, TinyCLR_Uart_ErrorReceivedHandler handler);
TinyCLR_Result AT91SAM9X35_Uart_SetDataReceivedHandler(const TinyCLR_Uart_Controller* self, TinyCLR_Uart_DataReceivedHandler handler);
TinyCLR_Result AT91SAM9X35_Uart_GetClearToSendState(const TinyCLR_Uart_Controller* self, bool& state);
TinyCLR_Result AT91SAM9X35_Uart_SetClearToSendChangedHandler(const TinyCLR_Uart_Controller* self, TinyCLR_Uart_ClearToSendChangedHandler handler);
TinyCLR_Result AT91SAM9X35_Uart_GetIsRequestToSendEnabled(const TinyCLR_Uart_Controller* self, bool& state);