Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}