Skip to main content

pmbus_adapter/
commands.rs

1/// All standard PMBus 1.4 command codes.
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3#[repr(u8)]
4pub enum CommandCode {
5    // General
6    Page = 0x00,
7    Operation = 0x01,
8    OnOffConfig = 0x02,
9    ClearFaults = 0x03,
10    Phase = 0x04,
11    PagePlusWrite = 0x05,
12    PagePlusRead = 0x06,
13    ZoneConfig = 0x07,
14    ZoneActive = 0x08,
15
16    // Store / Restore
17    WriteProtect = 0x10,
18    StoreDefaultAll = 0x11,
19    RestoreDefaultAll = 0x12,
20    StoreDefaultCode = 0x13,
21    RestoreDefaultCode = 0x14,
22    StoreUserAll = 0x15,
23    RestoreUserAll = 0x16,
24    StoreUserCode = 0x17,
25    RestoreUserCode = 0x18,
26    Capability = 0x19,
27    Query = 0x1A,
28    SmbalertMask = 0x1B,
29
30    // Output voltage
31    VoutMode = 0x20,
32    VoutCommand = 0x21,
33    VoutTrim = 0x22,
34    VoutCalOffset = 0x23,
35    VoutMax = 0x24,
36    VoutMarginHigh = 0x25,
37    VoutMarginLow = 0x26,
38    VoutTransitionRate = 0x27,
39    VoutDroop = 0x28,
40    VoutScaleLoop = 0x29,
41    VoutScaleMonitor = 0x2A,
42    VoutMin = 0x2B,
43
44    // Coefficients & power
45    Coefficients = 0x30,
46    PoutMax = 0x31,
47    MaxDuty = 0x32,
48    FrequencySwitch = 0x33,
49    PowerMode = 0x34,
50    VinOn = 0x35,
51    VinOff = 0x36,
52    Interleave = 0x37,
53    IoutCalGain = 0x38,
54    IoutCalOffset = 0x39,
55
56    // Fan config/command
57    FanConfig12 = 0x3A,
58    FanCommand1 = 0x3B,
59    FanCommand2 = 0x3C,
60    FanConfig34 = 0x3D,
61    FanCommand3 = 0x3E,
62    FanCommand4 = 0x3F,
63
64    // Fault/warn limits and responses — VOUT
65    VoutOvFaultLimit = 0x40,
66    VoutOvFaultResponse = 0x41,
67    VoutOvWarnLimit = 0x42,
68    VoutUvWarnLimit = 0x43,
69    VoutUvFaultLimit = 0x44,
70    VoutUvFaultResponse = 0x45,
71
72    // IOUT
73    IoutOcFaultLimit = 0x46,
74    IoutOcFaultResponse = 0x47,
75    IoutOcLvFaultLimit = 0x48,
76    IoutOcLvFaultResponse = 0x49,
77    IoutOcWarnLimit = 0x4A,
78    IoutUcFaultLimit = 0x4B,
79    IoutUcFaultResponse = 0x4C,
80
81    // Over-temperature
82    OtFaultLimit = 0x4F,
83    OtFaultResponse = 0x50,
84    OtWarnLimit = 0x51,
85
86    // Under-temperature
87    UtWarnLimit = 0x52,
88    UtFaultLimit = 0x53,
89    UtFaultResponse = 0x54,
90
91    // VIN
92    VinOvFaultLimit = 0x55,
93    VinOvFaultResponse = 0x56,
94    VinOvWarnLimit = 0x57,
95    VinUvWarnLimit = 0x58,
96    VinUvFaultLimit = 0x59,
97    VinUvFaultResponse = 0x5A,
98
99    // IIN
100    IinOcFaultLimit = 0x5B,
101    IinOcFaultResponse = 0x5C,
102    IinOcWarnLimit = 0x5D,
103
104    // Power good
105    PowerGoodOn = 0x5E,
106    PowerGoodOff = 0x5F,
107
108    // Timing
109    TonDelay = 0x60,
110    TonRise = 0x61,
111    TonMaxFaultLimit = 0x62,
112    TonMaxFaultResponse = 0x63,
113    ToffDelay = 0x64,
114    ToffFall = 0x65,
115    ToffMaxWarnLimit = 0x66,
116
117    // POUT / PIN
118    PoutOpFaultLimit = 0x68,
119    PoutOpFaultResponse = 0x69,
120    PoutOpWarnLimit = 0x6A,
121    PinOpWarnLimit = 0x6B,
122
123    // Status
124    StatusByte = 0x78,
125    StatusWord = 0x79,
126    StatusVout = 0x7A,
127    StatusIout = 0x7B,
128    StatusInput = 0x7C,
129    StatusTemperature = 0x7D,
130    StatusCml = 0x7E,
131    StatusOther = 0x7F,
132    StatusMfrSpecific = 0x80,
133    StatusFans12 = 0x81,
134    StatusFans34 = 0x82,
135
136    // Energy / KWH
137    ReadKwhIn = 0x83,
138    ReadKwhOut = 0x84,
139    ReadKwhConfig = 0x85,
140
141    // Telemetry — block reads
142    ReadEin = 0x86,
143    ReadEout = 0x87,
144
145    // Telemetry — word reads
146    ReadVin = 0x88,
147    ReadIin = 0x89,
148    ReadVcap = 0x8A,
149    ReadVout = 0x8B,
150    ReadIout = 0x8C,
151    ReadTemperature1 = 0x8D,
152    ReadTemperature2 = 0x8E,
153    ReadTemperature3 = 0x8F,
154    ReadFanSpeed1 = 0x90,
155    ReadFanSpeed2 = 0x91,
156    ReadFanSpeed3 = 0x92,
157    ReadFanSpeed4 = 0x93,
158    ReadDutyCycle = 0x94,
159    ReadFrequency = 0x95,
160    ReadPout = 0x96,
161    ReadPin = 0x97,
162
163    // Identification
164    PmbusRevision = 0x98,
165    MfrId = 0x99,
166    MfrModel = 0x9A,
167    MfrRevision = 0x9B,
168    MfrLocation = 0x9C,
169    MfrDate = 0x9D,
170    MfrSerial = 0x9E,
171    AppProfileSupport = 0x9F,
172
173    // MFR telemetry limits
174    MfrVinMin = 0xA0,
175    MfrVinMax = 0xA1,
176    MfrIinMax = 0xA2,
177    MfrPinMax = 0xA3,
178    MfrVoutMin = 0xA4,
179    MfrVoutMax = 0xA5,
180    MfrIoutMax = 0xA6,
181    MfrPoutMax = 0xA7,
182    MfrTambientMax = 0xA8,
183    MfrTambientMin = 0xA9,
184    MfrEfficiencyLl = 0xAA,
185    MfrEfficiencyHl = 0xAB,
186    MfrPinAccuracy = 0xAC,
187    IcDeviceId = 0xAD,
188    IcDeviceRev = 0xAE,
189
190    // User data
191    UserData00 = 0xB0,
192    UserData01 = 0xB1,
193    UserData02 = 0xB2,
194    UserData03 = 0xB3,
195    UserData04 = 0xB4,
196    UserData05 = 0xB5,
197    UserData06 = 0xB6,
198    UserData07 = 0xB7,
199    UserData08 = 0xB8,
200    UserData09 = 0xB9,
201    UserData10 = 0xBA,
202    UserData11 = 0xBB,
203    UserData12 = 0xBC,
204    UserData13 = 0xBD,
205    UserData14 = 0xBE,
206    UserData15 = 0xBF,
207
208    // MFR max temps
209    MfrMaxTemp1 = 0xC0,
210    MfrMaxTemp2 = 0xC1,
211    MfrMaxTemp3 = 0xC2,
212
213    // Extended command
214    MfrSpecificCommandExt = 0xFE,
215    PmbusCommandExt = 0xFF,
216}
217
218impl CommandCode {
219    /// Return the raw u8 command code.
220    pub fn code(self) -> u8 {
221        self as u8
222    }
223}
224
225impl From<CommandCode> for u8 {
226    fn from(cmd: CommandCode) -> u8 {
227        cmd as u8
228    }
229}
230
231#[cfg(test)]
232mod tests {
233    use super::*;
234
235    #[test]
236    fn command_code_values() {
237        assert_eq!(CommandCode::Page.code(), 0x00);
238        assert_eq!(CommandCode::ClearFaults.code(), 0x03);
239        assert_eq!(CommandCode::VoutMode.code(), 0x20);
240        assert_eq!(CommandCode::StatusWord.code(), 0x79);
241        assert_eq!(CommandCode::ReadVin.code(), 0x88);
242        assert_eq!(CommandCode::ReadVout.code(), 0x8B);
243        assert_eq!(CommandCode::MfrId.code(), 0x99);
244        assert_eq!(CommandCode::UserData00.code(), 0xB0);
245        assert_eq!(CommandCode::UserData15.code(), 0xBF);
246        assert_eq!(CommandCode::PmbusCommandExt.code(), 0xFF);
247    }
248
249    #[test]
250    fn from_u8() {
251        let code: u8 = CommandCode::ReadPout.into();
252        assert_eq!(code, 0x96);
253    }
254}