Commit bd8838d0 authored by Georg Auzinger's avatar Georg Auzinger
Browse files

Merge branch 'chbonnin/Ph2_ACF-Dev' into Dev

parents 6d25d72e 0f99319c
......@@ -68,11 +68,6 @@ public:
* \param puHalConfigFileName : path of the uHal Config File
* \param pFileHandler : pointer to file handler for saving Raw Data*/
BeBoardFWInterface( const char* puHalConfigFileName, uint32_t pBoardId );
/*!
* \brief Constructor of the BeBoardFWInterface class
* \param pId : identifier string
* \param pUri : URI string
* \param pAddressTable: address table string*/
BeBoardFWInterface( const char* pId, const char* pUri, const char* pAddressTable );
/*!
* \brief Destructor of the BeBoardFWInterface class
......@@ -91,6 +86,8 @@ public:
virtual void FlashProm( const std::string& strConfig, const char* pstrFile ) {}
/*! \brief Jump to an FPGA configuration */
virtual void JumpToFpgaConfig( const std::string& strConfig ) {}
virtual void DownloadFpgaConfig( const std::string& strConfig, const std::string& strDest ) {}
/*! \brief Current FPGA configuration*/
virtual const FpgaConfig* getConfiguringFpga()
{
......
......@@ -211,6 +211,12 @@ namespace Ph2_HwInterface
fBoardFW->JumpToFpgaConfig( strConfig );
}
void BeBoardInterface::DownloadFpgaConfig( BeBoard* pBoard, const std::string& strConfig, const std::string& strDest)
{
setBoard( pBoard->getBeBoardIdentifier() );
fBoardFW->DownloadFpgaConfig( strConfig, strDest );
}
const FpgaConfig* BeBoardInterface::getConfiguringFpga( BeBoard* pBoard )
{
setBoard( pBoard->getBeBoardIdentifier() );
......
......@@ -211,6 +211,8 @@ namespace Ph2_HwInterface
* \param numConfig FPGA configuration number
*/
void JumpToFpgaConfig( BeBoard* pBoard, const std::string& strConfig);
void DownloadFpgaConfig( BeBoard* pBoard, const std::string& strConfig, const std::string& strDest);
/*! \brief Current FPGA configuration
* \param pBoard pointer to a board description
* \return const pointer to an FPGA uploading process. NULL means that no upload is been processed.
......
This diff is collapsed.
......@@ -31,31 +31,31 @@ using namespace Ph2_HwDescription;
*/
namespace Ph2_HwInterface
{
class CtaFpgaConfig;
class CtaFpgaConfig;
/*!
* \class CtaFWInterface
* \brief init/config of the CTA and its Cbc's
*/
class CtaFWInterface : public BeBoardFWInterface
{
/*!
* \class CtaFWInterface
* \brief init/config of the CTA and its Cbc's
*/
class CtaFWInterface : public BeBoardFWInterface
{
private:
Data* fData; /*!< Data read storage*/
private:
Data* fData; /*!< Data read storage*/
struct timeval fStartVeto;
std::string fStrSram, fStrSramUserLogic, fStrFull, fStrReadout, fStrOtherSram, fStrOtherSramUserLogic;
std::string fCbcStubLat, fCbcI2CCmdAck, fCbcI2CCmdRq, fCbcHardReset, fCbcFastReset;
CtaFpgaConfig* fpgaConfig;
FileHandler* fFileHandler ;
struct timeval fStartVeto;
std::string fStrSram, fStrSramUserLogic, fStrFull, fStrReadout, fStrOtherSram, fStrOtherSramUserLogic;
std::string fCbcStubLat, fCbcI2CCmdAck, fCbcI2CCmdRq, fCbcHardReset, fCbcFastReset;
CtaFpgaConfig* fpgaConfig;
FileHandler* fFileHandler ;
private:
/*!
* \brief SRAM selection for DAQ
* \param pNthAcq : actual number of acquisitions
*/
void SelectDaqSRAM( uint32_t pNthAcq );
private:
/*!
* \brief SRAM selection for DAQ
* \param pNthAcq : actual number of acquisitions
*/
void SelectDaqSRAM( uint32_t pNthAcq );
public:
/*!
......@@ -74,144 +74,140 @@ public:
CtaFWInterface( const char* pId, const char* pUri, const char* pAddressTable );
CtaFWInterface( const char* pId, const char* pUri, const char* pAddressTable, FileHandler* pFileHandler );
/*!
* \brief Destructor of the CtaFWInterface class
*/
~CtaFWInterface()
{
if ( fData ) delete fData;
}
/*!
* \brief Configure the board with its Config File
* \param pBoard
*/
void ConfigureBoard( const BeBoard* pBoard ) override;
/*!
* \brief Detect the right FE Id to write the right registers (not working with the latest Firmware)
*/
void SelectFEId();
/*!
* \brief Start a DAQ
*/
void Start() override;
/*!
* \brief Stop a DAQ
* \param pNthAcq : actual number of acquisitions
*/
void Stop( uint32_t pNthAcq ) override;
/*!
* \brief Pause a DAQ
*/
void Pause() override;
/*!
* \brief Unpause a DAQ
*/
void Resume() override;
/*!
* \brief Read data from DAQ
* \param pNthAcq : actual number of acquisitions
* \param pBreakTrigger : if true, enable the break trigger
* \return cNPackets: the number of packets read
*/
uint32_t ReadData( BeBoard* pBoard, uint32_t pNthAcq, bool pBreakTrigger ) override;
/*!
* \brief Get next event from data buffer
* \return Next event
*/
const Event* GetNextEvent( const BeBoard* pBoard ) const override
{
return fData->GetNextEvent( pBoard );
}
const Event* GetEvent( const BeBoard* pBoard, int i ) const override
{
return fData->GetEvent( pBoard, i );
}
const std::vector<Event*>& GetEvents( const BeBoard* pBoard ) const override
{
return fData->GetEvents( pBoard );
}
/*! \brief Read a block of a given size
* \param pRegNode Param Node name
* \param pBlocksize Number of 32-bit words to read
* \return Vector of validated 32-bit values
*/
std::vector<uint32_t> ReadBlockRegValue( const std::string& pRegNode, const uint32_t& pBlocksize ) override;
void StartThread( BeBoard* pBoard, uint32_t uNbAcq, HwInterfaceVisitor* visitor ) override;
//Methods for the Cbc's:
private:
//I2C Methods
/*!
* \brief Wait for the I2C command acknowledgement
* \param pAckVal : Expected status of acknowledgement, 1/0 -> true/false
* \param pNcount : Number of registers at stake
* \return boolean confirming the acknowledgement
*/
bool I2cCmdAckWait( uint32_t pAckVal, uint8_t pNcount = 1 );
/*!
* \brief Send request to r/w blocks via I2C
* \param pVecReq : Block of words to send
* \param pWrite : 1/0 -> Write/Read
*/
void SendBlockCbcI2cRequest( std::vector<uint32_t>& pVecReq, bool pWrite );
/*!
* \brief Read blocks from SRAM via I2C
* \param pVecReq : Vector to stack the read words
*/
void ReadI2cBlockValuesInSRAM( std::vector<uint32_t>& pVecReq );
/*!
* \brief Enable I2C communications
* \param pEnable : 1/0 -> Enable/Disable
*/
void EnableI2c( bool pEnable );
void SelectFeSRAM( uint32_t pFe );
/*! Compute the size of an acquisition data block
* \return Number of 32-bit words to be read at each iteration */
uint32_t computeBlockSize( BeBoard* pBoard );
void checkIfUploading();
public:
//r/w the Cbc registers
/*!
* \brief Read register blocks of a Cbc
* \param pFeId : FrontEnd to work with
* \param pVecReq : Vector to stack the read words
*/
void WriteCbcBlockReg( uint8_t pFeId, std::vector<uint32_t>& pVecReq );
/*! \brief Read register blocks of a Cbc
* \param pFeId : FrontEnd to work with
* \param pVecReq : Vector to stack the read words
*/
void ReadCbcBlockReg( uint8_t pFeId, std::vector<uint32_t>& pVecReq );
/*! \brief Upload a firmware (FPGA configuration) from a file in MCS format into a given configuration
* \param strConfig FPGA configuration name
* \param pstrFile path to MCS file
*/
void FlashProm( const std::string& strConfig, const char* pstrFile );
/*! \brief Jump to an FPGA configuration */
void JumpToFpgaConfig( const std::string& strConfig);
/*! \brief Is the FPGA being configured ?
* \return FPGA configuring process or NULL if configuration occurs */
const FpgaConfig* getConfiguringFpga()
{
return (const FpgaConfig*)fpgaConfig;
}
/*! \brief Get the list of available FPGA configuration (or firmware images)*/
std::vector<std::string> getFpgaConfigList( );
/*! \brief Delete one Fpga configuration (or firmware image)*/
void DeleteFpgaConfig( const std::string& strId);
void threadAcquisitionLoop( BeBoard* pBoard, HwInterfaceVisitor* visitor );
};
/*!
* \brief Destructor of the CtaFWInterface class
*/
~CtaFWInterface() {
if ( fData ) delete fData;
}
/*!
* \brief Configure the board with its Config File
* \param pBoard
*/
void ConfigureBoard( const BeBoard* pBoard ) override;
/*!
* \brief Detect the right FE Id to write the right registers (not working with the latest Firmware)
*/
void SelectFEId();
/*!
* \brief Start a DAQ
*/
void Start() override;
/*!
* \brief Stop a DAQ
* \param pNthAcq : actual number of acquisitions
*/
void Stop( uint32_t pNthAcq ) override;
/*!
* \brief Pause a DAQ
*/
void Pause() override;
/*!
* \brief Unpause a DAQ
*/
void Resume() override;
/*!
* \brief Read data from DAQ
* \param pNthAcq : actual number of acquisitions
* \param pBreakTrigger : if true, enable the break trigger
* \return cNPackets: the number of packets read
*/
uint32_t ReadData( BeBoard* pBoard, uint32_t pNthAcq, bool pBreakTrigger ) override;
/*!
* \brief Get next event from data buffer
* \return Next event
*/
const Event* GetNextEvent( const BeBoard* pBoard ) const override {
return fData->GetNextEvent( pBoard );
}
const Event* GetEvent( const BeBoard* pBoard, int i ) const override {
return fData->GetEvent( pBoard, i );
}
const std::vector<Event*>& GetEvents( const BeBoard* pBoard ) const override {
return fData->GetEvents( pBoard );
}
/*! \brief Read a block of a given size
* \param pRegNode Param Node name
* \param pBlocksize Number of 32-bit words to read
* \return Vector of validated 32-bit values
*/
std::vector<uint32_t> ReadBlockRegValue( const std::string& pRegNode, const uint32_t& pBlocksize ) override;
void StartThread( BeBoard* pBoard, uint32_t uNbAcq, HwInterfaceVisitor* visitor ) override;
//Methods for the Cbc's:
private:
//I2C Methods
/*!
* \brief Wait for the I2C command acknowledgement
* \param pAckVal : Expected status of acknowledgement, 1/0 -> true/false
* \param pNcount : Number of registers at stake
* \return boolean confirming the acknowledgement
*/
bool I2cCmdAckWait( uint32_t pAckVal, uint8_t pNcount = 1 );
/*!
* \brief Send request to r/w blocks via I2C
* \param pVecReq : Block of words to send
* \param pWrite : 1/0 -> Write/Read
*/
void SendBlockCbcI2cRequest( std::vector<uint32_t>& pVecReq, bool pWrite );
/*!
* \brief Read blocks from SRAM via I2C
* \param pVecReq : Vector to stack the read words
*/
void ReadI2cBlockValuesInSRAM( std::vector<uint32_t>& pVecReq );
/*!
* \brief Enable I2C communications
* \param pEnable : 1/0 -> Enable/Disable
*/
void EnableI2c( bool pEnable );
void SelectFeSRAM( uint32_t pFe );
/*! Compute the size of an acquisition data block
* \return Number of 32-bit words to be read at each iteration */
uint32_t computeBlockSize( BeBoard* pBoard );
void checkIfUploading();
public:
//r/w the Cbc registers
/*!
* \brief Read register blocks of a Cbc
* \param pFeId : FrontEnd to work with
* \param pVecReq : Vector to stack the read words
*/
void WriteCbcBlockReg( uint8_t pFeId, std::vector<uint32_t>& pVecReq );
/*! \brief Read register blocks of a Cbc
* \param pFeId : FrontEnd to work with
* \param pVecReq : Vector to stack the read words
*/
void ReadCbcBlockReg( uint8_t pFeId, std::vector<uint32_t>& pVecReq );
/*! \brief Upload a firmware (FPGA configuration) from a file in MCS format into a given configuration
* \param strConfig FPGA configuration name
* \param pstrFile path to MCS file
*/
void FlashProm( const std::string& strConfig, const char* pstrFile );
/*! \brief Jump to an FPGA configuration */
void JumpToFpgaConfig( const std::string& strConfig);
void DownloadFpgaConfig( const std::string& strConfig, const std::string& strDest );
/*! \brief Is the FPGA being configured ?
* \return FPGA configuring process or NULL if configuration occurs */
const FpgaConfig* getConfiguringFpga() {
return (const FpgaConfig*)fpgaConfig;
}
/*! \brief Get the list of available FPGA configuration (or firmware images)*/
std::vector<std::string> getFpgaConfigList( );
/*! \brief Delete one Fpga configuration (or firmware image)*/
void DeleteFpgaConfig( const std::string& strId);
void threadAcquisitionLoop( BeBoard* pBoard, HwInterfaceVisitor* visitor );
};
}
#endif
......@@ -52,8 +52,13 @@ CtaFpgaConfig::CtaFpgaConfig(BeBoardFWInterface* pbbi):
}
void CtaFpgaConfig::dumpFromFileIntoSD(const std::string& strImage, const char* pstrFile){
fc7::XilinxBitFile bitFile(pstrFile);
lNode.FileToSD(strImage, bitFile, &progressValue, &progressString);
if (string(pstrFile).compare(string(pstrFile).length()-4,4,".bit")==0){
fc7::XilinxBitFile bitFile(pstrFile);
lNode.FileToSD(strImage, bitFile, &progressValue, &progressString);
} else {
fc7::XilinxBinFile binFile(pstrFile);
lNode.FileToSD(strImage, binFile, &progressValue, &progressString);
}
progressValue=100;
lNode.RebootFPGA(strImage, SECURE_MODE_PASSWORD);
}
......@@ -62,6 +67,46 @@ CtaFpgaConfig::CtaFpgaConfig(BeBoardFWInterface* pbbi):
lNode.RebootFPGA(strImage, SECURE_MODE_PASSWORD);
}
void CtaFpgaConfig::runDownload(const std::string& strImage, const char* szFile) throw (std::string){
vector<string> lstNames=lNode.ListFilesOnSD();
for (int iName=0; iName<lstNames.size(); iName++){
if (!strImage.compare(lstNames[iName]))
numUploadingFpga=iName+1;
break;
}
progressValue=0;
progressString="Downloading configuration";
boost::thread(&CtaFpgaConfig::downloadImage, this, strImage, szFile);
}
void CtaFpgaConfig::downloadImage( const std::string& strImage, const std::string& strDestFile){
fc7::Firmware bitStream1 = lNode.FileFromSD(strImage, &progressValue, 0);
progressString="Checking download";
fc7::Firmware bitStream2 = lNode.FileFromSD(strImage, &progressValue, 33);
fc7::Firmware bitStream3("empty");
ofstream oFile;
oFile.open(strDestFile, ios::out | ios::binary);
//for (const auto& uVal:bitStream.Bitstream())
for (size_t idx = 0 ; idx<bitStream1.Bitstream().size(); idx++){
if (bitStream1.Bitstream()[idx]!=bitStream2.Bitstream()[idx]){
if (bitStream3.Bitstream().empty()){
progressString="Errors found, checking again";
bitStream3 = lNode.FileFromSD(strImage, &progressValue, 66);
}
if (bitStream1.Bitstream()[idx]==bitStream3.Bitstream()[idx])
oFile<<(char)bitStream1.Bitstream()[idx];
else if (bitStream2.Bitstream()[idx]==bitStream3.Bitstream()[idx])
oFile<<(char)bitStream2.Bitstream()[idx];
else
throw fc7::CorruptedFile();
} else
oFile<<(char)bitStream1.Bitstream()[idx];
}
oFile.close();
progressValue=100;
}
std::vector<std::string> CtaFpgaConfig::getFirmwareImageNames(){
return lNode.ListFilesOnSD ();
......
......@@ -29,13 +29,20 @@ namespace Ph2_HwInterface
CtaFpgaConfig(BeBoardFWInterface* pbbi);
/*! \brief Launch the firmware upload in a separate thread
* \param strConfig FPGA configuration name
* \param pstrFile absolute path to the .bit file
* \param pstrFile absolute path to the .bit or .bin file
*/
void runUpload(const std::string& strConfig, const char* pstrFile) throw (std::string);
/*! \brief Launch the firmware download in a separate thread
* \param strConfig FPGA configuration name
* \param pstrFile absolute path to the .bin file
*/
void runDownload(const std::string& strConfig, const char* pstrFile) throw (std::string);
/*! \brief Jump to an FPGA configuration
* \param strConfig FPGA configuration name
*/
void jumpToImage( const std::string& strImage);
void downloadImage( const std::string& strImage, const std::string& strDestFile);
/*! \brief Get the list of available FPGA configuration (or firmware images)*/
std::vector<std::string> getFirmwareImageNames();
/*! \brief Delete one Fpga configuration (or firmware image)*/
......
......@@ -24,9 +24,14 @@ namespace Ph2_HwInterface
* \param pbbi Reference to the BeBoardFWInterface
*/
FpgaConfig(BeBoardFWInterface* pbbi);
/*! \brief Launch the firmware download in a separate thread
* \param strConfig FPGA configuration number or name
* \param pstrFile absolute path to the configuration file
*/
virtual void runDownload(const std::string& strConfig, const char* pstrFile) throw (std::string){};
/*! \brief Launch the firmware upload in a separate thread
* \param strConfig FPGA configuration number or name
* \param pstrFile absolute path to the MCS file
* \param pstrFile absolute path to the configuration file
*/
virtual void runUpload(const std::string& strConfig, const char* pstrFile) throw (std::string)=0;
/*! \brief Tells if a configuration is currently been uploaded
......
......@@ -288,6 +288,7 @@ namespace fc7
lEnd = lSrcData.end();
}
//std::cout<<"begin: "<<std::dec<<distance(lSrcData.begin(),lBegin)<<", end: "<<distance(lSrcData.begin(),lEnd)<<" ("<<distance(lBegin, lEnd)<<")"<<std::endl;
lVector.assign ( lBegin , lEnd );
this->getNode ( "FIFO" ).writeBlock ( lVector );
this->getClient().dispatch();
......@@ -304,12 +305,13 @@ namespace fc7
if (pProgressStr) pProgressStr->assign("Done loading firmware image");
Receive ();
//std::cout<<"Out of Receive()"<<std::endl;
}
XilinxBitStream MmcPipeInterface::FileFromSD ( const std::string& aFilename )
XilinxBitStream MmcPipeInterface::FileFromSD ( const std::string& aFilename, uint32_t *pProgress , uint32_t uOffset)
{
SetTextSpace ( aFilename );
Send ( 0x00000009 );
......@@ -328,9 +330,9 @@ namespace fc7
std::vector< uint32_t > lRet;
lRet.reserve( 5120000 );
uint32_t lWordCount = lHeader[1];
uint32_t lWordCount = lHeader[1], lTot=lWordCount;
std::cout << "Retrieving firmware image" << std::endl;
//std::cout << "Retrieving firmware image" << std::endl;
uint32_t i ( 0 );
while ( lWordCount )
......@@ -354,18 +356,18 @@ namespace fc7
lRet.insert( lRet.end() , lPayload.begin() , lPayload.end() );
if ( ! ( i++ %500 ) )
if ( ! ( i++ %500 ) && pProgress )
{
std::cout << "." << std::flush;
*pProgress=33-lWordCount*33/lTot + uOffset;
//std::cout << "." << std::flush;
}
}
else{
usleep ( 1000 ); //Otherwise we get serious bus contention
}
}
std::cout << std::endl;
std::cout << "Done retrieving firmware image" << std::endl;
//std::cout << std::endl;
//std::cout << "Done retrieving firmware image" << std::endl;
if ( lHeader[0] )
{
......@@ -490,7 +492,7 @@ namespace fc7
mFPGAtoMMCSpaceAvailable = 511 - mFPGAtoMMCDataAvailable;
mMMCtoFPGADataAvailable = ( ( ( lMMCtoFPGAcounters>>1 ) & 0x00007FFF ) - ( ( lMMCtoFPGAcounters>>16 ) & 0x0000FFFF ) + 1 ) % 512;
mMMCtoFPGASpaceAvailable = 511 - mMMCtoFPGADataAvailable;
// std::cout << std::dec << "mFPGAtoMMCDataAvailable:" << mFPGAtoMMCDataAvailable << "\tmFPGAtoMMCSpaceAvailable:" << mFPGAtoMMCSpaceAvailable << "\tmMMCtoFPGADataAvailable:" << mMMCtoFPGADataAvailable << "\tmMMCtoFPGASpaceAvailable:" << mMMCtoFPGASpaceAvailable << std::endl;
//std::cout << std::dec << "mFPGAtoMMCDataAvailable:" << mFPGAtoMMCDataAvailable << "\tmFPGAtoMMCSpaceAvailable:" << mFPGAtoMMCSpaceAvailable << "\tmMMCtoFPGADataAvailable:" << mMMCtoFPGADataAvailable << "\tmMMCtoFPGASpaceAvailable:" << mMMCtoFPGASpaceAvailable <<std::endl;//"\tlFpgaToMmc:"<< std::hex << lFPGAtoMMCcounters<<"\tlMmcToFpga:"<< lMMCtoFPGAcounters<<std::endl;
}
......
......@@ -47,7 +47,7 @@ namespace fc7
void SetDummySensor ( const uint8_t& aValue );
void FileToSD ( const std::string& aFilename, Firmware& aFirmware , uint32_t *pProgress=NULL, std::string *pProgressStr=NULL);
XilinxBitStream FileFromSD ( const std::string& aFilename );
XilinxBitStream FileFromSD ( const std::string& aFilename , uint32_t *pProgress, uint32_t uOffset );
void RebootFPGA ( const std::string& aFilename , const std::string& aPassword );
void BoardHardReset ( const std::string& aPassword );
......
This diff is collapsed.
......@@ -180,6 +180,10 @@ namespace Ph2_System
*\param os : ostream to dump output
*/
void parseSettingsjson( const std::string& pFilename, std::ostream& os );
/*! \brief Expand environment variables in string
* \param s input string
* \return Result with variables expanded */
std::string expandEnvironmentVariables( std::string s ) ;
};
}
......
No preview for this file type
......@@ -92,9 +92,12 @@ int main( int argc, char* argv[] )
cmd.defineOption( "delete", "Delete a firmware image on SD card (works only with CTA boards)", ArgvParser::OptionRequiresValue );
cmd.defineOptionAlternative( "delete", "d" );
cmd.defineOption( "file", "FPGA Bitstream (*.mcs format for GLIB or *.bit format for CTA boards)", ArgvParser::OptionRequiresValue /*| ArgvParser::OptionRequired*/ );
cmd.defineOption( "file", "FPGA Bitstream (*.mcs format for GLIB or *.bit/*.bin format for CTA boards)", ArgvParser::OptionRequiresValue /*| ArgvParser::OptionRequired*/ );
cmd.defineOptionAlternative( "file", "f" );
cmd.defineOption( "download", "Download an FPGA configuration from SD card to file (only for CTA boards)", ArgvParser::OptionRequiresValue /*| ArgvParser::OptionRequired*/ );
cmd.defineOptionAlternative( "download", "o" );
cmd.defineOption( "config", "Hw Description File . Default value: settings/HWDescription_2CBC.xml", ArgvParser::OptionRequiresValue /*| ArgvParser::OptionRequired*/ );
cmd.defineOptionAlternative( "config", "c" );
......@@ -126,8 +129,8 @@ int main( int argc, char* argv[] )
if(lstNames.size()==0 && cFWFile.find(".mcs") == std::string::npos){
std::cout << "Error, the specified file is not a .mcs file" << std::endl;
exit(1);
} else if (lstNames.size()>0 && cFWFile.find(".bit") == std::string::npos){
std::cout << "Error, the specified file is not a .bit file" << std::endl;
} else if (lstNames.size()>0 && cFWFile.compare(cFWFile.length()-4,4,".bit") && cFWFile.compare(cFWFile.length()-4,4,".bin")){
std::cout << "Error, the specified file is neither a .bit nor a .bin file" << std::endl;
exit(1);
}
} else if (cmd.foundOption("delete") && !lstNames.empty()){
......@@ -157,29 +160,30 @@ int main( int argc, char* argv[] )
t.stop();
t.show( "Time to Initialize/configure the system: " );
if (!cmd.foundOption("file")){
if (!cmd.foundOption("file") && !cmd.foundOption("download")){
cSystemController.fBeBoardInterface->JumpToFpgaConfig(pBoard, strImage);
exit(0);
}