public virtual byte[] ReadMemory(MemSource memType, int startAddress, int maxSize, bool breakOnEraseBlock = false) { var flashbuf = new byte[maxSize]; int bytesReaded = 0; int bytesToRead = maxSize; int blockSize = 200; while (bytesToRead > 0) { if (bytesToRead < blockSize) { blockSize = bytesToRead; } LoadAddress(startAddress); var blockbuf = new byte[blockSize]; ReadPage(memType, blockSize, ref blockbuf); if (breakOnEraseBlock && blockbuf.All(v => v == 0xFF)) { break; //erased block found } Array.Copy(blockbuf, 0, flashbuf, bytesReaded, blockSize); bytesReaded += blockSize; startAddress += blockSize; bytesToRead -= blockSize; NotifyReadProgress(bytesReaded); } Array.Resize(ref flashbuf, bytesReaded); return(flashbuf); }
public override void WriteMemory(MemSource memType, int startAddress, int pageSize, byte[] databuf) { if (memType == MemSource.EEPROM) { base.WriteMemory(memType, startAddress, pageSize, databuf); return; } int bytesWritten = 0; int bytesToWrite = databuf.Length; int blockSize = ASPConst.USBASP_RW_BLOCKSIZE; int blockFlag = ASPConst.USBASP_BLOCKFLAG_FIRST; while (bytesToWrite > 0) { if (bytesToWrite <= blockSize) { blockSize = bytesToWrite; blockFlag |= ASPConst.USBASP_BLOCKFLAG_LAST; } // paged write var param = (pageSize & 0xFF); //lsb param |= ((blockFlag & 0x0F) + ((pageSize & 0xF00) >> 4)) << 8; //msb, TP: Mega128 fix var blockbuf = new byte[blockSize]; Array.Copy(databuf, bytesWritten, blockbuf, 0, blockSize); WriteUsbEndpointOut(ASPCMD.USBASP_FUNC_WRITEFLASH, blockbuf, startAddress, param, blockSize); blockFlag = 0; bytesWritten += blockSize; startAddress += blockSize; bytesToWrite -= blockSize; NotifyWriteProgress(bytesWritten); } }
protected override void ReadPage(MemSource source, int size, ref byte[] data) { var memType = (source == MemSource.Flash) ? 'F' : 'E'; var i = 0; var cmd = new byte[5]; cmd[i++] = StkCommand.CMD_READ_PAGE; cmd[i++] = MSB16(size); cmd[i++] = LSB16(size); cmd[i++] = (byte)memType; cmd[i++] = StkCommand.CRC_EOP; data = ExecuteCommand(cmd, size); }
protected override void WritePage(MemSource source, int size, byte[] data) { var memType = (source == MemSource.Flash) ? 'F' : 'E'; var i = 0; var cmd = new byte[5 + size]; cmd[i++] = StkCommand.CMD_PROG_PAGE; cmd[i++] = MSB16(size); cmd[i++] = LSB16(size); cmd[i++] = (byte)memType; Array.Copy(data, 0, cmd, i, size); cmd[cmd.Length - 1] = StkCommand.CRC_EOP; ExecuteCommand(cmd, 0); }
protected override void WritePage(MemSource source, int size, byte[] data) { var cmd = new byte[10 + size]; if (source == MemSource.Flash) { cmd[0] = Stkv2Command.CMD_PROGRAM_FLASH_ISP; } else { cmd[0] = Stkv2Command.CMD_PROGRAM_EEPROM_ISP; } cmd[1] = MSB16(size); cmd[2] = LSB16(size); Array.Copy(data, 0, cmd, 10, size); ExecuteCommand(cmd, 2); }
protected override void ReadPage(MemSource source, int size, ref byte[] data) { var cmd = new byte[3]; if (source == MemSource.Flash) { cmd[0] = Stkv2Command.CMD_READ_FLASH_ISP; } else { cmd[0] = Stkv2Command.CMD_READ_EEPROM_ISP; } cmd[1] = MSB16(size); cmd[2] = LSB16(size); var response = ExecuteCommand(cmd, size + 3); Array.Copy(response, 2, data, 0, size); }
public virtual void WriteMemory(MemSource memType, int startAddress, int pageSize, byte[] databuf) { int bytesWritten = 0; int bytesToWrite = databuf.Length; int blockSize = pageSize; while (bytesToWrite > 0) { if (bytesToWrite < blockSize) { blockSize = bytesToWrite; } LoadAddress(startAddress); var blockbuf = new byte[blockSize]; Array.Copy(databuf, bytesWritten, blockbuf, 0, blockSize); WritePage(memType, blockSize, blockbuf); bytesWritten += blockSize; startAddress += blockSize; bytesToWrite -= blockSize; NotifyWriteProgress(bytesWritten); } }
protected abstract void WritePage(MemSource source, int size, byte[] data);
protected abstract void ReadPage(MemSource source, int size, ref byte[] data);
protected override void WritePage(MemSource source, int size, byte[] data) { var cmd = (source == MemSource.Flash) ? ASPCMD.USBASP_FUNC_WRITEFLASH : ASPCMD.USBASP_FUNC_WRITEEEPROM; WriteUsbEndpointOut(cmd, data, _pageAddress, 0, size); //eeprom only }
protected override void ReadPage(MemSource source, int size, ref byte[] data) { var cmd = (source == MemSource.Flash) ? ASPCMD.USBASP_FUNC_READFLASH : ASPCMD.USBASP_FUNC_READEEPROM; ReadUsbEndpointIn(cmd, ref data, _pageAddress, 0, size); }