use crate::{Guid, Status, guid, newtype_enum};
use bitflags::bitflags;
bitflags! {
#[repr(transparent)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct ControlBits: u32 {
const CLEAR_TO_SEND = 0x10;
const DATA_SET_READY = 0x20;
const RING_INDICATE = 0x40;
const CARRIER_DETECT = 0x80;
const INPUT_BUFFER_EMPTY = 0x100;
const OUTPUT_BUFFER_EMPTY = 0x200;
const DATA_TERMINAL_READY = 0x1;
const REQUEST_TO_SEND = 0x2;
const HARDWARE_LOOPBACK_ENABLE = 0x1000;
const SOFTWARE_LOOPBACK_ENABLE = 0x2000;
const HARDWARE_FLOW_CONTROL_ENABLE = 0x4000;
const SETTABLE =
ControlBits::DATA_TERMINAL_READY.bits()
| ControlBits::REQUEST_TO_SEND.bits()
| ControlBits::HARDWARE_LOOPBACK_ENABLE.bits()
| ControlBits::SOFTWARE_LOOPBACK_ENABLE.bits()
| ControlBits::HARDWARE_FLOW_CONTROL_ENABLE.bits();
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[repr(C)]
pub struct SerialIoMode {
pub control_mask: ControlBits,
pub timeout: u32,
pub baud_rate: u64,
pub receive_fifo_depth: u32,
pub data_bits: u32,
pub parity: Parity,
pub stop_bits: StopBits,
}
newtype_enum! {
#[derive(Default)]
pub enum SerialIoProtocolRevision: u32 => {
REVISION_1_0 = 0x00010000,
REVISION_1_1 = 0x00010001,
}
}
#[derive(Debug)]
#[repr(C)]
pub struct SerialIoProtocol {
pub revision: SerialIoProtocolRevision,
pub reset: unsafe extern "efiapi" fn(*mut Self) -> Status,
pub set_attributes: unsafe extern "efiapi" fn(
*mut Self,
baud_rate: u64,
receive_fifo_depth: u32,
timeout: u32,
parity: Parity,
data_bits: u8,
stop_bits_type: StopBits,
) -> Status,
pub set_control_bits: unsafe extern "efiapi" fn(*mut Self, ControlBits) -> Status,
pub get_control_bits: unsafe extern "efiapi" fn(*const Self, *mut ControlBits) -> Status,
pub write: unsafe extern "efiapi" fn(*mut Self, *mut usize, *const u8) -> Status,
pub read: unsafe extern "efiapi" fn(*mut Self, *mut usize, *mut u8) -> Status,
pub mode: *const SerialIoMode,
}
impl SerialIoProtocol {
pub const GUID: Guid = guid!("bb25cf6f-f1d4-11d2-9a0c-0090273fc1fd");
}
#[derive(Debug)]
#[repr(C)]
#[allow(non_camel_case_types)]
pub struct SerialIoProtocol_1_1 {
pub base_protocol: SerialIoProtocol,
pub device_type_guid: *const Guid,
}
impl SerialIoProtocol_1_1 {
pub const GUID: Guid = SerialIoProtocol::GUID;
}
newtype_enum! {
pub enum Parity: u32 => {
DEFAULT = 0,
NONE = 1,
EVEN = 2,
ODD = 3,
MARK = 4,
SPACE = 5,
}
}
newtype_enum! {
pub enum StopBits: u32 => {
DEFAULT = 0,
ONE = 1,
ONE_FIVE = 2,
TWO = 3,
}
}