Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }