1
0
mirror of git://projects.qi-hardware.com/openwrt-packages.git synced 2024-11-22 11:52:48 +02:00

cgminer: now cgminer+icarus is 10% better then origin miner.py

enable all FPGA devices
This commit is contained in:
Xiangfu Liu 2012-02-19 22:26:00 +08:00
parent d3ed7805ff
commit c38f27772d
12 changed files with 504 additions and 446 deletions

View File

@ -9,8 +9,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=cgminer
PKG_VERSION:=20120215
PKG_REV:=9a0e4f8facababf54cf6dcac7bf93a0e6099047e
PKG_VERSION:=20120219
PKG_REV:=3cdac04f4f4c638f4a721042208073e371726cf4
PKG_RELEASE:=1
PKG_INSTALL:=1
@ -37,7 +37,7 @@ endef
define Package/cgminer/description
endef
CONFIGURE_ARGS += --disable-opencl --disable-adl --enable-icarus
CONFIGURE_ARGS += --disable-opencl --disable-adl --enable-icarus --enable-bitforce
TARGET_CFLAGS +=
TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib

View File

@ -0,0 +1,326 @@
From 340b923e42d32bd5173fe6b285923635a6fcc67f Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Mon, 13 Feb 2012 16:04:34 +0800
Subject: [PATCH 1/7] add icarus.c, base on bitforce.c
---
icarus.c | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 307 insertions(+), 0 deletions(-)
create mode 100644 icarus.c
diff --git a/icarus.c b/icarus.c
new file mode 100644
index 0000000..56b8d8a
--- /dev/null
+++ b/icarus.c
@@ -0,0 +1,307 @@
+/*
+ * Copyright 2012 Luke Dashjr
+ * Copyright 2012 Xiangfu <xiangfu@openmobilefree.com>
+ *
+ * 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 2 of the License, or (at your option)
+ * any later version. See COPYING for more details.
+ */
+
+/*
+ * Those code should be works fine with V2 and V3 bitstream of Icarus.
+ * Operation:
+ * No detection implement.
+ * Input: 64B = 32B midstate + 20B fill bytes + last 12 bytes of block head.
+ * Return: send back 32bits immediately when Icarus found a valid nonce.
+ * no query protocol implemented here, if no data send back in ~11.3
+ * seconds (full cover time on 32bit nonce range by 380MH/s speed)
+ * just send another work.
+ * Notice:
+ * 1. Icarus will start calculate when you push a work to them, even they
+ * are busy.
+ * 2. The 2 FPGAs on Icarus will distribute the job, one will calculate the
+ * 0 ~ 7FFFFFFF, another one will cover the 80000000 ~ FFFFFFFF.
+ * 3. It's possible for 2 FPGAs both find valid nonce in the meantime, the 2
+ * valid nonce will all be send back.
+ * 4. Icarus will stop work when: a valid nonce has been found or 32 bits
+ * nonce range is completely calculated.
+ */
+
+#include <limits.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#ifndef WIN32
+ #include <termios.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+ #ifndef O_CLOEXEC
+ #define O_CLOEXEC 0
+ #endif
+#else
+ #include <windows.h>
+ #include <io.h>
+#endif
+
+#include "elist.h"
+#include "miner.h"
+
+#define ICARUS_READ_FAULT_COUNT (8)
+
+int icarus_read_count;
+struct device_api icarus_api;
+
+static void rev(unsigned char *s, size_t l)
+{
+ size_t i, j;
+ unsigned char t;
+
+ for (i = 0, j = l - 1; i < j; i++, j--) {
+ t = s[i];
+ s[i] = s[j];
+ s[j] = t;
+ }
+}
+
+static int icarus_open(const char *devpath)
+{
+#ifndef WIN32
+ struct termios my_termios;
+
+ int serialfd = open(devpath, O_RDWR | O_CLOEXEC | O_NOCTTY);
+
+ if (serialfd == -1)
+ return -1;
+
+ tcgetattr(serialfd, &my_termios);
+ my_termios.c_cflag = B115200;
+ my_termios.c_cflag |= CS8;
+ my_termios.c_cflag |= CREAD;
+ my_termios.c_cflag |= CLOCAL;
+ my_termios.c_cflag &= ~(CSIZE | PARENB);
+
+ my_termios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK |
+ ISTRIP | INLCR | IGNCR | ICRNL | IXON);
+ my_termios.c_oflag &= ~OPOST;
+ my_termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+ my_termios.c_cc[VTIME] = 10; /* block 1 second */
+ my_termios.c_cc[VMIN] = 0;
+ tcsetattr(serialfd, TCSANOW, &my_termios);
+
+ tcflush(serialfd, TCOFLUSH);
+ tcflush(serialfd, TCIFLUSH);
+
+ return serialfd;
+#else
+ HANDLE hSerial = CreateFile(devpath, GENERIC_READ | GENERIC_WRITE, 0,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (unlikely(hSerial == INVALID_HANDLE_VALUE))
+ return -1;
+ /* TODO: Needs setup read block time. just like VTIME = 10 */
+ return _open_osfhandle((LONG)hSerial, 0);
+#endif
+}
+
+static void icarus_gets(char *buf, size_t bufLen, int fd)
+{
+ ssize_t ret = 0;
+
+ icarus_read_count = 0;
+
+ while (bufLen) {
+ ret = read(fd, buf, 1);
+ if (ret == 1) {
+ bufLen--;
+ buf++;
+ continue;
+ }
+
+ icarus_read_count++;
+ if (icarus_read_count == ICARUS_READ_FAULT_COUNT) {
+ applog(LOG_WARNING,
+ "Icarus Read: No data in %d seconds",
+ ICARUS_READ_FAULT_COUNT);
+ break;
+ }
+ }
+}
+
+static void icarus_write(int fd, const void *buf, size_t bufLen)
+{
+ ssize_t ret;
+
+ ret = write(fd, buf, bufLen);
+ if (unlikely(ret != bufLen))
+ quit(1, "Icarus: Send data failed!");
+}
+
+#define icarus_close(fd) close(fd)
+
+static bool icarus_detect_one(const char *devpath)
+{
+ int fd;
+ static int i = 0;
+
+ const unsigned char golden_ob[] =
+ "2db907f9cb4eb938ded904f4832c4331"
+ "0380e3aeb54364057e7fec5157bfc533"
+ "00000000000000000000000080000000"
+ "00000000a58e091ac342724e7c3dc346";
+ const unsigned char golden_nonce[] = "063c5e01";
+
+ char ob_bin[64], nonce_bin[4];
+ char *nonce_hex;
+
+ if (total_devices == MAX_DEVICES)
+ return false;
+
+ fd = icarus_open(devpath);
+ if (unlikely(fd == -1)) {
+ applog(LOG_ERR, "Icarus Detect: Failed to open %s", devpath);
+ return false;
+ }
+
+ hex2bin(ob_bin, golden_ob, sizeof(ob_bin));
+ icarus_write(fd, ob_bin, sizeof(ob_bin));
+
+ memset(nonce_bin, 0, sizeof(nonce_bin));
+ icarus_gets(nonce_bin, sizeof(nonce_bin), fd);
+
+ icarus_close(fd);
+
+ nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin));
+ if (nonce_hex) {
+ if (strncmp(nonce_hex, golden_nonce, 8)) {
+ applog(LOG_ERR,
+ "Icarus Detect: "
+ "Test failed at %s : get %s, should: %s",
+ devpath, nonce_hex, golden_nonce);
+ free(nonce_hex);
+ return false;
+ }
+ free(nonce_hex);
+ } else
+ return false;
+
+ /* We have a real Icarus! */
+ struct cgpu_info *icarus;
+ icarus = calloc(1, sizeof(*icarus));
+ devices[total_devices++] = icarus;
+ icarus->api = &icarus_api;
+ icarus->device_id = i++;
+ icarus->device_path = strdup(devpath);
+ icarus->threads = 1;
+
+ return true;
+}
+
+static void icarus_detect()
+{
+ struct string_elist *iter, *tmp;
+
+ list_for_each_entry_safe(iter, tmp, &scan_devices, list) {
+ if (icarus_detect_one(iter->string))
+ string_elist_del(iter);
+ }
+}
+
+static bool icarus_thread_prepare(struct thr_info *thr)
+{
+ struct cgpu_info *icarus = thr->cgpu;
+
+ struct timeval now;
+
+ int fd = icarus_open(icarus->device_path);
+ if (unlikely(-1 == fd)) {
+ applog(LOG_ERR, "Failed to open Icarus on %s",
+ icarus->device_path);
+ return false;
+ }
+
+ icarus->device_fd = fd;
+
+ applog(LOG_INFO, "Opened Icarus on %s", icarus->device_path);
+ gettimeofday(&now, NULL);
+ get_datestamp(icarus->init, &now);
+
+ return true;
+}
+
+static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
+ uint64_t max_nonce)
+{
+ struct cgpu_info *icarus;
+ int fd;
+
+ unsigned char ob_bin[64], nonce_bin[4];
+ unsigned char *ob_hex, *nonce_hex;
+ uint32_t nonce;
+ uint32_t hash_count;
+ time_t t;
+
+ icarus = thr->cgpu;
+ fd = icarus->device_fd;
+
+ memset(ob_bin, 0, sizeof(ob_bin));
+ memcpy(ob_bin, work->midstate, 32);
+ memcpy(ob_bin + 52, work->data + 64, 12);
+ rev(ob_bin, 32);
+ rev(ob_bin + 52, 12);
+#ifndef WIN32
+ tcflush(fd, TCOFLUSH);
+#endif
+ icarus_write(fd, ob_bin, sizeof(ob_bin));
+
+ ob_hex = bin2hex(ob_bin, sizeof(ob_bin));
+ if (ob_hex) {
+ t = time(NULL);
+ applog(LOG_DEBUG, "Icarus send : %s", ob_hex);
+ free(ob_hex);
+ }
+
+ /* Icarus will return 8 bytes nonces or nothing */
+ memset(nonce_bin, 0, sizeof(nonce_bin));
+ icarus_gets(nonce_bin, sizeof(nonce_bin), fd);
+
+ nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin));
+ if (nonce_hex) {
+ t = time(NULL) - t;
+ applog(LOG_DEBUG, "Icarus return (elapse %d seconds): %s",
+ t, nonce_hex);
+ free(nonce_hex);
+ }
+
+ memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin));
+
+ if (nonce == 0 && icarus_read_count == ICARUS_READ_FAULT_COUNT)
+ return 0xffffffff;
+
+#ifndef __BIG_ENDIAN__
+ nonce = swab32(nonce);
+#endif
+ work->blk.nonce = 0xffffffff;
+ submit_nonce(thr, work, nonce);
+
+ hash_count = (nonce & 0x7fffffff);
+ if (hash_count == 0)
+ hash_count = 2;
+ else {
+ if (hash_count++ == 0x7fffffff)
+ hash_count = 0xffffffff;
+ else
+ hash_count <<= 1;
+ }
+
+ return hash_count;
+}
+
+struct device_api icarus_api = {
+ .name = "Icarus",
+ .api_detect = icarus_detect,
+ .thread_prepare = icarus_thread_prepare,
+ .scanhash = icarus_scanhash,
+};
--
1.7.5.4

