uchar usbFunctionWrite(uchar *data, uchar len) { uchar retVal = 0; uchar i; /* check if programmer is in correct write state */ if ((prog_state != PROG_STATE_WRITEFLASH) && (prog_state != PROG_STATE_WRITEEEPROM) && (prog_state != PROG_STATE_TPI_WRITE)) { return 0xff; } if (prog_state == PROG_STATE_TPI_WRITE) { tpi_write_block(prog_address, data, len); prog_address += len; prog_nbytes -= len; if(prog_nbytes <= 0) { prog_state = PROG_STATE_IDLE; return 1; } return 0; } for (i = 0; i < len; i++) { if (prog_state == PROG_STATE_WRITEFLASH) { /* Flash */ if (prog_pagesize == 0) { /* not paged */ ispWriteFlash(prog_address, data[i], 1); } else { /* paged */ ispWriteFlash(prog_address, data[i], 0); prog_pagecounter--; if (prog_pagecounter == 0) { ispFlushPage(prog_address, data[i]); prog_pagecounter = prog_pagesize; } } } else { /* EEPROM */ ispWriteEEPROM(prog_address, data[i]); } prog_nbytes--; if (prog_nbytes == 0) { prog_state = PROG_STATE_IDLE; if ((prog_blockflags & PROG_BLOCKFLAG_LAST) && (prog_pagecounter != prog_pagesize)) { /* last block and page flush pending, so flush it now */ ispFlushPage(prog_address, data[i]); } retVal = 1; // Need to return 1 when no more data is to be received } prog_address++; } return retVal; }
uchar usbFunctionWrite(uchar *data, uchar len) { uchar retVal = 0; uchar i; /* check if programmer is in correct write state */ if ((prog_state != PROG_STATE_WRITEFLASH) && (prog_state != PROG_STATE_WRITEEEPROM) && (prog_state != PROG_STATE_TPI_WRITE)) { return 0xff; } #if 0 if (prog_state == PROG_STATE_TPI_WRITE) { tpi_write_block(prog_address, data, len); prog_address += len; prog_nbytes -= len; if(prog_nbytes <= 0) { prog_state = PROG_STATE_IDLE; return 1; } return 0; } #endif #if 0 #ifdef UART_DEBUG if (prog_state == PROG_STATE_WRITEFLASH) TransmitString("WRFL\r\n"); TransmitString("len:"); TransmitHex(len); TransmitString("\r\n"); TransmitString("ctr:"); TransmitHex(prog_pagecounter/256); TransmitHex(prog_pagecounter); TransmitString("\r\n"); TransmitString("size:"); TransmitHex(prog_pagesize/256); TransmitHex(prog_pagesize); TransmitString("\r\n"); TransmitString("adx:"); TransmitHex(prog_address/256/256); TransmitHex(prog_address/256); TransmitHex(prog_address); TransmitString("\r\n"); #endif #endif flashpagesize = prog_pagesize; for (i = 0; i < len; i++) { if (prog_state == PROG_STATE_WRITEFLASH) { /* Flash */ if (prog_pagesize == 0) { /* not paged */ #ifdef UART_DEBUG TransmitString("NP write not supported"); #endif return 0xff; } else { /* paged */ // load one word into the flash buffer AVRJTAGLoadFlashPage(data + i, prog_address/2, 1); i++; prog_pagecounter--; prog_pagecounter--; if (prog_pagecounter == 0) { AVRJTAGWriteFlashPage(prog_address/2); prog_pagecounter = prog_pagesize; } } } else { /* EEPROM */ AVRJTAGProgramEEPROMByte(data[i], prog_address); } if (prog_state == PROG_STATE_WRITEFLASH) { prog_nbytes-=2; } else { prog_nbytes--; } if (prog_nbytes == 0) { if ((prog_blockflags & PROG_BLOCKFLAG_LAST) && (prog_pagecounter != prog_pagesize)) { /* last block and page flush pending, so flush it now */ if (prog_state == PROG_STATE_WRITEFLASH) { AVRJTAGWriteFlashPage(prog_address/2); } // No need to flush EEPROM } prog_state = PROG_STATE_IDLE; retVal = 1; // Need to return 1 when no more data is to be received } if (prog_state == PROG_STATE_WRITEFLASH) { prog_address += 2; } else { prog_address++; } } return retVal; }