/************************************************************************************************ * Project: USB AVR-ISP * Author: Christian Ulrich * Contact: christian at ullihome dot de * * Creation Date: 2008-12-10 * Copyright: (c) 2008 by Christian Ulrich * License: GPLv2 for private use * commercial use prohibited * * Changes: ***********************************************************************************************/ #include #include #include #include #include #include #include #include #include #include "usbdrv.h" #include "usbconfig.h" #include "led.h" #include "timer.h" #include "main.h" #include "jtag.h" #define FUNC_READ_CHAIN 1 #define FUNC_WRITE_CHAIN 2 #define FUNC_TAP_STATE 3 #define FUNC_GET_TAP_STATE 4 #define FUNC_OPEN 5 #define FUNC_CLOSE 6 #define FUNC_SHIFTBITS 7 #define FUNC_CHAINSIZE 8 #define FUNC_EXECCHAIN 9 #define FUNC_START_BOOTLOADER 30 #define FUNC_GET_TYPE 0xFE #define STATE_IDLE 0 #define STATE_READ 1 #define STATE_WRITE 2 uint8_t usb_state = STATE_IDLE; #ifndef USBASP_COMPATIBLE led_t leds[] = {{4,LED_OFF,LED_OFF}, {3,LED_OFF,LED_OFF}, {5,LED_OFF,LED_OFF} }; #else led_t leds[] = {{0,LED_OFF,LED_OFF}, {1,LED_OFF,LED_OFF}, {3,LED_OFF,LED_OFF} }; #endif const uint8_t led_count = sizeof(leds)/sizeof(led_t); #define MAX_CHAINSIZE 900 unsigned char JTAG_CHAIN[MAX_CHAINSIZE]; unsigned int chainpos = 0; int main(void) { extern uchar usbNewDeviceAddr; uint8_t i; PORTC |= (1<>8; len = 2; } else if (data[1] == FUNC_EXECCHAIN) { /* unsigned char i; for (i = 0; i < len / 2; i++) { unsigned char z = JTAG_CHAIN[i]; JTAG_CHAIN[i] = JTAG_CHAIN[len - i - 1]; JTAG_CHAIN[len - i - 1] = z; }*/ JTAG_shift_bytes(JTAG_CHAIN,chainpos); leds[LED_GREEN].counter = 10; leds[LED_GREEN].frequency = LED_FLASH_NEG; } leds[LED_BLUE].counter = 10; leds[LED_BLUE].frequency = LED_FLASH_NEG; usbMsgPtr = replyBuffer; return len; } uint8_t usbFunctionRead( uint8_t *data, uint8_t len ) { if (usb_state != STATE_READ) return 0xff; uint8_t asize = 0; memcpy(data,&JTAG_CHAIN[chainpos],len); chainpos += len; asize+=len; return asize; } uint8_t usbFunctionWrite( uint8_t *data, uint8_t len ) { if (usb_state != STATE_WRITE) return 0xff; memcpy(&JTAG_CHAIN[chainpos],data,len); chainpos += len; return len; }