tool/cmd_domain.cpp
changeset 1126 b09fd81894cb
child 1130 bb1c11adb2db
equal deleted inserted replaced
1125:9976f7b9fe66 1126:b09fd81894cb
       
     1 /*****************************************************************************
       
     2  *
       
     3  * $Id$
       
     4  *
       
     5  ****************************************************************************/
       
     6 
       
     7 #include <iostream>
       
     8 #include <iomanip>
       
     9 using namespace std;
       
    10 
       
    11 #include "globals.h"
       
    12 
       
    13 /*****************************************************************************/
       
    14 
       
    15 const char *help_domains =
       
    16     "[OPTIONS]\n"
       
    17     "\n"
       
    18     "\n"
       
    19     "Command-specific options:\n";
       
    20 
       
    21 /****************************************************************************/
       
    22 
       
    23 void showDomain(unsigned int);
       
    24 
       
    25 /****************************************************************************/
       
    26 
       
    27 void command_domains(void)
       
    28 {
       
    29     masterDev.open(MasterDevice::Read);
       
    30 
       
    31     if (domainIndex == -1) {
       
    32         unsigned int i;
       
    33         ec_ioctl_master_t master;
       
    34 
       
    35         masterDev.getMaster(&master);
       
    36 
       
    37         for (i = 0; i < master.domain_count; i++) {
       
    38             showDomain(i);
       
    39         }
       
    40     } else {
       
    41         showDomain(domainIndex);
       
    42     }
       
    43 }
       
    44 
       
    45 /****************************************************************************/
       
    46 
       
    47 void showDomain(unsigned int domainIndex)
       
    48 {
       
    49     ec_ioctl_domain_t domain;
       
    50     unsigned char *processData;
       
    51     ec_ioctl_domain_data_t data;
       
    52     unsigned int i, j;
       
    53     ec_ioctl_domain_fmmu_t fmmu;
       
    54     unsigned int dataOffset;
       
    55     
       
    56     masterDev.getDomain(&domain, domainIndex);
       
    57 
       
    58 	cout << "Domain" << dec << domainIndex << ":"
       
    59 		<< " LogBaseAddr 0x"
       
    60 		<< hex << setfill('0')
       
    61         << setw(8) << domain.logical_base_address
       
    62 		<< ", Size " << dec << setfill(' ')
       
    63         << setw(3) << domain.data_size
       
    64 		<< ", WorkingCounter "
       
    65 		<< domain.working_counter << "/"
       
    66         << domain.expected_working_counter << endl;
       
    67 
       
    68     if (!domain.data_size || verbosity != Verbose)
       
    69         return;
       
    70 
       
    71     processData = new unsigned char[domain.data_size];
       
    72 
       
    73     try {
       
    74         masterDev.getData(&data, domainIndex, domain.data_size, processData);
       
    75     } catch (MasterDeviceException &e) {
       
    76         delete [] processData;
       
    77         throw e;
       
    78     }
       
    79 
       
    80     for (i = 0; i < domain.fmmu_count; i++) {
       
    81         masterDev.getFmmu(&fmmu, domainIndex, i);
       
    82 
       
    83         cout << "  SlaveConfig "
       
    84             << dec << fmmu.slave_config_alias
       
    85             << ":" << fmmu.slave_config_position
       
    86             << ", SM" << (unsigned int) fmmu.sync_index << " ("
       
    87             << setfill(' ') << setw(6)
       
    88             << (fmmu.dir == EC_DIR_INPUT ? "Input" : "Output")
       
    89             << "), LogAddr 0x"
       
    90             << hex << setfill('0')
       
    91             << setw(8) << fmmu.logical_address
       
    92             << ", Size " << dec << fmmu.data_size << endl;
       
    93 
       
    94         dataOffset = fmmu.logical_address - domain.logical_base_address;
       
    95         if (dataOffset + fmmu.data_size > domain.data_size) {
       
    96             stringstream err;
       
    97             err << "Fmmu information corrupted!";
       
    98             delete [] processData;
       
    99             throw MasterDeviceException(err.str());
       
   100         }
       
   101 
       
   102         cout << "    " << hex << setfill('0');
       
   103         for (j = 0; j < fmmu.data_size; j++) {
       
   104             if (j && !(j % BreakAfterBytes))
       
   105                 cout << endl << "    ";
       
   106             cout << setw(2)
       
   107                 << (unsigned int) *(processData + dataOffset + j) << " ";
       
   108         }
       
   109         cout << endl;
       
   110     }
       
   111 
       
   112     delete [] processData;
       
   113 }
       
   114 
       
   115 /*****************************************************************************/