tool/cmd_sii_write.cpp
changeset 1136 a0982873d655
parent 1130 bb1c11adb2db
child 1137 a73c0f54be42
equal deleted inserted replaced
1135:807ec6498502 1136:a0982873d655
    32     const uint16_t *categoryHeader;
    32     const uint16_t *categoryHeader;
    33     uint16_t categoryType, categorySize;
    33     uint16_t categoryType, categorySize;
    34     uint8_t crc;
    34     uint8_t crc;
    35 
    35 
    36     if (slavePosition < 0) {
    36     if (slavePosition < 0) {
    37         err << "'sii_write' requires a slave! Please specify --slave.";
    37         err << "'" << commandName << "' requires a slave! "
    38         throw MasterDeviceException(err.str());
    38             << "Please specify --slave.";
       
    39         throw InvalidUsageException(err);
    39     }
    40     }
    40     data.slave_position = slavePosition;
    41     data.slave_position = slavePosition;
    41 
    42 
    42     if (commandArgs.size() != 1) {
    43     if (commandArgs.size() != 1) {
    43         err << "'ssi_write' takes exactly one argument!";
    44         err << "'" << commandName << "' takes exactly one argument!";
    44         throw MasterDeviceException(err.str());
    45         throw InvalidUsageException(err);
    45     }
    46     }
    46 
    47 
    47     file.open(commandArgs[0].c_str(), ifstream::in | ifstream::binary);
    48     file.open(commandArgs[0].c_str(), ifstream::in | ifstream::binary);
    48     if (file.fail()) {
    49     if (file.fail()) {
    49         err << "Failed to open '" << commandArgs[0] << "'!";
    50         err << "Failed to open '" << commandArgs[0] << "'!";
    50         throw MasterDeviceException(err.str());
    51         throw CommandException(err);
    51     }
    52     }
    52 
    53 
    53     // get length of file
    54     // get length of file
    54     file.seekg(0, ios::end);
    55     file.seekg(0, ios::end);
    55     byte_size = file.tellg();
    56     byte_size = file.tellg();
    56     file.seekg(0, ios::beg);
    57     file.seekg(0, ios::beg);
    57 
    58 
    58     if (!byte_size || byte_size % 2) {
    59     if (!byte_size || byte_size % 2) {
    59         stringstream err;
       
    60         err << "Invalid file size! Must be non-zero and even.";
    60         err << "Invalid file size! Must be non-zero and even.";
    61         throw MasterDeviceException(err.str());
    61         throw CommandException(err);
    62     }
    62     }
    63 
    63 
    64     data.nwords = byte_size / 2;
    64     data.nwords = byte_size / 2;
    65     if (data.nwords < 0x0041 && !force) {
    65     if (data.nwords < 0x0041 && !force) {
    66         err << "SII data too short (" << data.nwords << " words)! Mimimum is"
    66         err << "SII data too short (" << data.nwords << " words)! Mimimum is"
    67                 " 40 fixed words + 1 delimiter. Use --force to write anyway.";
    67                 " 40 fixed words + 1 delimiter. Use --force to write anyway.";
    68         throw MasterDeviceException(err.str());
    68         throw CommandException(err);
    69     }
    69     }
    70 
    70 
    71     // allocate buffer and read file into buffer
    71     // allocate buffer and read file into buffer
    72     data.words = new uint16_t[data.nwords];
    72     data.words = new uint16_t[data.nwords];
    73     file.read((char *) data.words, byte_size);
    73     file.read((char *) data.words, byte_size);
    78         crc = calcSiiCrc((const uint8_t *) data.words, 14);
    78         crc = calcSiiCrc((const uint8_t *) data.words, 14);
    79         if (crc != ((const uint8_t *) data.words)[14]) {
    79         if (crc != ((const uint8_t *) data.words)[14]) {
    80             err << "CRC incorrect. Must be 0x"
    80             err << "CRC incorrect. Must be 0x"
    81                 << hex << setfill('0') << setw(2) << (unsigned int) crc
    81                 << hex << setfill('0') << setw(2) << (unsigned int) crc
    82                 << ". Use --force to write anyway.";
    82                 << ". Use --force to write anyway.";
    83             throw MasterDeviceException(err.str());
    83             throw CommandException(err);
    84         }
    84         }
    85 
    85 
    86         // cycle through categories to detect corruption
    86         // cycle through categories to detect corruption
    87         categoryHeader = data.words + 0x0040U;
    87         categoryHeader = data.words + 0x0040U;
    88         categoryType = le16tocpu(*categoryHeader);
    88         categoryType = le16tocpu(*categoryHeader);
    89         while (categoryType != 0xffff) {
    89         while (categoryType != 0xffff) {
    90             if (categoryHeader + 1 > data.words + data.nwords) {
    90             if (categoryHeader + 1 > data.words + data.nwords) {
    91                 err << "SII data seem to be corrupted! "
    91                 err << "SII data seem to be corrupted! "
    92                     << "Use --force to write anyway.";
    92                     << "Use --force to write anyway.";
    93                 throw MasterDeviceException(err.str());
    93                 throw CommandException(err);
    94             }
    94             }
    95             categorySize = le16tocpu(*(categoryHeader + 1));
    95             categorySize = le16tocpu(*(categoryHeader + 1));
    96             if (categoryHeader + 2 + categorySize + 1
    96             if (categoryHeader + 2 + categorySize + 1
    97                     > data.words + data.nwords) {
    97                     > data.words + data.nwords) {
    98                 err << "SII data seem to be corrupted! "
    98                 err << "SII data seem to be corrupted! "
    99                     "Use --force to write anyway.";
    99                     "Use --force to write anyway.";
   100                 throw MasterDeviceException(err.str());
   100                 throw CommandException(err);
   101             }
   101             }
   102             categoryHeader += 2 + categorySize;
   102             categoryHeader += 2 + categorySize;
   103             categoryType = le16tocpu(*categoryHeader);
   103             categoryType = le16tocpu(*categoryHeader);
   104         }
   104         }
   105     }
   105     }