private int parseHeader(string header, ref uint siliconId, ref byte siliconRev, ref byte checksumType) { byte[] rowData = fromAscii(header); if (rowData.Length != 6) { return((int)HostStatus.CYRET_ERR_LENGTH); } siliconId = ((uint)rowData[0] << 24) | ((uint)rowData[1] << 16) | ((uint)rowData[2] << 8) | ((uint)rowData[3]); siliconRev = rowData[4]; checksumType = rowData[5]; return((int)HostStatus.CYRET_SUCCESS); }
private int runAction(BootloaderAction action, Stream fileStream) { uint siliconId = 0; byte siliconRev = 0; byte checksumType = 0; int err = (int)HostStatus.CYRET_SUCCESS; MemoryStream ms = new MemoryStream(); fileStream.CopyTo(ms); int currentRow = 0; int rowCount = getRows(ms) - 2; using (StreamReader cyacdReader = new StreamReader(ms)) { err = parseHeader(cyacdReader.ReadLine(), ref siliconId, ref siliconRev, ref checksumType); this.checksumType = (checksumType == 1) ? BootloaderChecksum.CRC : BootloaderChecksum.SUM; if (err == (int)HostStatus.CYRET_SUCCESS) { err = startBootload(siliconId, siliconRev); } if (action == BootloaderAction.VERSION) { if (err == (int)HostStatus.CYRET_SUCCESS) { byte[] getMetadataRes = transferData(createPacket(BootloaderCommand.CMD_GET_METADATA, new byte[1] { 0x00 }), 0x56, true); if ((BootloaderStatus)getMetadataRes[1] != BootloaderStatus.CYRET_SUCCESS) { err = getMetadataRes[1] | 0x4000; } else { err = ((ushort)getMetadataRes[0x19] << 8) | getMetadataRes[0x1A]; transferData(createPacket(BootloaderCommand.CMD_EXIT_BOOTLOADER, new byte[1] { 0 }), 0, false); return(err); } } } else { ushort startRow = 0; while (err == (int)HostStatus.CYRET_SUCCESS) { byte arrayId = 0; ushort rowNum = 0; ushort size = 0; byte checksum = 0; byte[] rowData = null; err = parseRowData(cyacdReader.ReadLine(), ref arrayId, ref rowNum, ref rowData, ref size, ref checksum); if (startRow == 0) { startRow = rowNum; } if (err != (int)HostStatus.CYRET_SUCCESS) { break; } switch (action) { case BootloaderAction.TEST: err = (int)HostStatus.CYRET_ERR_EOF; break; case BootloaderAction.ERASE: err = eraseRow(arrayId, rowNum); break; case BootloaderAction.PROGRAM: int retry = 5; do { err = programRow(arrayId, rowNum, rowData); } while (--retry != 0 && err != 0); if (err == (int)HostStatus.CYRET_SUCCESS) { goto case BootloaderAction.VERIFY; } break; case BootloaderAction.VERIFY: byte checksum2 = (byte)(checksum + arrayId + (ushort)rowNum + (ushort)(rowNum >> 8) + (ushort)rowData.Length + (ushort)(rowData.Length >> 8)); err = verifyRow(arrayId, rowNum, checksum2); break; } if (cancelToken != null && cancelToken.IsCancellationRequested) { err = (int)HostStatus.CYRET_ABORT; } settings.Update((ushort)((float)currentRow++ / rowCount * 100.0f)); } } transferData(createPacket(BootloaderCommand.CMD_EXIT_BOOTLOADER, new byte[1] { 0 }), 0, false); settings.CloseConnection(); } if (err == (int)HostStatus.CYRET_ERR_EOF) { return((int)HostStatus.CYRET_SUCCESS); } return(err); }