+
+ } else if (data[1] == USBASP_FUNC_TPI_CONNECT) {
+ tpi_dly_cnt = data[2] | (data[3] << 8);
+
+ /* RST high */
+ ISP_OUT |= (1 << ISP_RST);
+ ISP_DDR |= (1 << ISP_RST);
+
+ clockWait(3);
+
+ /* RST low */
+ ISP_OUT &= ~(1 << ISP_RST);
+ ledRedOn();
+
+ clockWait(16);
+ tpi_init();
+
+ } else if (data[1] == USBASP_FUNC_TPI_DISCONNECT) {
+
+ tpi_send_byte(TPI_OP_SSTCS(TPISR));
+ tpi_send_byte(0);
+
+ clockWait(10);
+
+ /* pulse RST */
+ ISP_OUT |= (1 << ISP_RST);
+ clockWait(5);
+ ISP_OUT &= ~(1 << ISP_RST);
+ clockWait(5);
+
+ /* set all ISP pins inputs */
+ ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));
+ /* switch pullups off */
+ ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));
+
+ ledRedOff();
+
+ } else if (data[1] == USBASP_FUNC_TPI_RAWREAD) {
+ replyBuffer[0] = tpi_recv_byte();
+ len = 1;
+
+ } else if (data[1] == USBASP_FUNC_TPI_RAWWRITE) {
+ tpi_send_byte(data[2]);
+
+ } else if (data[1] == USBASP_FUNC_TPI_READBLOCK) {
+ prog_address = (data[3] << 8) | data[2];
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_TPI_READ;
+ len = 0xff; /* multiple in */
+
+ } else if (data[1] == USBASP_FUNC_TPI_WRITEBLOCK) {
+ prog_address = (data[3] << 8) | data[2];
+ prog_nbytes = (data[7] << 8) | data[6];
+ prog_state = PROG_STATE_TPI_WRITE;
+ len = 0xff; /* multiple out */
+
+ } else if (data[1] == USBASP_FUNC_GETCAPABILITIES) {
+ replyBuffer[0] = USBASP_CAP_0_TPI;
+ replyBuffer[1] = 0;
+ replyBuffer[2] = 0;
+ replyBuffer[3] = 0;
+ len = 4;