View File

@ -1,289 +0,0 @@
From 80451867b6eeeb79e02d639171999d99069bb27f Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Mon, 13 Feb 2012 16:04:34 +0800
Subject: [PATCH 2/6] add icarus.c, base on bitforce.c
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
icarus.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 268 insertions(+), 0 deletions(-)
create mode 100644 icarus.c
diff --git a/icarus.c b/icarus.c
new file mode 100644
index 0000000..141d639
--- /dev/null
+++ b/icarus.c
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2012 Luke Dashjr
+ * Copyright 2012 Xiangfu <xiangfu@openmobilefree.com>
+ *
+ * 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 2 of the License, or (at your option)
+ * any later version. See COPYING for more details.
+ */
+
+#include <limits.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#ifndef WIN32
+ #include <termios.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+ #ifndef O_CLOEXEC
+ #define O_CLOEXEC 0
+ #endif
+#else
+ #include <windows.h>
+ #include <io.h>
+#endif
+
+#include "elist.h"
+#include "miner.h"
+
+#define ICARUS_READ_FAULT_COUNT (8)
+
+struct device_api icarus_api;
+
+static void rev(char *s, ssize_t l)
+{
+ int i, j;
+ char t;
+
+ for(i = 0, j = l - 1; i < j; i++, j--) {
+ t = s[i];
+ s[i] = s[j];
+ s[j] = t;
+ }
+}
+
+static int icarus_open(const char *devpath)
+{
+#ifndef WIN32
+ struct termios my_termios;
+
+ int serialfd = open(devpath, O_RDWR | O_CLOEXEC | O_NOCTTY);
+
+ if(serialfd == -1)
+ return -1;
+
+ tcgetattr(serialfd, &my_termios);
+ my_termios.c_cflag = B115200;
+ my_termios.c_cflag |= CS8;
+ my_termios.c_cflag |= CREAD;
+ my_termios.c_cflag |= CLOCAL;
+ my_termios.c_cflag &= ~(CSIZE | PARENB);
+
+ my_termios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
+ my_termios.c_oflag &= ~OPOST;
+ my_termios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+ my_termios.c_cc[VTIME] = 10; /* block 1 second */
+ my_termios.c_cc[VMIN] = 0;
+ tcsetattr(serialfd, TCSANOW, &my_termios);
+
+ tcflush(serialfd, TCOFLUSH);
+ tcflush(serialfd, TCIFLUSH);
+
+ return serialfd;
+#else
+ HANDLE hSerial = CreateFile(devpath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if (unlikely(hSerial == INVALID_HANDLE_VALUE))
+ return -1;
+ return _open_osfhandle((LONG)hSerial, 0);
+#endif
+}
+
+static void icarus_gets(char *buf, size_t bufLen, int fd)
+{
+ int ret = 0, count = 0;
+
+ while (bufLen) {
+ ret = read(fd, buf, 1);
+ if(ret == 1) {
+ bufLen--;
+ buf++;
+ }
+ count++;
+ if(count == ICARUS_READ_FAULT_COUNT)
+ break;
+ }
+}
+
+static void icarus_write(int fd, const void *buf, size_t bufLen)
+{
+ ssize_t ret = write(fd, buf, bufLen);
+ if (unlikely(ret != bufLen))
+ quit(1, "icarus_write failed");
+}
+
+#define icarus_close(fd) close(fd)
+
+static bool icarus_detect_one(const char *devpath)
+{
+ static int i = 0;
+
+ const char ob[128] =
+"ce92099c5a80bb81c52990d5c0924c625fd25a535640607d5a4bdf8174e2c8d500000000000000000000000080000000000000000b290c1a42313b4f21b5bcb8";
+ const char nonce[] = "8e0b31c5";
+ char ob_bin[64];
+ char pdevbuf[4];
+ int fdDev;
+ char *nonce_hex;
+
+ if (total_devices == MAX_DEVICES)
+ return false;
+
+ fdDev = icarus_open(devpath);
+ if (unlikely(fdDev == -1)) {
+ applog(LOG_ERR, "Icarus Detect: Failed to open %s", devpath);
+ return false;
+ }
+
+ hex2bin(ob_bin, ob, sizeof(ob_bin));
+ icarus_write(fdDev, ob_bin, sizeof(ob_bin));
+
+ memset(pdevbuf, 0, sizeof(pdevbuf));
+ icarus_gets(pdevbuf, sizeof(pdevbuf), fdDev);
+
+ icarus_close(fdDev);
+
+ nonce_hex = bin2hex(pdevbuf, sizeof(pdevbuf));
+ if(strncmp(nonce_hex, nonce, 8)) {
+ applog(LOG_DEBUG, "Icarus Detect: Test failed at %s : get %s, should: %s",
+ devpath, nonce_hex, nonce);
+ return false;
+ }
+ free(nonce_hex);
+
+ /* We have a real Icarus! */
+ struct cgpu_info *icarus;
+ icarus = calloc(1, sizeof(*icarus));
+ devices[total_devices++] = icarus;
+ icarus->api = &icarus_api;
+ icarus->device_id = i++;
+ icarus->device_path = strdup(devpath);
+ icarus->enabled = true;
+ icarus->threads = 1;
+
+ return true;
+}
+
+static void icarus_detect_auto()
+{
+#ifndef WIN32
+ DIR *D;
+ struct dirent *de;
+ const char udevdir[] = "/dev/serial/by-id";
+ char devpath[sizeof(udevdir) + 1 + NAME_MAX];
+ char *devfile = devpath + sizeof(udevdir);
+
+ D = opendir(udevdir);
+ if (!D)
+ return;
+ memcpy(devpath, udevdir, sizeof(udevdir) - 1);
+ devpath[sizeof(udevdir) - 1] = '/';
+ while ( (de = readdir(D)) ) {
+ /* Icarus using a PL2303 usb-serial chip */
+ if (!strstr(de->d_name, "Prolific_Technology_Inc"))
+ continue;
+ strcpy(devfile, de->d_name);
+ icarus_detect_one(devpath);
+ }
+ closedir(D);
+#endif
+}
+
+static void icarus_detect()
+{
+ struct string_elist *iter, *tmp;
+
+ list_for_each_entry_safe(iter, tmp, &scan_devices, list) {
+ if (icarus_detect_one(iter->string))
+ string_elist_del(iter);
+ }
+
+ icarus_detect_auto();
+}
+
+static pthread_mutex_t hash_lock;
+
+static bool icarus_thread_prepare(struct thr_info *thr)
+{
+ struct cgpu_info *icarus = thr->cgpu;
+
+ struct timeval now;
+
+ int fdDev = icarus_open(icarus->device_path);
+ if (unlikely(-1 == fdDev)) {
+ applog(LOG_ERR, "Failed to open Icarus on %s", icarus->device_path);
+ return false;
+ }
+
+ icarus->device_fd = fdDev;
+
+ applog(LOG_INFO, "Opened Icarus on %s", icarus->device_path);
+ gettimeofday(&now, NULL);
+ get_datestamp(icarus->init, &now);
+
+ mutex_init(&hash_lock);
+ return true;
+}
+
+static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, uint64_t max_nonce)
+{
+ struct cgpu_info *icarus = thr->cgpu;
+ int fdDev = icarus->device_fd;
+
+ char pdevbuf[4];
+ unsigned char ob[64];
+ uint32_t nonce;
+ char *ob_hex, *nonce_hex;
+
+ mutex_lock(&hash_lock);
+
+ memcpy(ob, work->midstate, 32);
+ memcpy(ob + 32, work->data + 64, 32);
+ rev(ob, 32);
+ rev(ob + 32, 32);
+
+ icarus_write(fdDev, ob, sizeof(ob));
+
+ ob_hex = bin2hex(ob, sizeof(ob));
+ applog(LOG_DEBUG, "Icarus Send: %s", ob_hex);
+ free(ob_hex);
+
+ memset(pdevbuf, 0, sizeof(pdevbuf));
+ icarus_gets(pdevbuf, sizeof(pdevbuf), fdDev);
+
+ nonce_hex = bin2hex(pdevbuf, sizeof(pdevbuf));
+ applog(LOG_DEBUG, "Icarus Return: %s", nonce_hex);
+ free(nonce_hex);
+
+ work->blk.nonce = 0xffffffff;
+
+ memcpy((char *)&nonce, pdevbuf, sizeof(pdevbuf));
+#ifndef __BIG_ENDIAN__
+ nonce = swab32(nonce);
+#endif
+ submit_nonce(thr, work, nonce);
+
+ mutex_unlock(&hash_lock);
+ return 0xffffffff;
+}
+
+struct device_api icarus_api = {
+ .name = "Icarus",
+ .api_detect = icarus_detect,
+ .thread_prepare = icarus_thread_prepare,
+ .scanhash = icarus_scanhash,
+};
--
1.7.5.4

