1 /** 2 * Copyright © 2020 IBM Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include "action_environment.hpp" 19 #include "i2c_action.hpp" 20 21 #include <cstdint> 22 #include <string> 23 24 namespace phosphor::power::regulators 25 { 26 27 /** 28 * @class I2CWriteByteAction 29 * 30 * Writes a byte to a device register. Communicates with the device directly 31 * using the I2C interface. 32 * 33 * Implements the i2c_write_byte action in the JSON config file. 34 */ 35 class I2CWriteByteAction : public I2CAction 36 { 37 public: 38 // Specify which compiler-generated methods we want 39 I2CWriteByteAction() = delete; 40 I2CWriteByteAction(const I2CWriteByteAction&) = delete; 41 I2CWriteByteAction(I2CWriteByteAction&&) = delete; 42 I2CWriteByteAction& operator=(const I2CWriteByteAction&) = delete; 43 I2CWriteByteAction& operator=(I2CWriteByteAction&&) = delete; 44 virtual ~I2CWriteByteAction() = default; 45 46 /** 47 * Constructor. 48 * 49 * @param reg Device register address. Note: named 'reg' because 'register' 50 * is a reserved keyword. 51 * @param value Byte value to write. 52 * @param mask Bit mask. Specifies which bits to write within the byte 53 * value. Only the bits with a value of 1 in the mask will be 54 * written. 55 */ I2CWriteByteAction(uint8_t reg,uint8_t value,uint8_t mask=0xFF)56 explicit I2CWriteByteAction(uint8_t reg, uint8_t value, 57 uint8_t mask = 0xFF) : 58 reg{reg}, value{value}, mask{mask} 59 {} 60 61 /** 62 * Executes this action. 63 * 64 * Writes a byte to a device register using the I2C interface. 65 * 66 * The device register, byte value, and mask (if any) were specified in the 67 * constructor. 68 * 69 * The device is obtained from the specified action environment. 70 * 71 * Throws an exception if an error occurs. 72 * 73 * @param environment action execution environment 74 * @return true 75 */ 76 virtual bool execute(ActionEnvironment& environment) override; 77 78 /** 79 * Returns the device register address. 80 * 81 * @return register address 82 */ getRegister() const83 uint8_t getRegister() const 84 { 85 return reg; 86 } 87 88 /** 89 * Returns the byte value to write. 90 * 91 * @return value to write 92 */ getValue() const93 uint8_t getValue() const 94 { 95 return value; 96 } 97 98 /** 99 * Returns the bit mask. 100 * 101 * Specifies which bits to write within the byte value. Only the bits with 102 * a value of 1 in the mask will be written. 103 * 104 * @return bit mask 105 */ getMask() const106 uint8_t getMask() const 107 { 108 return mask; 109 } 110 111 /** 112 * Returns a string description of this action. 113 * 114 * @return description of action 115 */ 116 virtual std::string toString() const override; 117 118 private: 119 /** 120 * Device register address. Note: named 'reg' because 'register' is a 121 * reserved keyword. 122 */ 123 const uint8_t reg{0x00}; 124 125 /** 126 * Byte value to write. 127 */ 128 const uint8_t value{0x00}; 129 130 /** 131 * Bit mask. Specifies which bits to write within the byte value. Only the 132 * bits with a value of 1 in the mask will be written. 133 */ 134 const uint8_t mask{0xFF}; 135 }; 136 137 } // namespace phosphor::power::regulators 138