espvban/ESPIDFNEW/main/power/husb238.h
2024-08-29 21:38:48 +02:00

90 lines
3.2 KiB
C

#ifndef _husb238_h_
#define _husb238_h_
#include "driver/i2c.h"
#define HUSB238TAG "USBPD"
/** Default HUSB238 I2C address. */
#define HUSB238_I2CADDR_DEFAULT 0x08 ///< I2C address
#define HUSB238_PD_STATUS0 0x00 ///< Register value for PD_STATUS0 in HUSB238
#define HUSB238_PD_STATUS1 0x01 ///< Register value for PD_STATUS1 in HUSB238
#define HUSB238_SRC_PDO_5V 0x02 ///< Register value for SRC_PDO_5V in HUSB238
#define HUSB238_SRC_PDO_9V 0x03 ///< Register value for SRC_PDO_9V in HUSB238
#define HUSB238_SRC_PDO_12V 0x04 ///< Register value for SRC_PDO_12V in HUSB238
#define HUSB238_SRC_PDO_15V 0x05 ///< Register value for SRC_PDO_15V in HUSB238
#define HUSB238_SRC_PDO_18V 0x06 ///< Register value for SRC_PDO_18V in HUSB238
#define HUSB238_SRC_PDO_20V 0x07 ///< Register value for SRC_PDO_20V in HUSB238
#define HUSB238_SRC_PDO 0x08 ///< Register value for SRC_PDO in HUSB238
#define HUSB238_GO_COMMAND 0x09 ///< Register value for GO_COMMAND in HUSB238
/** Available currents per PD output */
typedef enum _husb_currents {
CURRENT_0_5_A = 0b0000, ///< 0.5A
CURRENT_0_7_A = 0b0001, ///< 0.7A
CURRENT_1_0_A = 0b0010, ///< 1.0A
CURRENT_1_25_A = 0b0011, ///< 1.25A
CURRENT_1_5_A = 0b0100, ///< 1.5A
CURRENT_1_75_A = 0b0101, ///< 1.75A
CURRENT_2_0_A = 0b0110, ///< 2.0A
CURRENT_2_25_A = 0b0111, ///< 2.25A
CURRENT_2_50_A = 0b1000, ///< 2.50A
CURRENT_2_75_A = 0b1001, ///< 2.75A
CURRENT_3_0_A = 0b1010, ///< 3.0A
CURRENT_3_25_A = 0b1011, ///< 3.25A
CURRENT_3_5_A = 0b1100, ///< 3.5A
CURRENT_4_0_A = 0b1101, ///< 4.0A
CURRENT_4_5_A = 0b1110, ///< 4.5A
CURRENT_5_0_A = 0b1111 ///< 5.0A
} HUSB238_CurrentSetting;
/** Available voltages for PD output */
typedef enum _husb_voltages {
UNATTACHED = 0b0000, ///< Unattached
PD_5V = 0b0001, ///< 5V
PD_9V = 0b0010, ///< 9V
PD_12V = 0b0011, ///< 12V
PD_15V = 0b0100, ///< 15V
PD_18V = 0b0101, ///< 18V
PD_20V = 0b0110 ///< 20V
} HUSB238_VoltageSetting;
/** Responses to PD query */
typedef enum _husb_response_codes {
NO_RESPONSE = 0b000, ///< No response
SUCCESS = 0b001, ///< Success
INVALID_CMD_OR_ARG = 0b011, ///< Invalid command or argument
CMD_NOT_SUPPORTED = 0b100, ///< Command not supported
TRANSACTION_FAIL_NO_GOOD_CRC =
0b101 ///< Transaction fail. No GoodCRC is received after sending
} HUSB238_ResponseCodes;
/** Default 5V output current */
typedef enum _husb_5v_current_contract {
CURRENT5V_DEFAULT = 0b00, ///< Default current
CURRENT5V_1_5_A = 0b01, ///< 1.5A
CURRENT5V_2_4_A = 0b10, ///< 2.4A
CURRENT5V_3_A = 0b11 ///< 3A
} HUSB238_5VCurrentContract;
/** What voltage is selected for PD sink */
typedef enum _husb_pd_selection {
PD_NOT_SELECTED = 0b0000, ///< Not selected
PD_SRC_5V = 0b0001, ///< SRC_PDO_5V
PD_SRC_9V = 0b0010, ///< SRC_PDO_9V
PD_SRC_12V = 0b0011, ///< SRC_PDO_12V
PD_SRC_15V = 0b1000, ///< SRC_PDO_15V
PD_SRC_18V = 0b1001, ///< SRC_PDO_18V
PD_SRC_20V = 0b1010 ///< SRC_PDO_20V
} HUSB238_PDSelection;
void husb238_init(int i2c_master_port);
void husb238_requestVoltage(int i2c_master_port,HUSB238_PDSelection voltage);
float husb238_getMaxCurrent(int i2c_master_port,HUSB238_PDSelection voltage);
void init_i2c();
#endif //_husb238_h_