#define ICX3_I2C_ADDR 0x2D #define ICX3_REG_FANCONTROL 80 #define ICX3_REG_TEMPSENSOR 102 #define ICX3_REG_READINFORMATION 177 #define ICX3_FANCONTROL_SIZE 0x09 #define ICX3_TEMPSENSOR_SIZE 0x13 #define ICX3_READINFORMATION_SIZE 0x06 #define ICX3_MAX_FANS 4 #define ICX3_NUM_TEMP_SENSORS 9 struct icx3_fancontrol { unsigned char length; unsigned char fanmode; unsigned short rpm_offset; unsigned char duty; unsigned char duty_status; unsigned short rpm_status; }; struct icx3_tempsensors { unsigned char length; unsigned char data[18]; }; struct icx3_info { unsigned char reserved; unsigned char slave_address; unsigned char product_id; unsigned char major_version; unsigned char minor_version; }; enum icx3_product_id { ICX3_IAP = 160, ICX3_E227_E228_FTW3 = 2, ICX3_E230_FTW3 = 4, ICX3_E227_E228_FTW3_HYBRID = 8, ICX3_E227_E228_FTW3_HC = 9, ICX3_E221_E222_XC3 = 1, ICX3_E229_XC3 = 5, ICX3_E221_E222_XC3_HYBRID = 6, ICX3_E221_E222_XC3_HC = 7, ICX3_IAP_KINGPIN = 161, ICX3_E223_KINGPIN_HYBRID = 3, ICX3_E223_KINGPIN_HC = 10, ICX3_IAP_KINGPIN_E251 = 165, ICX3_E251_KINGPIN_HYBRID = 19, ICX3_E251_KINGPIN_HC = 26, ICX3_IAP_LPC5516 = 164, ICX3_E250_FTW3 = 50, ICX3_E250_FTW3_HYBRID = 56, ICX3_IAP_LPC54113 = 162, ICX3_E227_E228_FTW3_LPC54113 = 18, ICX3_E227_E228_FTW3_HYBRID_LPC54113 = 24, ICX3_E230_FTW3_LPC54113 = 20, ICX3_E222_XC3_LPC54113 = 17, ICX3_E229_XC3_LPC54113 = 21, ICX3_IAP_STM32L431 = 163, ICX3_E230_E238_FTW3_STM32L431 = 36, ICX3_E221_XC3_STM32L431 = 33, ICX3_E229_E237_XC3_STM32L431 = 37, ICX3_NONE = 0 } const char *icx3_fan_names[] = { "Fan 1", "Fan 2", "Fan 3", "Ext. fan" }; const char *icx3_fan_mode_names[] = { "Default", "Auto", "Manual", "Offset", "MCU curve", "Mode 3" }; const char *icx3_temp_sensor_names[] = { "GPU2", "MEM1", "MEM2", "MEM3", "PWR1", "PWR2", "PWR3", "PWR4", "PWR5", }; enum icx3_product_id check_for_icx3(char *i2c_dev_path);