View File

@ -0,0 +1,112 @@
From 706c4de11159e06284b70cc1d12ba9c2cbcbb684 Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Sun, 19 Feb 2012 21:31:58 +0800
Subject: [PATCH 2/7] add shutdown function
---
icarus.c | 42 ++++++++++++++++++++++++++++++++++--------
1 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/icarus.c b/icarus.c
index 56b8d8a..5562e5e 100644
--- a/icarus.c
+++ b/icarus.c
@@ -52,7 +52,9 @@
#define ICARUS_READ_FAULT_COUNT (8)
-int icarus_read_count;
+static int icarus_read_count;
+static int icarus_write_fault;
+
struct device_api icarus_api;
static void rev(unsigned char *s, size_t l)
@@ -136,7 +138,7 @@ static void icarus_write(int fd, const void *buf, size_t bufLen)
ret = write(fd, buf, bufLen);
if (unlikely(ret != bufLen))
- quit(1, "Icarus: Send data failed!");
+ icarus_write_fault = 1;
}
#define icarus_close(fd) close(fd)
@@ -144,7 +146,6 @@ static void icarus_write(int fd, const void *buf, size_t bufLen)
static bool icarus_detect_one(const char *devpath)
{
int fd;
- static int i = 0;
const unsigned char golden_ob[] =
"2db907f9cb4eb938ded904f4832c4331"
@@ -189,12 +190,14 @@ static bool icarus_detect_one(const char *devpath)
/* We have a real Icarus! */
struct cgpu_info *icarus;
- icarus = calloc(1, sizeof(*icarus));
- devices[total_devices++] = icarus;
+ icarus = calloc(1, sizeof(struct cgpu_info));
icarus->api = &icarus_api;
- icarus->device_id = i++;
+ icarus->device_id = total_devices;
icarus->device_path = strdup(devpath);
icarus->threads = 1;
+ devices[total_devices++] = icarus;
+
+ icarus_write_fault = 0;
return true;
}
@@ -209,7 +212,7 @@ static void icarus_detect()
}
}
-static bool icarus_thread_prepare(struct thr_info *thr)
+static bool icarus_prepare(struct thr_info *thr)
{
struct cgpu_info *icarus = thr->cgpu;
@@ -255,6 +258,8 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
tcflush(fd, TCOFLUSH);
#endif
icarus_write(fd, ob_bin, sizeof(ob_bin));
+ if (icarus_write_fault)
+ return 0; /* This should never happen */
ob_hex = bin2hex(ob_bin, sizeof(ob_bin));
if (ob_hex) {
@@ -299,9 +304,30 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
return hash_count;
}
+static void icarus_shutdown(struct thr_info *thr)
+{
+ struct cgpu_info *icarus;
+ int fd;
+
+ if (thr->cgpu) {
+ icarus = thr->cgpu;
+
+ if (icarus->device_path)
+ free(icarus->device_path);
+
+ close(icarus->device_fd);
+
+ devices[icarus->device_id] = NULL;
+ free(icarus);
+
+ thr->cgpu = NULL;
+ }
+}
+
struct device_api icarus_api = {
.name = "Icarus",
.api_detect = icarus_detect,
- .thread_prepare = icarus_thread_prepare,
+ .thread_prepare = icarus_prepare,
.scanhash = icarus_scanhash,
+ .thread_shutdown = icarus_shutdown,
};
--
1.7.5.4

View File

@ -1,19 +1,17 @@
From fdcf21974b9b9d1b2d92ccad6b16eadf023515fc Mon Sep 17 00:00:00 2001
From f46c2b28a0d50a026354013ead0963ce4248ef4e Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Mon, 13 Feb 2012 16:09:45 +0800
Subject: [PATCH 3/6] add icarus to cgminer.c
Subject: [PATCH 3/7] add icarus to cgminer.c
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
cgminer.c | 17 ++++++++++++++---
1 files changed, 14 insertions(+), 3 deletions(-)
cgminer.c | 19 +++++++++++++++----
1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/cgminer.c b/cgminer.c
index 596a21a..cea6f59 100644
index 8264db5..3bd4eb0 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -400,7 +400,7 @@ static char *set_int_1_to_10(const char *arg, int *i)
@@ -399,7 +399,7 @@ static char *set_int_1_to_10(const char *arg, int *i)
return set_int_range(arg, i, 1, 10);
}
@ -22,7 +20,7 @@ index 596a21a..cea6f59 100644
static char *add_serial(char *arg)
{
string_elist_add(arg, &scan_devices);
@@ -662,7 +662,7 @@ static struct opt_table opt_config_table[] = {
@@ -661,7 +661,7 @@ static struct opt_table opt_config_table[] = {
OPT_WITHOUT_ARG("--disable-gpu|-G",
opt_set_bool, &opt_nogpu,
"Disable GPU mining even if suitable devices exist"),
@ -31,16 +29,20 @@ index 596a21a..cea6f59 100644
OPT_WITHOUT_ARG("--enable-cpu|-C",
opt_set_bool, &opt_usecpu,
"Enable CPU mining with other mining (default: no CPU mining if other devices exist)"),
@@ -777,7 +777,7 @@ static struct opt_table opt_config_table[] = {
@@ -776,10 +776,10 @@ static struct opt_table opt_config_table[] = {
OPT_WITHOUT_ARG("--round-robin",
set_rr, &pool_strategy,
"Change multipool strategy from failover to round robin on failure"),
-#ifdef USE_BITFORCE
+#if defined(USE_BITFORCE) || (defined(USE_ICARUS) && defined(WIN32))
+#if defined(USE_BITFORCE) || defined(USE_ICARUS)
OPT_WITH_ARG("--scan-serial|-S",
add_serial, NULL, NULL,
"Serial port to probe for BitForce device"),
@@ -962,6 +962,9 @@ static char *opt_verusage_and_exit(const char *extra)
- "Serial port to probe for BitForce device"),
+ "Serial port to probe for FPGA Mining device"),
#endif
OPT_WITH_ARG("--scan-time|-s",
set_int_0_to_9999, opt_show_intval, &opt_scantime,
@@ -961,6 +961,9 @@ static char *opt_verusage_and_exit(const char *extra)
#ifdef USE_BITFORCE
"bitforce "
#endif
@ -50,7 +52,7 @@ index 596a21a..cea6f59 100644
"mining support.\n"
, packagename);
printf("%s", opt_usage(opt_argv0, extra));
@@ -4117,6 +4120,10 @@ struct device_api cpu_api = {
@@ -4153,6 +4156,10 @@ struct device_api cpu_api = {
extern struct device_api bitforce_api;
#endif
@ -61,7 +63,7 @@ index 596a21a..cea6f59 100644
static int cgminer_id_count = 0;
@@ -4271,6 +4278,10 @@ int main (int argc, char *argv[])
@@ -4307,6 +4314,10 @@ int main (int argc, char *argv[])
bitforce_api.api_detect();
#endif

View File

@ -1,10 +1,8 @@
From 75e27968a62025d1ac3655275e8f52b879092255 Mon Sep 17 00:00:00 2001
From 2bb92ebcdc4612d218e965b8f6f6f22b6b3ff21d Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Mon, 13 Feb 2012 16:04:13 +0800
Subject: [PATCH 1/6] add Icarus support to autoreconf system
Subject: [PATCH 4/7] add Icarus support to autoreconf system
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
Makefile.am | 3 +++
configure.ac | 21 +++++++++++++++++++--
@ -22,7 +20,7 @@ index 4249d51..5262d52 100644
+cgminer_SOURCES += icarus.c
+endif
diff --git a/configure.ac b/configure.ac
index ee665aa..a931867 100644
index d2fdbb4..ce89c6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -196,6 +196,17 @@ if test "x$bitforce" = xyes; then

View File

@ -1,27 +0,0 @@
From aed89bc1d85f6d4dc0834f850730894571ed9e71 Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Tue, 14 Feb 2012 00:02:06 +0800
Subject: [PATCH 4/6] update the message fit both bitforce and Icarus
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
cgminer.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/cgminer.c b/cgminer.c
index cea6f59..bfb8399 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -780,7 +780,7 @@ static struct opt_table opt_config_table[] = {
#if defined(USE_BITFORCE) || (defined(USE_ICARUS) && defined(WIN32))
OPT_WITH_ARG("--scan-serial|-S",
add_serial, NULL, NULL,
- "Serial port to probe for BitForce device"),
+ "Serial port to probe for FPGA Mining device"),
#endif
OPT_WITH_ARG("--scan-time|-s",
set_int_0_to_9999, opt_show_intval, &opt_scantime,
--
1.7.5.4

View File

@ -1,16 +1,14 @@
From 5ae847013d58990a1686d2875b768945c65a2f6e Mon Sep 17 00:00:00 2001
From beaf158a409920ab436cef749b997f487e0225b9 Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Tue, 14 Feb 2012 00:01:20 +0800
Subject: [PATCH 5/6] update README for Icarus
Subject: [PATCH 5/7] update README for Icarus
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
README | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
README | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/README b/README
index f3c0a26..0ef1b9f 100644
index f3c0a26..30cf037 100644
--- a/README
+++ b/README
@@ -50,6 +50,7 @@ CGMiner specific configuration options:
@ -21,18 +19,18 @@ index f3c0a26..0ef1b9f 100644
Basic *nix build instructions:
To build with GPU mining support:
@@ -198,6 +199,11 @@ BitForce only options:
--scan-serial|-S <arg> Serial port to probe for BitForce device
@@ -193,9 +194,9 @@ GPU only options:
--ndevs|-n Enumerate number of detected GPUs and exit
-BitForce only options:
+FPGA mining boards(BitForce, Icarus) only options:
---scan-serial|-S <arg> Serial port to probe for BitForce device
+--scan-serial|-S <arg> Serial port to probe for FPGA mining device
+Icarus only options(only under Windows system):
+
+--scan-serial|-S <arg> Serial port to probe for Icarus device
+
+
CPU only options:
--algo|-a <arg> Specify sha256 implementation for CPU mining:
--
1.7.5.4

View File

@ -1,19 +1,17 @@
From 867a939c012ffcdbff018625c76571a588642662 Mon Sep 17 00:00:00 2001
From dfead150f78fcaa5b052c791b6ee0ee8f2939b1c Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Wed, 15 Feb 2012 12:43:25 +0800
Subject: [PATCH 6/6] add shortcut to description for easy grep
Subject: [PATCH 6/7] add shortcuts to description for easy grep
Signed-off-by: Xiangfu <xiangfu@openmobilefree.net>
---
README | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/README b/README
index 0ef1b9f..174882a 100644
index 30cf037..d801a9a 100644
--- a/README
+++ b/README
@@ -320,14 +320,14 @@ The output line shows the following:
@@ -315,14 +315,14 @@ The output line shows the following:
(5s):1713.6 (avg):1707.8 Mh/s | Q:301 A:729 R:8 HW:0 E:242% U:22.53/m
Each column is as follows:

View File

@ -0,0 +1,25 @@
From 83df54b91b99aad744e0f62431d6f3ceecd0ac51 Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Sun, 19 Feb 2012 22:20:22 +0800
Subject: [PATCH 7/7] add-MIPSED-to-icarus-for-BIG_ENDIAN.patch
---
icarus.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/icarus.c b/icarus.c
index 5562e5e..73cd4de 100644
--- a/icarus.c
+++ b/icarus.c
@@ -285,7 +285,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
if (nonce == 0 && icarus_read_count == ICARUS_READ_FAULT_COUNT)
return 0xffffffff;
-#ifndef __BIG_ENDIAN__
+#if !defined (__BIG_ENDIAN__) && !defined(MIPSEB)
nonce = swab32(nonce);
#endif
work->blk.nonce = 0xffffffff;
--
1.7.5.4

View File

@ -1,72 +0,0 @@
From 46143d76539752dc929da18fed74301008c75184 Mon Sep 17 00:00:00 2001
From: Xiangfu <xiangfu@openmobilefree.net>
Date: Fri, 17 Feb 2012 11:19:44 +0800
Subject: [PATCH] remove icarus detect auto. Icarus should configure the
pl2303 eeprom for this
---
cgminer.c | 2 +-
icarus.c | 27 ---------------------------
2 files changed, 1 insertions(+), 28 deletions(-)
diff --git a/cgminer.c b/cgminer.c
index bfb8399..c97f276 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -777,7 +777,7 @@ static struct opt_table opt_config_table[] = {
OPT_WITHOUT_ARG("--round-robin",
set_rr, &pool_strategy,
"Change multipool strategy from failover to round robin on failure"),
-#if defined(USE_BITFORCE) || (defined(USE_ICARUS) && defined(WIN32))
+#if defined(USE_BITFORCE) || defined(USE_ICARUS)
OPT_WITH_ARG("--scan-serial|-S",
add_serial, NULL, NULL,
"Serial port to probe for FPGA Mining device"),
diff --git a/icarus.c b/icarus.c
index 141d639..1f8ab52 100644
--- a/icarus.c
+++ b/icarus.c
@@ -157,31 +157,6 @@ static bool icarus_detect_one(const char *devpath)
return true;
}
-static void icarus_detect_auto()
-{
-#ifndef WIN32
- DIR *D;
- struct dirent *de;
- const char udevdir[] = "/dev/serial/by-id";
- char devpath[sizeof(udevdir) + 1 + NAME_MAX];
- char *devfile = devpath + sizeof(udevdir);
-
- D = opendir(udevdir);
- if (!D)
- return;
- memcpy(devpath, udevdir, sizeof(udevdir) - 1);
- devpath[sizeof(udevdir) - 1] = '/';
- while ( (de = readdir(D)) ) {
- /* Icarus using a PL2303 usb-serial chip */
- if (!strstr(de->d_name, "Prolific_Technology_Inc"))
- continue;
- strcpy(devfile, de->d_name);
- icarus_detect_one(devpath);
- }
- closedir(D);
-#endif
-}
-
static void icarus_detect()
{
struct string_elist *iter, *tmp;
@@ -190,8 +165,6 @@ static void icarus_detect()
if (icarus_detect_one(iter->string))
string_elist_del(iter);
}
-
- icarus_detect_auto();
}
static pthread_mutex_t hash_lock;
--
1.7.5.4

View File

@ -1,13 +0,0 @@
diff --git a/icarus.c b/icarus.c
index 141d639..2e89a86 100644
--- a/icarus.c
+++ b/icarus.c
@@ -251,7 +251,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, uint64_
work->blk.nonce = 0xffffffff;
memcpy((char *)&nonce, pdevbuf, sizeof(pdevbuf));
-#ifndef __BIG_ENDIAN__
+#if !defined (__BIG_ENDIAN__) && !defined(MIPSEB)
nonce = swab32(nonce);
#endif
submit_nonce(thr, work, nonce);