Updated version of CrC calculations by Mecanix (#933)

* Update crc.c

crc files from Mecanix

* Create crc.h

Part of the crc alternative suggested by Mecanix

* Update crc.h

Wrong cut& paste, sorry

* Delete components/asic/crc.h

File in wrong directory

* Update crc.h

* Update TPS546.c

Initialize variables so the code can be compiled with -O2 option.
This commit is contained in:
fromport
2025-05-22 23:21:24 -07:00
committed by GitHub
parent 1dedbc508e
commit 28b43a85e1
3 changed files with 90 additions and 111 deletions

View File

@@ -1,114 +1,55 @@
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#define CRC5_MASK 0x1F #include "crc.h"
/* compute crc5 over given number of bytes */
// adapted from https://mightydevices.com/index.php/2018/02/reverse-engineering-antminer-s1/
uint8_t crc5(uint8_t *data, uint8_t len)
{
uint8_t i, j, k, index = 0;
uint8_t crc = CRC5_MASK;
/* registers */
uint8_t crcin[5] = {1, 1, 1, 1, 1};
uint8_t crcout[5] = {1, 1, 1, 1, 1};
uint8_t din = 0;
len *= 8; // Poly x⁵ + x² + 1 MSB-first
uint8_t crc5(uint8_t *data, uint8_t len) {
/* push data bits */ uint8_t crc = 0x1F;
for (j = 0x80, k = 0, i = 0; i < len; i++) uint8_t bit_counter, byte_counter;
{
/* input bit */
din = (data[index] & j) != 0;
/* shift register */
crcout[0] = crcin[4] ^ din;
crcout[1] = crcin[0];
crcout[2] = crcin[1] ^ crcin[4] ^ din;
crcout[3] = crcin[2];
crcout[4] = crcin[3];
/* next bit */
j >>= 1, k++;
/* next byte */
if (k == 8)
j = 0x80, k = 0, index++;
/* apply new shift register value */
memcpy(crcin, crcout, 5);
// crcin = crcout[0];
}
crc = 0; for (byte_counter = 0; byte_counter < len; byte_counter++) {
/* extract bitmask from register */ uint8_t byte = data[byte_counter];
if (crcin[4]) for (bit_counter = 0; bit_counter < 8; bit_counter++) {
crc |= 0x10; uint8_t bit = (byte >> 7) & 1;
if (crcin[3]) byte <<= 1;
crc |= 0x08;
if (crcin[2])
crc |= 0x04;
if (crcin[1])
crc |= 0x02;
if (crcin[0])
crc |= 0x01;
return crc; uint8_t new_bit = ((crc >> 4) ^ bit) & 1;
crc = ((crc << 1) | new_bit) ^ (new_bit << 2);
crc &= 0x1F;
}
}
return crc;
} }
// kindly provided by cgminer // with loop unrolling
unsigned int crc16_table[256] = { uint16_t crc16(uint8_t *data, uint16_t len)
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};
/* CRC-16/CCITT */
uint16_t crc16(uint8_t *buffer, uint16_t len)
{ {
uint16_t crc; uint16_t crc = 0;
crc = 0; while(len >= 4) {
while (len-- > 0) crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
crc = crc16_table[((crc >> 8) ^ (*buffer++)) & 0xFF] ^ (crc << 8); crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
len -= 4;
}
return crc; while(len--) {
crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
}
return crc;
} }
/* CRC-16/CCITT-FALSE */ uint16_t crc16_false(uint8_t *data, uint16_t len)
uint16_t crc16_false(uint8_t *buffer, uint16_t len)
{ {
uint16_t crc; uint16_t crc = 0xFFFF;
crc = 0xffff; while(len--) {
while (len-- > 0) crc = crc16_table[(crc >> 8) ^ *data++] ^ (crc << 8);
crc = crc16_table[((crc >> 8) ^ (*buffer++)) & 0xFF] ^ (crc << 8); }
return crc; return crc;
} }

View File

@@ -1,8 +1,46 @@
#ifndef CRC_H_ #ifndef INC_CRC_H_
#define CRC_H_ #define INC_CRC_H_
#include <stdint.h>
static const uint16_t crc16_table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
uint8_t crc5(uint8_t *data, uint8_t len); uint8_t crc5(uint8_t *data, uint8_t len);
unsigned short crc16(const unsigned char *buffer, int len); uint16_t crc16(uint8_t *data, uint16_t len);
unsigned short crc16_false(const unsigned char *buffer, int len); uint16_t crc16_false(uint8_t *data, uint16_t len);
#endif // PRETTY_H_
#endif /* INC_CRC_H_ */

View File

@@ -333,8 +333,8 @@ static uint16_t float_2_ulinear16(float value)
esp_err_t TPS546_init(TPS546_CONFIG config) esp_err_t TPS546_init(TPS546_CONFIG config)
{ {
uint8_t data[7]; uint8_t data[7];
uint8_t u8_value; uint8_t u8_value = 0;
uint16_t u16_value; uint16_t u16_value = 0;
uint8_t read_mfr_revision[4]; uint8_t read_mfr_revision[4];
int temp; int temp;
uint8_t comp_config[5]; uint8_t comp_config[5];
@@ -633,7 +633,7 @@ void TPS546_write_entire_config(void)
int TPS546_get_frequency(void) int TPS546_get_frequency(void)
{ {
uint16_t value; uint16_t value = 0;
int freq; int freq;
smb_read_word(PMBUS_FREQUENCY_SWITCH, &value); smb_read_word(PMBUS_FREQUENCY_SWITCH, &value);
@@ -644,7 +644,7 @@ int TPS546_get_frequency(void)
void TPS546_set_frequency(int newfreq) void TPS546_set_frequency(int newfreq)
{ {
uint16_t value; uint16_t value = 0;
//int freq; //int freq;
ESP_LOGI(TAG, "Writing new frequency: %d", newfreq); ESP_LOGI(TAG, "Writing new frequency: %d", newfreq);
@@ -659,7 +659,7 @@ void TPS546_set_frequency(int newfreq)
int TPS546_get_temperature(void) int TPS546_get_temperature(void)
{ {
uint16_t value; uint16_t value = 0;
int temp; int temp;
smb_read_word(PMBUS_READ_TEMPERATURE_1, &value); smb_read_word(PMBUS_READ_TEMPERATURE_1, &value);
@@ -669,7 +669,7 @@ int TPS546_get_temperature(void)
float TPS546_get_vin(void) float TPS546_get_vin(void)
{ {
uint16_t u16_value; uint16_t u16_value = 0;
float vin; float vin;
/* Get voltage input (ULINEAR16) */ /* Get voltage input (ULINEAR16) */
@@ -687,7 +687,7 @@ float TPS546_get_vin(void)
float TPS546_get_iout(void) float TPS546_get_iout(void)
{ {
uint16_t u16_value; uint16_t u16_value = 0;
float iout; float iout;
//set the phase register to 0xFF to read all phases //set the phase register to 0xFF to read all phases
@@ -713,7 +713,7 @@ float TPS546_get_iout(void)
float TPS546_get_vout(void) float TPS546_get_vout(void)
{ {
uint16_t u16_value; uint16_t u16_value = 0;
float vout; float vout;
/* Get voltage output (ULINEAR16) */ /* Get voltage output (ULINEAR16) */
@@ -1009,7 +1009,7 @@ esp_err_t TPS546_set_vout(float volts) {
void TPS546_show_voltage_settings(void) void TPS546_show_voltage_settings(void)
{ {
uint16_t u16_value; uint16_t u16_value = 0;
uint8_t u8_value; uint8_t u8_value;
float f_value; float f_value;