/* Universal functions: for both SPI and TPI */ static int aspspi_initialize(PROGRAMMER * pgm, AVRPART * p) { unsigned char temp[4] = {0, 0, 0, 0}; unsigned char res[4]; IMPORT_PDATA(pgm); if (verbose > 2) fprintf(stderr, "%s: aspspi_initialize()\n", progname); /* get capabilities */ if(aspspi_transmit(pgm, 1, USBASP_FUNC_GETCAPABILITIES, temp, res, sizeof(res)) == 4) pdata->capabilities = res[0] | ((unsigned int)res[1] << 8) | ((unsigned int)res[2] << 16) | ((unsigned int)res[3] << 24); else pdata->capabilities = 0; /* set sck period */ pgm->set_sck_period(pgm, pgm->bitclock); /* connect to target device */ aspspi_transmit(pgm, 1, USBASP_FUNC_CONNECT, temp, res, sizeof(res)); /* wait, so device is ready to receive commands */ usleep(10000); return 0; }
/* Universal functions: for both SPI and TPI */ static int usbasp_initialize(PROGRAMMER * pgm, AVRPART * p) { unsigned char temp[4]; unsigned char res[4]; IMPORT_PDATA(pgm); if (verbose > 2) fprintf(stderr, "%s: usbasp_initialize()\n", progname); /* get capabilities */ memset(temp, 0, sizeof(temp)); if(usbasp_transmit(pgm, 1, USBASP_FUNC_GETCAPABILITIES, temp, res, sizeof(res)) == 4) pdata->capabilities = res[0] | ((unsigned int)res[1] << 8) | ((unsigned int)res[2] << 16) | ((unsigned int)res[3] << 24); else pdata->capabilities = 0; pdata->use_tpi = ((pdata->capabilities & USBASP_CAP_TPI) != 0 && (p->flags & AVRPART_HAS_TPI) != 0) ? 1 : 0; if(pdata->use_tpi) { /* calc tpiclk delay */ int dly = 1500000.0 * pgm->bitclock; if(dly < 1) dly = 1; else if(dly > 2047) dly = 2047; temp[0] = dly; temp[1] = dly >> 8; /* connect */ usbasp_transmit(pgm, 1, USBASP_FUNC_TPI_CONNECT, temp, res, sizeof(res)); /* change interface */ pgm->program_enable = usbasp_tpi_program_enable; pgm->chip_erase = usbasp_tpi_chip_erase; pgm->cmd = usbasp_tpi_cmd; pgm->read_byte = usbasp_tpi_read_byte; pgm->write_byte = usbasp_tpi_write_byte; pgm->paged_write = usbasp_tpi_paged_write; pgm->paged_load = usbasp_tpi_paged_load; pgm->set_sck_period = usbasp_tpi_set_sck_period; }