use core::fmt;
use num_derive::FromPrimitive;
use super::{command::*, input_deck::INPUT_DECK_SLOTS};
#[cfg(feature = "uefi")]
use core::prelude::rust_2021::derive;
#[repr(C, packed)]
pub struct EcRequestGetVersion {}
#[repr(C, packed)]
pub struct EcResponseGetVersion {
pub version_string_ro: [u8; 32],
pub version_string_rw: [u8; 32],
pub reserved: [u8; 32],
pub current_image: u32,
}
impl EcRequest<EcResponseGetVersion> for EcRequestGetVersion {
fn command_id() -> EcCommands {
EcCommands::GetVersion
}
}
#[repr(C, packed)]
pub struct EcRequestGetCmdVersionsV0 {
pub cmd: u8,
}
#[repr(C, packed)]
#[derive(Debug, Clone, Copy)]
pub struct EcResponseGetCmdVersionsV0 {
pub version_mask: u32,
}
impl EcRequest<EcResponseGetCmdVersionsV0> for EcRequestGetCmdVersionsV0 {
fn command_id() -> EcCommands {
EcCommands::GetCmdVersions
}
fn command_version() -> u8 {
0
}
}
#[repr(C, packed)]
pub struct EcRequestGetCmdVersionsV1 {
pub cmd: u32,
}
#[repr(C, packed)]
#[derive(Debug, Clone, Copy)]
pub struct EcResponseGetCmdVersionsV1 {
pub version_mask: u32,
}
impl EcRequest<EcResponseGetCmdVersionsV1> for EcRequestGetCmdVersionsV1 {
fn command_id() -> EcCommands {
EcCommands::GetCmdVersions
}
fn command_version() -> u8 {
1
}
}
pub struct EcRequestFlashInfo {}
#[repr(C, packed)]
#[derive(Clone, Copy, Debug)]
pub struct EcResponseFlashInfo {
pub flash_size: u32,
pub write_block_size: u32,
pub erase_block_size: u32,
pub protect_block_size: u32,
pub write_ideal_size: u32,
pub flags: u32,
}
impl EcRequest<EcResponseFlashInfo> for EcRequestFlashInfo {
fn command_version() -> u8 {
1
}
fn command_id() -> EcCommands {
EcCommands::FlashInfo
}
}
pub struct EcRequestFlashRead {
pub offset: u32,
pub size: u32,
}
impl EcRequest<()> for EcRequestFlashRead {
fn command_id() -> EcCommands {
EcCommands::FlashRead
}
}
#[repr(C, packed)]
pub struct EcRequestFlashWrite {
pub offset: u32,
pub size: u32,
pub data: [u8; 0],
}
impl EcRequest<()> for EcRequestFlashWrite {
fn command_id() -> EcCommands {
EcCommands::FlashWrite
}
}
#[repr(C, packed)]
pub struct EcRequestFlashErase {
pub offset: u32,
pub size: u32,
}
impl EcRequest<()> for EcRequestFlashErase {
fn command_id() -> EcCommands {
EcCommands::FlashErase
}
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum FlashProtectFlags {
ProtectRoAtBoot = 1 << 0,
ProtectRoNow = 1 << 1,
ProtectAllNow = 1 << 2,
ProtectGpioAsserted = 1 << 3,
ErrorStruck = 1 << 4,
ErrorInconsistent = 1 << 5,
ProtectAllAtBoot = 1 << 6,
}
#[repr(C, packed)]
pub struct EcRequestFlashProtect {
pub mask: u32,
pub flags: u32,
}
pub struct EcResponseFlashProtect {
pub flags: u32,
pub valid_flags: u32,
pub writeable_flags: u32,
}
impl EcRequest<EcResponseFlashProtect> for EcRequestFlashProtect {
fn command_id() -> EcCommands {
EcCommands::FlashProtect
}
}
#[repr(C, packed)]
pub struct EcRequestPwmSetKeyboardBacklight {
pub percent: u8,
}
impl EcRequest<()> for EcRequestPwmSetKeyboardBacklight {
fn command_id() -> EcCommands {
EcCommands::PwmSetKeyboardBacklight
}
}
#[repr(C, packed)]
pub struct EcRequestPwmGetKeyboardBacklight {}
#[repr(C, packed)]
pub struct EcResponsePwmGetKeyboardBacklight {
pub percent: u8,
pub enabled: u8,
}
#[repr(u8)]
pub enum PwmType {
Generic = 0,
KbLight,
DisplayLight,
}
impl EcRequest<EcResponsePwmGetKeyboardBacklight> for EcRequestPwmGetKeyboardBacklight {
fn command_id() -> EcCommands {
EcCommands::PwmGetKeyboardBacklight
}
}
#[repr(C, packed)]
pub struct EcRequestPwmSetFanTargetRpmV0 {
pub rpm: u32,
}
impl EcRequest<()> for EcRequestPwmSetFanTargetRpmV0 {
fn command_id() -> EcCommands {
EcCommands::PwmSetFanTargetRpm
}
}
pub struct EcRequestPwmSetFanTargetRpmV1 {
pub rpm: u32,
pub fan_idx: u32,
}
impl EcRequest<()> for EcRequestPwmSetFanTargetRpmV1 {
fn command_id() -> EcCommands {
EcCommands::PwmSetFanTargetRpm
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequestPwmSetFanDutyV0 {
pub percent: u32,
}
impl EcRequest<()> for EcRequestPwmSetFanDutyV0 {
fn command_id() -> EcCommands {
EcCommands::PwmSetFanDuty
}
}
#[repr(C, packed)]
pub struct EcRequestPwmSetFanDutyV1 {
pub percent: u32,
pub fan_idx: u32,
}
impl EcRequest<()> for EcRequestPwmSetFanDutyV1 {
fn command_id() -> EcCommands {
EcCommands::PwmSetFanDuty
}
fn command_version() -> u8 {
1
}
}
pub const PWM_MAX_DUTY: u16 = 0xFFFF;
pub fn percent_to_duty(percent: u8) -> u16 {
let duty = percent as u32 * PWM_MAX_DUTY as u32;
(duty / 100) as u16
}
pub fn duty_to_percent(duty: u16) -> u8 {
let percent = duty as u32 * 100;
(percent / PWM_MAX_DUTY as u32) as u8
}
#[repr(C, packed)]
pub struct EcRequestPwmSetDuty {
pub duty: u16,
pub pwm_type: u8,
pub index: u8,
}
impl EcRequest<()> for EcRequestPwmSetDuty {
fn command_id() -> EcCommands {
EcCommands::PwmSetDuty
}
}
#[repr(C, packed)]
pub struct EcRequestPwmGetDuty {
pub pwm_type: u8,
pub index: u8,
}
#[repr(C, packed)]
pub struct EcResponsePwmGetDuty {
pub duty: u16,
}
impl EcRequest<EcResponsePwmGetDuty> for EcRequestPwmGetDuty {
fn command_id() -> EcCommands {
EcCommands::PwmGetDuty
}
}
#[repr(u8)]
pub enum MotionSenseCmd {
Dump = 0,
Info = 1,
}
#[repr(C, packed)]
pub struct EcRequestMotionSenseDump {
pub cmd: u8,
pub max_sensor_count: u8,
}
#[repr(C, packed)]
pub struct EcResponseMotionSenseDump {
pub module_flags: u8,
pub sensor_count: u8,
pub sensor: [u8; 0],
}
impl EcRequest<EcResponseMotionSenseDump> for EcRequestMotionSenseDump {
fn command_id() -> EcCommands {
EcCommands::MotionSense
}
fn command_version() -> u8 {
1
}
}
#[derive(Debug, FromPrimitive, PartialEq)]
pub enum MotionSenseType {
Accel = 0,
Gyro = 1,
Mag = 2,
Prox = 3,
Light = 4,
Activity = 5,
Baro = 6,
Sync = 7,
LightRgb = 8,
}
#[derive(Debug, FromPrimitive)]
pub enum MotionSenseLocation {
Base = 0,
Lid = 1,
Camera = 2,
}
#[derive(Debug, FromPrimitive)]
pub enum MotionSenseChip {
Kxcj9 = 0,
Lsm6ds0 = 1,
Bmi160 = 2,
Si1141 = 3,
Si1142 = 4,
Si1143 = 5,
Kx022 = 6,
L3gd20h = 7,
Bma255 = 8,
Bmp280 = 9,
Opt3001 = 10,
Bh1730 = 11,
Gpio = 12,
Lis2dh = 13,
Lsm6dsm = 14,
Lis2de = 15,
Lis2mdl = 16,
Lsm6ds3 = 17,
Lsm6dso = 18,
Lng2dm = 19,
Tcs3400 = 20,
Lis2dw12 = 21,
Lis2dwl = 22,
Lis2ds = 23,
Bmi260 = 24,
Icm426xx = 25,
Icm42607 = 26,
Bma422 = 27,
Bmi323 = 28,
Bmi220 = 29,
Cm32183 = 30,
Veml3328 = 31,
}
#[repr(C, packed)]
pub struct EcRequestMotionSenseInfo {
pub cmd: u8,
pub sensor_num: u8,
}
#[repr(C)]
pub struct EcResponseMotionSenseInfo {
pub sensor_type: u8,
pub location: u8,
pub chip: u8,
}
#[derive(Debug)]
pub struct MotionSenseInfo {
pub sensor_type: MotionSenseType,
pub location: MotionSenseLocation,
pub chip: MotionSenseChip,
}
impl EcRequest<EcResponseMotionSenseInfo> for EcRequestMotionSenseInfo {
fn command_id() -> EcCommands {
EcCommands::MotionSense
}
fn command_version() -> u8 {
1
}
}
pub enum TabletModeOverride {
Default = 0,
ForceTablet = 1,
ForceClamshell = 2,
}
#[repr(C, packed)]
pub struct EcRequestSetTabletMode {
pub mode: u8,
}
impl EcRequest<()> for EcRequestSetTabletMode {
fn command_id() -> EcCommands {
EcCommands::SetTabletMode
}
}
#[repr(C, packed)]
pub struct EcRequestAutoFanCtrlV0 {}
impl EcRequest<()> for EcRequestAutoFanCtrlV0 {
fn command_id() -> EcCommands {
EcCommands::AutoFanCtrl
}
}
#[repr(C, packed)]
pub struct EcRequestAutoFanCtrlV1 {
pub fan_idx: u8,
}
impl EcRequest<()> for EcRequestAutoFanCtrlV1 {
fn command_id() -> EcCommands {
EcCommands::AutoFanCtrl
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequestGpioSetV0 {
pub name: [u8; 32],
pub value: u8,
}
impl EcRequest<()> for EcRequestGpioSetV0 {
fn command_id() -> EcCommands {
EcCommands::GpioSet
}
}
#[repr(C, packed)]
pub struct EcRequestGpioGetV0 {
pub name: [u8; 32],
}
#[repr(C, packed)]
pub struct EcResponseGpioGetV0 {
pub val: u8,
}
impl EcRequest<EcResponseGpioGetV0> for EcRequestGpioGetV0 {
fn command_id() -> EcCommands {
EcCommands::GpioGet
}
fn command_version() -> u8 {
0
}
}
pub enum GpioGetSubCommand {
ByName = 0,
Count = 1,
Info = 2,
}
#[repr(C, packed)]
pub struct EcRequestGpioGetV1Count {
pub subcmd: u8,
}
#[repr(C, packed)]
pub struct EcRequestGpioGetV1ByName {
pub subcmd: u8,
pub name: [u8; 32],
}
#[repr(C, packed)]
pub struct EcRequestGpioGetV1Info {
pub subcmd: u8,
pub index: u8,
}
#[repr(C)]
pub struct EcResponseGpioGetV1Info {
pub val: u8,
pub name: [u8; 32],
pub flags: u32,
}
impl EcRequest<EcResponseGpioGetV0> for EcRequestGpioGetV1Count {
fn command_id() -> EcCommands {
EcCommands::GpioGet
}
fn command_version() -> u8 {
1
}
}
impl EcRequest<EcResponseGpioGetV0> for EcRequestGpioGetV1ByName {
fn command_id() -> EcCommands {
EcCommands::GpioGet
}
fn command_version() -> u8 {
1
}
}
impl EcRequest<EcResponseGpioGetV1Info> for EcRequestGpioGetV1Info {
fn command_id() -> EcCommands {
EcCommands::GpioGet
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequestReboot {}
impl EcRequest<()> for EcRequestReboot {
fn command_id() -> EcCommands {
EcCommands::Reboot
}
}
pub struct EcRequestConsoleSnapshot {}
impl EcRequest<()> for EcRequestConsoleSnapshot {
fn command_id() -> EcCommands {
EcCommands::ConsoleSnapshot
}
}
pub enum ConsoleReadSubCommand {
ConsoleReadNext = 0,
ConsoleReadRecent = 1,
}
pub struct EcRequestConsoleRead {
pub subcmd: u8,
}
impl EcRequest<()> for EcRequestConsoleRead {
fn command_id() -> EcCommands {
EcCommands::ConsoleRead
}
fn command_version() -> u8 {
1
}
}
#[repr(u8)]
pub enum ChargeStateCmd {
GetState = 0,
GetParam,
SetParam,
NumCmds,
}
#[repr(C, packed)]
pub struct EcRequestChargeStateGetV0 {
pub cmd: u8,
pub param: u32,
}
#[repr(C, packed)]
pub struct EcResponseChargeStateGetV0 {
pub ac: u32,
pub chg_voltage: u32,
pub chg_current: u32,
pub chg_input_current: u32,
pub batt_state_of_charge: u32,
}
impl EcRequest<EcResponseChargeStateGetV0> for EcRequestChargeStateGetV0 {
fn command_id() -> EcCommands {
EcCommands::ChargeState
}
fn command_version() -> u8 {
0
}
}
pub struct EcRequestCurrentLimitV0 {
pub current: u32,
}
impl EcRequest<()> for EcRequestCurrentLimitV0 {
fn command_id() -> EcCommands {
EcCommands::ChargeCurrentLimit
}
}
pub struct EcRequestCurrentLimitV1 {
pub current: u32,
pub battery_soc: u8,
}
impl EcRequest<()> for EcRequestCurrentLimitV1 {
fn command_id() -> EcCommands {
EcCommands::ChargeCurrentLimit
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequesetHibernationDelay {
pub seconds: u32,
}
#[repr(C, packed)]
pub struct EcResponseHibernationDelay {
pub time_g3: u32,
pub time_remaining: u32,
pub hibernation_delay: u32,
}
impl EcRequest<EcResponseHibernationDelay> for EcRequesetHibernationDelay {
fn command_id() -> EcCommands {
EcCommands::HibernationDelay
}
}
#[repr(C, packed)]
pub struct EcRequestS0ixCounter {
pub flags: u32,
}
#[repr(C, packed)]
pub struct EcResponseS0ixCounter {
pub s0ix_counter: u32,
}
pub const EC_S0IX_COUNTER_RESET: u32 = 0x01;
impl EcRequest<EcResponseS0ixCounter> for EcRequestS0ixCounter {
fn command_id() -> EcCommands {
EcCommands::S0ixCounter
}
}
#[derive(Debug, FromPrimitive)]
pub enum EcFeatureCode {
Limited = 0,
Flash = 1,
PwmFan = 2,
PwmKeyboardBacklight = 3,
Lightbar = 4,
Led = 5,
MotionSense = 6,
Keyboard = 7,
PersistentStorage = 8,
Port80 = 9,
Thermal = 10,
BacklightSwitch = 11,
WifiSwitch = 12,
HostEvents = 13,
Gpio = 14,
I2c = 15,
Charger = 16,
Battery = 17,
SmartBattery = 18,
HangDetect = 19,
Pmu = 20,
SubMcu = 21,
UsbPd = 22,
UsbMux = 23,
MotionSenseFifo = 24,
SecureVstore = 25,
UsbcSsMuxVirtual = 26,
Rtc = 27,
Fingerprint = 28,
Touchpad = 29,
RwSig = 30,
DeviceEvent = 31,
UnifiedWakeMasks = 32,
HostEvent64 = 33,
ExecInRam = 34,
Cec = 35,
MotionSenseTightTimesStamps = 36,
RefinedTabletModeHysteresis = 37,
Efs2 = 38,
Scp = 39,
Ish = 40,
TypecCmd = 41,
TypecRequireApModeEntry = 42,
TypeCMuxRequireApAck = 43,
S4Residency = 44,
TypeCApMuxSet = 45,
TypeCApVdmSend = 46,
SystemSafeMode = 47,
AssertReboots = 48,
TokenizedLogging = 49,
AmdStbDump = 50,
MemoryDump = 51,
Dp21 = 52,
ScpC1 = 53,
UcsiPpm = 54,
}
pub struct EcRequestGetFeatures {}
pub struct EcResponseGetFeatures {
pub flags: [u32; 2],
}
impl EcRequest<EcResponseGetFeatures> for EcRequestGetFeatures {
fn command_id() -> EcCommands {
EcCommands::GetFeatures
}
}
#[repr(u8)]
pub enum RebootEcCmd {
Cancel = 0,
JumpRo = 1,
JumpRw = 2,
DeprecatedJumpToRwB = 3,
ColdReboot = 4,
DisableJump = 5,
Hibernate = 6,
DeprecatedClearApOff = 7,
ColdApOff = 8,
NoOp = 9,
}
#[repr(u8)]
pub enum RebootEcFlags {
None = 0x00,
DeprecatedRecoveryRequest = 0x01,
OnApShutdown = 0x02,
SwitchRwSlot = 0x04,
ClearApidle = 0x08,
}
pub struct EcRequestRebootEc {
pub cmd: u8,
pub flags: u8,
}
impl EcRequest<()> for EcRequestRebootEc {
fn command_id() -> EcCommands {
EcCommands::RebootEc
}
fn command_version() -> u8 {
0
}
}
#[repr(C, packed)]
pub struct EcRequestUsbPdPowerInfo {
pub port: u8,
}
#[repr(C, packed)]
pub struct _UsbChargeMeasures {
pub voltage_max: u16,
pub voltage_now: u16,
pub current_max: u16,
pub current_lim: u16,
}
#[repr(C, packed)]
pub struct EcResponseUsbPdPowerInfo {
pub role: u8, pub charging_type: u8, pub dualrole: u8, pub reserved1: u8,
pub meas: _UsbChargeMeasures,
pub max_power: u32,
}
impl EcRequest<EcResponseUsbPdPowerInfo> for EcRequestUsbPdPowerInfo {
fn command_id() -> EcCommands {
EcCommands::UsbPdPowerInfo
}
}
#[repr(usize)]
#[derive(Debug, FromPrimitive)]
pub enum EcResetFlag {
Other,
ResetPin,
Brownout,
PowerOn,
Watchdog,
Soft,
Hibernate,
RtcAlarm,
WakePin,
LowBattery,
Sysjump,
Hard,
APOff,
Preserved,
UsbResume,
Rdd,
Rbox,
Security,
ApWatchdog,
StayInRo,
Efs,
ApIdle,
InitialPwr,
Count,
}
#[repr(u16)]
#[derive(Debug, FromPrimitive)]
pub enum ResetCause {
ResetUnknown = 0x0000,
ResetBoardCustom,
ResetHangReboot,
ResetConsoleCommand,
ResetHostCommand,
ResetKeyboardSysReset,
ResetKeyboardWarmBoot,
ResetDebugWarmBoot,
ResetApReq,
ResetInit,
ResetApWatchdog,
ShutdownPowerFail = 0x8000,
ShutdownInit,
ShutdownBoardCustom,
ShutdownBatteryInhibit,
ShutdownWait,
ShutdownBatteryCritical,
ShutdownConsoleCommand,
ShutdownG3,
ShutdownThermal,
ShutdownButton,
}
#[repr(C)]
pub struct EcRequestGetUptimeInfo {}
#[repr(C, packed)]
#[derive(Clone, Copy, Debug)]
pub struct ApResetLogEntry {
pub reset_cause: u16,
pub reserved: u16,
pub reset_time_ms: u32,
}
#[repr(C, packed)]
#[derive(Debug)]
pub struct EcResponseGetUptimeInfo {
pub time_since_ec_boot: u32,
pub ap_resets_since_ec_boot: u32,
pub ec_reset_flags: u32,
pub recent_ap_resets: [ApResetLogEntry; 4],
}
impl EcRequest<EcResponseGetUptimeInfo> for EcRequestGetUptimeInfo {
fn command_id() -> EcCommands {
EcCommands::GetUptimeInfo
}
}
#[repr(C, packed)]
pub struct EcRequestAdcRead {
pub adc_channel: u8,
}
pub struct EcResponseAdcRead {
pub adc_value: i32,
}
impl EcRequest<EcResponseAdcRead> for EcRequestAdcRead {
fn command_id() -> EcCommands {
EcCommands::AdcRead
}
}
#[repr(C)]
pub struct EcRequestApReset {}
impl EcRequest<()> for EcRequestApReset {
fn command_id() -> EcCommands {
EcCommands::ApReset
}
}
#[repr(C)]
pub struct EcRequestRebootApOnG3V0 {}
impl EcRequest<()> for EcRequestRebootApOnG3V0 {
fn command_id() -> EcCommands {
EcCommands::RebootApOnG3
}
fn command_version() -> u8 {
0
}
}
#[repr(C)]
pub struct EcRequestRebootApOnG3V1 {
pub delay: u32,
}
impl EcRequest<()> for EcRequestRebootApOnG3V1 {
fn command_id() -> EcCommands {
EcCommands::RebootApOnG3
}
fn command_version() -> u8 {
1
}
}
pub const EC_RGBKBD_MAX_KEY_COUNT: usize = 64;
#[repr(C, packed)]
#[derive(Default, Clone, Copy, Debug)]
pub struct RgbS {
pub r: u8,
pub g: u8,
pub b: u8,
}
#[repr(C, packed)]
pub struct EcRequestRgbKbdSetColor {
pub start_key: u8,
pub length: u8,
pub color: [RgbS; EC_RGBKBD_MAX_KEY_COUNT],
}
#[repr(C, packed)]
pub struct EcResponseRgbKbdSetColor {}
impl EcRequest<EcResponseRgbKbdSetColor> for EcRequestRgbKbdSetColor {
fn command_id() -> EcCommands {
EcCommands::RgbKbdSetColor
}
}
#[repr(C, packed)]
pub struct EcRequestFlashNotify {
pub flags: u8,
}
#[repr(C, packed)]
pub struct EcResponseFlashNotify {}
impl EcRequest<EcResponseFlashNotify> for EcRequestFlashNotify {
fn command_id() -> EcCommands {
EcCommands::FlashNotified
}
}
#[repr(C, packed)]
pub struct KeyboardMatrixMap {
pub row: u8,
pub col: u8,
pub scanset: u16,
}
#[repr(C, packed)]
pub struct EcRequestUpdateKeyboardMatrix {
pub num_items: u32,
pub write: u32,
pub scan_update: [KeyboardMatrixMap; 1],
}
#[repr(C, packed)]
pub struct EcResponseUpdateKeyboardMatrix {
pub num_items: u32,
pub write: u32,
pub scan_update: [KeyboardMatrixMap; 32],
}
impl EcRequest<EcResponseUpdateKeyboardMatrix> for EcRequestUpdateKeyboardMatrix {
fn command_id() -> EcCommands {
EcCommands::UpdateKeyboardMatrix
}
}
#[repr(C, packed)]
pub struct EcRequestChassisOpenCheck {}
#[repr(C, packed)]
pub struct EcResponseChassisOpenCheck {
pub status: u8,
}
impl EcRequest<EcResponseChassisOpenCheck> for EcRequestChassisOpenCheck {
fn command_id() -> EcCommands {
EcCommands::ChassisOpenCheck
}
}
#[repr(C, packed)]
pub struct EcRequestChassisIntrusionControl {
pub clear_magic: u8,
pub clear_chassis_status: u8,
}
#[repr(C, packed)]
pub struct EcResponseChassisIntrusionControl {
pub chassis_ever_opened: u8,
pub coin_batt_ever_remove: u8,
pub total_open_count: u8,
pub vtr_open_count: u8,
}
impl EcRequest<EcResponseChassisIntrusionControl> for EcRequestChassisIntrusionControl {
fn command_id() -> EcCommands {
EcCommands::ChassisIntrusion
}
}
#[repr(u8)]
pub enum RetimerControlMode {
EntryFwUpdateMode = 0x01,
ExitFwUpdateMode = 0x02,
EnableComplianceMode = 0x04,
DisableComplianceMode = 0x08,
CheckStatus = 0x80,
}
#[repr(C, packed)]
pub struct EcRequestRetimerControl {
pub controller: u8,
pub mode: u8,
}
#[repr(C, packed)]
pub struct EcResponseRetimerControlStatus {
pub status: u8,
}
impl EcRequest<EcResponseRetimerControlStatus> for EcRequestRetimerControl {
fn command_id() -> EcCommands {
EcCommands::RetimerControl
}
}
#[repr(C, packed)]
pub struct EcRequestReadPdVersionV0 {}
#[repr(C, packed)]
pub struct _EcResponseReadPdVersionV0 {
pub controller01: [u8; 8],
pub controller23: [u8; 8],
}
impl EcRequest<_EcResponseReadPdVersionV0> for EcRequestReadPdVersionV0 {
fn command_id() -> EcCommands {
EcCommands::ReadPdVersion
}
fn command_version() -> u8 {
0
}
}
#[repr(C, packed)]
pub struct EcRequestReadPdVersionV1 {}
#[repr(C, packed)]
pub struct _EcResponseReadPdVersionV1 {
pub pd_chip_count: u8,
pub pd_controllers: [u8; 0],
}
impl EcRequest<_EcResponseReadPdVersionV1> for EcRequestReadPdVersionV1 {
fn command_id() -> EcCommands {
EcCommands::ReadPdVersion
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequestGetPdPortState {
pub port: u8,
}
#[repr(C, packed)]
pub struct EcResponseGetPdPortState {
pub c_state: u8,
pub pd_state: u8,
pub power_role: u8,
pub data_role: u8,
pub vconn: u8,
pub epr_active: u8,
pub epr_support: u8,
pub cc_polarity: u8,
pub voltage: u16,
pub current: u16,
pub active_port: u8,
pub pd_alt_mode_status: u8,
}
impl EcRequest<EcResponseGetPdPortState> for EcRequestGetPdPortState {
fn command_id() -> EcCommands {
EcCommands::GetPdPortState
}
}
#[repr(C, packed)]
pub struct EcRequestPrivacySwitches {}
#[repr(C, packed)]
pub struct EcResponsePrivacySwitches {
pub microphone: u8,
pub camera: u8,
}
impl EcRequest<EcResponsePrivacySwitches> for EcRequestPrivacySwitches {
fn command_id() -> EcCommands {
EcCommands::PriavcySwitchesCheckMode
}
}
#[repr(u8)]
pub enum DeckStateMode {
ReadOnly = 0x00,
Required = 0x01,
ForceOn = 0x02,
ForceOff = 0x04,
}
#[repr(C, packed)]
pub struct EcRequestDeckState {
pub mode: DeckStateMode,
}
#[repr(C, packed)]
pub struct EcResponseDeckState {
pub board_id: [u8; INPUT_DECK_SLOTS],
pub deck_state: u8,
}
impl EcRequest<EcResponseDeckState> for EcRequestDeckState {
fn command_id() -> EcCommands {
EcCommands::CheckDeckState
}
}
#[repr(C, packed)]
pub struct EcRequestUefiAppMode {
pub enable: u8,
}
impl EcRequest<()> for EcRequestUefiAppMode {
fn command_id() -> EcCommands {
EcCommands::UefiAppMode
}
}
#[repr(C, packed)]
pub struct EcRequestUefiAppBtnStatus {}
#[repr(C, packed)]
pub struct EcResponseUefiAppBtnStatus {
pub status: u8,
}
impl EcRequest<EcResponseUefiAppBtnStatus> for EcRequestUefiAppBtnStatus {
fn command_id() -> EcCommands {
EcCommands::UefiAppBtnStatus
}
}
#[derive(Debug)]
pub enum ExpansionByStates {
ModuleEnabled = 0x01,
ModuleFault = 0x02,
HatchSwitchClosed = 0x04,
}
#[derive(Debug)]
pub enum ExpansionBayBoard {
DualInterposer,
SingleInterposer,
UmaFans,
}
#[derive(Debug)]
pub enum ExpansionBayIssue {
NoModule,
BadConnection(u8, u8),
}
pub const BOARD_VERSION_0: u8 = 0;
pub const BOARD_VERSION_1: u8 = 1;
pub const BOARD_VERSION_2: u8 = 2;
pub const BOARD_VERSION_3: u8 = 3;
pub const BOARD_VERSION_4: u8 = 4;
pub const BOARD_VERSION_5: u8 = 5;
pub const BOARD_VERSION_6: u8 = 6;
pub const BOARD_VERSION_7: u8 = 7;
pub const BOARD_VERSION_8: u8 = 8;
pub const BOARD_VERSION_9: u8 = 9;
pub const BOARD_VERSION_10: u8 = 10;
pub const BOARD_VERSION_11: u8 = 11;
pub const BOARD_VERSION_12: u8 = 12;
pub const BOARD_VERSION_13: u8 = 13;
pub const BOARD_VERSION_14: u8 = 14;
pub const BOARD_VERSION_15: u8 = 15;
#[repr(C, packed)]
pub struct EcRequestExpansionBayStatus {}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseExpansionBayStatus {
pub state: u8,
pub board_id_0: u8,
pub board_id_1: u8,
}
impl EcResponseExpansionBayStatus {
pub fn module_enabled(&self) -> bool {
self.state & (ExpansionByStates::ModuleEnabled as u8) != 0
}
pub fn module_fault(&self) -> bool {
self.state & (ExpansionByStates::ModuleFault as u8) != 0
}
pub fn hatch_switch_closed(&self) -> bool {
self.state & (ExpansionByStates::HatchSwitchClosed as u8) != 0
}
pub fn expansion_bay_board(&self) -> Result<ExpansionBayBoard, ExpansionBayIssue> {
match (self.board_id_0, self.board_id_1) {
(BOARD_VERSION_12, BOARD_VERSION_12) => Ok(ExpansionBayBoard::DualInterposer),
(BOARD_VERSION_13, BOARD_VERSION_15) => Ok(ExpansionBayBoard::UmaFans),
(BOARD_VERSION_11, BOARD_VERSION_15) => Ok(ExpansionBayBoard::SingleInterposer),
(BOARD_VERSION_15, BOARD_VERSION_15) => Err(ExpansionBayIssue::NoModule),
_ => Err(ExpansionBayIssue::BadConnection(
self.board_id_0,
self.board_id_1,
)),
}
}
}
impl EcRequest<EcResponseExpansionBayStatus> for EcRequestExpansionBayStatus {
fn command_id() -> EcCommands {
EcCommands::ExpansionBayStatus
}
}
pub const DIAGNOSTICS_START: usize = 0;
pub const DIAGNOSTICS_HW_NO_BATTERY: usize = 1;
pub const DIAGNOSTICS_HW_PGOOD_3V5V: usize = 2;
pub const DIAGNOSTICS_VCCIN_AUX_VR: usize = 3;
pub const DIAGNOSTICS_SLP_S4: usize = 4;
pub const DIAGNOSTICS_HW_PGOOD_VR: usize = 5;
pub const DIAGNOSTICS_INPUT_MODULE_FAULT: usize = 6;
pub const DIAGNOSTICS_NO_LEFT_FAN: usize = 7;
pub const DIAGNOSTICS_NO_RIGHT_FAN: usize = 8;
pub const DIAGNOSTICS_GPU_MODULE_FAULT: usize = 9;
pub const DIAGNOSTICS_TOUCHPAD: usize = 6;
pub const DIAGNOSTICS_AUDIO_DAUGHTERBOARD: usize = 7;
pub const DIAGNOSTICS_THERMAL_SENSOR: usize = 8;
pub const DIAGNOSTICS_NOFAN: usize = 9;
#[repr(C, packed)]
pub struct EcRequestGetHwDiag {}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseGetHwDiag {
pub hw_diag: u32,
pub bios_complete: u8,
pub device_complete: u8,
}
impl EcResponseGetHwDiag {
pub fn fan_fault(&self) -> (bool, bool) {
(
self.hw_diag & (1 << DIAGNOSTICS_NO_LEFT_FAN) != 0,
self.hw_diag & (1 << DIAGNOSTICS_NO_RIGHT_FAN) != 0,
)
}
}
impl fmt::Display for EcResponseGetHwDiag {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let (left_fan, right_fan) = self.fan_fault();
write!(
f,
"BIOS Done: {}, Fan Fault Left: {}, Right: {}",
self.bios_complete != 0,
left_fan,
right_fan
)
}
}
impl EcRequest<EcResponseGetHwDiag> for EcRequestGetHwDiag {
fn command_id() -> EcCommands {
EcCommands::GetHwDiag
}
}
#[repr(u8)]
pub enum ChargeLimitControlModes {
Disable = 0x01,
Set = 0x02,
Get = 0x08,
Override = 0x80,
}
#[repr(C, packed)]
pub struct EcRequestChargeLimitControl {
pub modes: u8,
pub max_percentage: u8,
pub min_percentage: u8,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseChargeLimitControl {
pub max_percentage: u8,
pub min_percentage: u8,
}
impl EcRequest<EcResponseChargeLimitControl> for EcRequestChargeLimitControl {
fn command_id() -> EcCommands {
EcCommands::ChargeLimitControl
}
}
pub const EC_CHARGE_LIMIT_RESTORE: u8 = 0x7F;
#[repr(C, packed)]
pub struct EcRequestDisablePs2Emulation {
pub disable: u8,
}
impl EcRequest<()> for EcRequestDisablePs2Emulation {
fn command_id() -> EcCommands {
EcCommands::DisablePs2Emulation
}
}
#[repr(u8)]
#[derive(Debug, FromPrimitive)]
pub enum FpLedBrightnessLevel {
High = 0,
Medium = 1,
Low = 2,
UltraLow = 3,
Custom = 0xFE,
Auto = 0xFF,
}
#[repr(C, packed)]
pub struct EcRequestFpLedLevelControlV0 {
pub set_level: u8,
pub get_level: u8,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseFpLedLevelControlV0 {
pub percentage: u8,
}
impl EcRequest<EcResponseFpLedLevelControlV0> for EcRequestFpLedLevelControlV0 {
fn command_id() -> EcCommands {
EcCommands::FpLedLevelControl
}
fn command_version() -> u8 {
0
}
}
#[repr(C, packed)]
pub struct EcRequestFpLedLevelControlV1 {
pub set_percentage: u8,
pub get_level: u8,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseFpLedLevelControlV1 {
pub percentage: u8,
pub level: u8,
}
impl EcRequest<EcResponseFpLedLevelControlV1> for EcRequestFpLedLevelControlV1 {
fn command_id() -> EcCommands {
EcCommands::FpLedLevelControl
}
fn command_version() -> u8 {
1
}
}
#[repr(C, packed)]
pub struct EcRequestGetGpuSerial {
pub idx: u8,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseGetGpuSerial {
pub idx: u8,
pub valid: u8,
pub serial: [u8; 20],
}
impl EcRequest<EcResponseGetGpuSerial> for EcRequestGetGpuSerial {
fn command_id() -> EcCommands {
EcCommands::GetGpuSerial
}
}
#[repr(C, packed)]
pub struct EcRequestGetGpuPcie {}
#[repr(u8)]
#[derive(Debug, FromPrimitive)]
pub enum GpuPcieConfig {
Pcie8x1 = 0,
Pcie4x1 = 1,
Pcie4x2 = 2,
}
#[repr(u8)]
#[derive(Debug, FromPrimitive, PartialEq)]
pub enum GpuVendor {
Initializing = 0x00,
FanOnly = 0x01,
GpuAmdR23M = 0x02,
SsdHolder = 0x03,
PcieAccessory = 0x4,
NvidiaGn22 = 0x5,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseGetGpuPcie {
pub gpu_pcie_config: u8,
pub gpu_vendor: u8,
}
impl EcRequest<EcResponseGetGpuPcie> for EcRequestGetGpuPcie {
fn command_id() -> EcCommands {
EcCommands::GetGpuPcie
}
}
#[repr(u8)]
pub enum SetGpuSerialMagic {
WriteGPUConfig = 0x0D,
WriteSSDConfig = 0x55,
}
#[repr(C, packed)]
pub struct EcRequestSetGpuSerial {
pub magic: u8,
pub idx: u8,
pub serial: [u8; 20],
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseSetGpuSerial {
pub valid: u8,
}
impl EcRequest<EcResponseSetGpuSerial> for EcRequestSetGpuSerial {
fn command_id() -> EcCommands {
EcCommands::ProgramGpuEeprom
}
}
#[repr(u8)]
#[derive(Debug, Clone, Copy)]
pub enum BoardIdType {
Mainboard = 0,
PowerButtonBoard = 1,
Touchpad = 2,
AudioBoard = 3,
DGpu0 = 4,
DGpu1 = 5,
}
#[repr(C, packed)]
pub struct EcRequestReadBoardId {
pub board_id_type: u8,
}
#[repr(C, packed)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EcResponseReadBoardId {
pub board_id: i8,
}
impl EcRequest<EcResponseReadBoardId> for EcRequestReadBoardId {
fn command_id() -> EcCommands {
EcCommands::ReadBoardId
}
}