From c280dd0daedbf77f73c159b3e99f0a0d94a676f3 Mon Sep 17 00:00:00 2001 From: nelisky Date: Tue, 17 Apr 2012 01:51:53 -0700 Subject: [PATCH] Moving space indentation to tabs For consistency with cgminer sources --- libztex.c | 757 +++++++++++++++++++++++++++--------------------------- libztex.h | 68 ++--- ztex.c | 426 +++++++++++++++--------------- 3 files changed, 624 insertions(+), 627 deletions(-) diff --git a/libztex.c b/libztex.c index 1935d9cf..8bd4be0f 100644 --- a/libztex.c +++ b/libztex.c @@ -45,428 +45,425 @@ static bool libztex_checkDevice (struct libusb_device *dev) { - int err; - - struct libusb_device_descriptor desc; - err = libusb_get_device_descriptor(dev, &desc); - if (unlikely(err != 0)) { - applog(LOG_ERR, "Ztex check device: Failed to open read descriptor with error %d", err); - return false; - } - if (!(desc.idVendor == LIBZTEX_IDVENDOR && desc.idProduct == LIBZTEX_IDPRODUCT)) { - return false; - } - return true; + int err; + + struct libusb_device_descriptor desc; + err = libusb_get_device_descriptor(dev, &desc); + if (unlikely(err != 0)) { + applog(LOG_ERR, "Ztex check device: Failed to open read descriptor with error %d", err); + return false; + } + if (!(desc.idVendor == LIBZTEX_IDVENDOR && desc.idProduct == LIBZTEX_IDPRODUCT)) { + return false; + } + return true; } static bool libztex_checkCapability (struct libztex_device *ztex, int i, int j) { - if (!((i>=0) && (i<=5) && (j>=0) && (j<8) && - (((ztex->interfaceCapabilities[i] & 255) & (1 << j)) != 0))) { - applog(LOG_ERR, "%s: capability missing: %d %d", ztex->repr, i, i); - } - return true; + if (!((i>=0) && (i<=5) && (j>=0) && (j<8) && + (((ztex->interfaceCapabilities[i] & 255) & (1 << j)) != 0))) { + applog(LOG_ERR, "%s: capability missing: %d %d", ztex->repr, i, i); + } + return true; } static int libztex_detectBitstreamBitOrder (const unsigned char *buf, int size) { - int i; - size -= 4; - for (i=0; i> 7) | - ((c & 64) >> 5) | - ((c & 32) >> 3) | - ((c & 16) >> 1) | - ((c & 8) << 1) | - ((c & 4) << 3) | - ((c & 2) << 5) | - ((c & 1) << 7); - } + int i; + unsigned char c; + for (i=0; i> 7) | + ((c & 64) >> 5) | + ((c & 32) >> 3) | + ((c & 16) >> 1) | + ((c & 8) << 1) | + ((c & 4) << 3) | + ((c & 2) << 5) | + ((c & 1) << 7); + } } static int libztex_getFpgaState (struct libztex_device *ztex, struct libztex_fpgastate *state) { - int cnt; - unsigned char buf[9]; - if (!libztex_checkCapability(ztex, CAPABILITY_FPGA)) { - return -1; - } - cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x30, 0, 0, buf, 9, 1000); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "%s: Failed getFpgaState with err %d", ztex->repr, cnt); - return cnt; - } - state->fpgaConfigured = buf[0] == 0; - state->fpgaChecksum = buf[1] & 0xff; - state->fpgaBytes = ((buf[5] & 0xff)<<24) | ((buf[4] & 0xff)<<16) | ((buf[3] & 0xff)<<8) | (buf[2] & 0xff); - state->fpgaInitB = buf[6] & 0xff; - state->fpgaFlashResult = buf[7]; - state->fpgaFlashBitSwap = buf[8] != 0; - return 0; + int cnt; + unsigned char buf[9]; + if (!libztex_checkCapability(ztex, CAPABILITY_FPGA)) { + return -1; + } + cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x30, 0, 0, buf, 9, 1000); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "%s: Failed getFpgaState with err %d", ztex->repr, cnt); + return cnt; + } + state->fpgaConfigured = buf[0] == 0; + state->fpgaChecksum = buf[1] & 0xff; + state->fpgaBytes = ((buf[5] & 0xff)<<24) | ((buf[4] & 0xff)<<16) | ((buf[3] & 0xff)<<8) | (buf[2] & 0xff); + state->fpgaInitB = buf[6] & 0xff; + state->fpgaFlashResult = buf[7]; + state->fpgaFlashBitSwap = buf[8] != 0; + return 0; } static int libztex_configureFpgaLS (struct libztex_device *ztex, const char* firmware, bool force, char bs) { - struct libztex_fpgastate state; - ssize_t pos=0; - int transactionBytes = 2048; - unsigned char buf[transactionBytes], cs; - int tries, cnt, buf_p, i; - FILE *fp; - - if (!libztex_checkCapability(ztex, CAPABILITY_FPGA)) { - return -1; - } - - libztex_getFpgaState(ztex, &state); - if (!force) { - if (state.fpgaConfigured) { - return 1; - } - } - - for (tries=10; tries>0; tries--) { - - fp = fopen(firmware, "rb"); - if (!fp) { - applog(LOG_ERR, "%s: failed to read firmware '%s'", ztex->repr, firmware); - return -2; - } - - cs = 0; - while (pos < transactionBytes && !feof(fp)) { - buf[pos] = getc(fp); - cs += buf[pos++]; - }; - if (feof(fp)) - pos--; - - if ( bs<0 || bs>1 ) - bs = libztex_detectBitstreamBitOrder(buf, transactionBytesrepr, cnt); - continue; - } - - if ( bs == 1 ) - libztex_swapBits(buf, pos); - - buf_p = pos; - while (1) { - i = 0; - while (i < buf_p) { - cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x32, 0, 0, &buf[i], buf_p-i, 5000); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "%s: Failed send fpga data with err %d", ztex->repr, cnt); - break; - } - i += cnt; - } - if (i < buf_p || buf_p < transactionBytes) - break; - buf_p = 0; - while (buf_p < transactionBytes && !feof(fp)) { - buf[buf_p] = getc(fp); - cs += buf[buf_p++]; - }; - if (feof(fp)) - buf_p--; - pos += buf_p; - if (buf_p == 0) - break; - if ( bs == 1 ) - libztex_swapBits(buf, buf_p); - } - if (cnt >= 0) - tries = 0; - - fclose(fp); - } - libztex_getFpgaState(ztex, &state); - if (!state.fpgaConfigured) { - applog(LOG_ERR, "%s: FPGA configuration failed: DONE pin does not go high", ztex->repr); - return 3; - } - usleep(200000); - applog(LOG_ERR, "%s: FPGA configuration done", ztex->repr); - return 0; + struct libztex_fpgastate state; + ssize_t pos=0; + int transactionBytes = 2048; + unsigned char buf[transactionBytes], cs; + int tries, cnt, buf_p, i; + FILE *fp; + + if (!libztex_checkCapability(ztex, CAPABILITY_FPGA)) { + return -1; + } + + libztex_getFpgaState(ztex, &state); + if (!force) { + if (state.fpgaConfigured) { + return 1; + } + } + + for (tries=10; tries>0; tries--) { + + fp = fopen(firmware, "rb"); + if (!fp) { + applog(LOG_ERR, "%s: failed to read firmware '%s'", ztex->repr, firmware); + return -2; + } + + cs = 0; + while (pos < transactionBytes && !feof(fp)) { + buf[pos] = getc(fp); + cs += buf[pos++]; + }; + if (feof(fp)) + pos--; + + if ( bs<0 || bs>1 ) + bs = libztex_detectBitstreamBitOrder(buf, transactionBytesrepr, cnt); + continue; + } + + if ( bs == 1 ) + libztex_swapBits(buf, pos); + + buf_p = pos; + while (1) { + i = 0; + while (i < buf_p) { + cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x32, 0, 0, &buf[i], buf_p-i, 5000); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "%s: Failed send fpga data with err %d", ztex->repr, cnt); + break; + } + i += cnt; + } + if (i < buf_p || buf_p < transactionBytes) + break; + buf_p = 0; + while (buf_p < transactionBytes && !feof(fp)) { + buf[buf_p] = getc(fp); + cs += buf[buf_p++]; + }; + if (feof(fp)) + buf_p--; + pos += buf_p; + if (buf_p == 0) + break; + if ( bs == 1 ) + libztex_swapBits(buf, buf_p); + } + if (cnt >= 0) + tries = 0; + + fclose(fp); + } + libztex_getFpgaState(ztex, &state); + if (!state.fpgaConfigured) { + applog(LOG_ERR, "%s: FPGA configuration failed: DONE pin does not go high", ztex->repr); + return 3; + } + usleep(200000); + applog(LOG_ERR, "%s: FPGA configuration done", ztex->repr); + return 0; } int libztex_configureFpga (struct libztex_device *ztex) { - int rv; - char buf[256] = "bitstreams/"; - memset(&buf[11], 0, 245); - strcpy(&buf[11], ztex->bitFileName); - strcpy(&buf[strlen(buf)], ".bit"); - - rv = libztex_configureFpgaLS(ztex, buf, true, 2); - //if (rv == 0) { - // libztex_setFreq(ztex, ztex->freqMDefault); - //} - return rv; + int rv; + char buf[256] = "bitstreams/"; + memset(&buf[11], 0, 245); + strcpy(&buf[11], ztex->bitFileName); + strcpy(&buf[strlen(buf)], ".bit"); + + rv = libztex_configureFpgaLS(ztex, buf, true, 2); + return rv; } int libztex_setFreq (struct libztex_device *ztex, uint16_t freq) { - int cnt; - if (freq > ztex->freqMaxM) { - freq = ztex->freqMaxM; - } - - cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x83, freq, 0, NULL, 0, 500); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "Ztex check device: Failed to set frequency with err %d", cnt); - return cnt; - } - ztex->freqM = freq; - applog(LOG_WARNING, "%s: Frequency change to %0.2f Mhz", ztex->repr, ztex->freqM1 * (ztex->freqM + 1)); - - return 0; + int cnt; + if (freq > ztex->freqMaxM) { + freq = ztex->freqMaxM; + } + + cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x83, freq, 0, NULL, 0, 500); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "Ztex check device: Failed to set frequency with err %d", cnt); + return cnt; + } + ztex->freqM = freq; + applog(LOG_WARNING, "%s: Frequency change to %0.2f Mhz", ztex->repr, ztex->freqM1 * (ztex->freqM + 1)); + + return 0; } int libztex_resetFpga (struct libztex_device *ztex) { - return libusb_control_transfer(ztex->hndl, 0x40, 0x31, 0, 0, NULL, 0, 1000); + return libusb_control_transfer(ztex->hndl, 0x40, 0x31, 0, 0, NULL, 0, 1000); } int libztex_prepare_device (struct libusb_device *dev, struct libztex_device** ztex) { - struct libztex_device *newdev; - int cnt, err; - unsigned char buf[64]; - - newdev = malloc(sizeof(struct libztex_device)); - newdev->valid = false; - newdev->hndl = NULL; - newdev->bitFileName = NULL; - *ztex = newdev; - - err = libusb_get_device_descriptor(dev, &newdev->descriptor); - if (unlikely(err != 0)) { - applog(LOG_ERR, "Ztex check device: Failed to open read descriptor with error %d", err); - return err; - } - - // Check vendorId and productId - if (!(newdev->descriptor.idVendor == LIBZTEX_IDVENDOR && - newdev->descriptor.idProduct == LIBZTEX_IDPRODUCT)) { - applog(LOG_ERR, "Not a ztex device? %0.4X, %0.4X", newdev->descriptor.idVendor, newdev->descriptor.idProduct); - return 1; - } - - err = libusb_open(dev, &newdev->hndl); - if (unlikely(err != 0)) { - applog(LOG_ERR, "Ztex check device: Failed to open handle with error %d", err); - return err; - } - - cnt = libusb_get_string_descriptor_ascii (newdev->hndl, newdev->descriptor.iSerialNumber, newdev->snString, - LIBZTEX_SNSTRING_LEN+1); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "Ztex check device: Failed to read device snString with err %d", cnt); - return cnt; - } - - cnt = libusb_control_transfer(newdev->hndl, 0xc0, 0x22, 0, 0, buf, 40, 500); - if (unlikely(cnt < 0)) { - 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; - } - - newdev->productId[0] = buf[6]; - newdev->productId[1] = buf[7]; - newdev->productId[2] = buf[8]; - newdev->productId[3] = buf[9]; - newdev->fwVersion = buf[10]; - newdev->interfaceVersion = buf[11]; - newdev->interfaceCapabilities[0] = buf[12]; - newdev->interfaceCapabilities[1] = buf[13]; - newdev->interfaceCapabilities[2] = buf[14]; - newdev->interfaceCapabilities[3] = buf[15]; - newdev->interfaceCapabilities[4] = buf[16]; - newdev->interfaceCapabilities[5] = buf[17]; - newdev->moduleReserved[0] = buf[18]; - newdev->moduleReserved[1] = buf[19]; - newdev->moduleReserved[2] = buf[20]; - newdev->moduleReserved[3] = buf[21]; - newdev->moduleReserved[4] = buf[22]; - newdev->moduleReserved[5] = buf[23]; - newdev->moduleReserved[6] = buf[24]; - newdev->moduleReserved[7] = buf[25]; - newdev->moduleReserved[8] = buf[26]; - newdev->moduleReserved[9] = buf[27]; - newdev->moduleReserved[10] = buf[28]; - newdev->moduleReserved[11] = buf[29]; - - - cnt = libusb_control_transfer(newdev->hndl, 0xc0, 0x82, 0, 0, buf, 64, 500); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "Ztex check device: Failed to read ztex descriptor with err %d", cnt); - return cnt; - } - - if (unlikely(!(buf[0]) == 4)) { - if (unlikely(buf[0]) != 2) { - applog(LOG_ERR, "Invalid BTCMiner descriptor version. Firmware must be updated (%d).", buf[0]); - return 3; - } - applog(LOG_WARNING, "Firmware out of date"); - } - - newdev->numNonces = buf[1] + 1; - newdev->offsNonces = ((buf[2] & 255) | ((buf[3] & 255) << 8)) - 10000; - newdev->freqM1 = ( (buf[4] & 255) | ((buf[5] & 255) << 8) ) * 0.01; - newdev->freqMaxM = (buf[7] & 255); - newdev->freqM = (buf[6] & 255); - newdev->freqMDefault = newdev->freqM; - - for (cnt=0; cnt<255; cnt++) { - newdev->errorCount[cnt] = 0; - newdev->errorWeight[cnt] = 0; - newdev->errorRate[cnt] = 0; - newdev->maxErrorRate[cnt] = 0; - } - - cnt = strlen((char *)&buf[buf[0]==4?10:8]); - newdev->bitFileName = malloc(sizeof(char)*(cnt+1)); - memcpy(newdev->bitFileName, &buf[buf[0]==4?10:8], cnt+1); - - newdev->usbbus = libusb_get_bus_number(dev); - newdev->usbaddress = libusb_get_device_address(dev); - sprintf(newdev->repr, "ZTEX %.3d:%.3d-%s", newdev->usbbus, newdev->usbaddress, newdev->snString); - newdev->valid = true; - return 0; + struct libztex_device *newdev; + int cnt, err; + unsigned char buf[64]; + + newdev = malloc(sizeof(struct libztex_device)); + newdev->valid = false; + newdev->hndl = NULL; + newdev->bitFileName = NULL; + *ztex = newdev; + + err = libusb_get_device_descriptor(dev, &newdev->descriptor); + if (unlikely(err != 0)) { + applog(LOG_ERR, "Ztex check device: Failed to open read descriptor with error %d", err); + return err; + } + + // Check vendorId and productId + if (!(newdev->descriptor.idVendor == LIBZTEX_IDVENDOR && + newdev->descriptor.idProduct == LIBZTEX_IDPRODUCT)) { + applog(LOG_ERR, "Not a ztex device? %0.4X, %0.4X", newdev->descriptor.idVendor, newdev->descriptor.idProduct); + return 1; + } + + err = libusb_open(dev, &newdev->hndl); + if (unlikely(err != 0)) { + applog(LOG_ERR, "Ztex check device: Failed to open handle with error %d", err); + return err; + } + + cnt = libusb_get_string_descriptor_ascii (newdev->hndl, newdev->descriptor.iSerialNumber, newdev->snString, + LIBZTEX_SNSTRING_LEN+1); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "Ztex check device: Failed to read device snString with err %d", cnt); + return cnt; + } + + cnt = libusb_control_transfer(newdev->hndl, 0xc0, 0x22, 0, 0, buf, 40, 500); + if (unlikely(cnt < 0)) { + 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; + } + + newdev->productId[0] = buf[6]; + newdev->productId[1] = buf[7]; + newdev->productId[2] = buf[8]; + newdev->productId[3] = buf[9]; + newdev->fwVersion = buf[10]; + newdev->interfaceVersion = buf[11]; + newdev->interfaceCapabilities[0] = buf[12]; + newdev->interfaceCapabilities[1] = buf[13]; + newdev->interfaceCapabilities[2] = buf[14]; + newdev->interfaceCapabilities[3] = buf[15]; + newdev->interfaceCapabilities[4] = buf[16]; + newdev->interfaceCapabilities[5] = buf[17]; + newdev->moduleReserved[0] = buf[18]; + newdev->moduleReserved[1] = buf[19]; + newdev->moduleReserved[2] = buf[20]; + newdev->moduleReserved[3] = buf[21]; + newdev->moduleReserved[4] = buf[22]; + newdev->moduleReserved[5] = buf[23]; + newdev->moduleReserved[6] = buf[24]; + newdev->moduleReserved[7] = buf[25]; + newdev->moduleReserved[8] = buf[26]; + newdev->moduleReserved[9] = buf[27]; + newdev->moduleReserved[10] = buf[28]; + newdev->moduleReserved[11] = buf[29]; + + + cnt = libusb_control_transfer(newdev->hndl, 0xc0, 0x82, 0, 0, buf, 64, 500); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "Ztex check device: Failed to read ztex descriptor with err %d", cnt); + return cnt; + } + + if (unlikely(!(buf[0]) == 4)) { + if (unlikely(buf[0]) != 2) { + applog(LOG_ERR, "Invalid BTCMiner descriptor version. Firmware must be updated (%d).", buf[0]); + return 3; + } + applog(LOG_WARNING, "Firmware out of date"); + } + + newdev->numNonces = buf[1] + 1; + newdev->offsNonces = ((buf[2] & 255) | ((buf[3] & 255) << 8)) - 10000; + newdev->freqM1 = ( (buf[4] & 255) | ((buf[5] & 255) << 8) ) * 0.01; + newdev->freqMaxM = (buf[7] & 255); + newdev->freqM = (buf[6] & 255); + newdev->freqMDefault = newdev->freqM; + + for (cnt=0; cnt<255; cnt++) { + newdev->errorCount[cnt] = 0; + newdev->errorWeight[cnt] = 0; + newdev->errorRate[cnt] = 0; + newdev->maxErrorRate[cnt] = 0; + } + + cnt = strlen((char *)&buf[buf[0]==4?10:8]); + newdev->bitFileName = malloc(sizeof(char)*(cnt+1)); + memcpy(newdev->bitFileName, &buf[buf[0]==4?10:8], cnt+1); + + newdev->usbbus = libusb_get_bus_number(dev); + newdev->usbaddress = libusb_get_device_address(dev); + sprintf(newdev->repr, "ZTEX %.3d:%.3d-%s", newdev->usbbus, newdev->usbaddress, newdev->snString); + newdev->valid = true; + return 0; } void libztex_destroy_device (struct libztex_device* ztex) { - if (ztex->hndl != NULL) { - libusb_close(ztex->hndl); - ztex->hndl = NULL; - } - if (ztex->bitFileName != NULL) { - free(ztex->bitFileName); - ztex->bitFileName = NULL; - } - free(ztex); + if (ztex->hndl != NULL) { + libusb_close(ztex->hndl); + ztex->hndl = NULL; + } + if (ztex->bitFileName != NULL) { + free(ztex->bitFileName); + ztex->bitFileName = NULL; + } + free(ztex); } int libztex_scanDevices (struct libztex_dev_list*** devs_p) { - libusb_device **list; - struct libztex_device *ztex; - ssize_t cnt = libusb_get_device_list(NULL, &list); - ssize_t i = 0; - int found = 0, pos = 0, err; - - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "Ztex scan devices: Failed to list usb devices with err %d", cnt); - return 0; - } - - int usbdevices[LIBZTEX_MAX_DESCRIPTORS]; - - for (i = 0; i < cnt; i++) { - if (libztex_checkDevice(list[i])) { - // Got one! - usbdevices[found] = i; - found++; - } - } - - struct libztex_dev_list **devs; - devs = malloc(sizeof(struct libztex_dev_list *) * found); - if (devs == NULL) { - applog(LOG_ERR, "Ztex scan devices: Failed to allocate memory"); - return 0; - } - - for (i = 0; i < found; i++) { - err = libztex_prepare_device(list[usbdevices[i]], &ztex); - if (unlikely(err != 0)) { - applog(LOG_ERR, "prepare device: %d", err); - } - // check if valid - if (!ztex->valid) { - libztex_destroy_device(ztex); - continue; - } - devs[pos] = malloc(sizeof(struct libztex_dev_list)); - devs[pos]->dev = ztex; - devs[pos]->next = NULL; - if (pos > 0) { - devs[pos-1]->next = devs[pos]; - } - pos++; - } - - libusb_free_device_list(list, 1); - *devs_p = devs; - return pos; + libusb_device **list; + struct libztex_device *ztex; + ssize_t cnt = libusb_get_device_list(NULL, &list); + ssize_t i = 0; + int found = 0, pos = 0, err; + + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "Ztex scan devices: Failed to list usb devices with err %d", cnt); + return 0; + } + + int usbdevices[LIBZTEX_MAX_DESCRIPTORS]; + + for (i = 0; i < cnt; i++) { + if (libztex_checkDevice(list[i])) { + // Got one! + usbdevices[found] = i; + found++; + } + } + + struct libztex_dev_list **devs; + devs = malloc(sizeof(struct libztex_dev_list *) * found); + if (devs == NULL) { + applog(LOG_ERR, "Ztex scan devices: Failed to allocate memory"); + return 0; + } + + for (i = 0; i < found; i++) { + err = libztex_prepare_device(list[usbdevices[i]], &ztex); + if (unlikely(err != 0)) { + applog(LOG_ERR, "prepare device: %d", err); + } + // check if valid + if (!ztex->valid) { + libztex_destroy_device(ztex); + continue; + } + devs[pos] = malloc(sizeof(struct libztex_dev_list)); + devs[pos]->dev = ztex; + devs[pos]->next = NULL; + if (pos > 0) { + devs[pos-1]->next = devs[pos]; + } + pos++; + } + + libusb_free_device_list(list, 1); + *devs_p = devs; + return pos; } int libztex_sendHashData (struct libztex_device *ztex, unsigned char *sendbuf) { - int cnt; - if (ztex == NULL || ztex->hndl == NULL) { - return 0; - } - cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x80, 0, 0, sendbuf, 44, 1000); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "%s: Failed sendHashData with err %d", ztex->repr, cnt); - } - - return cnt; + int cnt; + if (ztex == NULL || ztex->hndl == NULL) { + return 0; + } + cnt = libusb_control_transfer(ztex->hndl, 0x40, 0x80, 0, 0, sendbuf, 44, 1000); + 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[]) { - // length of buf must be 8 * (numNonces + 1) - unsigned char rbuf[12*8]; - int cnt, i; - - if (ztex->hndl == NULL) { - return 0; - } - - cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x81, 0, 0, rbuf, 12*ztex->numNonces, 1000); - if (unlikely(cnt < 0)) { - applog(LOG_ERR, "%s: Failed readHashData with err %d", ztex->repr, cnt); - return cnt; - } - - for (i=0; inumNonces; i++) { - memcpy((char*)&nonces[i].goldenNonce, &rbuf[i*12], 4); - nonces[i].goldenNonce -= ztex->offsNonces; - memcpy((char*)&nonces[i].nonce, &rbuf[(i*12)+4], 4); - nonces[i].nonce -= ztex->offsNonces; - memcpy((char*)&nonces[i].hash7, &rbuf[(i*12)+8], 4); - } - - return cnt; + // length of buf must be 8 * (numNonces + 1) + unsigned char rbuf[12*8]; + int cnt, i; + + if (ztex->hndl == NULL) { + return 0; + } + + cnt = libusb_control_transfer(ztex->hndl, 0xc0, 0x81, 0, 0, rbuf, 12*ztex->numNonces, 1000); + if (unlikely(cnt < 0)) { + applog(LOG_ERR, "%s: Failed readHashData with err %d", ztex->repr, cnt); + return cnt; + } + + for (i=0; inumNonces; i++) { + memcpy((char*)&nonces[i].goldenNonce, &rbuf[i*12], 4); + nonces[i].goldenNonce -= ztex->offsNonces; + memcpy((char*)&nonces[i].nonce, &rbuf[(i*12)+4], 4); + nonces[i].nonce -= ztex->offsNonces; + memcpy((char*)&nonces[i].hash7, &rbuf[(i*12)+8], 4); + } + + return cnt; } void libztex_freeDevList (struct libztex_dev_list **devs) { - ssize_t cnt = 0; - bool done = false; - while (!done) { - if (devs[cnt]->next == NULL) { - done = true; - } - free(devs[cnt++]); - } - free(devs); + ssize_t cnt = 0; + bool done = false; + while (!done) { + if (devs[cnt]->next == NULL) { + done = true; + } + free(devs[cnt++]); + } + free(devs); } diff --git a/libztex.h b/libztex.h index a3d9ceef..5f88af99 100644 --- a/libztex.h +++ b/libztex.h @@ -35,51 +35,51 @@ #define LIBZTEX_OVERHEATTHRESHOLD 0.5 struct libztex_fpgastate { - bool fpgaConfigured; - unsigned char fpgaChecksum; - uint16_t fpgaBytes; - unsigned char fpgaInitB; - unsigned char fpgaFlashResult; - bool fpgaFlashBitSwap; + bool fpgaConfigured; + unsigned char fpgaChecksum; + uint16_t fpgaBytes; + unsigned char fpgaInitB; + unsigned char fpgaFlashResult; + bool fpgaFlashBitSwap; }; struct libztex_device { - bool valid; - struct libusb_device_descriptor descriptor; - libusb_device_handle *hndl; - unsigned char usbbus; - unsigned char usbaddress; - unsigned char snString[LIBZTEX_SNSTRING_LEN+1]; - unsigned char productId[4]; - unsigned char fwVersion; - unsigned char interfaceVersion; - unsigned char interfaceCapabilities[6]; - unsigned char moduleReserved[12]; - uint8_t numNonces; - uint16_t offsNonces; - double freqM1; - uint8_t freqM; - uint8_t freqMaxM; - uint8_t freqMDefault; - char* bitFileName; + bool valid; + struct libusb_device_descriptor descriptor; + libusb_device_handle *hndl; + unsigned char usbbus; + unsigned char usbaddress; + unsigned char snString[LIBZTEX_SNSTRING_LEN+1]; + unsigned char productId[4]; + unsigned char fwVersion; + unsigned char interfaceVersion; + unsigned char interfaceCapabilities[6]; + unsigned char moduleReserved[12]; + uint8_t numNonces; + uint16_t offsNonces; + double freqM1; + uint8_t freqM; + uint8_t freqMaxM; + uint8_t freqMDefault; + char* bitFileName; - double errorCount[256]; - double errorWeight[256]; - double errorRate[256]; - double maxErrorRate[256]; + double errorCount[256]; + double errorWeight[256]; + double errorRate[256]; + double maxErrorRate[256]; - char repr[64]; + char repr[64]; }; struct libztex_dev_list { - struct libztex_device *dev; - struct libztex_dev_list *next; + struct libztex_device *dev; + struct libztex_dev_list *next; }; struct libztex_hash_data { - uint32_t goldenNonce; - uint32_t nonce; - uint32_t hash7; + uint32_t goldenNonce; + uint32_t nonce; + uint32_t hash7; }; extern int libztex_scanDevices (struct libztex_dev_list ***devs); diff --git a/ztex.c b/ztex.c index dc79947f..fea01dc7 100644 --- a/ztex.c +++ b/ztex.c @@ -38,72 +38,72 @@ static bool ztex_prepare(struct thr_info *thr); static void ztex_detect() { - int cnt; - int i; - struct libztex_dev_list **ztex_devices; - - cnt = libztex_scanDevices(&ztex_devices); - applog(LOG_WARNING, "Found %d ztex board(s)", cnt); - - for (i=0; iapi = &ztex_api; - ztex->device_id = total_devices; - ztex->device = ztex_devices[i]->dev; - ztex->threads = 1; - devices[total_devices++] = ztex; - - applog(LOG_WARNING,"%s: Found Ztex, mark as %d", ztex->device->repr, ztex->device_id); - } - - if (cnt > 0) { - libztex_freeDevList(ztex_devices); - } + int cnt; + int i; + struct libztex_dev_list **ztex_devices; + + cnt = libztex_scanDevices(&ztex_devices); + applog(LOG_WARNING, "Found %d ztex board(s)", cnt); + + for (i=0; iapi = &ztex_api; + ztex->device_id = total_devices; + ztex->device = ztex_devices[i]->dev; + ztex->threads = 1; + devices[total_devices++] = ztex; + + applog(LOG_WARNING,"%s: Found Ztex, mark as %d", ztex->device->repr, ztex->device_id); + } + + if (cnt > 0) { + libztex_freeDevList(ztex_devices); + } } static bool ztex_updateFreq (struct libztex_device* ztex) { - int i, maxM, bestM; - double bestR, r; - - for (i=0; ifreqMaxM; i++) { - if (ztex->maxErrorRate[i+1]*i < ztex->maxErrorRate[i]*(i+20)) - ztex->maxErrorRate[i+1] = ztex->maxErrorRate[i]*(1.0+20.0/i); - } - - maxM = 0; - while (maxMfreqMDefault && ztex->maxErrorRate[maxM+1]freqMaxM && ztex->errorWeight[maxM]>150 && ztex->maxErrorRate[maxM+1]freqM ? LIBZTEX_ERRORHYSTERESIS : 0))*(1-ztex->maxErrorRate[i]); - if (r > bestR) { - bestM = i; - bestR = r; - } - } - - if (bestM != ztex->freqM) { - libztex_setFreq(ztex, bestM); - } - - maxM = ztex->freqMDefault; - while (maxMfreqMaxM && ztex->errorWeight[maxM+1] > 100) - maxM++; - if ((bestM < (1.0-LIBZTEX_OVERHEATTHRESHOLD) * maxM) && bestM < maxM - 1) { - libztex_resetFpga(ztex); - applog(LOG_ERR, "%s: frequency drop of %.1f%% detect. This may be caused by overheating. FPGA is shut down to prevent damage.", ztex->repr, (1.0-1.0*bestM/maxM)*100); - return false; - } - return true; + int i, maxM, bestM; + double bestR, r; + + for (i=0; ifreqMaxM; i++) { + if (ztex->maxErrorRate[i+1]*i < ztex->maxErrorRate[i]*(i+20)) + ztex->maxErrorRate[i+1] = ztex->maxErrorRate[i]*(1.0+20.0/i); + } + + maxM = 0; + while (maxMfreqMDefault && ztex->maxErrorRate[maxM+1]freqMaxM && ztex->errorWeight[maxM]>150 && ztex->maxErrorRate[maxM+1]freqM ? LIBZTEX_ERRORHYSTERESIS : 0))*(1-ztex->maxErrorRate[i]); + if (r > bestR) { + bestM = i; + bestR = r; + } + } + + if (bestM != ztex->freqM) { + libztex_setFreq(ztex, bestM); + } + + maxM = ztex->freqMDefault; + while (maxMfreqMaxM && ztex->errorWeight[maxM+1] > 100) + maxM++; + if ((bestM < (1.0-LIBZTEX_OVERHEATTHRESHOLD) * maxM) && bestM < maxM - 1) { + libztex_resetFpga(ztex); + applog(LOG_ERR, "%s: frequency drop of %.1f%% detect. This may be caused by overheating. FPGA is shut down to prevent damage.", ztex->repr, (1.0-1.0*bestM/maxM)*100); + return false; + } + return true; } @@ -111,198 +111,198 @@ static bool ztex_checkNonce (struct libztex_device *ztex, struct work *work, struct libztex_hash_data *hdata) { - uint32_t *data32 = (uint32_t *)(work->data); - unsigned char swap[128]; - uint32_t *swap32 = (uint32_t *)swap; - unsigned char hash1[32]; - unsigned char hash2[32]; - uint32_t *hash2_32 = (uint32_t *)hash2; - int i; + uint32_t *data32 = (uint32_t *)(work->data); + unsigned char swap[128]; + uint32_t *swap32 = (uint32_t *)swap; + unsigned char hash1[32]; + unsigned char hash2[32]; + uint32_t *hash2_32 = (uint32_t *)hash2; + int i; #if defined(__BIGENDIAN__) || defined(MIPSEB) - hdata->nonce = swab32(hdata->nonce); - hdata->hash7 = swab32(hdata->hash7); + hdata->nonce = swab32(hdata->nonce); + hdata->hash7 = swab32(hdata->hash7); #endif - work->data[64 + 12 + 0] = (hdata->nonce >> 0) & 0xff; - work->data[64 + 12 + 1] = (hdata->nonce >> 8) & 0xff; - work->data[64 + 12 + 2] = (hdata->nonce >> 16) & 0xff; - work->data[64 + 12 + 3] = (hdata->nonce >> 24) & 0xff; + work->data[64 + 12 + 0] = (hdata->nonce >> 0) & 0xff; + work->data[64 + 12 + 1] = (hdata->nonce >> 8) & 0xff; + work->data[64 + 12 + 2] = (hdata->nonce >> 16) & 0xff; + work->data[64 + 12 + 3] = (hdata->nonce >> 24) & 0xff; - for (i = 0; i < 80 / 4; i++) - swap32[i] = swab32(data32[i]); - - sha2(swap, 80, hash1, false); - sha2(hash1, 32, hash2, false); + for (i = 0; i < 80 / 4; i++) + swap32[i] = swab32(data32[i]); + + sha2(swap, 80, hash1, false); + sha2(hash1, 32, hash2, false); #if defined(__BIGENDIAN__) || defined(MIPSEB) - if (hash2_32[7] != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) { + if (hash2_32[7] != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) { #else - if (swab32(hash2_32[7]) != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) { + if (swab32(hash2_32[7]) != ((hdata->hash7 + 0x5be0cd19) & 0xFFFFFFFF)) { #endif - ztex->errorCount[ztex->freqM] += 1.0/ztex->numNonces; - applog(LOG_DEBUG, "%s: checkNonce failed for %0.8X", ztex->repr, hdata->nonce); - return false; - } - return true; + ztex->errorCount[ztex->freqM] += 1.0/ztex->numNonces; + applog(LOG_DEBUG, "%s: checkNonce failed for %0.8X", ztex->repr, hdata->nonce); + return false; + } + return true; } static uint64_t ztex_scanhash(struct thr_info *thr, struct work *work, - __maybe_unused uint64_t max_nonce) + __maybe_unused uint64_t max_nonce) { - struct libztex_device *ztex; - unsigned char sendbuf[44]; - int i, j; - uint32_t backlog[GOLDEN_BACKLOG]; - int backlog_p = 0; - uint32_t lastnonce[GOLDEN_BACKLOG], nonce, noncecnt = 0; - bool overflow, found, rv; - struct libztex_hash_data hdata[GOLDEN_BACKLOG]; - - ztex = thr->cgpu->device; - - memcpy(sendbuf, work->data + 64, 12); - memcpy(sendbuf+12, work->midstate, 32); - memset(backlog, 0, sizeof(backlog)); - i = libztex_sendHashData(ztex, sendbuf); - if (i < 0) { - // Something wrong happened in send - applog(LOG_ERR, "%s: Failed to send hash data with err %d", ztex->repr, i); - usleep(500000); - i = libztex_sendHashData(ztex, sendbuf); - if (i < 0) { - // And there's nothing we can do about it - ztex_disable(thr); - return 0; - } - } - - applog(LOG_DEBUG, "sent hashdata"); - - for (i=0; inumNonces; i++) { - lastnonce[i] = 0; - } - overflow = false; - - while (!(overflow || work_restart[thr->id].restart)) { - usleep(250000); - if (work_restart[thr->id].restart) { - break; - } - i = libztex_readHashData(ztex, &hdata[0]); - if (i < 0) { - // Something wrong happened in read - applog(LOG_ERR, "%s: Failed to read hash data with err %d", ztex->repr, i); - usleep(500000); - i = libztex_readHashData(ztex, &hdata[0]); - if (i < 0) { - // And there's nothing we can do about it - ztex_disable(thr); - return 0; - } - } - - if (work_restart[thr->id].restart) { - break; - } - - ztex->errorCount[ztex->freqM] *= 0.995; - ztex->errorWeight[ztex->freqM] = ztex->errorWeight[ztex->freqM] * 0.995 + 1.0; + struct libztex_device *ztex; + unsigned char sendbuf[44]; + int i, j; + uint32_t backlog[GOLDEN_BACKLOG]; + int backlog_p = 0; + uint32_t lastnonce[GOLDEN_BACKLOG], nonce, noncecnt = 0; + bool overflow, found, rv; + struct libztex_hash_data hdata[GOLDEN_BACKLOG]; + + ztex = thr->cgpu->device; + + memcpy(sendbuf, work->data + 64, 12); + memcpy(sendbuf+12, work->midstate, 32); + memset(backlog, 0, sizeof(backlog)); + i = libztex_sendHashData(ztex, sendbuf); + if (i < 0) { + // Something wrong happened in send + applog(LOG_ERR, "%s: Failed to send hash data with err %d", ztex->repr, i); + usleep(500000); + i = libztex_sendHashData(ztex, sendbuf); + if (i < 0) { + // And there's nothing we can do about it + ztex_disable(thr); + return 0; + } + } + + applog(LOG_DEBUG, "sent hashdata"); + + for (i=0; inumNonces; i++) { + lastnonce[i] = 0; + } + overflow = false; + + while (!(overflow || work_restart[thr->id].restart)) { + usleep(250000); + if (work_restart[thr->id].restart) { + break; + } + i = libztex_readHashData(ztex, &hdata[0]); + if (i < 0) { + // Something wrong happened in read + applog(LOG_ERR, "%s: Failed to read hash data with err %d", ztex->repr, i); + usleep(500000); + i = libztex_readHashData(ztex, &hdata[0]); + if (i < 0) { + // And there's nothing we can do about it + ztex_disable(thr); + return 0; + } + } + + if (work_restart[thr->id].restart) { + break; + } + + ztex->errorCount[ztex->freqM] *= 0.995; + ztex->errorWeight[ztex->freqM] = ztex->errorWeight[ztex->freqM] * 0.995 + 1.0; - for (i=0; inumNonces; i++) { - nonce = swab32(hdata[i].nonce); - if (nonce > noncecnt) - noncecnt = nonce; - if ((nonce >> 4) < (lastnonce[i] >> 4)) { - overflow = true; - } else { - lastnonce[i] = nonce; - } - if (!ztex_checkNonce(ztex, work, &hdata[i])) { - thr->cgpu->hw_errors++; - continue; - } - nonce = hdata[i].goldenNonce; - if (nonce > 0) { - found = false; - for (j=0; j= GOLDEN_BACKLOG) { - backlog_p = 0; - } + for (i=0; inumNonces; i++) { + nonce = swab32(hdata[i].nonce); + if (nonce > noncecnt) + noncecnt = nonce; + if ((nonce >> 4) < (lastnonce[i] >> 4)) { + overflow = true; + } else { + lastnonce[i] = nonce; + } + if (!ztex_checkNonce(ztex, work, &hdata[i])) { + thr->cgpu->hw_errors++; + continue; + } + nonce = hdata[i].goldenNonce; + if (nonce > 0) { + found = false; + for (j=0; j= GOLDEN_BACKLOG) { + backlog_p = 0; + } #if defined(__BIGENDIAN__) || defined(MIPSEB) - nonce = swab32(nonce); + nonce = swab32(nonce); #endif - work->blk.nonce = 0xffffffff; - rv = submit_nonce(thr, work, nonce); - applog(LOG_DEBUG, "submitted %0.8X %d", nonce, rv); - } - } + work->blk.nonce = 0xffffffff; + rv = submit_nonce(thr, work, nonce); + applog(LOG_DEBUG, "submitted %0.8X %d", nonce, rv); + } + } - } + } - } + } - ztex->errorRate[ztex->freqM] = ztex->errorCount[ztex->freqM] / ztex->errorWeight[ztex->freqM] * (ztex->errorWeight[ztex->freqM]<100 ? ztex->errorWeight[ztex->freqM]*0.01 : 1.0); - if (ztex->errorRate[ztex->freqM] > ztex->maxErrorRate[ztex->freqM]) { - ztex->maxErrorRate[ztex->freqM] = ztex->errorRate[ztex->freqM]; - } + ztex->errorRate[ztex->freqM] = ztex->errorCount[ztex->freqM] / ztex->errorWeight[ztex->freqM] * (ztex->errorWeight[ztex->freqM]<100 ? ztex->errorWeight[ztex->freqM]*0.01 : 1.0); + if (ztex->errorRate[ztex->freqM] > ztex->maxErrorRate[ztex->freqM]) { + ztex->maxErrorRate[ztex->freqM] = ztex->errorRate[ztex->freqM]; + } - if (!ztex_updateFreq(ztex)) { - // Something really serious happened, so mark this thread as dead! - return 0; - } - applog(LOG_DEBUG, "exit %1.8X", noncecnt); + if (!ztex_updateFreq(ztex)) { + // Something really serious happened, so mark this thread as dead! + return 0; + } + applog(LOG_DEBUG, "exit %1.8X", noncecnt); - work->blk.nonce = 0xffffffff; + work->blk.nonce = 0xffffffff; - return noncecnt > 0 ? noncecnt : 1; + return noncecnt > 0 ? noncecnt : 1; } static void ztex_statline_before(char *buf, struct cgpu_info *cgpu) { - if (cgpu->deven == DEV_ENABLED) { - tailsprintf(buf, "%s | ", cgpu->device->snString); - tailsprintf(buf, "%0.2fMhz | ", cgpu->device->freqM1 * (cgpu->device->freqM + 1)); - } + if (cgpu->deven == DEV_ENABLED) { + tailsprintf(buf, "%s | ", cgpu->device->snString); + tailsprintf(buf, "%0.2fMhz | ", cgpu->device->freqM1 * (cgpu->device->freqM + 1)); + } } static bool ztex_prepare(struct thr_info *thr) { - struct timeval now; - struct cgpu_info *ztex = thr->cgpu; + struct timeval now; + struct cgpu_info *ztex = thr->cgpu; - gettimeofday(&now, NULL); - get_datestamp(ztex->init, &now); + gettimeofday(&now, NULL); + get_datestamp(ztex->init, &now); - if (libztex_configureFpga(ztex->device) != 0) { - return false; - } - ztex->device->freqM = -1; - ztex_updateFreq(ztex->device); + if (libztex_configureFpga(ztex->device) != 0) { + return false; + } + ztex->device->freqM = -1; + ztex_updateFreq(ztex->device); - return true; + return true; } static void ztex_shutdown(struct thr_info *thr) { - if (thr->cgpu->device != NULL) { - libztex_destroy_device(thr->cgpu->device); - thr->cgpu->device = NULL; - } + if (thr->cgpu->device != NULL) { + libztex_destroy_device(thr->cgpu->device); + thr->cgpu->device = NULL; + } } static void ztex_disable (struct thr_info *thr) { - applog(LOG_ERR, "%s: Disabling!", thr->cgpu->device->repr); - devices[thr->cgpu->device_id]->deven = DEV_DISABLED; - ztex_shutdown(thr); + applog(LOG_ERR, "%s: Disabling!", thr->cgpu->device->repr); + devices[thr->cgpu->device_id]->deven = DEV_DISABLED; + ztex_shutdown(thr); } struct device_api ztex_api = {