| // Copyright 2024 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef HAMMERD_I2C_ENDPOINT_H_ | |
| #define HAMMERD_I2C_ENDPOINT_H_ | |
| #include <string> | |
| #include "hammerd/usb_utils.h" | |
| namespace hammerd { | |
| class I2CEndpoint : public UsbEndpointInterface { | |
| public: | |
| explicit I2CEndpoint(const std::string& i2c_path) : i2c_path_(i2c_path) {} | |
| ~I2CEndpoint() override { Close(); } | |
| // Check whether the sysfs file exist or not. | |
| bool UsbSysfsExists() override; | |
| // Initializes the endpoint. | |
| UsbConnectStatus Connect(bool check_id) override; | |
| // Releases endpoint. | |
| void Close() override; | |
| // Returns whether the endpoint is initialized. | |
| bool IsConnected() const override { return fd_ >= 0; } | |
| // Sends the data to endpoint and then reads the result back. | |
| // Returns the byte number of the received data. -1 if the process fails, or | |
| // if `allow_less` is false and the received data does not match outlen. | |
| int Transfer(const void* outbuf, | |
| int outlen, | |
| void* inbuf, | |
| int inlen, | |
| bool allow_less = false, | |
| unsigned int timeout_ms = 0) override { | |
| if (int err = Send(outbuf, outlen, allow_less, timeout_ms); err < 0) { | |
| return err; | |
| } | |
| return Receive(inbuf, inlen, allow_less, timeout_ms); | |
| } | |
| // Sends the data to endpoint. | |
| // Returns the byte number of the received data. -1 if the process fails, or | |
| // if `allow_less` is false and the received data does not match outlen. | |
| int Send(const void* outbuf, | |
| int outlen, | |
| bool allow_less = false, | |
| unsigned int timeout_ms = 0) override; | |
| int ReceiveNoWait(void* inbuf, int inlen); | |
| // Receives the data from endpoint. | |
| // Returns the byte number of the received data. -1 if the process fails, or | |
| // if `allow_less` is false and the received data does not match outlen. | |
| int Receive(void* inbuf, | |
| int inlen, | |
| bool allow_less = false, | |
| unsigned int timeout_ms = 0) override; | |
| // Gets the chunk length of the USB endpoint. | |
| int GetChunkLength() const override { return 48; } | |
| // Gets the configuration string of the endpoint. | |
| std::string GetConfigurationString() const override { | |
| return configuration_string_; | |
| } | |
| private: | |
| int fd_ = -1; | |
| uint32_t addr_; | |
| std::string i2c_path_; | |
| std::string configuration_string_; | |
| }; | |
| } // namespace hammerd | |
| #endif // HAMMERD_I2C_ENDPOINT_H_ |