From b509e84376dc9618b0596ee35fec0db6c29b261d Mon Sep 17 00:00:00 2001 From: Chris Chua Date: Thu, 3 Oct 2013 20:11:37 +1000 Subject: [PATCH] using separate identifier for bitburner fury boards --- cgminer.c | 5 ++++- driver-avalon.c | 39 +++++++++++++++++++++++++++++++-------- driver-avalon.h | 10 +++++++++- usbutils.c | 12 ++++++++++++ usbutils.h | 1 + 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/cgminer.c b/cgminer.c index 1de5e084..300f1c8d 100644 --- a/cgminer.c +++ b/cgminer.c @@ -1245,7 +1245,10 @@ static struct opt_table opt_config_table[] = { "Set avalon target temperature"), OPT_WITH_ARG("--bitburner-voltage", opt_set_intval, NULL, &opt_bitburner_core_voltage, - "Set BitBurner core voltage, in millivolts"), + "Set BitBurner (Avalon) core voltage, in millivolts"), + OPT_WITH_ARG("--bitburner-fury-voltage", + opt_set_intval, NULL, &opt_bitburner_fury_core_voltage, + "Set BitBurner Fury core voltage, in millivolts"), #endif #ifdef USE_KLONDIKE OPT_WITH_ARG("--klondike-options", diff --git a/driver-avalon.c b/driver-avalon.c index 82657e58..6245dc02 100644 --- a/driver-avalon.c +++ b/driver-avalon.c @@ -49,6 +49,7 @@ int opt_avalon_fan_max = AVALON_DEFAULT_FAN_MAX_PWM; int opt_avalon_freq_min = AVALON_MIN_FREQUENCY; int opt_avalon_freq_max = AVALON_MAX_FREQUENCY; int opt_bitburner_core_voltage = BITBURNER_DEFAULT_CORE_VOLTAGE; +int opt_bitburner_fury_core_voltage = BITBURNER_FURY_DEFAULT_CORE_VOLTAGE; bool opt_avalon_auto; static int option_offset = -1; @@ -214,6 +215,7 @@ static int bitburner_send_task(const struct avalon_task *at, struct cgpu_info *a { uint8_t buf[AVALON_WRITE_SIZE + 4 * AVALON_DEFAULT_ASIC_NUM]; int ret, ep = C_AVALON_TASK; + cgtimer_t ts_start; size_t nr_len; if (at->nonce_elf) @@ -250,7 +252,9 @@ static int bitburner_send_task(const struct avalon_task *at, struct cgpu_info *a applog(LOG_DEBUG, "Avalon: Sent(%u):", (unsigned int)nr_len); hexdump(buf, nr_len); } + cgsleep_prepare_r(&ts_start); ret = avalon_write(avalon, (char *)buf, nr_len, ep); + cgsleep_us_r(&ts_start, 3000); // 3 ms = 333 tasks per second, or 1.4 TH/s return ret; } @@ -666,12 +670,20 @@ static void avalon_initialise(struct cgpu_info *avalon) avalon->drv->name, avalon->device_id, err); } +static bool is_bitburner(struct cgpu_info *avalon) +{ + enum sub_ident ident; + + ident = usb_ident(avalon); + return ident == IDENT_BTB || ident == IDENT_BBF; +} + static bool bitburner_set_core_voltage(struct cgpu_info *avalon, int core_voltage) { uint8_t buf[2]; int err; - if (usb_ident(avalon) == IDENT_BTB) { + if (is_bitburner(avalon)) { buf[0] = (uint8_t)core_voltage; buf[1] = (uint8_t)(core_voltage >> 8); err = usb_transfer_data(avalon, FTDI_TYPE_OUT, BITBURNER_REQUEST, @@ -697,7 +709,7 @@ static int bitburner_get_core_voltage(struct cgpu_info *avalon) int err; int amount; - if (usb_ident(avalon) == IDENT_BTB) { + if (is_bitburner(avalon)) { err = usb_transfer_read(avalon, FTDI_TYPE_IN, BITBURNER_REQUEST, BITBURNER_VALUE, BITBURNER_INDEX_GET_VOLTAGE, (char *)buf, sizeof(buf), &amount, @@ -826,7 +838,18 @@ static bool avalon_detect_one(libusb_device *dev, struct usb_find_devices *found BITBURNER_MAX_COREMV); } else bitburner_set_core_voltage(avalon, opt_bitburner_core_voltage); + } else if (usb_ident(avalon) == IDENT_BBF) { + if (opt_bitburner_fury_core_voltage < BITBURNER_FURY_MIN_COREMV || + opt_bitburner_fury_core_voltage > BITBURNER_FURY_MAX_COREMV) { + quit(1, "Invalid bitburner-fury-voltage %d must be %dmv - %dmv", + opt_bitburner_fury_core_voltage, + BITBURNER_FURY_MIN_COREMV, + BITBURNER_FURY_MAX_COREMV); + } else + bitburner_set_core_voltage(avalon, opt_bitburner_fury_core_voltage); + } + if (is_bitburner(avalon)) { bitburner_get_version(avalon); } @@ -1257,7 +1280,7 @@ static bool avalon_prepare(struct thr_info *thr) int array_size = AVALON_ARRAY_SIZE; void *(*write_thread_fn)(void *) = avalon_send_tasks; - if (usb_ident(avalon) == IDENT_BTB) { + if (is_bitburner(avalon)) { array_size = BITBURNER_ARRAY_SIZE; write_thread_fn = bitburner_send_tasks; } @@ -1402,7 +1425,7 @@ static void avalon_update_temps(struct cgpu_info *avalon, struct avalon_info *in info->temp_sum += avalon->temp; applog(LOG_DEBUG, "Avalon: temp_index: %d, temp_count: %d, temp_old: %d", info->temp_history_index, info->temp_history_count, info->temp_old); - if (usb_ident(avalon) == IDENT_BTB) { + if (is_bitburner(avalon)) { info->core_voltage = bitburner_get_core_voltage(avalon); } if (info->temp_history_index == info->temp_history_count) { @@ -1424,7 +1447,7 @@ static void get_avalon_statline_before(char *buf, size_t bufsiz, struct cgpu_inf struct avalon_info *info = avalon->device_data; int lowfan = 10000; - if (usb_ident(avalon) == IDENT_BTB) { + if (is_bitburner(avalon)) { int temp = info->temp0; if (info->temp2 > temp) temp = info->temp2; @@ -1510,7 +1533,7 @@ static int64_t avalon_scanhash(struct thr_info *thr) /* Check for nothing but consecutive bad results or consistently less * results than we should be getting and reset the FPGA if necessary */ - if (usb_ident(avalon) != IDENT_BTB) { + if (!is_bitburner(avalon)) { if (avalon->results < -miner_count && !info->reset) { applog(LOG_ERR, "%s%d: Result return rate low, resetting!", avalon->drv->name, avalon->device_id); @@ -1571,7 +1594,7 @@ static struct api_data *avalon_api_stats(struct cgpu_info *cgpu) sprintf(mcw, "match_work_count%d", i + 1); root = api_add_int(root, mcw, &(info->matching_work[i]), false); } - if (usb_ident(cgpu) == IDENT_BTB) { + if (is_bitburner(cgpu)) { root = api_add_int(root, "core_voltage", &(info->core_voltage), false); snprintf(buf, sizeof(buf), "%"PRIu8".%"PRIu8".%"PRIu8, info->version1, info->version2, info->version3); @@ -1599,7 +1622,7 @@ static char *avalon_set_device(struct cgpu_info *avalon, char *option, char *set } if (strcasecmp(option, "millivolts") == 0 || strcasecmp(option, "mv") == 0) { - if (usb_ident(avalon) != IDENT_BTB) { + if (!is_bitburner(avalon)) { sprintf(replybuf, "%s cannot set millivolts", avalon->drv->name); return replybuf; } diff --git a/driver-avalon.h b/driver-avalon.h index ae32353d..7e11e6cf 100644 --- a/driver-avalon.h +++ b/driver-avalon.h @@ -33,10 +33,17 @@ #define AVALON_TEMP_HYSTERESIS 3 #define AVALON_TEMP_OVERHEAT 60 +/* Avalon-based BitBurner. */ #define BITBURNER_DEFAULT_CORE_VOLTAGE 1200 /* in millivolts */ #define BITBURNER_MIN_COREMV 1000 /* change here if you want to risk killing it :) */ -#define BITBURNER_MAX_COREMV 1500 +#define BITBURNER_MAX_COREMV 1400 + +/* BitFury-based BitBurner. */ +#define BITBURNER_FURY_DEFAULT_CORE_VOLTAGE 900 /* in millivolts */ +#define BITBURNER_FURY_MIN_COREMV 700 +/* change here if you want to risk killing it :) */ +#define BITBURNER_FURY_MAX_COREMV 1100 #define AVALON_DEFAULT_TIMEOUT 0x2D @@ -180,6 +187,7 @@ extern int opt_avalon_freq_min; extern int opt_avalon_freq_max; extern bool opt_avalon_auto; extern int opt_bitburner_core_voltage; +extern int opt_bitburner_fury_core_voltage; extern char *set_avalon_fan(char *arg); extern char *set_avalon_freq(char *arg); diff --git a/usbutils.c b/usbutils.c index 93066235..27c21ecc 100644 --- a/usbutils.c +++ b/usbutils.c @@ -307,6 +307,18 @@ static struct usb_find_devices find_dev[] = { .timeout = AVALON_TIMEOUT_MS, .latency = 10, INTINFO(ava_ints) }, + { + .drv = DRIVER_avalon, + .name = "BBF", + .ident = IDENT_BBF, + .idVendor = IDVENDOR_FTDI, + .idProduct = 0x6001, + .iManufacturer = "Burnin Electronics", + .iProduct = "BitBurner Fury", + .config = 1, + .timeout = AVALON_TIMEOUT_MS, + .latency = 10, + INTINFO(ava_ints) }, { .drv = DRIVER_avalon, .name = "AVA", diff --git a/usbutils.h b/usbutils.h index 19e64c52..ff136e41 100644 --- a/usbutils.h +++ b/usbutils.h @@ -144,6 +144,7 @@ enum sub_ident { IDENT_MMQ, IDENT_AVA, IDENT_BTB, + IDENT_BBF, IDENT_KLN, IDENT_ICA, IDENT_AMU,