示例#1
0
static bool hfa_initialise(struct cgpu_info *hashfast)
{
    int err;

    if (hashfast->usbinfo.nodev)
        return false;

    hfa_clear_readbuf(hashfast);

    err = usb_transfer(hashfast, 0, 9, 1, 0, C_ATMEL_RESET);
    if (!err)
        err = usb_transfer(hashfast, 0x21, 0x22, 0, 0, C_ATMEL_OPEN);
    if (!err) {
        uint32_t buf[2];

        /* Magic sequence to reset device only really needed for windows
         * but harmless on linux. */
        buf[0] = 0x80250000;
        buf[1] = 0x00000800;
        err = usb_transfer_data(hashfast, 0x21, 0x20, 0x0000, 0, buf,
                                7, C_ATMEL_INIT);
    }
    if (err < 0) {
        applog(LOG_INFO, "HFA %d: Failed to open with error %s",
               hashfast->device_id, libusb_error_name(err));
    }
    /* Must have transmitted init sequence sized buffer */
    return (err == 7);
}
示例#2
0
int32_t auc_init(AUC_HANDLE handle, uint32_t clk_rate, uint32_t xfer_delay)
{
	struct cdc_i2c_configparams params;
	uint8_t buf[CDC_I2C_PACKET_SZ];
	struct cdc_i2c_header *pheader = (struct cdc_i2c_header*)buf;
	uint32_t i, count;

	params.clk_rate[0] = clk_rate & 0xff;
	params.clk_rate[1] = (clk_rate >> 8) & 0xff;
	params.clk_rate[2] = (clk_rate >> 16) & 0xff;
	params.clk_rate[3] = (clk_rate >> 24) & 0xff;
	params.xfer_delay[0] = xfer_delay & 0xff;
	params.xfer_delay[1] = (xfer_delay >> 8) & 0xff;
	params.xfer_delay[2] = (xfer_delay >> 16) & 0xff;
	params.xfer_delay[3] = (xfer_delay >> 24) & 0xff;

	memset(buf, 0, CDC_I2C_PACKET_SZ);
	while (!usb_transfer(handle, NULL, 0, buf, CDC_I2C_PACKET_SZ));
	count = auc_pkg_init(CDC_I2C_REQ_INIT_PORT, (uint8_t*)&params, sizeof(params));
	if (usb_transfer(handle, g_auc_pkg, count, buf, CDC_I2C_PACKET_SZ)) {
		printf("auc_init usb_transfer failed!\n");
		return 1;
	}

	for (i = 0; i < AUC_DEVCNT; i++) {
		if (handle == auc_devctx.handle[i])
			break;
	}

	if (i >= AUC_DEVCNT) {
		printf("auc_init i(%d) > AUC_DEVCNT", i);
		return 1;
	}

	if (pheader->length > CDC_I2C_HEADER_SZ) {
		memset(auc_devctx.auc_ver[i], 0, AUC_VERLEN+1);
		memcpy(auc_devctx.auc_ver[i], buf + CDC_I2C_HEADER_SZ, AUC_VERLEN);
		auc_devctx.auc_ver[i][AUC_VERLEN] = '\0';
	} else {
		printf("auc_init pheader->length = %d\n", pheader->length);
		return 1;
	}

	return 0;
}
示例#3
0
static void bitforce_initialise(struct cgpu_info *bitforce, bool lock)
{
	int err;

	if (lock)
		mutex_lock(&bitforce->device_mutex);

	// Reset
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
				FTDI_VALUE_RESET, bitforce->usbdev->found->interface, C_RESET);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: reset got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Set data control
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_DATA,
				FTDI_VALUE_DATA, bitforce->usbdev->found->interface, C_SETDATA);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: setdata got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Set the baud
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_BAUD, FTDI_VALUE_BAUD,
				(FTDI_INDEX_BAUD & 0xff00) | bitforce->usbdev->found->interface,
				C_SETBAUD);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: setbaud got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Set Flow Control
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
				FTDI_VALUE_FLOW, bitforce->usbdev->found->interface, C_SETFLOW);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: setflowctrl got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Set Modem Control
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
				FTDI_VALUE_MODEM, bitforce->usbdev->found->interface, C_SETMODEM);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: setmodemctrl got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Clear any sent data
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
				FTDI_VALUE_PURGE_TX, bitforce->usbdev->found->interface, C_PURGETX);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: purgetx got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	// Clear any received data
	err = usb_transfer(bitforce, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
				FTDI_VALUE_PURGE_RX, bitforce->usbdev->found->interface, C_PURGERX);
	if (opt_debug)
		applog(LOG_DEBUG, "%s%i: purgerx got err %d",
			bitforce->drv->name, bitforce->device_id, err);

	if (lock)
		mutex_unlock(&bitforce->device_mutex);
}
示例#4
0
int32_t auc_xfer(AUC_HANDLE handle, uint8_t slaveAddr, uint8_t *wbuf, uint32_t wlen, uint8_t *rbuf, uint32_t rlen, uint8_t *respcode)
{
	struct cdc_i2c_xferparams params;
	uint8_t buf[CDC_I2C_PACKET_SZ];
	struct cdc_i2c_header *pheader = (struct cdc_i2c_header *)buf;
	int32_t count;

	while ((wlen > 0) || (rlen > 0)) {
		memset(&params, 0, sizeof(params));

		if (wlen >= CDC_I2C_PAYLOAD_SZ) {
			params.txLength = CDC_I2C_PAYLOAD_SZ;
			wlen -= CDC_I2C_PAYLOAD_SZ;
		} else {
			params.txLength = wlen;
			wlen = 0;
		}

		if (rlen >= (CDC_I2C_PACKET_SZ - CDC_I2C_HEADER_SZ)) {
			params.rxLength = (CDC_I2C_PACKET_SZ - CDC_I2C_HEADER_SZ);
			rlen -= (CDC_I2C_PACKET_SZ - CDC_I2C_HEADER_SZ);
		} else {
			params.rxLength = rlen;
			rlen = 0;
		}
		params.reserved = 0;
		params.slaveAddr = slaveAddr;
		if (params.txLength)
			memcpy(params.data, wbuf, params.txLength);

		memset(buf, 0, CDC_I2C_PACKET_SZ);
		count = auc_pkg_init(CDC_I2C_REQ_DEVICE_XFER, (uint8_t*)&params, params.txLength + sizeof(struct cdc_i2c_header));
		if (usb_transfer(handle, g_auc_pkg, count, buf, CDC_I2C_PACKET_SZ)) {
#ifdef DEBUG_VERBOSE
			printf("auc_xfer usb_transfer failed!\n");
#endif
			return 0;
		}

		if (pheader->length > CDC_I2C_HEADER_SZ)
			memcpy(rbuf, buf + CDC_I2C_HEADER_SZ, pheader->length - CDC_I2C_HEADER_SZ);
#ifdef DEBUG_VERBOSE
		else {
			printf("auc_xfer pheader->length = %d\n", pheader->length);
		}
#endif
		wbuf += CDC_I2C_PAYLOAD_SZ;
		rbuf += (CDC_I2C_PACKET_SZ - CDC_I2C_HEADER_SZ);
	}

	if (respcode)
		*respcode = buf[CDC_I2C_HEADER_SZ - 1];

	return pheader->length - CDC_I2C_HEADER_SZ;
}
示例#5
0
int32_t auc_deinit(AUC_HANDLE handle)
{
	uint32_t count;
	uint8_t buf[CDC_I2C_HEADER_SZ];

	memset(buf, 0, CDC_I2C_HEADER_SZ);
	count = auc_pkg_init(CDC_I2C_REQ_DEINIT_PORT, NULL, 0);
	if (usb_transfer(handle, g_auc_pkg, count, buf, CDC_I2C_HEADER_SZ)) {
		printf("auc_deinit usb_transfer failed!\n");
		return 1;
	}

	return 0;
}
示例#6
0
static int gridseed_ftdi_init(struct cgpu_info *gridseed, int interface)
{
	int err;

	// Reset
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
				FTDI_VALUE_RESET, interface, C_RESET);

	applog(LOG_DEBUG, "%s%i: reset got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set latency
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_LATENCY,
			   GRIDSEED_LATENCY, interface, C_LATENCY);

	applog(LOG_DEBUG, "%s%i: latency got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set data
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_DATA,
				FTDI_VALUE_DATA_AVA, interface, C_SETDATA);

	applog(LOG_DEBUG, "%s%i: data got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set the baud
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_BAUD, FTDI_VALUE_BAUD_AVA,
				(FTDI_INDEX_BAUD_AVA & 0xff00) | interface,
				C_SETBAUD);

	applog(LOG_DEBUG, "%s%i: setbaud got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set Modem Control
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
				FTDI_VALUE_MODEM, interface, C_SETMODEM);

	applog(LOG_DEBUG, "%s%i: setmodemctrl got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set Flow Control
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
				FTDI_VALUE_FLOW, interface, C_SETFLOW);

	applog(LOG_DEBUG, "%s%i: setflowctrl got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	/* Avalon repeats the following */
	// Set Modem Control
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
				FTDI_VALUE_MODEM, interface, C_SETMODEM);

	applog(LOG_DEBUG, "%s%i: setmodemctrl 2 got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	// Set Flow Control
	err = usb_transfer(gridseed, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
				FTDI_VALUE_FLOW, interface, C_SETFLOW);

	applog(LOG_DEBUG, "%s%i: setflowctrl 2 got err %d",
		gridseed->drv->name, gridseed->device_id, err);

	if (gridseed->usbinfo.nodev)
		return -1;

	return 0;
}
示例#7
0
static void hashratio_initialise(struct cgpu_info *hashratio)
{
	int err, interface;

	if (hashratio->usbinfo.nodev)
		return;

	interface = usb_interface(hashratio);
	// Reset
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_RESET,
				FTDI_VALUE_RESET, interface, C_RESET);

	applog(LOG_DEBUG, "%s%i: reset got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set latency
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_LATENCY,
			   HASHRATIO_LATENCY, interface, C_LATENCY);

	applog(LOG_DEBUG, "%s%i: latency got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set data
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_DATA,
				FTDI_VALUE_DATA_AVA, interface, C_SETDATA);

	applog(LOG_DEBUG, "%s%i: data got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set the baud
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_BAUD, FTDI_VALUE_BAUD_AVA,
				(FTDI_INDEX_BAUD_AVA & 0xff00) | interface,
				C_SETBAUD);

	applog(LOG_DEBUG, "%s%i: setbaud got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set Modem Control
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
				FTDI_VALUE_MODEM, interface, C_SETMODEM);

	applog(LOG_DEBUG, "%s%i: setmodemctrl got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set Flow Control
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
				FTDI_VALUE_FLOW, interface, C_SETFLOW);

	applog(LOG_DEBUG, "%s%i: setflowctrl got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	/* hashratio repeats the following */
	// Set Modem Control
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_MODEM,
				FTDI_VALUE_MODEM, interface, C_SETMODEM);

	applog(LOG_DEBUG, "%s%i: setmodemctrl 2 got err %d",
		hashratio->drv->name, hashratio->device_id, err);

	if (hashratio->usbinfo.nodev)
		return;

	// Set Flow Control
	err = usb_transfer(hashratio, FTDI_TYPE_OUT, FTDI_REQUEST_FLOW,
				FTDI_VALUE_FLOW, interface, C_SETFLOW);

	applog(LOG_DEBUG, "%s%i: setflowctrl 2 got err %d",
		hashratio->drv->name, hashratio->device_id, err);
}