Browse Source

Merge branch 'dualminer' into bfgminer

Luke Dashjr 12 years ago
parent
commit
93cf5cd2d5
5 changed files with 65 additions and 74 deletions
  1. 1 0
      driver-dualminer.c
  2. 4 64
      gc3355.c
  3. 2 5
      gc3355.h
  4. 56 5
      lowl-vcom.c
  5. 2 0
      lowl-vcom.h

+ 1 - 0
driver-dualminer.c

@@ -320,6 +320,7 @@ void dualminer_drv_init()
 	dualminer_drv = icarus_drv;
 	dualminer_drv.dname = "dualminer";
 	dualminer_drv.name = "DMU";
+	dualminer_drv.supported_algos = POW_SCRYPT | POW_SHA256D;
 	dualminer_drv.lowl_probe = dualminer_lowl_probe;
 	dualminer_drv.thread_init = dualminer_init;
 	dualminer_drv.thread_shutdown = dualminer_thread_shutdown;

+ 4 - 64
gc3355.c

@@ -14,6 +14,7 @@
 #include "miner.h"
 #include "driver-icarus.h"
 #include "logging.h"
+#include "lowl-vcom.h"
 
 #ifndef WIN32
   #include <sys/ioctl.h>
@@ -339,31 +340,9 @@ bool opt_dual_mode = false;
 
 void gc3355_dual_reset(int fd)
 {
-#ifdef WIN32
-	DCB dcb;
-
-	memset(&dcb, 0, sizeof(DCB));
-	GetCommState(_get_osfhandle(fd), &dcb);
-	dcb.fDtrControl = DTR_CONTROL_ENABLE;
-	SetCommState(_get_osfhandle(fd), &dcb);
-	Sleep(1);
-	GetCommState(_get_osfhandle(fd), &dcb);
-	dcb.fDtrControl = DTR_CONTROL_DISABLE;
-	SetCommState(_get_osfhandle(fd), &dcb);
-
-#else
-
-	int dtr_flag = 0;
-	ioctl(fd, TIOCMGET, &dtr_flag);
-	dtr_flag |= TIOCM_DTR;
-	ioctl(fd, TIOCMSET, &dtr_flag);
-	usleep(1000);
-	ioctl(fd, TIOCMGET, &dtr_flag);
-	dtr_flag &= ~TIOCM_DTR;
-	ioctl(fd, TIOCMSET, &dtr_flag);
-
-#endif
-
+	set_serial_dtr(fd, 1);
+	cgsleep_ms(1000);
+	set_serial_dtr(fd, 0);
 }
 
 static
@@ -396,45 +375,6 @@ void gc3355_opt_scrypt_init(int fd)
 	gc3355_send_cmds(fd, initscrypt_ob);
 }
 
-int gc3355_get_cts_status(int fd)
-{
-	int ret;
-	int status = 0;
-#ifdef WIN32
-	GetCommModemStatus(_get_osfhandle(fd), &status);
-	applog(LOG_DEBUG, "Get CTS Status is : %d [Windows: 0 is 1.2; 16 is 0.9]\n", status);
-	ret = (status == 0) ? 1 : 0;
-	return ret;
-#else
-	ioctl(fd, TIOCMGET, &status);
-	ret = (status & 0x20) ? 0 : 1;
-	applog(LOG_DEBUG, "Get CTS Status is : %d [Linux: 1 is 1.2; 0 is 0.9]\n", ret);
-	return ret;
-#endif
-}
-
-void gc3355_set_rts_status(int fd, unsigned int value)
-{
-#ifdef WIN32
-	DCB dcb;
-	memset(&dcb, 0, sizeof(DCB));
-	GetCommState(_get_osfhandle(fd), &dcb);
-	if (value != 0)
-		dcb.fRtsControl = RTS_CONTROL_ENABLE;
-	else
-		dcb.fRtsControl = RTS_CONTROL_DISABLE;
-	SetCommState(_get_osfhandle(fd), &dcb);
-#else
-	int rts_flag = 0;
-	ioctl(fd, TIOCMGET, &rts_flag);
-	if (value != 0)
-		rts_flag |= TIOCM_RTS;
-	else
-		rts_flag &= ~TIOCM_RTS;
-	ioctl(fd, TIOCMSET, &rts_flag);
-#endif
-}
-
 static
 void gc3355_pll_freq_init2(int fd, int pll_freq)
 {

+ 2 - 5
gc3355.h

@@ -57,10 +57,7 @@ void gc3355_open_sha2_unit(int fd, char *opt_sha2_gating);
 extern
 void gc3355_open_scrypt_unit(int fd, int status);
 
-extern
-int gc3355_get_cts_status(int fd);
-
-extern
-void gc3355_set_rts_status(int fd, unsigned int value);
+#define gc3355_get_cts_status(fd)  (get_serial_cts(fd) ? 0 : 1)
+#define gc3355_set_rts_status(fd, val)  set_serial_rts(fd, val)
 
 #endif

+ 56 - 5
lowl-vcom.c

@@ -1108,7 +1108,8 @@ int get_serial_cts(int fd)
 	return (flags & TIOCM_CTS) ? 1 : 0;
 }
 
