1//! Character size definitions
23use super::DataReg;
4use crate::typelevel::Sealed;
5use num_traits::{AsPrimitive, PrimInt};
67/// 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
14type Word: 'static + PrimInt + AsPrimitive<DataReg> + Copy;
15}
1617/// Type-level `enum` indicating a [`CharSize`] that is not dynamic
18pub trait FixedCharSize: CharSize {
19/// Bits to write into the `LENGTH` register
20const SIZE: CharSizeEnum;
21}
2223/// Type alias to recover the `Word` type from an implementation of [`CharSize`]
24pub type Word<C> = <C as CharSize>::Word;
2526/// [`CharSize`] variant for 5-bit transactions
27pub enum FiveBit {}
2829/// [`CharSize`] variant for 6-bit transactions
30pub enum SixBit {}
3132/// [`CharSize`] variant for 7-bit transactions
33pub enum SevenBit {}
3435/// [`CharSize`] variant for 8-bit transactions
36pub enum EightBit {}
3738/// [`CharSize`] variant for 9-bit transactions
39pub enum NineBit {}
4041/// Dynamic [`CharSize`] that can be changed on the fly
42pub enum DynCharSize {}
4344/// `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}
5354impl Sealed for FiveBit {}
55impl CharSize for FiveBit {
56type Word = u8;
57}
58impl FixedCharSize for FiveBit {
59const SIZE: CharSizeEnum = CharSizeEnum::FiveBit;
60}
6162impl Sealed for SixBit {}
63impl CharSize for SixBit {
64type Word = u8;
65}
66impl FixedCharSize for SixBit {
67const SIZE: CharSizeEnum = CharSizeEnum::SixBit;
68}
6970impl Sealed for SevenBit {}
71impl CharSize for SevenBit {
72type Word = u8;
73}
74impl FixedCharSize for SevenBit {
75const SIZE: CharSizeEnum = CharSizeEnum::SevenBit;
76}
7778impl Sealed for EightBit {}
79impl CharSize for EightBit {
80type Word = u8;
81}
82impl FixedCharSize for EightBit {
83const SIZE: CharSizeEnum = CharSizeEnum::EightBit;
84}
8586impl Sealed for NineBit {}
87impl CharSize for NineBit {
88type Word = u16;
89}
90impl FixedCharSize for NineBit {
91const SIZE: CharSizeEnum = CharSizeEnum::NineBit;
92}
9394impl Sealed for DynCharSize {}
95impl CharSize for DynCharSize {
96type Word = u16;
97}