00001
00009 #include <iostream>
00010 using namespace std;
00011
00012 #include <ctype.h>
00013
00014 #include "RodModule.h"
00015
00016 #include "RCCVmeInterface.h"
00017
00018 int main(int argc, char *argv[]) {
00019
00020 using namespace SctPixelRod;
00021
00022 const unsigned long mapSize=0xc00040;
00023 const long numSlaves=4;
00024 unsigned long numWords;
00025 long dspStart;
00026 unsigned long statusVal;
00027 unsigned long txtAddress[4] = {ERR_BUFF_BASE, INFO_BUFF_BASE, \
00028 DIAG_BUFF_BASE, XFER_BUFF_BASE};
00029 unsigned long slvHpic;
00030 unsigned long hpicValue;
00031 void* genPtr;
00032 char* textBuff;
00033 clock_t startTime;
00034
00035 long slvNumber = -1;
00036 std::string fileName(""), option;
00037 int slot = -1;
00038 unsigned long baseAddress;
00039 bool slaveRunning;
00040
00041 if (argc > 1) {
00042 for (int i=1; i<argc; i++) {
00043 option = argv[i];
00044 if (option[0] != '-') break;
00045 switch (option[1]) {
00046 case 's': {
00047 slot = atoi(option.substr(2).c_str());
00048 break;
00049 }
00050 case 'v': {
00051 slvNumber = atoi(option.substr(2).c_str());
00052 break;
00053 }
00054 default: {
00055 break;
00056 }
00057 }
00058 }
00059 }
00060
00061
00062 if (slot < 0 ) {
00063 cout << "Enter slot number (decimal):";
00064 cin >> slot;
00065 while ((slot < 1) || (slot > 21)) {
00066 cout << "Slot number out or range [1:21], re-enter: ";
00067 cin >> slot;
00068 }
00069 }
00070 baseAddress = slot << 24;
00071
00072
00073 RCCVmeInterface *vme1 = new RCCVmeInterface();
00074
00075
00076 RodModule* rod0 = new RodModule(baseAddress, mapSize, *vme1, numSlaves);
00077
00078
00079 if (slvNumber < 0 ) {
00080 cout << "Enter slave number (0-3):";
00081 cin >> slvNumber;
00082 while ((slvNumber < 0) || (slvNumber > 3)) {
00083 cout << "Slave number out or range [0:3], re-enter: ";
00084 cin >> slvNumber;
00085 }
00086 }
00087
00088
00089 slaveRunning = false;
00090 slvHpic = SLAVE_HPIC_BASE + slvNumber*SLAVE_HPI_OFFSET;
00091 hpicValue = rod0->mdspSingleRead(slvHpic);
00092 if (hpicValue == 0xb000b) {
00093 slaveRunning = true;
00094 rod0->setVmeCommandRegBit(CR_DMA_ACCESS_REQ);
00095 startTime = clock();
00096 do {
00097 statusVal = rod0->slvSingleRead(STATUS_REG[0], slvNumber);
00098 if (statusVal == 0x1>>SR_DMA_ACCESS_ERR) {
00099 cout << "Error setting slave DMA ACCESS bit. Program terminating" << endl;
00100 return 0;
00101 }
00102 if ((clock()-startTime)/CLOCKS_PER_SEC > DSP_RESET_TIMEOUT) {
00103 cout << "Timeout waiting for SR_ACCESS_ACK" << endl;
00104 }
00105 } while (statusVal & 0x1>>SR_DMA_ACCESS_ACK);
00106 }
00107
00108 dspStart = SLAVE_PRIM_BUFF_BASE;
00109 numWords = rod0->slvSingleRead(dspStart, slvNumber);
00110 if (numWords > PRIM_BUFF_SIZE) numWords = PRIM_BUFF_SIZE;
00111 unsigned long * buffer = new unsigned long[numWords];
00112 rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00113
00114
00115 cout << "PRIM Buffer:" << endl;
00116 hex(cout);
00117 cout.fill('0');
00118 for (unsigned int i=0; i<numWords; i+=8) {
00119 cout.width(8); cout << buffer[i] << ' ';
00120 cout.width(8); cout << buffer[i+1] << ' ';
00121 cout.width(8); cout << buffer[i+2] << ' ';
00122 cout.width(8); cout << buffer[i+3] << ' ';
00123 cout.width(8); cout << buffer[i+4] << ' ';
00124 cout.width(8); cout << buffer[i+5] << ' ';
00125 cout.width(8); cout << buffer[i+6] << ' ';
00126 cout.width(8); cout << buffer[i+7] << endl;
00127 }
00128 dec(cout);
00129 cout.fill(' ');
00130 delete [] buffer;
00131
00132
00133 dspStart = SLAVE_REPLY_BUFF_BASE;
00134 numWords = rod0->slvSingleRead(dspStart, slvNumber);
00135 if (numWords > REPLY_BUFF_SIZE) numWords = REPLY_BUFF_SIZE;
00136 buffer = new unsigned long[numWords];
00137 rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00138
00139
00140 cout << "REPLY Buffer:" << endl;
00141 hex(cout);
00142 cout.fill('0');
00143 for (unsigned int i=0; i<numWords; i+=8) {
00144 cout.width(8); cout << buffer[i] << ' ';
00145 cout.width(8); cout << buffer[i+1] << ' ';
00146 cout.width(8); cout << buffer[i+2] << ' ';
00147 cout.width(8); cout << buffer[i+3] << ' ';
00148 cout.width(8); cout << buffer[i+4] << ' ';
00149 cout.width(8); cout << buffer[i+5] << ' ';
00150 cout.width(8); cout << buffer[i+6] << ' ';
00151 cout.width(8); cout << buffer[i+7] << endl;
00152 }
00153 dec(cout);
00154 cout.fill(' ');
00155 delete [] buffer;
00156
00157
00158 hex(cout);
00159 for (int i=0; i<3; i++) {
00160 statusVal = rod0->slvSingleRead(STATUS_REG[i], slvNumber);
00161 cout << "Status register " << i << " (hex) = ";
00162 cout.width(8);
00163 cout << statusVal << endl;
00164 }
00165 for (int i=0; i<1; i++) {
00166 statusVal = rod0->slvSingleRead(COMMAND_REG[i], slvNumber);
00167 cout << "Command register " << i << " (hex) = ";
00168 cout.width(8);
00169 cout << statusVal << endl;
00170 }
00171 dec(cout);
00172
00173
00174 numWords = 512;
00175 for (int ibuf=0; ibuf<4; ibuf++) {
00176 dspStart = txtAddress[ibuf];
00177 unsigned long * buffer = new unsigned long[numWords];
00178 rod0->slvBlockRead(dspStart, buffer, numWords, slvNumber);
00179 switch(ibuf) {
00180 case 0: cout << endl << "Hexadecimal dump of ERR buffer:" << endl;
00181 break;
00182 case 1: cout << endl << "Hexadecimal dump of INFO buffer:" << endl;
00183 break;
00184 case 2: cout << endl << "Hexadecimal dump of DIAG buffer:" << endl;
00185 break;
00186 case 3: cout << endl << "Hexadecimal dump of XFER buffer:" << endl;
00187 break;
00188 }
00189 hex(cout);
00190 cout.fill('0');
00191 for (unsigned int i=0; i<numWords; i+=8) {
00192 cout.width(8); cout << buffer[i] << ' ';
00193 cout.width(8); cout << buffer[i+1] << ' ';
00194 cout.width(8); cout << buffer[i+2] << ' ';
00195 cout.width(8); cout << buffer[i+3] << ' ';
00196 cout.width(8); cout << buffer[i+4] << ' ';
00197 cout.width(8); cout << buffer[i+5] << ' ';
00198 cout.width(8); cout << buffer[i+6] << ' ';
00199 cout.width(8); cout << buffer[i+7] << endl;
00200 }
00201 dec(cout);
00202 cout.fill(' ');
00203 genPtr = static_cast<void*>(buffer);
00204 textBuff = static_cast<char*>(genPtr);
00205 switch(ibuf) {
00206 case 0: cout << endl << "ASCII dump of ERR buffer:" << endl;
00207 break;
00208 case 1: cout << endl << "ASCII dump of INFO buffer:" << endl;
00209 break;
00210 case 2: cout << endl << "ASCII dump of DIAG buffer:" << endl;
00211 break;
00212 case 3: cout << endl << "ASCII dump of XFER buffer:" << endl;
00213 break;
00214 }
00215 for (unsigned int itext = 0; itext< 4*numWords; itext++) {
00216 if ((textBuff[itext]<' ') || (textBuff[itext] > '~')) textBuff[itext] = '.';
00217 cout << textBuff[itext];
00218 if ((itext+1)%64 == 0) cout << endl;
00219 }
00220 cout << endl;
00221
00222 delete [] buffer;
00223 }
00224
00225
00226 if (slaveRunning) {
00227 slaveRunning = false;
00228 rod0->clearVmeCommandRegBit(CR_DMA_ACCESS_REQ);
00229 do {
00230 statusVal = rod0->slvSingleRead(STATUS_REG[0], slvNumber);
00231 if (statusVal == 0x1>>SR_DMA_ACCESS_ERR) {
00232 cout << "Error setting slave DMA ACCESS bit. Program terminating" << endl;
00233 return 0;
00234 }
00235 } while ((statusVal & 0x1>>SR_DMA_ACCESS_ACK));
00236 }
00237
00238
00239 delete rod0;
00240 delete vme1;
00241
00242 return 0;
00243 }
00244
00245