xref: /openbmc/phosphor-power/phosphor-regulators/src/actions/i2c_write_byte_action.hpp (revision f54021972b91be5058b50e9046bb0dd5a3b22a80)
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