Library of Bus-Adapters
|
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 };