Library of Bus-Adapters
/home/cschwick/hal/busAdapter/dummy/src/common/PCIDummyDeviceIdentifier.cc
Go to the documentation of this file.
00001 #include <sstream>
00002 #include "hal/PCIDummyDeviceIdentifier.hh"
00003 
00004 HAL::PCIDummyDeviceIdentifier::PCIDummyDeviceIdentifier( uint32_t deviceNumber,
00005                                                          std::vector<char *>&memorySpacePtr,
00006                                                          char *configSpacePtr,
00007                                                          std::vector<uint32_t> baseaddresses,
00008                                                          std::vector<uint32_t> mapsizes,
00009                                                          bool swapFlag) 
00010   : deviceNumber( deviceNumber ),
00011     memorySpacePtr_( memorySpacePtr ),
00012     configSpacePtr_( configSpacePtr ),
00013     baseaddresses_(baseaddresses),
00014     mapsizes_(mapsizes),
00015     swapFlag_( swapFlag ) {
00016 }
00017 
00018 HAL::PCIDummyDeviceIdentifier::~PCIDummyDeviceIdentifier() {
00019 
00020   // in principle we do not need the if since it is legal to delete a null 
00021   // pointer; but it is more instructive to code it like this:
00022 
00023   for ( int ic=0; ic<6; ic++ ) {
00024     if ( memorySpacePtr_[ic] != (char*)0 ) 
00025       delete memorySpacePtr_[ic];
00026   }
00027   if (configSpacePtr_ != (char*)0) {
00028     delete configSpacePtr_;
00029   }
00030 }
00031 
00032 char* HAL::PCIDummyDeviceIdentifier::getConfigSpacePtr() const {
00033   return configSpacePtr_;
00034 }
00035 
00036 char* HAL::PCIDummyDeviceIdentifier::remap( uint32_t address ) const
00037   throw( BusAdapterException ) {
00038 
00039   int ibar;
00040   bool found = false;
00041 
00042   for( ibar = 0; ibar < 6; ibar++ ) {
00043 
00044     if ( (address >= baseaddresses_[ibar] ) && ( address < (baseaddresses_[ibar] + mapsizes_[ibar]) ) ) {
00045       found = true;
00046       break;
00047     }
00048   }
00049 
00050   if ( ! found ) {
00051     std::stringstream text;
00052     text << "Could not find a mapped bar for the requested address. Software bug in HAL.\n" << std::ends;
00053     throw( BusAdapterException( text.str(), __FILE__, __LINE__, __FUNCTION__ ) );
00054   }
00055 
00056   char* result = ((address - baseaddresses_[ibar])) + memorySpacePtr_[ibar];
00057   return result;
00058 }
00059 
00060 std::string HAL::PCIDummyDeviceIdentifier::printString() const {
00061   char buf[256];
00062   sprintf( buf, "PCIDummyDeviceIdentifier : %u ", deviceNumber );
00063 
00064   return std::string(buf) ;
00065 }
00066 
00067 bool HAL::PCIDummyDeviceIdentifier::doSwap() const {
00068   return swapFlag_;
00069 }
00070 
00071 
00072 uint32_t HAL::PCIDummyDeviceIdentifier::getPCIBusAddress( uint32_t bar ) const 
00073   throw( ) {
00074   return (uint32_t) baseaddresses_[ bar ];
00075 };