| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // Copyright (C) 2014 Michael McMaster <michael@codesrc.com>
- //
- // This file is part of SCSI2SD.
- //
- // SCSI2SD is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // SCSI2SD is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with SCSI2SD. If not, see <http://www.gnu.org/licenses/>.
- #include "Firmware.hh"
- extern "C"
- {
- #include "cybtldr_parse.h"
- }
- #include <functional>
- #include <sstream>
- #include <stdexcept>
- #include <string.h>
- using namespace SCSI2SD;
- namespace
- {
- struct FirmwareFile
- {
- ~FirmwareFile()
- {
- CyBtldr_CloseDataFile();
- }
- };
- }
- Firmware::Firmware(const std::string& path)
- {
- if (CyBtldr_OpenDataFile(path.c_str()) != CYRET_SUCCESS)
- {
- std::stringstream msg;
- msg << "Could not open file: " << path;
- throw std::runtime_error(msg.str());
- }
- FirmwareFile closeOnReturn;
- uint8_t buffer[MAX_BUFFER_SIZE];
- unsigned int lineSize;
- if (
- CyBtldr_ReadLine(&lineSize, reinterpret_cast<char*>(buffer))
- != CYRET_SUCCESS
- )
- {
- std::stringstream msg;
- msg << "Could not read file: " << path;
- throw std::runtime_error(msg.str());
- }
- {
- unsigned long silId;
- unsigned char silRev;
- unsigned char chksum[MAX_BUFFER_SIZE];
- if (
- CyBtldr_ParseHeader(
- lineSize,
- buffer,
- &silId,
- &silRev,
- chksum)
- != CYRET_SUCCESS)
- {
- std::stringstream msg;
- msg << "Premature end of file: " << path;
- throw std::runtime_error(msg.str());
- }
- mySiliconId = silId;
- mySiliconRev = static_cast<int>(silRev);
- }
- // Count the number of flash rows. This is used to show "percentage
- // complete" when uploading the firmware.
- myTotalFlashRows = 0;
- while (
- CyBtldr_ReadLine(&lineSize, reinterpret_cast<char*>(buffer))
- == CYRET_SUCCESS
- )
- {
- myTotalFlashRows++;
- }
- }
- Firmware::~Firmware()
- {
- }
|