private async Task ExtendedErase(uint pageNumber)
{
/* command word */
var tx = new byte[7];
/* temporary storage for response bytes */
var tmp = new byte[1];
/* command code */
tx[0] = (byte)STCmds.EXT_ERASE;
/* checksum */
tx[1] = ComputeChecksum(tx, 0, 1);
/* erase single page */
tx[2] = 0;
tx[3] = 0;
/* set page number */
tx[4] = (byte)(pageNumber >> 8);
tx[5] = (byte)(pageNumber >> 0);
/* checksum */
tx[6] = (byte)~ComputeChecksum(tx, 2, 5);
/* try to send command and wait for response */
try {
/* send bytes */
await SerialWrite(tx, 0, 2);
/* wait for response code */
await SerialRead(tmp, 0, 1);
/* check response code */
if (tmp[0] != (byte)STResps.ACK)
throw new STBootException("Command Rejected");
/* send address */
await SerialWrite(tx, 2, 5);
/* wait for response code. use longer timeout, erase might
* take a while or two. */
await SerialRead(tmp, 0, 1, 3000);
/* check response code */
if (tmp[0] != (byte)STResps.ACK)
throw new STBootException("Page Rejected");
/* oops, something baaad happened! */
} catch (Exception) {
/* release semaphore */
sem.Release();
/* re-throw */
throw;
}
/* release semaphore */
sem.Release();
}