xref: /openbmc/phosphor-power/tools/i2c/i2c.hpp (revision 9af82a5c)
1ab1327c3SLei YU #pragma once
2ab1327c3SLei YU 
3ab1327c3SLei YU #include "i2c_interface.hpp"
4ab1327c3SLei YU 
5ab1327c3SLei YU namespace i2c
6ab1327c3SLei YU {
7ab1327c3SLei YU 
8ab1327c3SLei YU class I2CDevice : public I2CInterface
9ab1327c3SLei YU {
10ab1327c3SLei YU   private:
11ab1327c3SLei YU     I2CDevice() = delete;
12ab1327c3SLei YU 
13*9af82a5cSLei YU     /** @brief Constructor
14*9af82a5cSLei YU      *
15*9af82a5cSLei YU      * Construct I2CDevice object from the bus id and device address
16*9af82a5cSLei YU      *
17*9af82a5cSLei YU      * @param[in] busId - The i2c bus ID
18*9af82a5cSLei YU      * @param[in] devAddr - The device address of the I2C device
19*9af82a5cSLei YU      */
20*9af82a5cSLei YU     explicit I2CDevice(uint8_t busId, uint8_t devAddr) :
21*9af82a5cSLei YU         busId(busId), devAddr(devAddr)
22ab1327c3SLei YU     {
23*9af82a5cSLei YU         busStr = "/dev/i2c-" + std::to_string(busId);
24*9af82a5cSLei YU         open();
25ab1327c3SLei YU     }
26ab1327c3SLei YU 
27*9af82a5cSLei YU     /** @brief Open the i2c device */
28*9af82a5cSLei YU     void open();
29*9af82a5cSLei YU 
30*9af82a5cSLei YU     /** @brief Close the i2c device */
31*9af82a5cSLei YU     void close();
32*9af82a5cSLei YU 
33*9af82a5cSLei YU     /** @brief The I2C bus ID */
34*9af82a5cSLei YU     uint8_t busId;
35*9af82a5cSLei YU 
36*9af82a5cSLei YU     /** @brief The i2c device address in the bus */
37*9af82a5cSLei YU     uint8_t devAddr;
38*9af82a5cSLei YU 
39*9af82a5cSLei YU     /** @brief The file descriptor of the opened i2c device */
40*9af82a5cSLei YU     int fd;
41*9af82a5cSLei YU 
42*9af82a5cSLei YU     /** @brief The i2c bus path in /dev */
43*9af82a5cSLei YU     std::string busStr;
44*9af82a5cSLei YU 
45ab1327c3SLei YU   public:
46*9af82a5cSLei YU     ~I2CDevice()
47*9af82a5cSLei YU     {
48*9af82a5cSLei YU         close();
49*9af82a5cSLei YU     }
50ab1327c3SLei YU 
51ab1327c3SLei YU     /** @copydoc I2CInterface::read(uint8_t&) */
52ab1327c3SLei YU     void read(uint8_t& data) override;
53ab1327c3SLei YU 
54ab1327c3SLei YU     /** @copydoc I2CInterface::read(uint8_t,uint8_t&) */
55ab1327c3SLei YU     void read(uint8_t addr, uint8_t& data) override;
56ab1327c3SLei YU 
57ab1327c3SLei YU     /** @copydoc I2CInterface::read(uint8_t,uint16_t&) */
58ab1327c3SLei YU     void read(uint8_t addr, uint16_t& data) override;
59ab1327c3SLei YU 
60ab1327c3SLei YU     /** @copydoc I2CInterface::read(uint8_t,uint8_t&,uint8_t*) */
61ab1327c3SLei YU     void read(uint8_t addr, uint8_t& size, uint8_t* data) override;
62ab1327c3SLei YU 
63ab1327c3SLei YU     /** @copydoc I2CInterface::write(uint8_t) */
64ab1327c3SLei YU     void write(uint8_t data) override;
65ab1327c3SLei YU 
66ab1327c3SLei YU     /** @copydoc I2CInterface::write(uint8_t,uint8_t) */
67ab1327c3SLei YU     void write(uint8_t addr, uint8_t data) override;
68ab1327c3SLei YU 
69ab1327c3SLei YU     /** @copydoc I2CInterface::write(uint8_t,uint16_t) */
70ab1327c3SLei YU     void write(uint8_t addr, uint16_t data) override;
71ab1327c3SLei YU 
72ab1327c3SLei YU     /** @copydoc I2CInterface::write(uint8_t,uint8_t,const uint8_t*) */
73ab1327c3SLei YU     void write(uint8_t addr, uint8_t size, const uint8_t* data) override;
74ab1327c3SLei YU 
75ab1327c3SLei YU     /** @brief Create an I2CInterface instance
76ab1327c3SLei YU      *
77ab1327c3SLei YU      * @param[in] busId - The i2c bus ID
78ab1327c3SLei YU      * @param[in] devAddr - The device address of the i2c
79ab1327c3SLei YU      *
80ab1327c3SLei YU      * @return The unique_ptr holding the I2CInterface
81ab1327c3SLei YU      */
82ab1327c3SLei YU     static std::unique_ptr<I2CInterface> create(uint8_t busId, uint8_t devAddr);
83ab1327c3SLei YU };
84ab1327c3SLei YU 
85ab1327c3SLei YU } // namespace i2c
86