The following is a list of My Cloud PR4100 and PR2100 Power Management Controller (PMC) chip commands.
WARNING: Some of these commands are potentially dangerous, if you screw something up by using them, it’s not my problem.
LCD Backlight Brightness (BKL):
0x00 = 000% Brightness (Min)
0x19 = 025% Brightness
0x32 = 050% Brightness
0x3C = 060% Brightness (Default)
0x64 = 100% Brightness (Max)
Type: Get and Set
Note: Level 0-100
# echo "BKL=00" > /dev/ttyS2
LCD Display Text (LN1, LN2):
Type: Set only
Note: 16 Characters Max Per Line
# echo "LN1=XXXXXXXXXXXXXXXX" > /dev/ttyS2
# echo "LN2=XXXXXXXXXXXXXXXX" > /dev/ttyS2
Fan Speed Level 0-100% (FAN):
0x00 : 0x0000 -> ((00 / 2) * 60) = 0000 RPM
0x05 : 0x0009 -> ((09 / 2) * 60) = 0270 RPM
0x10 : 0x000E -> ((14 / 2) * 60) = 0420 RPM
0x15 : 0x0013 -> ((19 / 2) * 60) = 0570 RPM
0x20 : 0x001C -> ((28 / 2) * 60) = 0840 RPM
0x25 : 0x0021 -> ((33 / 2) * 60) = 0990 RPM
0x30 : 0x0029 -> ((41 / 2) * 60) = 1230 RPM
0x35 : 0x002D -> ((45 / 2) * 60) = 1350 RPM
0x40 : 0x0035 -> ((53 / 2) * 60) = 1590 RPM
0x45 : 0x0039 -> ((57 / 2) * 60) = 1710 RPM
0x50 : 0x0040 -> ((64 / 2) * 60) = 1920 RPM
0x55 : 0x0043 -> ((67 / 2) * 60) = 2010 RPM
0x60 : 0x0049 -> ((73 / 2) * 60) = 2190 RPM
0x64 : 0x004A -> ((74 / 2) * 60) = 2220 RPM
Type: Get and Set
Note: Level 0-64
# echo "FAN=25" > /dev/ttyS2
Fan TAC Frequency (TAC):
0x00 : 0x0000 -> ((00 / 2) * 60) = 0000 RPM
0x05 : 0x0009 -> ((09 / 2) * 60) = 0270 RPM
0x10 : 0x000E -> ((14 / 2) * 60) = 0420 RPM
0x15 : 0x0013 -> ((19 / 2) * 60) = 0570 RPM
0x20 : 0x001C -> ((28 / 2) * 60) = 0840 RPM
0x25 : 0x0021 -> ((33 / 2) * 60) = 0990 RPM
0x30 : 0x0029 -> ((41 / 2) * 60) = 1230 RPM
0x35 : 0x002D -> ((45 / 2) * 60) = 1350 RPM
0x40 : 0x0035 -> ((53 / 2) * 60) = 1590 RPM
0x45 : 0x0039 -> ((57 / 2) * 60) = 1710 RPM
0x50 : 0x0040 -> ((64 / 2) * 60) = 1920 RPM
0x55 : 0x0043 -> ((67 / 2) * 60) = 2010 RPM
0x60 : 0x0049 -> ((73 / 2) * 60) = 2190 RPM
0x64 : 0x004A -> ((74 / 2) * 60) = 2220 RPM
Type: Get only
Note: RPM = ((TAC / 2) * 60)
# echo "TAC" > /dev/ttyS2
Fan TAC Frequency as RPM (RPM):
0x0000 = 0000 RPM
0x01FE = 0510 RPM
0x08AC = 2220 RPM
Type: Get only
# echo "RPM" > /dev/ttyS2
Interrupt Mask Register (IMR):
0x01 -> Fan Failure
0x02 -> Power Supply 1
0x04 -> Power Supply 2
0x08 -> USB Copy Button State
0x10 -> Drive Presence Detection
0x20 -> LCD Up Button Pressed
0x40 -> LCD Down Button Pressed
0x80 -> Buzzer State
Type: Get and Set
Note: Must set IMR=FF before ISR use
Response: IMR=FF
# echo "IMR=FF" > /dev/ttyS2
Interrupt Status Register (ISR):
0x01 -> Fan Failure
0x02 -> Power Supply 1
0x04 -> Power Supply 2
0x08 -> USB Copy Button State
0x10 -> Drive Presence Detection
0x20 -> LCD Up Button Pressed
0x40 -> LCD Down Button Pressed
0x80 -> Buzzer State
Type: Get only
Note: After boot ISR=10
Note: Must set IMR=FF before ISR use
Note: ISR resets to 0x00 after value retrieved
Note: ALERT sent when a button is pressed
# echo "ISR" > /dev/ttyS2
LED Configuration (LED, BLK):
0x00 = 0000 0000 -> Power All Off, USB All Off
0x01 = 0000 0001 -> Power Blue On
0x02 = 0000 0010 -> Power Red On
0x04 = 0000 0100 -> Power Green On
0x08 = 0000 1000 -> USB Red On
0x09 = 0000 1001 -> USB Red On, Power Blue On
0x0A = 0000 1010 -> USB Red On, Power Red On
0x0C = 0000 1100 -> USB Red On, Power Green On
0x10 = 0001 0000 -> USB Blue On
0x11 = 0001 0001 -> USB Blue On, Power Blue On
0x12 = 0001 0010 -> USB Blue On, Power Red On
0x14 = 0001 0100 -> USB Blue On, Power Green On
0x1F = 0001 1111 -> Power All On, USB All On
Type: Get and Set
Note: BLK is Blink
Note: Set LED=00 and PLS=00 before setting BLK
Note: Set BLK=00 and PLS=00 before setting LED
echo "BLK=00" > /dev/ttyS2
echo "LED=00" > /dev/ttyS2
LED Configuration Bits (LED, BLK):
0 0 0 0 0 0 0 1 --> 0x01 (Hex)
- - - - - - - -
| | | | | | | |
| | | | | | | +---> Power Blue
| | | | | | +-----> Power Red
| | | | | +-------> Power Green
| | | | +---------> USB Red
| | | +------------> USB Blue
| | +--------------> Unused
| +----------------> Unused
+------------------> Unused
LED Pulse (PLS):
0x00 -> LED Pulse Off
0x01 -> LED Pulse On
Type: Get and Set
Note: Power LED Only
Note: Set LED=00 and BLK=00 before setting PLS
# echo "PLS=00" > /dev/ttyS2
Drive Status (DE0):
0x0F = 0000 1111 -> hd1,hd2,hd3,hd4
0x1F = 0001 1111 -> hd2,hd3,hd4
0x2F = 0010 1111 -> hd1,hd3,hd4
0x3F = 0011 1111 -> hd3,hd4
0x4F = 0100 1111 -> hd1,hd2,hd4
0x5F = 0101 1111 -> hd2,hd4
0x6F = 0110 1111 -> hd1,hd4
0x7F = 0111 1111 -> hd4
0x8F = 1000 1111 -> hd1,hd2,hd3
0x9F = 1001 1111 -> hd2,hd3
0xAF = 1010 1111 -> hd1,hd3
0xBF = 1011 1111 -> hd3
0xCF = 1100 1111 -> hd1,hd2
0xDF = 1101 1111 -> hd2
0xEF = 1110 1111 -> hd1
0xFF = 1111 1111 -> None
Type: Get and Set
Note: Red LED On/Off
Note: Zeros in right half of byte powers down drive(s)
Note: DLC/DLS are inverse of DE0
# echo "DE0=FF" > /dev/ttyS2
Drive Enable Register (DE0):
0x00 - 0000 0000 -> hd1,hd2,hd3,hd4
0x01 - 0000 0001 -> hd1,hd2,hd3
0x02 - 0000 0010 -> hd1,hd3,hd4
0x03 - 0000 0011 -> hd3,hd4
0x04 - 0000 0100 -> hd1,hd2,hd4
0x05 - 0000 0101 -> hd2,hd4
0x06 - 0000 0110 -> hd1,hd4
0x07 - 0000 0111 -> hd4
0x08 - 0000 1000 -> hd2,hd3,hd4
0x09 - 0000 1001 -> hd2,hd3
0x0A - 0000 1010 -> hd1,hd3
0x0B - 0000 1011 -> hd3
0x0C - 0000 1100 -> hd1,hd2
0x0D - 0000 1101 -> hd2
0x0E - 0000 1110 -> hd1
0x0F - 0000 1111 -> None
Type: Get and Set
Note: Blue LED On/Off
Note: Zeros in right half of byte powers down drive(s)
Note: DLC/DLS are inverse of DE0
# echo "DE0=0F" > /dev/ttyS2
Drive LED Status (DLC, DLS):
0x10 = 0001 0000 -> hd1
0x20 = 0010 0000 -> hd2
0x30 = 0011 0000 -> hd1,hd2
0x40 = 0100 0000 -> hd3
0x50 = 0101 0000 -> hd1,hd3
0x60 = 0110 0000 -> hd2,hd3
0x70 = 0111 0000 -> hd2,hd3,hd4
0x80 = 1000 0000 -> hd4
0x90 = 1001 0000 -> hd1,hd4
0xA0 = 1010 0000 -> hd2,hd4
0xB0 = 1011 0000 -> hd1,hd2,hd4
0xC0 = 1100 0000 -> hd3,hd4
0xD0 = 1101 0000 -> hd1,hd3,hd4
0xE0 = 1110 0000 -> hd1,hd2,hd3
0xF0 = 1111 0000 -> hd1,hd2,hd3,hd4
Type: Set only
Note: DLS = Drive LED Set Register
Note: DLC = Drive LED Clear Register
Note: Red LED On/Off
Note: DLC/DLS are inverse of DE0
Note: Use DLC for on, or DLS for off
Note: Ones in right half of byte powers down drive(s)
# echo "DLC=F0" > /dev/ttyS2
# echo "DLS=F0" > /dev/ttyS2
Drive Power (DLC, DLS):
0x01 - 0000 0001 -> hd1
0x02 - 0000 0010 -> hd2
0x03 - 0000 0011 -> hd1,hd2
0x04 - 0000 0100 -> hd3
0x05 - 0000 0101 -> hd1,hd3
0x06 - 0000 0110 -> hd2,hd3
0x07 - 0000 0111 -> hd2,hd3,hd4
0x08 - 0000 1000 -> hd4
0x09 - 0000 1001 -> hd1,hd4
0x0A - 0000 1010 -> hd2,hd4
0x0B - 0000 1011 -> hd1,hd2,hd4
0x0C - 0000 1100 -> hd3,hd4
0x0D - 0000 1101 -> hd1,hd3,hd4
0x0E - 0000 1110 -> hd1,hd2,hd3
0x0F - 0000 1111 -> hd1,hd2,hd3,hd4
Type: Set only
Note: Blue LED On/Off
Note: Ones in right half of byte powers down drive(s)
Note: DLC/DLS are inverse of DE0
Note: Use DLC for on, or DLS for off
# echo "DLC=0F" > /dev/ttyS2
# echo "DLS=0F" > /dev/ttyS2
Drive Status and Power Bits (DE0, DLC, DLS):
0 0 0 1 0 0 0 0 --> 0x10 (Hex)
- - - - - - - -
| | | | | | | |
| | | | | | | +---> hd1 Power
| | | | | | +-----> hd2 Power
| | | | | +-------> hd3 Power
| | | | +---------> hd4 Power
| | | +------------> hd1 Status LED (Red)
| | +--------------> hd2 Status LED (Red)
| +----------------> hd3 Status LED (Red)
+------------------> hd4 Status LED (Red)
Drive LED Blink (DLB):
0x00 = 0000 0000 -> None
0x10 = 0001 0000 -> hd1
0x20 = 0010 0000 -> hd2
0x30 = 0011 0000 -> hd1,hd2
0x40 = 0100 0000 -> hd3
0x50 = 0101 0000 -> hd1,hd3
0x60 = 0110 0000 -> hd2,hd3
0x70 = 0111 0000 -> hd1,hd2,hd3
0x80 = 1000 0000 -> hd4
0x90 = 1001 0000 -> hd1,hd4
0xA0 = 1010 0000 -> hd2,hd4
0xB0 = 1011 0000 -> hd1,hd2,hd4
0xC0 = 1100 0000 -> hd3,hd4
0xD0 = 1101 0000 -> hd1,hd3,hd4
0xE0 = 1110 0000 -> hd2,hd3,hd4
0xF0 = 1111 0000 -> hd1,hd2,hd3,hd4
Type: Get and Set
Note: Red LED On/Off
echo "DLB=00" > /dev/ttyS2
Drive LED Blink Bits (DLB):
0 0 0 1 0 0 0 0 --> 0x10 (Hex)
- - - - - - - -
| | | | | | | |
| | | | | | | +---> Always 0
| | | | | | +-----> Always 0
| | | | | +-------> Always 0
| | | | +---------> Always 0
| | | +------------> Status, hd1 (Red LED Blink)
| | +--------------> Status, hd2 (Red LED Blink)
| +----------------> Status, hd3 (Red LED Blink)
+------------------> Status, hd4 (Red LED Blink)
Drive Presence Detection Register (DP0):
0x90 - 1001 0000 -> hd1,hd2,hd3,hd4 Present
0x91 - 1001 0001 -> hd2,hd3,hd4 Present
0x92 - 1001 0010 -> hd1,hd3,hd4 Present
0x93 - 1001 0011 -> hd3,hd4 Present
0x94 - 1001 0100 -> hd1,hd2,hd4 Present
0x95 - 1001 0101 -> hd2,hd4 Present
0x96 - 1001 0110 -> hd1,hd4 Present
0x97 - 1001 0111 -> hd4 Present
0x98 - 1001 1000 -> hd1,hd2,hd3 Present
0x99 - 1001 1001 -> hd2,hd3 Present
0x9A - 1001 1010 -> hd1,hd3 Present
0x9B - 1001 1011 -> hd3 Present
0x9C - 1001 1100 -> hd1,hd2 Present
0x9D - 1001 1101 -> hd2 Present
0x9E - 1001 1110 -> hd1 Present
0x9F - 1001 1111 -> No Drives Present
Type: Get only
Note: ALERT sent when a drive is inserted or removed
# echo "DP0" > /dev/ttyS2
Drive Presence Detection Register Bits (DP0):
1 0 0 1 0 0 0 0 --> 0x90 (Hex)
- - - - - - - -
| | | | | | | |
| | | | | | | +---> hd1
| | | | | | +-----> hd2
| | | | | +-------> hd3
| | | | +---------> hd4
| | | +------------> Bit always 1
| | +--------------> Bit always 0
| +----------------> Bit always 0
+------------------> Bit always 1
Note: 0=Present, 1=Absent
PMC Temperature (TMP, tmp):
0x1C -> (28C x 1.8) + 32 = 082.4F
0x1D -> (29C x 1.8) + 32 = 084.2F
0x1E -> (30C x 1.8) + 32 = 086.0F
0x1F -> (31C x 1.8) + 32 = 087.8F
0x20 -> (32C x 1.8) + 32 = 089.6F
0x21 -> (33C x 1.8) + 32 = 091.4F
0x22 -> (34C x 1.8) + 32 = 093.2F
0x23 -> (35C x 1.8) + 32 = 095.0F
0x24 -> (36C x 1.8) + 32 = 096.8F
0x25 -> (37C x 1.8) + 32 = 098.6F
0x26 -> (38C x 1.8) + 32 = 100.4F
0x27 -> (39C x 1.8) + 32 = 102.2F
0x28 -> (40C x 1.8) + 32 = 104.0F
0x29 -> (41C x 1.8) + 32 = 106.0F
0x30 -> (48C x 1.8) + 32 = 118.4F
Type: Get only
Note: TMP is hex (upper case)
Note: tmp is decimal (lower case)
# echo "TMP" > /dev/ttyS2
Buzzer (BZR):
Type: Set only
Note: On BZR=FF / Off BZR=00
# echo "BZR=FF" > /dev/ttyS2
Status (STA):
0x6A = 0110 1010 = 106 -> Power Cable in Jack #2
0x6C = 0110 1100 = 108 -> Power Cable in Jack #1
0x6E = 0110 1110 = 110 -> Power Cable in Jack #1 and #2
0x62 = 0110 0010 = 098 -> USB Button Pushed and Power Cable in Jack #2
0x64 = 0110 0100 = 100 -> USB Button Pushed and Power Cable in Jack #1
0x66 = 0110 0110 = 102 -> USB Button Pushed and Power Cable in Jack #1 and #2
0x4A = 0100 1010 = 074 -> LCD Up Button Pushed and Power Cable in Jack #2
0x4C = 0100 1100 = 076 -> LCD Up Button Pushed and Power Cable in Jack #1
0x4E = 0100 1110 = 078 -> LCD Up Button Pushed and Power Cable in Jack #1 and #2
0x2A = 0010 1010 = 042 -> LCD Down Button Pushed and Power Cable in Jack #2
0x2C = 0010 1100 = 044 -> LCD Down Button Pushed and Power Cable in Jack #1
0x2E = 0010 1110 = 046 -> LCD Down Button Pushed and Power Cable in Jack #1 and #2
Type: Get only
Response: STA=6c
# echo "STA" > /dev/ttyS2
Status Bits (STA):
0 1 1 0 1 1 1 0 --> 0x00 (Hex)
- - - - - - - -
| | | | | | | |
| | | | | | | +---> Unused
| | | | | | +-----> Power Cable #2
| | | | | +-------> Power Cable #1
| | | | +---------> LCD Button
| | | +------------> Unused
| | +--------------> LCD Down Button [ OR ] USB Button
| +----------------> LCD Up Button [ OR ] USB Button
+------------------> Unused
Note: 0=Bit Off, 1=Bit On
Note: LCD and USB share two bits
Note: LCD has two bits, one up, one down
Note: USB has two bits, both on or both off
Timeout Event Counter (TEC):
Type: Get only
Response: TEC=00
Note: Records reboot timeout events.
# echo "TEC" > /dev/ttyS2
Unknown (ECH):
Type: Get and Set
Response: ALERT
# echo "ECH=00" > /dev/ttyS2
Version (VER):
Type: Get only
Response: VER=WD BBC v02
Note: Two versions are known to exist.
Note: My Cloud OS3 includes VER=WD BBC v01
Note: My Cloud OS5 includes VER=WD BBC v02
Note: My Cloud OS5 uses pmc_update to update the PMC chip.
# echo "VER" > /dev/ttyS2
Configuration (CFG):
Type: Get and Set
Note: CFG=1 -> Reset PMC
Note: CFG=2 -> Disable automatic drive presence detection DP0
Note: CFG=3 -> Enable automatic drive presence detection DP0
Note: Default value is 0x03
# echo "CFG=02" > /dev/ttyS2
Flash Write Test (FWT):
WARNING: This command is potentially dangerous and should not be used.
Type: Set only
# echo "FWT=00" > /dev/ttyS2
Update (UPD):
This command puts the PMC chip into a special update or reset mode, with an interactive menu. Of all the commands one may issue, this appears to be the most dangerous. Yet, it may afford the possibility of dumping the PMC firmware for analysis.
WARNING: Using this command could potentially corrupt the PMC chip firmware, rendering the fan control and other hardware control functions inoperative.
# echo "UPD" > /dev/ttyS2
========= WDPMC Update Menu v1.0 =============
Reset PMC -------------------------------- 0
Write Image To PMC Internal Flash -------- 1
Read Image From PMC Internal Flash ------- 2
Execute The New Program ------------------ 3
==============================================
Note: To select a number, echo it to the PMC via /dev/ttyS2
# echo 1 > /dev/ttyS2
# echo 2 > /dev/ttyS2
# echo 3 > /dev/ttyS2