Browse Source

dualminer: refactor gc3355 code for readability, maintainability and use with other devices

Nate Woolls 12 years ago
parent
commit
69bcda03f6
3 changed files with 93 additions and 37 deletions
  1. 2 19
      driver-dualminer.c
  2. 90 13
      gc3355.c
  3. 1 5
      gc3355.h

+ 2 - 19
driver-dualminer.c

@@ -80,19 +80,6 @@ const struct bfg_set_device_definition dualminer_set_device_funcs[];
 
 // device helper functions
 
-static
-void dualminer_bootstrap_device(int fd)
-{
-	gc3355_reset_dtr(fd);
-
-	if (opt_scrypt && !opt_dual_mode)
-		gc3355_opt_scrypt_only_init(fd);
-	else
-		gc3355_dualminer_init(fd);
-
-	cgsleep_ms(1);
-}
-
 static
 void dualminer_teardown_device(int fd)
 {
@@ -132,14 +119,10 @@ void dualminer_init_firstrun(struct cgpu_info *icarus)
 {
 	int fd = icarus->device_fd;
 
-	dualminer_bootstrap_device(fd);
-
-	if (opt_scrypt)
-		set_serial_rts(fd, BGV_HIGH);
+	gc3355_init_usbstick(fd, opt_pll_freq, !opt_dual_mode, false);
 	
 	dualminer_init_hashrate(icarus);
 
-	gc3355_init(fd, opt_sha2_units, !opt_dual_mode);
 	applog(LOG_DEBUG, "%"PRIpreprv": scrypt: %d, scrypt only: %d\n", icarus->proc_repr, opt_scrypt, opt_scrypt);
 
 	applog(LOG_DEBUG, "%"PRIpreprv": dualminer: Init: pll=%d, sha2num=%d", icarus->proc_repr, opt_pll_freq, opt_sha2_units);
@@ -178,7 +161,7 @@ bool dualminer_detect_init(const char *devpath, int fd, struct ICARUS_INFO * __m
 {
 	dualminer_set_defaults(fd);
 	
-	dualminer_bootstrap_device(fd);
+	gc3355_init_usbstick(fd, opt_pll_freq, !opt_dual_mode, true);
 
 	return true;
 }

+ 90 - 13
gc3355.c

@@ -212,6 +212,24 @@ const char *sha2_open_cmd[] =
 	NULL
 };
 
+static
+const char *sha2_init_cmd[] =
+{
+	"55AAEF3020000000",  // Enable SHA-2
+	"55AA1F2817000000",  // Enable GCP
+	NULL
+};
+
+// called when initializing GridSeed device
+// called while initializing DualMiner when mining in scrypt+sha (dual-mode)
+static
+const char *scrypt_init_cmd[] =
+{
+	"55AA1F2814000000",  // Enable Scrypt
+	"55AA1F2817000000",  // Enable GCP
+	NULL
+};
+
 // called while initializing DualMiner when mining scrypt in scrypt-only (not dual-mode)
 static
 const char *scrypt_only_init_cmd[] =
@@ -227,6 +245,20 @@ const char *scrypt_only_init_cmd[] =
 	NULL
 };
 
+static
+const char *gcp_chip_reset_cmd[] =
+{
+	"55AAC000808080800000000001000000",  // GCP (GridChip) reset
+	NULL
+};
+
+static
+const char *sha2_chip_reset_cmd[] =
+{
+	"55AAC000E0E0E0E00000000001000000",  // SHA2 reset
+	NULL
+};
+
 bool opt_dual_mode = false;
 
 void gc3355_reset_dtr(int fd)
@@ -391,11 +423,67 @@ void gc3355_open_sha2_units(int fd, int sha2_units)
 		gc3355_send_cmds(fd, sha2_gating_cmd);
 }
 
-void gc3355_opt_scrypt_only_init(int fd)
+void gc3355_scrypt_init(int fd)
+{
+	gc3355_send_cmds(fd, scrypt_init_cmd);
+}
+
+static
+void gc3355_scrypt_only_init(int fd)
 {
+	gc3355_send_cmds(fd, sha2_gating_cmd);
 	gc3355_send_cmds(fd, scrypt_only_init_cmd);
+	gc3355_scrypt_only_reset(fd);
+}
+
+static
+void gc3355_sha2_init(int fd)
+{
+	gc3355_send_cmds(fd, sha2_gating_cmd);
+	gc3355_send_cmds(fd, sha2_init_cmd);
+}
+
+static
+void gc3355_reset_chips(int fd)
+{
+	// reset chips
+	gc3355_send_cmds(fd, gcp_chip_reset_cmd);
+	gc3355_send_cmds(fd, sha2_chip_reset_cmd);
+}
+
+void gc3355_init_usbstick(int fd, int pll_freq, bool scrypt_only, bool detect_only)
+{
+	gc3355_reset_chips(fd);
+
+	gc3355_reset_dtr(fd);
+
+
+	// initialize units
+	if (opt_scrypt && scrypt_only)
+		gc3355_scrypt_only_init(fd);
+	else
+	{
+		gc3355_sha2_init(fd);
+		gc3355_scrypt_init(fd);
+	}
+
+	//set freq
+	gc3355_set_pll_freq(fd, pll_freq);
 
-	gc3355_set_pll_freq(fd, opt_pll_freq);
+	// zzz
+	cgsleep_ms(GC3355_COMMAND_DELAY_MS);
+
+	if (!detect_only)
+	{
+		if (!opt_scrypt)
+		{
+			// open sha2 units
+			gc3355_open_sha2_units(fd, opt_sha2_units);
+		}
+
+		// set request to send (RTS) status
+		set_serial_rts(fd, BGV_HIGH);
+	}
 }
 
 void gc3355_dualminer_init(int fd)
@@ -430,17 +518,6 @@ void gc3355_dualminer_init(int fd)
 		gc3355_set_pll_freq(fd, opt_pll_freq);
 }
 
-void gc3355_init(int fd, int sha2_units, bool is_scrypt_only)
-{
-	if (opt_scrypt)
-	{
-		if (is_scrypt_only)
-			gc3355_opt_scrypt_only_init(fd);
-	}
-	else
-		gc3355_open_sha2_units(fd, sha2_units);
-}
-
 void gc3355_scrypt_prepare_work(unsigned char cmd[156], struct work *work)
 {
 	// command header

+ 1 - 5
gc3355.h

@@ -39,8 +39,7 @@ bool opt_dual_mode;
 extern
 void gc3355_reset_dtr(int fd);
 
-extern
-void gc3355_opt_scrypt_only_init(int fd);
+extern void gc3355_init_usbstick(int fd, int pll_freq, bool scrypt_only, bool detect_only);
 
 extern
 void gc3355_dualminer_init(int fd);
@@ -48,9 +47,6 @@ void gc3355_dualminer_init(int fd);
 extern
 void gc3355_scrypt_only_reset(int fd);
 
-extern
-void gc3355_init(int fd, int sha2_units, bool is_scrypt_only);
-
 extern void gc3355_scrypt_prepare_work(unsigned char cmd[156], struct work *);
 extern void gc3355_sha2_prepare_work(unsigned char cmd[52], struct work *, bool simple);