atsamd_hal/sercom/uart/
charsize.rs

1//! Character size definitions
2
3use super::DataReg;
4use crate::typelevel::Sealed;
5use num_traits::{AsPrimitive, PrimInt};
6
7/// Type-level `enum` representing the UART character size
8///
9/// The UART character size affects the word size for the embedded HAL traits.
10/// Eight or less bit transactions use a `u8` word, while nine-bit transactions
11/// use a `u16` word.
12pub trait CharSize: Sealed {
13    /// Word size for the character size
14    type Word: 'static + PrimInt + AsPrimitive<DataReg> + Copy;
15}
16
17/// Type-level `enum` indicating a [`CharSize`] that is not dynamic
18pub trait FixedCharSize: CharSize {
19    /// Bits to write into the `LENGTH` register
20    const SIZE: CharSizeEnum;
21}
22
23/// Type alias to recover the `Word` type from an implementation of [`CharSize`]
24pub type Word<C> = <C as CharSize>::Word;
25
26/// [`CharSize`] variant for 5-bit transactions
27pub enum FiveBit {}
28
29/// [`CharSize`] variant for 6-bit transactions
30pub enum SixBit {}
31
32/// [`CharSize`] variant for 7-bit transactions
33pub enum SevenBit {}
34
35/// [`CharSize`] variant for 8-bit transactions
36pub enum EightBit {}
37
38/// [`CharSize`] variant for 9-bit transactions
39pub enum NineBit {}
40
41/// Dynamic [`CharSize`] that can be changed on the fly
42pub enum DynCharSize {}
43
44/// `enum` version of [`CharSize`]
45#[repr(u8)]
46pub enum CharSizeEnum {
47    FiveBit = 0x5,
48    SixBit = 0x6,
49    SevenBit = 0x7,
50    EightBit = 0x0,
51    NineBit = 0x1,
52}
53
54impl Sealed for FiveBit {}
55impl CharSize for FiveBit {
56    type Word = u8;
57}
58impl FixedCharSize for FiveBit {
59    const SIZE: CharSizeEnum = CharSizeEnum::FiveBit;
60}
61
62impl Sealed for SixBit {}
63impl CharSize for SixBit {
64    type Word = u8;
65}
66impl FixedCharSize for SixBit {
67    const SIZE: CharSizeEnum = CharSizeEnum::SixBit;
68}
69
70impl Sealed for SevenBit {}
71impl CharSize for SevenBit {
72    type Word = u8;
73}
74impl FixedCharSize for SevenBit {
75    const SIZE: CharSizeEnum = CharSizeEnum::SevenBit;
76}
77
78impl Sealed for EightBit {}
79impl CharSize for EightBit {
80    type Word = u8;
81}
82impl FixedCharSize for EightBit {
83    const SIZE: CharSizeEnum = CharSizeEnum::EightBit;
84}
85
86impl Sealed for NineBit {}
87impl CharSize for NineBit {
88    type Word = u16;
89}
90impl FixedCharSize for NineBit {
91    const SIZE: CharSizeEnum = CharSizeEnum::NineBit;
92}
93
94impl Sealed for DynCharSize {}
95impl CharSize for DynCharSize {
96    type Word = u16;
97}