/ driver-avalon4.h
driver-avalon4.h
1 /* 2 * Copyright 2013-2015 Con Kolivas <kernel@kolivas.org> 3 * Copyright 2012-2014 Xiangfu <xiangfu@openmobilefree.com> 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the Free 7 * Software Foundation; either version 3 of the License, or (at your option) 8 * any later version. See COPYING for more details. 9 */ 10 11 #ifndef _AVALON4_H_ 12 #define _AVALON4_H_ 13 14 #include "util.h" 15 #include "i2c-context.h" 16 17 #ifdef USE_AVALON4 18 19 #define AVA4_DEFAULT_FAN_MIN 10 /* % */ 20 #define AVA4_DEFAULT_FAN_MAX 100 21 /* Percentage required to make sure fan starts spinning, then we can go down */ 22 #define AVA4_DEFAULT_FAN_START 15 23 #define AVA4_FREEZESAFE_FAN 10 24 25 #define AVA4_DEFAULT_TEMP_TARGET 65 26 #define AVA4_DEFAULT_TEMP_OVERHEAT 85 27 #define AVA4_MM40_TEMP_TARGET 42 28 #define AVA4_MM40_TEMP_OVERHEAT 65 29 #define AVA4_MM60_TEMP_FREQADJ 70 30 31 #define AVA4_DEFAULT_VOLTAGE_MIN 4000 32 #define AVA4_DEFAULT_VOLTAGE_MAX 9000 33 #define AVA4_FREEZESAFE_VOLTAGE 4000 34 35 #define AVA4_DEFAULT_FREQUENCY_MIN 100 36 #define AVA4_DEFAULT_FREQUENCY_MAX 1000 37 #define AVA4_FREEZESAFE_FREQUENCY 100 38 #define AVA4_MM60_FREQUENCY_MAX 500 39 40 #define AVA4_DEFAULT_MODULARS 7 /* Only support 6 modules maximum with one AUC */ 41 #define AVA4_DEFAULT_MINER_MAX 10 42 #define AVA4_DEFAULT_ASIC_MAX 40 43 #define AVA4_DEFAULT_ADC_MAX 6 /* RNTC1-4, VCC12, VCC3VC */ 44 #define AVA4_DEFAULT_PLL_MAX 7 45 46 #define AVA4_DEFAULT_MINER_CNT 10 47 #define AVA4_DEFAULT_ASIC_CNT 4 48 #define AVA4_MM50_MINER_CNT 2 49 #define AVA4_MM50_ASIC_CNT 16 50 #define AVA4_MM60_MINER_CNT 2 51 #define AVA4_MM60_ASIC_CNT 40 52 53 #define AVA4_DEFAULT_VOLTAGE 6875 54 #define AVA4_DEFAULT_FREQUENCY 200 55 #define AVA4_DEFAULT_POLLING_DELAY 20 /* ms */ 56 57 #define AVA4_DEFAULT_ADJ_TIMES 6 58 #define AVA4_DEFAULT_NTCB 3450 59 #define AVA4_DEFAULT_NCHECK true 60 #define AVA4_DEFAULT_SPEED_BINGO 255 61 #define AVA4_DEFAULT_SPEED_ERROR 3 62 63 #define AVA4_DEFAULT_SMARTSPEED_OFF 0 64 #define AVA4_DEFAULT_SMARTSPEED_MODE1 1 65 #define AVA4_DEFAULT_SMARTSPEED_MODE2 2 66 #define AVA4_DEFAULT_SMARTSPEED_MODE3 3 67 #define AVA4_DEFAULT_SMART_SPEED (AVA4_DEFAULT_SMARTSPEED_MODE3) 68 69 #define AVA4_DEFAULT_IIC_DETECT false 70 71 #define AVA4_DH_INC 0.03 72 #define AVA4_DH_DEC 0.002 73 74 #define AVA4_PWM_MAX 0x3FF 75 #define AVA4_ADC_MAX 0x3FF 76 #define AVA4_DRV_DIFFMAX 1024 77 78 #define AVA4_AUC_VER_LEN 12 /* Version length: 12 (AUC-YYYYMMDD) */ 79 #define AVA4_AUC_SPEED 400000 80 #define AVA4_AUC_XDELAY 19200 /* 4800 = 1ms in AUC (11U14) */ 81 #define AVA4_AUC_P_SIZE 64 82 83 #define AVA4_MOD_CUSTOM 0x0 84 #define AVA4_MOD_ECO 0x1 85 #define AVA4_MOD_NORMAL 0x2 86 #define AVA4_MOD_TURBO 0x3 87 88 #define AVA4_CONNECTER_AUC 1 89 #define AVA4_CONNECTER_IIC 2 90 91 /* Avalon4 protocol package type from MM protocol.h 92 * https://github.com/Canaan-Creative/MM/blob/avalon4/firmware/protocol.h */ 93 #define AVA4_MM_VER_LEN 15 94 #define AVA4_MM_DNA_LEN 8 95 #define AVA4_H1 'C' 96 #define AVA4_H2 'N' 97 98 #define AVA4_P_COINBASE_SIZE (6 * 1024 + 64) 99 #define AVA4_P_MERKLES_COUNT 30 100 101 #define AVA4_P_COUNT 40 102 #define AVA4_P_DATA_LEN 32 103 104 /* Broadcase with block iic_write*/ 105 #define AVA4_P_DETECT 0x10 106 107 /* Broadcase With non-block iic_write*/ 108 #define AVA4_P_STATIC 0x11 109 #define AVA4_P_JOB_ID 0x12 110 #define AVA4_P_COINBASE 0x13 111 #define AVA4_P_MERKLES 0x14 112 #define AVA4_P_HEADER 0x15 113 #define AVA4_P_TARGET 0x16 114 115 /* Broadcase or Address */ 116 #define AVA4_P_SET 0x20 117 #define AVA4_P_FINISH 0x21 118 #define AVA4_P_SET_VOLT 0x22 119 #define AVA4_P_SET_FREQ 0x23 120 121 /* Have to with I2C address */ 122 #define AVA4_P_POLLING 0x30 123 #define AVA4_P_REQUIRE 0x31 124 #define AVA4_P_TEST 0x32 125 #define AVA4_P_RSTMMTX 0x33 126 #define AVA4_P_GET_VOLT 0x34 127 128 /* Back to host */ 129 #define AVA4_P_ACKDETECT 0x40 130 #define AVA4_P_STATUS 0x41 131 #define AVA4_P_NONCE 0x42 132 #define AVA4_P_TEST_RET 0x43 133 #define AVA4_P_STATUS_LW 0x44 134 #define AVA4_P_STATUS_HW 0x45 135 #define AVA4_P_STATUS_VOLT 0x46 136 #define AVA4_P_STATUS_MA 0x47 137 #define AVA4_P_STATUS_M 0x48 138 139 #define AVA4_MODULE_BROADCAST 0 140 /* Endof Avalon4 protocol package type */ 141 142 #define AVA4_MM40_PREFIXSTR "40" 143 #define AVA4_MM41_PREFIXSTR "41" 144 #define AVA4_MM50_PREFIXSTR "50" 145 #define AVA4_MM60_PREFIXSTR "60" 146 #define AVA4_MM_VERNULL "NONE" 147 148 #define AVA4_TYPE_MM40 40 149 #define AVA4_TYPE_MM41 41 150 #define AVA4_TYPE_MM50 50 151 #define AVA4_TYPE_MM60 60 152 #define AVA4_TYPE_NULL 00 153 154 #define AVA4_IIC_RESET 0xa0 155 #define AVA4_IIC_INIT 0xa1 156 #define AVA4_IIC_DEINIT 0xa2 157 #define AVA4_IIC_XFER 0xa5 158 #define AVA4_IIC_INFO 0xa6 159 160 #define AVA4_FREQ_INIT_MODE 0x0 161 #define AVA4_FREQ_CUTOFF_MODE 0x1 162 #define AVA4_FREQ_TEMPADJ_MODE 0x2 163 #define AVA4_FREQ_PLLADJ_MODE 0x3 164 165 /* pll check range [0, 7680], 0 means turn off check */ 166 #define AVA4_DEFAULT_LEAST_PLL 768 167 #define AVA4_DEFAULT_MOST_PLL 256 168 169 /* seconds */ 170 #define AVA4_DEFAULT_FDEC_TIME 60.0 171 #define AVA4_DEFAULT_FINC_TIME 1200.0 172 #define AVA4_DEFAULT_FAVG_TIME (15 * 60.0) 173 #define AVA4_DEFAULT_FREQADJ_TIME 60 174 175 #define AVA4_DEFAULT_DELTA_T 0 176 #define AVA4_DEFAULT_DELTA_FREQ 100 177 178 struct avalon4_pkg { 179 uint8_t head[2]; 180 uint8_t type; 181 uint8_t opt; 182 uint8_t idx; 183 uint8_t cnt; 184 uint8_t data[32]; 185 uint8_t crc[2]; 186 }; 187 #define avalon4_ret avalon4_pkg 188 189 struct avalon4_info { 190 cglock_t update_lock; 191 192 int polling_first; 193 int polling_err_cnt[AVA4_DEFAULT_MODULARS]; 194 int xfer_err_cnt; 195 196 int pool_no; 197 struct pool pool0; 198 struct pool pool1; 199 struct pool pool2; 200 201 struct timeval last_fan; 202 struct timeval last_stratum; 203 204 char auc_version[AVA4_AUC_VER_LEN + 1]; 205 int auc_speed; 206 int auc_xdelay; 207 int auc_temp; 208 209 int mm_count; 210 uint8_t connecter; 211 212 unsigned int set_frequency[AVA4_DEFAULT_MODULARS][3]; 213 unsigned int set_smart_frequency[AVA4_DEFAULT_MODULARS][3]; 214 int set_frequency_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX][AVA4_DEFAULT_ASIC_MAX][3]; 215 int set_voltage[AVA4_DEFAULT_MODULARS]; 216 uint16_t set_voltage_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 217 int8_t set_voltage_offset[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 218 219 int mod_type[AVA4_DEFAULT_MODULARS]; 220 bool enable[AVA4_DEFAULT_MODULARS]; 221 222 struct timeval elapsed[AVA4_DEFAULT_MODULARS]; 223 struct timeval firsthash; 224 char mm_version[AVA4_DEFAULT_MODULARS][AVA4_MM_VER_LEN + 1]; 225 uint8_t mm_dna[AVA4_DEFAULT_MODULARS][AVA4_MM_DNA_LEN + 1]; 226 int get_voltage[AVA4_DEFAULT_MODULARS]; 227 int get_voltage_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 228 int get_frequency[AVA4_DEFAULT_MODULARS]; 229 int power_good[AVA4_DEFAULT_MODULARS]; 230 int error_code[AVA4_DEFAULT_MODULARS]; 231 int fan_pct[AVA4_DEFAULT_MODULARS]; 232 int fan[AVA4_DEFAULT_MODULARS]; 233 int temp[AVA4_DEFAULT_MODULARS]; 234 int led_red[AVA4_DEFAULT_MODULARS]; 235 uint16_t adc[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_ADC_MAX]; 236 uint16_t pll_sel[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_PLL_MAX]; 237 238 uint64_t local_works[AVA4_DEFAULT_MODULARS]; 239 uint64_t local_works_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 240 uint64_t hw_works[AVA4_DEFAULT_MODULARS]; 241 uint64_t hw_works_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 242 243 uint32_t local_work[AVA4_DEFAULT_MODULARS]; 244 uint32_t hw_work[AVA4_DEFAULT_MODULARS]; 245 246 uint32_t lw5[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_ADJ_TIMES]; 247 uint32_t lw5_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX][AVA4_DEFAULT_ADJ_TIMES]; 248 uint32_t hw5[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_ADJ_TIMES]; 249 uint32_t hw5_i[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX][AVA4_DEFAULT_ADJ_TIMES]; 250 int i_5s; 251 struct timeval last_30s; 252 struct timeval last_5s; 253 struct timeval last_finc[AVA4_DEFAULT_MODULARS]; 254 struct timeval last_fdec[AVA4_DEFAULT_MODULARS]; 255 struct timeval last_favg[AVA4_DEFAULT_MODULARS]; 256 struct timeval last_fadj; 257 struct timeval last_tcheck; 258 259 int matching_work[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 260 int chipmatching_work[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX][AVA4_DEFAULT_ASIC_MAX]; 261 uint8_t saved[AVA4_DEFAULT_MODULARS]; 262 uint8_t adjflag[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX]; 263 uint8_t cutoff[AVA4_DEFAULT_MODULARS]; 264 uint8_t miner_count[AVA4_DEFAULT_MODULARS]; 265 uint8_t asic_count[AVA4_DEFAULT_MODULARS]; 266 int ntime_offset[AVA4_DEFAULT_MODULARS]; 267 bool autov[AVA4_DEFAULT_MODULARS]; 268 uint8_t ma_sum[AVA4_DEFAULT_MODULARS][AVA4_DEFAULT_MINER_MAX][AVA4_DEFAULT_ASIC_MAX]; 269 uint32_t newnonce; 270 uint32_t total_asics[AVA4_DEFAULT_MODULARS]; 271 int toverheat[AVA4_DEFAULT_MODULARS]; 272 int temp_target[AVA4_DEFAULT_MODULARS]; 273 uint8_t speed_bingo[AVA4_DEFAULT_MODULARS]; 274 uint8_t speed_error[AVA4_DEFAULT_MODULARS]; 275 uint32_t freq_mode[AVA4_DEFAULT_MODULARS]; 276 struct i2c_ctx *i2c_slaves[AVA4_DEFAULT_MODULARS]; 277 int last_maxtemp[AVA4_DEFAULT_MODULARS]; 278 }; 279 280 struct avalon4_iic_info { 281 uint8_t iic_op; 282 union { 283 uint32_t aucParam[2]; 284 uint8_t slave_addr; 285 } iic_param; 286 }; 287 288 #define AVA4_WRITE_SIZE (sizeof(struct avalon4_pkg)) 289 #define AVA4_READ_SIZE AVA4_WRITE_SIZE 290 291 #define AVA4_SEND_OK 0 292 #define AVA4_SEND_ERROR -1 293 294 extern char *set_avalon4_fan(char *arg); 295 extern char *set_avalon4_temp(char *arg); 296 extern char *set_avalon4_freq(char *arg); 297 extern char *set_avalon4_voltage(char *arg); 298 extern bool opt_avalon4_autov; 299 extern bool opt_avalon4_freezesafe; 300 extern int opt_avalon4_temp_target; 301 extern int opt_avalon4_overheat; 302 extern int opt_avalon4_polling_delay; 303 extern int opt_avalon4_aucspeed; 304 extern int opt_avalon4_aucxdelay; 305 extern int opt_avalon4_ntime_offset; 306 extern int opt_avalon4_miningmode; 307 extern int opt_avalon4_ntcb; 308 extern int opt_avalon4_freq_min; 309 extern int opt_avalon4_freq_max; 310 extern bool opt_avalon4_noncecheck; 311 extern int opt_avalon4_smart_speed; 312 extern int opt_avalon4_speed_bingo; 313 extern int opt_avalon4_speed_error; 314 extern int opt_avalon4_least_pll_check; 315 extern int opt_avalon4_most_pll_check; 316 extern bool opt_avalon4_iic_detect; 317 extern int opt_avalon4_freqadj_time; 318 extern int opt_avalon4_delta_temp; 319 extern int opt_avalon4_delta_freq; 320 extern int opt_avalon4_freqadj_temp; 321 #endif /* USE_AVALON4 */ 322 #endif /* _AVALON4_H_ */