/ 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_ */