-int set_serial_rts(int fd, int rts)
+static
+int _set_serial_cmflag(int fd, int flag, bool val)
 {
 	int flags;
 
@@ -1117,13 +1118,23 @@ int set_serial_rts(int fd, int rts)
 
 	ioctl(fd, TIOCMGET, &flags);
 	
-	if (rts)
-		flags |= TIOCM_RTS;
+	if (val)
+		flags |= flag;
 	else
-		flags &= ~TIOCM_RTS;
+		flags &= ~flag;
 
 	ioctl(fd, TIOCMSET, &flags);
-	return flags & TIOCM_CTS;
+	return val ? 1 : 0;
+}
+
+int set_serial_dtr(int fd, int dtr)
+{
+	return _set_serial_cmflag(fd, TIOCM_DTR, dtr);
+}
+
+int set_serial_rts(int fd, int rts)
+{
+	return _set_serial_cmflag(fd, TIOCM_RTS, rts);
 }
 #else
 int get_serial_cts(const int fd)
@@ -1140,6 +1151,46 @@ int get_serial_cts(const int fd)
 
 	return (flags & MS_CTS_ON) ? 1 : 0;
 }
+
+static
+int _set_serial_cmflag(int fd, void (*setfunc)(DCB*, bool), bool val, const char * const fname)
+{
+	if (fd == -1)
+		return -1;
+	const HANDLE fh = (HANDLE)_get_osfhandle(fd);
+	if (fh == INVALID_HANDLE_VALUE)
+		return -1;
+	
+	DCB dcb;
+	if (!GetCommState(fh, &dcb))
+		applogr(-1, LOG_DEBUG, "Failed to %s"IN_FMT_FFL": %s",
+		        "GetCommState", __FILE__, fname, __LINE__,
+		        bfg_strerror(GetLastError(), BST_SYSTEM));
+	
+	setfunc(&dcb, val);
+	
+	if (!SetCommState(fh, &dcb))
+		applogr(-1, LOG_DEBUG, "Failed to %s"IN_FMT_FFL": %s",
+		        "GetCommState", __FILE__, fname, __LINE__,
+		        bfg_strerror(GetLastError(), BST_SYSTEM));
+	
+	return val ? 1 : 0;
+}
+#define _set_serial_cmflag2(name, field, trueval, falseval)  \
+static  \
+void _set_serial_cmflag_ ## name(DCB *dcb, bool val)  \
+{  \
+	dcb->field = val ? (trueval) : (falseval);  \
+}  \
+  \
+int set_serial_ ## name(int fd, int val)  \
+{  \
+	return _set_serial_cmflag(fd, _set_serial_cmflag_ ## name, val, "set_serial_" #name);  \
+}  \
+// END _set_serial_cmflag2
+
+_set_serial_cmflag2(dtr, fDtrControl, DTR_CONTROL_ENABLE, DTR_CONTROL_DISABLE)
+_set_serial_cmflag2(rts, fRtsControl, RTS_CONTROL_ENABLE, RTS_CONTROL_DISABLE)
 #endif // ! WIN32
 
 struct lowlevel_driver lowl_vcom = {

+ 2 - 0
lowl-vcom.h

@@ -39,6 +39,8 @@ extern ssize_t _serial_read(int fd, char *buf, size_t buflen, char *eol);
 extern int serial_close(int fd);
 
 extern int get_serial_cts(int fd);
+extern int set_serial_dtr(int fd, int dtr);
+extern int set_serial_rts(int fd, int rts);
 extern bool valid_baud(int baud);
 
 #endif