|
|
|
@ -49,7 +49,8 @@
@@ -49,7 +49,8 @@
|
|
|
|
|
#define CAPABILITY_MULTI_FPGA 0,7 |
|
|
|
|
|
|
|
|
|
static int libztex_get_string_descriptor_ascii(libusb_device_handle *dev, uint8_t desc_index, |
|
|
|
|
unsigned char *data, int length) { |
|
|
|
|
unsigned char *data, int length) |
|
|
|
|
{ |
|
|
|
|
int i, cnt; |
|
|
|
|
uint16_t langid; |
|
|
|
|
unsigned char buf[260]; |
|
|
|
@ -90,7 +91,8 @@ static int libztex_get_string_descriptor_ascii(libusb_device_handle *dev, uint8_
@@ -90,7 +91,8 @@ static int libztex_get_string_descriptor_ascii(libusb_device_handle *dev, uint8_
|
|
|
|
|
return LIBUSB_SUCCESS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum check_result { |
|
|
|
|
enum check_result |
|
|
|
|
{ |
|
|
|
|
CHECK_ERROR, |
|
|
|
|
CHECK_IS_NOT_ZTEX, |
|
|
|
|
CHECK_OK, |
|
|
|
@ -494,9 +496,11 @@ int libztex_configureFpga(struct libztex_device *ztex)
@@ -494,9 +496,11 @@ int libztex_configureFpga(struct libztex_device *ztex)
|
|
|
|
|
return rv; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_numberOfFpgas(struct libztex_device *ztex) { |
|
|
|
|
int libztex_numberOfFpgas(struct libztex_device *ztex) |
|
|
|
|
{ |
|
|
|
|
int cnt; |
|
|
|
|
unsigned char buf[3]; |
|
|
|
|
|
|
|
|
|
if (ztex->numberOfFpgas < 0) { |
|
|
|
|
if (libztex_checkCapability(ztex, CAPABILITY_MULTI_FPGA)) { |
|
|
|
|
cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x50, 0, 0, buf, 3, 1000); |
|
|
|
@ -516,9 +520,11 @@ int libztex_numberOfFpgas(struct libztex_device *ztex) {
@@ -516,9 +520,11 @@ int libztex_numberOfFpgas(struct libztex_device *ztex) {
|
|
|
|
|
return ztex->numberOfFpgas; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_selectFpga(struct libztex_device *ztex) { |
|
|
|
|
int libztex_selectFpga(struct libztex_device *ztex) |
|
|
|
|
{ |
|
|
|
|
int cnt, fpgacnt = libztex_numberOfFpgas(ztex->root); |
|
|
|
|
int16_t number = ztex->fpgaNum; |
|
|
|
|
|
|
|
|
|
if (number < 0 || number >= fpgacnt) { |
|
|
|
|
applog(LOG_WARNING, "%s: Trying to select wrong fpga (%d in %d)", ztex->repr, number, fpgacnt); |
|
|
|
|
return 1; |
|
|
|
@ -534,7 +540,8 @@ int libztex_selectFpga(struct libztex_device *ztex) {
@@ -534,7 +540,8 @@ int libztex_selectFpga(struct libztex_device *ztex) {
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_setFreq(struct libztex_device *ztex, uint16_t freq) { |
|
|
|
|
int libztex_setFreq(struct libztex_device *ztex, uint16_t freq) |
|
|
|
|
{ |
|
|
|
|
int cnt; |
|
|
|
|
uint16_t oldfreq = ztex->freqM; |
|
|
|
|
|
|
|
|
@ -562,7 +569,8 @@ int libztex_resetFpga(struct libztex_device *ztex)
@@ -562,7 +569,8 @@ int libztex_resetFpga(struct libztex_device *ztex)
|
|
|
|
|
return libusb_control_transfer(ztex->hndl, 0x40, 0x31, 0, 0, NULL, 0, 1000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_suspend(struct libztex_device *ztex) { |
|
|
|
|
int libztex_suspend(struct libztex_device *ztex) |
|
|
|
|
{ |
|
|
|
|
if (ztex->suspendSupported) { |
|
|
|
|
return libusb_control_transfer(ztex->hndl, 0x40, 0x84, 0, 0, NULL, 0, 1000); |
|
|
|
|
} else { |
|
|
|
@ -570,7 +578,8 @@ int libztex_suspend(struct libztex_device *ztex) {
@@ -570,7 +578,8 @@ int libztex_suspend(struct libztex_device *ztex) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_prepare_device(struct libusb_device *dev, struct libztex_device** ztex) { |
|
|
|
|
int libztex_prepare_device(struct libusb_device *dev, struct libztex_device** ztex) |
|
|
|
|
{ |
|
|
|
|
struct libztex_device *newdev = *ztex; |
|
|
|
|
int i, cnt, err; |
|
|
|
|
unsigned char buf[64]; |
|
|
|
@ -598,7 +607,7 @@ int libztex_prepare_device(struct libusb_device *dev, struct libztex_device** zt
@@ -598,7 +607,7 @@ int libztex_prepare_device(struct libusb_device *dev, struct libztex_device** zt
|
|
|
|
|
applog(LOG_ERR, "Ztex check device: Failed to read ztex descriptor with err %d", cnt); |
|
|
|
|
return cnt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (buf[0] != 40 || buf[1] != 1 || buf[2] != 'Z' || buf[3] != 'T' || buf[4] != 'E' || buf[5] != 'X') { |
|
|
|
|
applog(LOG_ERR, "Ztex check device: Error reading ztex descriptor"); |
|
|
|
|
return 2; |
|
|
|
@ -822,11 +831,12 @@ int libztex_sendHashData(struct libztex_device *ztex, unsigned char *sendbuf)
@@ -822,11 +831,12 @@ int libztex_sendHashData(struct libztex_device *ztex, unsigned char *sendbuf)
|
|
|
|
|
} |
|
|
|
|
if (unlikely(cnt < 0)) |
|
|
|
|
applog(LOG_ERR, "%s: Failed sendHashData with err %d", ztex->repr, cnt); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return cnt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int libztex_readHashData(struct libztex_device *ztex, struct libztex_hash_data nonces[]) { |
|
|
|
|
int libztex_readHashData(struct libztex_device *ztex, struct libztex_hash_data nonces[]) |
|
|
|
|
{ |
|
|
|
|
int bufsize = 12 + ztex->extraSolutions * 4; |
|
|
|
|
int cnt = 0, i, j, ret, len; |
|
|
|
|
unsigned char *rbuf; |
|
|
|
@ -859,7 +869,7 @@ int libztex_readHashData(struct libztex_device *ztex, struct libztex_hash_data n
@@ -859,7 +869,7 @@ int libztex_readHashData(struct libztex_device *ztex, struct libztex_hash_data n
|
|
|
|
|
memcpy((char*)&nonces[i].goldenNonce[0], &rbuf[i*bufsize], 4); |
|
|
|
|
nonces[i].goldenNonce[0] -= ztex->offsNonces; |
|
|
|
|
//applog(LOG_DEBUG, "W %d:0 %0.8x", i, nonces[i].goldenNonce[0]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memcpy((char*)&nonces[i].nonce, &rbuf[(i*bufsize)+4], 4); |
|
|
|
|
nonces[i].nonce -= ztex->offsNonces; |
|
|
|
|
memcpy((char*)&nonces[i].hash7, &rbuf[(i*bufsize)+8], 4); |
|
|
|
@ -887,3 +897,4 @@ void libztex_freeDevList(struct libztex_dev_list **devs)
@@ -887,3 +897,4 @@ void libztex_freeDevList(struct libztex_dev_list **devs)
|
|
|
|
|
} |
|
|
|
|
free(devs); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|