1#![doc = "Peripheral access API for ATSAML21E18A microcontrollers (generated using svd2rust v0.27.2 ( ))\n\nYou can find an overview of the generated API [here].\n\nAPI features to be included in the [next]
2svd2rust release can be generated by cloning the svd2rust [repository], checking out the above commit, and running `cargo doc --open`.\n\n[here]: https://docs.rs/svd2rust/0.27.2/svd2rust/#peripheral-api\n[next]: https://github.com/rust-embedded/svd2rust/blob/master/CHANGELOG.md#unreleased\n[repository]: https://github.com/rust-embedded/svd2rust"]
3#![deny(dead_code)]
4#![deny(improper_ctypes)]
5#![deny(missing_docs)]
6#![deny(no_mangle_generic_items)]
7#![deny(non_shorthand_field_patterns)]
8#![deny(overflowing_literals)]
9#![deny(path_statements)]
10#![deny(patterns_in_fns_without_body)]
11#![deny(private_in_public)]
12#![deny(unconditional_recursion)]
13#![deny(unused_allocation)]
14#![deny(unused_comparisons)]
15#![deny(unused_parens)]
16#![deny(while_true)]
17#![allow(non_camel_case_types)]
18#![allow(non_snake_case)]
19#![no_std]
20use core::marker::PhantomData;
21use core::ops::Deref;
22#[doc = r"Number available in the NVIC for configuring priority"]
23pub const NVIC_PRIO_BITS: u8 = 2;
24#[cfg(feature = "rt")]
25pub use self::Interrupt as interrupt;
26pub use cortex_m::peripheral::Peripherals as CorePeripherals;
27pub use cortex_m::peripheral::{CBP, CPUID, DCB, DWT, FPB, ITM, MPU, NVIC, SCB, SYST, TPIU};
28#[cfg(feature = "rt")]
29pub use cortex_m_rt::interrupt;
30#[allow(unused_imports)]
31use generic::*;
32#[doc = r"Common register and bit access and modify traits"]
33pub mod generic;
34#[cfg(feature = "rt")]
35extern "C" {
36 fn SYSTEM();
37 fn WDT();
38 fn RTC();
39 fn EIC();
40 fn NVMCTRL();
41 fn DMAC();
42 fn USB();
43 fn EVSYS();
44 fn SERCOM0();
45 fn SERCOM1();
46 fn SERCOM2();
47 fn SERCOM3();
48 fn TCC0();
49 fn TCC1();
50 fn TCC2();
51 fn TC0();
52 fn TC1();
53 fn TC4();
54 fn ADC();
55 fn AC();
56 fn DAC();
57 fn AES();
58 fn TRNG();
59}
60#[doc(hidden)]
61pub union Vector {
62 _handler: unsafe extern "C" fn(),
63 _reserved: u32,
64}
65#[cfg(feature = "rt")]
66#[doc(hidden)]
67#[link_section = ".vector_table.interrupts"]
68#[no_mangle]
69pub static __INTERRUPTS: [Vector; 28] = [
70 Vector { _handler: SYSTEM },
71 Vector { _handler: WDT },
72 Vector { _handler: RTC },
73 Vector { _handler: EIC },
74 Vector { _handler: NVMCTRL },
75 Vector { _handler: DMAC },
76 Vector { _handler: USB },
77 Vector { _handler: EVSYS },
78 Vector { _handler: SERCOM0 },
79 Vector { _handler: SERCOM1 },
80 Vector { _handler: SERCOM2 },
81 Vector { _handler: SERCOM3 },
82 Vector { _reserved: 0 },
83 Vector { _reserved: 0 },
84 Vector { _handler: TCC0 },
85 Vector { _handler: TCC1 },
86 Vector { _handler: TCC2 },
87 Vector { _handler: TC0 },
88 Vector { _handler: TC1 },
89 Vector { _reserved: 0 },
90 Vector { _reserved: 0 },
91 Vector { _handler: TC4 },
92 Vector { _handler: ADC },
93 Vector { _handler: AC },
94 Vector { _handler: DAC },
95 Vector { _reserved: 0 },
96 Vector { _handler: AES },
97 Vector { _handler: TRNG },
98];
99#[doc = r"Enumeration of all the interrupts."]
100#[derive(Copy, Clone, Debug, PartialEq, Eq)]
101#[repr(u16)]
102pub enum Interrupt {
103 #[doc = "0 - SYSTEM"]
104 SYSTEM = 0,
105 #[doc = "1 - WDT"]
106 WDT = 1,
107 #[doc = "2 - RTC"]
108 RTC = 2,
109 #[doc = "3 - EIC"]
110 EIC = 3,
111 #[doc = "4 - NVMCTRL"]
112 NVMCTRL = 4,
113 #[doc = "5 - DMAC"]
114 DMAC = 5,
115 #[doc = "6 - USB"]
116 USB = 6,
117 #[doc = "7 - EVSYS"]
118 EVSYS = 7,
119 #[doc = "8 - SERCOM0"]
120 SERCOM0 = 8,
121 #[doc = "9 - SERCOM1"]
122 SERCOM1 = 9,
123 #[doc = "10 - SERCOM2"]
124 SERCOM2 = 10,
125 #[doc = "11 - SERCOM3"]
126 SERCOM3 = 11,
127 #[doc = "14 - TCC0"]
128 TCC0 = 14,
129 #[doc = "15 - TCC1"]
130 TCC1 = 15,
131 #[doc = "16 - TCC2"]
132 TCC2 = 16,
133 #[doc = "17 - TC0"]
134 TC0 = 17,
135 #[doc = "18 - TC1"]
136 TC1 = 18,
137 #[doc = "21 - TC4"]
138 TC4 = 21,
139 #[doc = "22 - ADC"]
140 ADC = 22,
141 #[doc = "23 - AC"]
142 AC = 23,
143 #[doc = "24 - DAC"]
144 DAC = 24,
145 #[doc = "26 - AES"]
146 AES = 26,
147 #[doc = "27 - TRNG"]
148 TRNG = 27,
149}
150unsafe impl cortex_m::interrupt::InterruptNumber for Interrupt {
151 #[inline(always)]
152 fn number(self) -> u16 {
153 self as u16
154 }
155}
156#[doc = "Analog Comparators"]
157pub struct AC {
158 _marker: PhantomData<*const ()>,
159}
160unsafe impl Send for AC {}
161impl AC {
162 #[doc = r"Pointer to the register block"]
163 pub const PTR: *const ac::RegisterBlock = 0x4300_1000 as *const _;
164 #[doc = r"Return the pointer to the register block"]
165 #[inline(always)]
166 pub const fn ptr() -> *const ac::RegisterBlock {
167 Self::PTR
168 }
169}
170impl Deref for AC {
171 type Target = ac::RegisterBlock;
172 #[inline(always)]
173 fn deref(&self) -> &Self::Target {
174 unsafe { &*Self::PTR }
175 }
176}
177impl core::fmt::Debug for AC {
178 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
179 f.debug_struct("AC").finish()
180 }
181}
182#[doc = "Analog Comparators"]
183pub mod ac;
184#[doc = "Analog Digital Converter"]
185pub struct ADC {
186 _marker: PhantomData<*const ()>,
187}
188unsafe impl Send for ADC {}
189impl ADC {
190 #[doc = r"Pointer to the register block"]
191 pub const PTR: *const adc::RegisterBlock = 0x4300_0c00 as *const _;
192 #[doc = r"Return the pointer to the register block"]
193 #[inline(always)]
194 pub const fn ptr() -> *const adc::RegisterBlock {
195 Self::PTR
196 }
197}
198impl Deref for ADC {
199 type Target = adc::RegisterBlock;
200 #[inline(always)]
201 fn deref(&self) -> &Self::Target {
202 unsafe { &*Self::PTR }
203 }
204}
205impl core::fmt::Debug for ADC {
206 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
207 f.debug_struct("ADC").finish()
208 }
209}
210#[doc = "Analog Digital Converter"]
211pub mod adc;
212#[doc = "Advanced Encryption Standard"]
213pub struct AES {
214 _marker: PhantomData<*const ()>,
215}
216unsafe impl Send for AES {}
217impl AES {
218 #[doc = r"Pointer to the register block"]
219 pub const PTR: *const aes::RegisterBlock = 0x4200_3400 as *const _;
220 #[doc = r"Return the pointer to the register block"]
221 #[inline(always)]
222 pub const fn ptr() -> *const aes::RegisterBlock {
223 Self::PTR
224 }
225}
226impl Deref for AES {
227 type Target = aes::RegisterBlock;
228 #[inline(always)]
229 fn deref(&self) -> &Self::Target {
230 unsafe { &*Self::PTR }
231 }
232}
233impl core::fmt::Debug for AES {
234 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
235 f.debug_struct("AES").finish()
236 }
237}
238#[doc = "Advanced Encryption Standard"]
239pub mod aes;
240#[doc = "Configurable Custom Logic"]
241pub struct CCL {
242 _marker: PhantomData<*const ()>,
243}
244unsafe impl Send for CCL {}
245impl CCL {
246 #[doc = r"Pointer to the register block"]
247 pub const PTR: *const ccl::RegisterBlock = 0x4300_1c00 as *const _;
248 #[doc = r"Return the pointer to the register block"]
249 #[inline(always)]
250 pub const fn ptr() -> *const ccl::RegisterBlock {
251 Self::PTR
252 }
253}
254impl Deref for CCL {
255 type Target = ccl::RegisterBlock;
256 #[inline(always)]
257 fn deref(&self) -> &Self::Target {
258 unsafe { &*Self::PTR }
259 }
260}
261impl core::fmt::Debug for CCL {
262 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
263 f.debug_struct("CCL").finish()
264 }
265}
266#[doc = "Configurable Custom Logic"]
267pub mod ccl;
268#[doc = "Digital-to-Analog Converter"]
269pub struct DAC {
270 _marker: PhantomData<*const ()>,
271}
272unsafe impl Send for DAC {}
273impl DAC {
274 #[doc = r"Pointer to the register block"]
275 pub const PTR: *const dac::RegisterBlock = 0x4200_3000 as *const _;
276 #[doc = r"Return the pointer to the register block"]
277 #[inline(always)]
278 pub const fn ptr() -> *const dac::RegisterBlock {
279 Self::PTR
280 }
281}
282impl Deref for DAC {
283 type Target = dac::RegisterBlock;
284 #[inline(always)]
285 fn deref(&self) -> &Self::Target {
286 unsafe { &*Self::PTR }
287 }
288}
289impl core::fmt::Debug for DAC {
290 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
291 f.debug_struct("DAC").finish()
292 }
293}
294#[doc = "Digital-to-Analog Converter"]
295pub mod dac;
296#[doc = "Direct Memory Access Controller"]
297pub struct DMAC {
298 _marker: PhantomData<*const ()>,
299}
300unsafe impl Send for DMAC {}
301impl DMAC {
302 #[doc = r"Pointer to the register block"]
303 pub const PTR: *const dmac::RegisterBlock = 0x4400_0400 as *const _;
304 #[doc = r"Return the pointer to the register block"]
305 #[inline(always)]
306 pub const fn ptr() -> *const dmac::RegisterBlock {
307 Self::PTR
308 }
309}
310impl Deref for DMAC {
311 type Target = dmac::RegisterBlock;
312 #[inline(always)]
313 fn deref(&self) -> &Self::Target {
314 unsafe { &*Self::PTR }
315 }
316}
317impl core::fmt::Debug for DMAC {
318 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
319 f.debug_struct("DMAC").finish()
320 }
321}
322#[doc = "Direct Memory Access Controller"]
323pub mod dmac;
324#[doc = "Device Service Unit"]
325pub struct DSU {
326 _marker: PhantomData<*const ()>,
327}
328unsafe impl Send for DSU {}
329impl DSU {
330 #[doc = r"Pointer to the register block"]
331 pub const PTR: *const dsu::RegisterBlock = 0x4100_2000 as *const _;
332 #[doc = r"Return the pointer to the register block"]
333 #[inline(always)]
334 pub const fn ptr() -> *const dsu::RegisterBlock {
335 Self::PTR
336 }
337}
338impl Deref for DSU {
339 type Target = dsu::RegisterBlock;
340 #[inline(always)]
341 fn deref(&self) -> &Self::Target {
342 unsafe { &*Self::PTR }
343 }
344}
345impl core::fmt::Debug for DSU {
346 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
347 f.debug_struct("DSU").finish()
348 }
349}
350#[doc = "Device Service Unit"]
351pub mod dsu;
352#[doc = "External Interrupt Controller"]
353pub struct EIC {
354 _marker: PhantomData<*const ()>,
355}
356unsafe impl Send for EIC {}
357impl EIC {
358 #[doc = r"Pointer to the register block"]
359 pub const PTR: *const eic::RegisterBlock = 0x4000_2400 as *const _;
360 #[doc = r"Return the pointer to the register block"]
361 #[inline(always)]
362 pub const fn ptr() -> *const eic::RegisterBlock {
363 Self::PTR
364 }
365}
366impl Deref for EIC {
367 type Target = eic::RegisterBlock;
368 #[inline(always)]
369 fn deref(&self) -> &Self::Target {
370 unsafe { &*Self::PTR }
371 }
372}
373impl core::fmt::Debug for EIC {
374 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
375 f.debug_struct("EIC").finish()
376 }
377}
378#[doc = "External Interrupt Controller"]
379pub mod eic;
380#[doc = "Event System Interface"]
381pub struct EVSYS {
382 _marker: PhantomData<*const ()>,
383}
384unsafe impl Send for EVSYS {}
385impl EVSYS {
386 #[doc = r"Pointer to the register block"]
387 pub const PTR: *const evsys::RegisterBlock = 0x4300_0000 as *const _;
388 #[doc = r"Return the pointer to the register block"]
389 #[inline(always)]
390 pub const fn ptr() -> *const evsys::RegisterBlock {
391 Self::PTR
392 }
393}
394impl Deref for EVSYS {
395 type Target = evsys::RegisterBlock;
396 #[inline(always)]
397 fn deref(&self) -> &Self::Target {
398 unsafe { &*Self::PTR }
399 }
400}
401impl core::fmt::Debug for EVSYS {
402 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
403 f.debug_struct("EVSYS").finish()
404 }
405}
406#[doc = "Event System Interface"]
407pub mod evsys;
408#[doc = "Generic Clock Generator"]
409pub struct GCLK {
410 _marker: PhantomData<*const ()>,
411}
412unsafe impl Send for GCLK {}
413impl GCLK {
414 #[doc = r"Pointer to the register block"]
415 pub const PTR: *const gclk::RegisterBlock = 0x4000_1800 as *const _;
416 #[doc = r"Return the pointer to the register block"]
417 #[inline(always)]
418 pub const fn ptr() -> *const gclk::RegisterBlock {
419 Self::PTR
420 }
421}
422impl Deref for GCLK {
423 type Target = gclk::RegisterBlock;
424 #[inline(always)]
425 fn deref(&self) -> &Self::Target {
426 unsafe { &*Self::PTR }
427 }
428}
429impl core::fmt::Debug for GCLK {
430 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
431 f.debug_struct("GCLK").finish()
432 }
433}
434#[doc = "Generic Clock Generator"]
435pub mod gclk;
436#[doc = "Main Clock"]
437pub struct MCLK {
438 _marker: PhantomData<*const ()>,
439}
440unsafe impl Send for MCLK {}
441impl MCLK {
442 #[doc = r"Pointer to the register block"]
443 pub const PTR: *const mclk::RegisterBlock = 0x4000_0400 as *const _;
444 #[doc = r"Return the pointer to the register block"]
445 #[inline(always)]
446 pub const fn ptr() -> *const mclk::RegisterBlock {
447 Self::PTR
448 }
449}
450impl Deref for MCLK {
451 type Target = mclk::RegisterBlock;
452 #[inline(always)]
453 fn deref(&self) -> &Self::Target {
454 unsafe { &*Self::PTR }
455 }
456}
457impl core::fmt::Debug for MCLK {
458 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
459 f.debug_struct("MCLK").finish()
460 }
461}
462#[doc = "Main Clock"]
463pub mod mclk;
464#[doc = "Cortex-M0+ Micro-Trace Buffer"]
465pub struct MTB {
466 _marker: PhantomData<*const ()>,
467}
468unsafe impl Send for MTB {}
469impl MTB {
470 #[doc = r"Pointer to the register block"]
471 pub const PTR: *const mtb::RegisterBlock = 0x4100_6000 as *const _;
472 #[doc = r"Return the pointer to the register block"]
473 #[inline(always)]
474 pub const fn ptr() -> *const mtb::RegisterBlock {
475 Self::PTR
476 }
477}
478impl Deref for MTB {
479 type Target = mtb::RegisterBlock;
480 #[inline(always)]
481 fn deref(&self) -> &Self::Target {
482 unsafe { &*Self::PTR }
483 }
484}
485impl core::fmt::Debug for MTB {
486 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
487 f.debug_struct("MTB").finish()
488 }
489}
490#[doc = "Cortex-M0+ Micro-Trace Buffer"]
491pub mod mtb;
492#[doc = "Non-Volatile Memory Controller"]
493pub struct NVMCTRL {
494 _marker: PhantomData<*const ()>,
495}
496unsafe impl Send for NVMCTRL {}
497impl NVMCTRL {
498 #[doc = r"Pointer to the register block"]
499 pub const PTR: *const nvmctrl::RegisterBlock = 0x4100_4000 as *const _;
500 #[doc = r"Return the pointer to the register block"]
501 #[inline(always)]
502 pub const fn ptr() -> *const nvmctrl::RegisterBlock {
503 Self::PTR
504 }
505}
506impl Deref for NVMCTRL {
507 type Target = nvmctrl::RegisterBlock;
508 #[inline(always)]
509 fn deref(&self) -> &Self::Target {
510 unsafe { &*Self::PTR }
511 }
512}
513impl core::fmt::Debug for NVMCTRL {
514 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
515 f.debug_struct("NVMCTRL").finish()
516 }
517}
518#[doc = "Non-Volatile Memory Controller"]
519pub mod nvmctrl;
520#[doc = "Operational Amplifier"]
521pub struct OPAMP {
522 _marker: PhantomData<*const ()>,
523}
524unsafe impl Send for OPAMP {}
525impl OPAMP {
526 #[doc = r"Pointer to the register block"]
527 pub const PTR: *const opamp::RegisterBlock = 0x4300_1800 as *const _;
528 #[doc = r"Return the pointer to the register block"]
529 #[inline(always)]
530 pub const fn ptr() -> *const opamp::RegisterBlock {
531 Self::PTR
532 }
533}
534impl Deref for OPAMP {
535 type Target = opamp::RegisterBlock;
536 #[inline(always)]
537 fn deref(&self) -> &Self::Target {
538 unsafe { &*Self::PTR }
539 }
540}
541impl core::fmt::Debug for OPAMP {
542 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
543 f.debug_struct("OPAMP").finish()
544 }
545}
546#[doc = "Operational Amplifier"]
547pub mod opamp;
548#[doc = "Oscillators Control"]
549pub struct OSCCTRL {
550 _marker: PhantomData<*const ()>,
551}
552unsafe impl Send for OSCCTRL {}
553impl OSCCTRL {
554 #[doc = r"Pointer to the register block"]
555 pub const PTR: *const oscctrl::RegisterBlock = 0x4000_0c00 as *const _;
556 #[doc = r"Return the pointer to the register block"]
557 #[inline(always)]
558 pub const fn ptr() -> *const oscctrl::RegisterBlock {
559 Self::PTR
560 }
561}
562impl Deref for OSCCTRL {
563 type Target = oscctrl::RegisterBlock;
564 #[inline(always)]
565 fn deref(&self) -> &Self::Target {
566 unsafe { &*Self::PTR }
567 }
568}
569impl core::fmt::Debug for OSCCTRL {
570 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
571 f.debug_struct("OSCCTRL").finish()
572 }
573}
574#[doc = "Oscillators Control"]
575pub mod oscctrl;
576#[doc = "32k Oscillators Control"]
577pub struct OSC32KCTRL {
578 _marker: PhantomData<*const ()>,
579}
580unsafe impl Send for OSC32KCTRL {}
581impl OSC32KCTRL {
582 #[doc = r"Pointer to the register block"]
583 pub const PTR: *const osc32kctrl::RegisterBlock = 0x4000_1000 as *const _;
584 #[doc = r"Return the pointer to the register block"]
585 #[inline(always)]
586 pub const fn ptr() -> *const osc32kctrl::RegisterBlock {
587 Self::PTR
588 }
589}
590impl Deref for OSC32KCTRL {
591 type Target = osc32kctrl::RegisterBlock;
592 #[inline(always)]
593 fn deref(&self) -> &Self::Target {
594 unsafe { &*Self::PTR }
595 }
596}
597impl core::fmt::Debug for OSC32KCTRL {
598 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
599 f.debug_struct("OSC32KCTRL").finish()
600 }
601}
602#[doc = "32k Oscillators Control"]
603pub mod osc32kctrl;
604#[doc = "Peripheral Access Controller"]
605pub struct PAC {
606 _marker: PhantomData<*const ()>,
607}
608unsafe impl Send for PAC {}
609impl PAC {
610 #[doc = r"Pointer to the register block"]
611 pub const PTR: *const pac::RegisterBlock = 0x4400_0000 as *const _;
612 #[doc = r"Return the pointer to the register block"]
613 #[inline(always)]
614 pub const fn ptr() -> *const pac::RegisterBlock {
615 Self::PTR
616 }
617}
618impl Deref for PAC {
619 type Target = pac::RegisterBlock;
620 #[inline(always)]
621 fn deref(&self) -> &Self::Target {
622 unsafe { &*Self::PTR }
623 }
624}
625impl core::fmt::Debug for PAC {
626 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
627 f.debug_struct("PAC").finish()
628 }
629}
630#[doc = "Peripheral Access Controller"]
631pub mod pac;
632#[doc = "Power Manager"]
633pub struct PM {
634 _marker: PhantomData<*const ()>,
635}
636unsafe impl Send for PM {}
637impl PM {
638 #[doc = r"Pointer to the register block"]
639 pub const PTR: *const pm::RegisterBlock = 0x4000_0000 as *const _;
640 #[doc = r"Return the pointer to the register block"]
641 #[inline(always)]
642 pub const fn ptr() -> *const pm::RegisterBlock {
643 Self::PTR
644 }
645}
646impl Deref for PM {
647 type Target = pm::RegisterBlock;
648 #[inline(always)]
649 fn deref(&self) -> &Self::Target {
650 unsafe { &*Self::PTR }
651 }
652}
653impl core::fmt::Debug for PM {
654 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
655 f.debug_struct("PM").finish()
656 }
657}
658#[doc = "Power Manager"]
659pub mod pm;
660#[doc = "Port Module"]
661pub struct PORT {
662 _marker: PhantomData<*const ()>,
663}
664unsafe impl Send for PORT {}
665impl PORT {
666 #[doc = r"Pointer to the register block"]
667 pub const PTR: *const port::RegisterBlock = 0x4000_2800 as *const _;
668 #[doc = r"Return the pointer to the register block"]
669 #[inline(always)]
670 pub const fn ptr() -> *const port::RegisterBlock {
671 Self::PTR
672 }
673}
674impl Deref for PORT {
675 type Target = port::RegisterBlock;
676 #[inline(always)]
677 fn deref(&self) -> &Self::Target {
678 unsafe { &*Self::PTR }
679 }
680}
681impl core::fmt::Debug for PORT {
682 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
683 f.debug_struct("PORT").finish()
684 }
685}
686#[doc = "Port Module"]
687pub mod port;
688#[doc = "Port Module (IOBUS)"]
689pub struct PORT_IOBUS {
690 _marker: PhantomData<*const ()>,
691}
692unsafe impl Send for PORT_IOBUS {}
693impl PORT_IOBUS {
694 #[doc = r"Pointer to the register block"]
695 pub const PTR: *const port::RegisterBlock = 0x6000_0000 as *const _;
696 #[doc = r"Return the pointer to the register block"]
697 #[inline(always)]
698 pub const fn ptr() -> *const port::RegisterBlock {
699 Self::PTR
700 }
701}
702impl Deref for PORT_IOBUS {
703 type Target = port::RegisterBlock;
704 #[inline(always)]
705 fn deref(&self) -> &Self::Target {
706 unsafe { &*Self::PTR }
707 }
708}
709impl core::fmt::Debug for PORT_IOBUS {
710 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
711 f.debug_struct("PORT_IOBUS").finish()
712 }
713}
714#[doc = "Port Module (IOBUS)"]
715pub use self::port as port_iobus;
716#[doc = "Reset Controller"]
717pub struct RSTC {
718 _marker: PhantomData<*const ()>,
719}
720unsafe impl Send for RSTC {}
721impl RSTC {
722 #[doc = r"Pointer to the register block"]
723 pub const PTR: *const rstc::RegisterBlock = 0x4000_0800 as *const _;
724 #[doc = r"Return the pointer to the register block"]
725 #[inline(always)]
726 pub const fn ptr() -> *const rstc::RegisterBlock {
727 Self::PTR
728 }
729}
730impl Deref for RSTC {
731 type Target = rstc::RegisterBlock;
732 #[inline(always)]
733 fn deref(&self) -> &Self::Target {
734 unsafe { &*Self::PTR }
735 }
736}
737impl core::fmt::Debug for RSTC {
738 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
739 f.debug_struct("RSTC").finish()
740 }
741}
742#[doc = "Reset Controller"]
743pub mod rstc;
744#[doc = "Real-Time Counter"]
745pub struct RTC {
746 _marker: PhantomData<*const ()>,
747}
748unsafe impl Send for RTC {}
749impl RTC {
750 #[doc = r"Pointer to the register block"]
751 pub const PTR: *const rtc::RegisterBlock = 0x4000_2000 as *const _;
752 #[doc = r"Return the pointer to the register block"]
753 #[inline(always)]
754 pub const fn ptr() -> *const rtc::RegisterBlock {
755 Self::PTR
756 }
757}
758impl Deref for RTC {
759 type Target = rtc::RegisterBlock;
760 #[inline(always)]
761 fn deref(&self) -> &Self::Target {
762 unsafe { &*Self::PTR }
763 }
764}
765impl core::fmt::Debug for RTC {
766 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
767 f.debug_struct("RTC").finish()
768 }
769}
770#[doc = "Real-Time Counter"]
771pub mod rtc;
772#[doc = "Serial Communication Interface 0"]
773pub struct SERCOM0 {
774 _marker: PhantomData<*const ()>,
775}
776unsafe impl Send for SERCOM0 {}
777impl SERCOM0 {
778 #[doc = r"Pointer to the register block"]
779 pub const PTR: *const sercom0::RegisterBlock = 0x4200_0000 as *const _;
780 #[doc = r"Return the pointer to the register block"]
781 #[inline(always)]
782 pub const fn ptr() -> *const sercom0::RegisterBlock {
783 Self::PTR
784 }
785}
786impl Deref for SERCOM0 {
787 type Target = sercom0::RegisterBlock;
788 #[inline(always)]
789 fn deref(&self) -> &Self::Target {
790 unsafe { &*Self::PTR }
791 }
792}
793impl core::fmt::Debug for SERCOM0 {
794 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
795 f.debug_struct("SERCOM0").finish()
796 }
797}
798#[doc = "Serial Communication Interface 0"]
799pub mod sercom0;
800#[doc = "Serial Communication Interface 1"]
801pub struct SERCOM1 {
802 _marker: PhantomData<*const ()>,
803}
804unsafe impl Send for SERCOM1 {}
805impl SERCOM1 {
806 #[doc = r"Pointer to the register block"]
807 pub const PTR: *const sercom0::RegisterBlock = 0x4200_0400 as *const _;
808 #[doc = r"Return the pointer to the register block"]
809 #[inline(always)]
810 pub const fn ptr() -> *const sercom0::RegisterBlock {
811 Self::PTR
812 }
813}
814impl Deref for SERCOM1 {
815 type Target = sercom0::RegisterBlock;
816 #[inline(always)]
817 fn deref(&self) -> &Self::Target {
818 unsafe { &*Self::PTR }
819 }
820}
821impl core::fmt::Debug for SERCOM1 {
822 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
823 f.debug_struct("SERCOM1").finish()
824 }
825}
826#[doc = "Serial Communication Interface 1"]
827pub use self::sercom0 as sercom1;
828#[doc = "Serial Communication Interface 2"]
829pub struct SERCOM2 {
830 _marker: PhantomData<*const ()>,
831}
832unsafe impl Send for SERCOM2 {}
833impl SERCOM2 {
834 #[doc = r"Pointer to the register block"]
835 pub const PTR: *const sercom0::RegisterBlock = 0x4200_0800 as *const _;
836 #[doc = r"Return the pointer to the register block"]
837 #[inline(always)]
838 pub const fn ptr() -> *const sercom0::RegisterBlock {
839 Self::PTR
840 }
841}
842impl Deref for SERCOM2 {
843 type Target = sercom0::RegisterBlock;
844 #[inline(always)]
845 fn deref(&self) -> &Self::Target {
846 unsafe { &*Self::PTR }
847 }
848}
849impl core::fmt::Debug for SERCOM2 {
850 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
851 f.debug_struct("SERCOM2").finish()
852 }
853}
854#[doc = "Serial Communication Interface 2"]
855pub use self::sercom0 as sercom2;
856#[doc = "Serial Communication Interface 3"]
857pub struct SERCOM3 {
858 _marker: PhantomData<*const ()>,
859}
860unsafe impl Send for SERCOM3 {}
861impl SERCOM3 {
862 #[doc = r"Pointer to the register block"]
863 pub const PTR: *const sercom0::RegisterBlock = 0x4200_0c00 as *const _;
864 #[doc = r"Return the pointer to the register block"]
865 #[inline(always)]
866 pub const fn ptr() -> *const sercom0::RegisterBlock {
867 Self::PTR
868 }
869}
870impl Deref for SERCOM3 {
871 type Target = sercom0::RegisterBlock;
872 #[inline(always)]
873 fn deref(&self) -> &Self::Target {
874 unsafe { &*Self::PTR }
875 }
876}
877impl core::fmt::Debug for SERCOM3 {
878 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
879 f.debug_struct("SERCOM3").finish()
880 }
881}
882#[doc = "Serial Communication Interface 3"]
883pub use self::sercom0 as sercom3;
884#[doc = "Supply Controller"]
885pub struct SUPC {
886 _marker: PhantomData<*const ()>,
887}
888unsafe impl Send for SUPC {}
889impl SUPC {
890 #[doc = r"Pointer to the register block"]
891 pub const PTR: *const supc::RegisterBlock = 0x4000_1400 as *const _;
892 #[doc = r"Return the pointer to the register block"]
893 #[inline(always)]
894 pub const fn ptr() -> *const supc::RegisterBlock {
895 Self::PTR
896 }
897}
898impl Deref for SUPC {
899 type Target = supc::RegisterBlock;
900 #[inline(always)]
901 fn deref(&self) -> &Self::Target {
902 unsafe { &*Self::PTR }
903 }
904}
905impl core::fmt::Debug for SUPC {
906 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
907 f.debug_struct("SUPC").finish()
908 }
909}
910#[doc = "Supply Controller"]
911pub mod supc;
912#[doc = "Basic Timer Counter 0"]
913pub struct TC0 {
914 _marker: PhantomData<*const ()>,
915}
916unsafe impl Send for TC0 {}
917impl TC0 {
918 #[doc = r"Pointer to the register block"]
919 pub const PTR: *const tc0::RegisterBlock = 0x4200_2000 as *const _;
920 #[doc = r"Return the pointer to the register block"]
921 #[inline(always)]
922 pub const fn ptr() -> *const tc0::RegisterBlock {
923 Self::PTR
924 }
925}
926impl Deref for TC0 {
927 type Target = tc0::RegisterBlock;
928 #[inline(always)]
929 fn deref(&self) -> &Self::Target {
930 unsafe { &*Self::PTR }
931 }
932}
933impl core::fmt::Debug for TC0 {
934 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
935 f.debug_struct("TC0").finish()
936 }
937}
938#[doc = "Basic Timer Counter 0"]
939pub mod tc0;
940#[doc = "Basic Timer Counter 1"]
941pub struct TC1 {
942 _marker: PhantomData<*const ()>,
943}
944unsafe impl Send for TC1 {}
945impl TC1 {
946 #[doc = r"Pointer to the register block"]
947 pub const PTR: *const tc0::RegisterBlock = 0x4200_2400 as *const _;
948 #[doc = r"Return the pointer to the register block"]
949 #[inline(always)]
950 pub const fn ptr() -> *const tc0::RegisterBlock {
951 Self::PTR
952 }
953}
954impl Deref for TC1 {
955 type Target = tc0::RegisterBlock;
956 #[inline(always)]
957 fn deref(&self) -> &Self::Target {
958 unsafe { &*Self::PTR }
959 }
960}
961impl core::fmt::Debug for TC1 {
962 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
963 f.debug_struct("TC1").finish()
964 }
965}
966#[doc = "Basic Timer Counter 1"]
967pub use self::tc0 as tc1;
968#[doc = "Basic Timer Counter 4"]
969pub struct TC4 {
970 _marker: PhantomData<*const ()>,
971}
972unsafe impl Send for TC4 {}
973impl TC4 {
974 #[doc = r"Pointer to the register block"]
975 pub const PTR: *const tc0::RegisterBlock = 0x4300_0800 as *const _;
976 #[doc = r"Return the pointer to the register block"]
977 #[inline(always)]
978 pub const fn ptr() -> *const tc0::RegisterBlock {
979 Self::PTR
980 }
981}
982impl Deref for TC4 {
983 type Target = tc0::RegisterBlock;
984 #[inline(always)]
985 fn deref(&self) -> &Self::Target {
986 unsafe { &*Self::PTR }
987 }
988}
989impl core::fmt::Debug for TC4 {
990 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
991 f.debug_struct("TC4").finish()
992 }
993}
994#[doc = "Basic Timer Counter 4"]
995pub use self::tc0 as tc4;
996#[doc = "Timer Counter Control 0"]
997pub struct TCC0 {
998 _marker: PhantomData<*const ()>,
999}
1000unsafe impl Send for TCC0 {}
1001impl TCC0 {
1002 #[doc = r"Pointer to the register block"]
1003 pub const PTR: *const tcc0::RegisterBlock = 0x4200_1400 as *const _;
1004 #[doc = r"Return the pointer to the register block"]
1005 #[inline(always)]
1006 pub const fn ptr() -> *const tcc0::RegisterBlock {
1007 Self::PTR
1008 }
1009}
1010impl Deref for TCC0 {
1011 type Target = tcc0::RegisterBlock;
1012 #[inline(always)]
1013 fn deref(&self) -> &Self::Target {
1014 unsafe { &*Self::PTR }
1015 }
1016}
1017impl core::fmt::Debug for TCC0 {
1018 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1019 f.debug_struct("TCC0").finish()
1020 }
1021}
1022#[doc = "Timer Counter Control 0"]
1023pub mod tcc0;
1024#[doc = "Timer Counter Control 1"]
1025pub struct TCC1 {
1026 _marker: PhantomData<*const ()>,
1027}
1028unsafe impl Send for TCC1 {}
1029impl TCC1 {
1030 #[doc = r"Pointer to the register block"]
1031 pub const PTR: *const tcc0::RegisterBlock = 0x4200_1800 as *const _;
1032 #[doc = r"Return the pointer to the register block"]
1033 #[inline(always)]
1034 pub const fn ptr() -> *const tcc0::RegisterBlock {
1035 Self::PTR
1036 }
1037}
1038impl Deref for TCC1 {
1039 type Target = tcc0::RegisterBlock;
1040 #[inline(always)]
1041 fn deref(&self) -> &Self::Target {
1042 unsafe { &*Self::PTR }
1043 }
1044}
1045impl core::fmt::Debug for TCC1 {
1046 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1047 f.debug_struct("TCC1").finish()
1048 }
1049}
1050#[doc = "Timer Counter Control 1"]
1051pub use self::tcc0 as tcc1;
1052#[doc = "Timer Counter Control 2"]
1053pub struct TCC2 {
1054 _marker: PhantomData<*const ()>,
1055}
1056unsafe impl Send for TCC2 {}
1057impl TCC2 {
1058 #[doc = r"Pointer to the register block"]
1059 pub const PTR: *const tcc0::RegisterBlock = 0x4200_1c00 as *const _;
1060 #[doc = r"Return the pointer to the register block"]
1061 #[inline(always)]
1062 pub const fn ptr() -> *const tcc0::RegisterBlock {
1063 Self::PTR
1064 }
1065}
1066impl Deref for TCC2 {
1067 type Target = tcc0::RegisterBlock;
1068 #[inline(always)]
1069 fn deref(&self) -> &Self::Target {
1070 unsafe { &*Self::PTR }
1071 }
1072}
1073impl core::fmt::Debug for TCC2 {
1074 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1075 f.debug_struct("TCC2").finish()
1076 }
1077}
1078#[doc = "Timer Counter Control 2"]
1079pub use self::tcc0 as tcc2;
1080#[doc = "True Random Generator"]
1081pub struct TRNG {
1082 _marker: PhantomData<*const ()>,
1083}
1084unsafe impl Send for TRNG {}
1085impl TRNG {
1086 #[doc = r"Pointer to the register block"]
1087 pub const PTR: *const trng::RegisterBlock = 0x4200_3800 as *const _;
1088 #[doc = r"Return the pointer to the register block"]
1089 #[inline(always)]
1090 pub const fn ptr() -> *const trng::RegisterBlock {
1091 Self::PTR
1092 }
1093}
1094impl Deref for TRNG {
1095 type Target = trng::RegisterBlock;
1096 #[inline(always)]
1097 fn deref(&self) -> &Self::Target {
1098 unsafe { &*Self::PTR }
1099 }
1100}
1101impl core::fmt::Debug for TRNG {
1102 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1103 f.debug_struct("TRNG").finish()
1104 }
1105}
1106#[doc = "True Random Generator"]
1107pub mod trng;
1108#[doc = "Universal Serial Bus"]
1109pub struct USB {
1110 _marker: PhantomData<*const ()>,
1111}
1112unsafe impl Send for USB {}
1113impl USB {
1114 #[doc = r"Pointer to the register block"]
1115 pub const PTR: *const usb::RegisterBlock = 0x4100_0000 as *const _;
1116 #[doc = r"Return the pointer to the register block"]
1117 #[inline(always)]
1118 pub const fn ptr() -> *const usb::RegisterBlock {
1119 Self::PTR
1120 }
1121}
1122impl Deref for USB {
1123 type Target = usb::RegisterBlock;
1124 #[inline(always)]
1125 fn deref(&self) -> &Self::Target {
1126 unsafe { &*Self::PTR }
1127 }
1128}
1129impl core::fmt::Debug for USB {
1130 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1131 f.debug_struct("USB").finish()
1132 }
1133}
1134#[doc = "Universal Serial Bus"]
1135pub mod usb;
1136#[doc = "Watchdog Timer"]
1137pub struct WDT {
1138 _marker: PhantomData<*const ()>,
1139}
1140unsafe impl Send for WDT {}
1141impl WDT {
1142 #[doc = r"Pointer to the register block"]
1143 pub const PTR: *const wdt::RegisterBlock = 0x4000_1c00 as *const _;
1144 #[doc = r"Return the pointer to the register block"]
1145 #[inline(always)]
1146 pub const fn ptr() -> *const wdt::RegisterBlock {
1147 Self::PTR
1148 }
1149}
1150impl Deref for WDT {
1151 type Target = wdt::RegisterBlock;
1152 #[inline(always)]
1153 fn deref(&self) -> &Self::Target {
1154 unsafe { &*Self::PTR }
1155 }
1156}
1157impl core::fmt::Debug for WDT {
1158 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
1159 f.debug_struct("WDT").finish()
1160 }
1161}
1162#[doc = "Watchdog Timer"]
1163pub mod wdt;
1164#[no_mangle]
1165static mut DEVICE_PERIPHERALS: bool = false;
1166#[doc = r" All the peripherals."]
1167#[allow(non_snake_case)]
1168pub struct Peripherals {
1169 #[doc = "AC"]
1170 pub AC: AC,
1171 #[doc = "ADC"]
1172 pub ADC: ADC,
1173 #[doc = "AES"]
1174 pub AES: AES,
1175 #[doc = "CCL"]
1176 pub CCL: CCL,
1177 #[doc = "DAC"]
1178 pub DAC: DAC,
1179 #[doc = "DMAC"]
1180 pub DMAC: DMAC,
1181 #[doc = "DSU"]
1182 pub DSU: DSU,
1183 #[doc = "EIC"]
1184 pub EIC: EIC,
1185 #[doc = "EVSYS"]
1186 pub EVSYS: EVSYS,
1187 #[doc = "GCLK"]
1188 pub GCLK: GCLK,
1189 #[doc = "MCLK"]
1190 pub MCLK: MCLK,
1191 #[doc = "MTB"]
1192 pub MTB: MTB,
1193 #[doc = "NVMCTRL"]
1194 pub NVMCTRL: NVMCTRL,
1195 #[doc = "OPAMP"]
1196 pub OPAMP: OPAMP,
1197 #[doc = "OSCCTRL"]
1198 pub OSCCTRL: OSCCTRL,
1199 #[doc = "OSC32KCTRL"]
1200 pub OSC32KCTRL: OSC32KCTRL,
1201 #[doc = "PAC"]
1202 pub PAC: PAC,
1203 #[doc = "PM"]
1204 pub PM: PM,
1205 #[doc = "PORT"]
1206 pub PORT: PORT,
1207 #[doc = "PORT_IOBUS"]
1208 pub PORT_IOBUS: PORT_IOBUS,
1209 #[doc = "RSTC"]
1210 pub RSTC: RSTC,
1211 #[doc = "RTC"]
1212 pub RTC: RTC,
1213 #[doc = "SERCOM0"]
1214 pub SERCOM0: SERCOM0,
1215 #[doc = "SERCOM1"]
1216 pub SERCOM1: SERCOM1,
1217 #[doc = "SERCOM2"]
1218 pub SERCOM2: SERCOM2,
1219 #[doc = "SERCOM3"]
1220 pub SERCOM3: SERCOM3,
1221 #[doc = "SUPC"]
1222 pub SUPC: SUPC,
1223 #[doc = "TC0"]
1224 pub TC0: TC0,
1225 #[doc = "TC1"]
1226 pub TC1: TC1,
1227 #[doc = "TC4"]
1228 pub TC4: TC4,
1229 #[doc = "TCC0"]
1230 pub TCC0: TCC0,
1231 #[doc = "TCC1"]
1232 pub TCC1: TCC1,
1233 #[doc = "TCC2"]
1234 pub TCC2: TCC2,
1235 #[doc = "TRNG"]
1236 pub TRNG: TRNG,
1237 #[doc = "USB"]
1238 pub USB: USB,
1239 #[doc = "WDT"]
1240 pub WDT: WDT,
1241}
1242impl Peripherals {
1243 #[doc = r" Returns all the peripherals *once*."]
1244 #[cfg(feature = "critical-section")]
1245 #[inline]
1246 pub fn take() -> Option<Self> {
1247 critical_section::with(|_| {
1248 if unsafe { DEVICE_PERIPHERALS } {
1249 return None;
1250 }
1251 Some(unsafe { Peripherals::steal() })
1252 })
1253 }
1254 #[doc = r" Unchecked version of `Peripherals::take`."]
1255 #[doc = r""]
1256 #[doc = r" # Safety"]
1257 #[doc = r""]
1258 #[doc = r" Each of the returned peripherals must be used at most once."]
1259 #[inline]
1260 pub unsafe fn steal() -> Self {
1261 DEVICE_PERIPHERALS = true;
1262 Peripherals {
1263 AC: AC {
1264 _marker: PhantomData,
1265 },
1266 ADC: ADC {
1267 _marker: PhantomData,
1268 },
1269 AES: AES {
1270 _marker: PhantomData,
1271 },
1272 CCL: CCL {
1273 _marker: PhantomData,
1274 },
1275 DAC: DAC {
1276 _marker: PhantomData,
1277 },
1278 DMAC: DMAC {
1279 _marker: PhantomData,
1280 },
1281 DSU: DSU {
1282 _marker: PhantomData,
1283 },
1284 EIC: EIC {
1285 _marker: PhantomData,
1286 },
1287 EVSYS: EVSYS {
1288 _marker: PhantomData,
1289 },
1290 GCLK: GCLK {
1291 _marker: PhantomData,
1292 },
1293 MCLK: MCLK {
1294 _marker: PhantomData,
1295 },
1296 MTB: MTB {
1297 _marker: PhantomData,
1298 },
1299 NVMCTRL: NVMCTRL {
1300 _marker: PhantomData,
1301 },
1302 OPAMP: OPAMP {
1303 _marker: PhantomData,
1304 },
1305 OSCCTRL: OSCCTRL {
1306 _marker: PhantomData,
1307 },
1308 OSC32KCTRL: OSC32KCTRL {
1309 _marker: PhantomData,
1310 },
1311 PAC: PAC {
1312 _marker: PhantomData,
1313 },
1314 PM: PM {
1315 _marker: PhantomData,
1316 },
1317 PORT: PORT {
1318 _marker: PhantomData,
1319 },
1320 PORT_IOBUS: PORT_IOBUS {
1321 _marker: PhantomData,
1322 },
1323 RSTC: RSTC {
1324 _marker: PhantomData,
1325 },
1326 RTC: RTC {
1327 _marker: PhantomData,
1328 },
1329 SERCOM0: SERCOM0 {
1330 _marker: PhantomData,
1331 },
1332 SERCOM1: SERCOM1 {
1333 _marker: PhantomData,
1334 },
1335 SERCOM2: SERCOM2 {
1336 _marker: PhantomData,
1337 },
1338 SERCOM3: SERCOM3 {
1339 _marker: PhantomData,
1340 },
1341 SUPC: SUPC {
1342 _marker: PhantomData,
1343 },
1344 TC0: TC0 {
1345 _marker: PhantomData,
1346 },
1347 TC1: TC1 {
1348 _marker: PhantomData,
1349 },
1350 TC4: TC4 {
1351 _marker: PhantomData,
1352 },
1353 TCC0: TCC0 {
1354 _marker: PhantomData,
1355 },
1356 TCC1: TCC1 {
1357 _marker: PhantomData,
1358 },
1359 TCC2: TCC2 {
1360 _marker: PhantomData,
1361 },
1362 TRNG: TRNG {
1363 _marker: PhantomData,
1364 },
1365 USB: USB {
1366 _marker: PhantomData,
1367 },
1368 WDT: WDT {
1369 _marker: PhantomData,
1370 },
1371 }
1372 }
1373}