forked from luke-jr/bfgminer
-
Notifications
You must be signed in to change notification settings - Fork 10
/
driver-icarus.h
162 lines (131 loc) · 4 KB
/
driver-icarus.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
* Copyright 2012-2013 Luke Dashjr
* Copyright 2012 Xiangfu
* Copyright 2012 Andrew Smith
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version. See COPYING for more details.
*/
#ifndef BFG_DRIVER_ICARUS_H
#define BFG_DRIVER_ICARUS_H
#include <stdbool.h>
#include <stdint.h>
#include <sys/time.h>
#include "dynclock.h"
#include "miner.h"
// Fraction of a second, USB timeout is measured in
// i.e. 10 means 1/10 of a second
// Right now, it MUST be 10 due to other assumptions.
#define TIME_FACTOR 10
// It's 10 per second, thus value = 10/TIME_FACTOR =
#define ICARUS_READ_FAULT_DECISECONDS 1
#define NANOSEC 1000000000.0
// Default value for ICARUS_INFO->read_size
#define ICARUS_DEFAULT_READ_SIZE 4
#define ICA_GETS_ERROR -1
#define ICA_GETS_OK 0
#define ICA_GETS_RESTART 1
#define ICA_GETS_TIMEOUT 2
// Store the last INFO_HISTORY data sets
// [0] = current data, not yet ready to be included as an estimate
// Each new data set throws the last old set off the end thus
// keeping a ongoing average of recent data
#define INFO_HISTORY 10
extern struct device_drv icarus_drv;
struct ICARUS_HISTORY {
struct timeval finish;
double sumXiTi;
double sumXi;
double sumTi;
double sumXi2;
uint32_t values;
uint32_t hash_count_min;
uint32_t hash_count_max;
};
enum timing_mode { MODE_DEFAULT, MODE_SHORT, MODE_LONG, MODE_VALUE };
enum icarus_reopen_mode {
IRM_NEVER,
IRM_TIMEOUT,
IRM_CYCLE,
};
enum icarus_user_settings {
IUS_WORK_DIVISION = 1,
IUS_FPGA_COUNT = 2,
};
struct ICARUS_INFO {
// time to calculate the golden_ob
struct timeval golden_tv;
// History structures for calculating read_count
// when info->do_icarus_timing is true
struct ICARUS_HISTORY history[INFO_HISTORY+1];
uint32_t min_data_count;
// Timeout scanning for a nonce (deciseconds)
int read_count;
// Timeout scanning for a golden nonce (deciseconds)
int probe_read_count;
// ds limit for (short=/long=) read_count
int read_count_limit;
enum timing_mode timing_mode;
bool do_icarus_timing;
int do_default_detection;
double fullnonce;
int count;
double W;
uint32_t values;
uint64_t hash_count_range;
// Determine the cost of history processing
// (which will only affect W)
uint64_t history_count;
struct timeval history_time;
// icarus-options
int baud;
// Used to calculate / display hash count when nonce is NOT found
// seconds per Hash
double Hs;
// Used to calculate / display hash count when a nonce is found
int work_division;
int fpga_count;
uint32_t nonce_mask;
enum icarus_reopen_mode reopen_mode;
bool reopen_now;
uint8_t user_set;
bool continue_search;
dclk_change_clock_func_t dclk_change_clock_func;
struct dclk_data dclk;
// Bytes to read from Icarus for nonce
int read_size;
// Settings used when probing / detecting
size_t ob_size;
const char *golden_ob;
const char *golden_nonce;
bool nonce_littleendian;
// Don't check the golden nonce returned when probing
bool ignore_golden_nonce;
// Custom driver functions
bool (*detect_init_func)(const char *devpath, int fd, struct ICARUS_INFO *);
bool (*job_start_func)(struct thr_info *);
#ifdef USE_ZEUSMINER
// Hardware information, doesn't affect anything directly
uint16_t freq;
uint16_t chips;
#endif
};
struct icarus_state {
bool firstrun;
struct timeval tv_workstart;
struct timeval tv_workfinish;
struct work *last_work;
struct work *last2_work;
bool changework;
bool identify;
uint8_t *ob_bin;
};
bool icarus_detect_custom(const char *devpath, struct device_drv *, struct ICARUS_INFO *);
extern int icarus_gets(unsigned char *, int fd, struct timeval *tv_finish, struct thr_info *, int read_count, int read_size);
extern int icarus_write(int fd, const void *buf, size_t bufLen);
extern bool icarus_init(struct thr_info *);
extern void do_icarus_close(struct thr_info *thr);
extern bool icarus_job_start(struct thr_info *);
#endif