Changeset 271
- Timestamp:
- 06/21/06 14:49:06 (16 years ago)
- Files:
-
- branches/libfreebob-downloader/ChangeLog (modified) (1 diff)
- branches/libfreebob-downloader/src/bebob/bebob_dl_bcd.cpp (added)
- branches/libfreebob-downloader/src/bebob/bebob_dl_bcd.h (added)
- branches/libfreebob-downloader/src/bebob/bebob_dl_codes.cpp (added)
- branches/libfreebob-downloader/src/bebob/bebob_dl_codes.h (added)
- branches/libfreebob-downloader/src/bebob/bebob_dl_mgr.cpp (added)
- branches/libfreebob-downloader/src/bebob/bebob_dl_mgr.h (added)
- branches/libfreebob-downloader/src/configrom.cpp (modified) (5 diffs)
- branches/libfreebob-downloader/src/configrom.h (modified) (2 diffs)
- branches/libfreebob-downloader/src/freebob-downloader.cpp (added)
- branches/libfreebob-downloader/src/libfreebobavc/ieee1394service.cpp (modified) (5 diffs)
- branches/libfreebob-downloader/src/libfreebobavc/ieee1394service.h (modified) (6 diffs)
- branches/libfreebob-downloader/src/libfreebobavc/serialize.cpp (modified) (1 diff)
- branches/libfreebob-downloader/src/Makefile.am (modified) (3 diffs)
- branches/libfreebob-downloader/src/threads.h (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/libfreebob-downloader/ChangeLog
r259 r271 1 2006-06-21 Daniel Wagner <wagi@monom.org> 2 3 * freebob-downloader first version added 4 1 5 2006-06-10 Daniel Wagner <wagi@monom.org> 2 6 branches/libfreebob-downloader/src/configrom.cpp
r241 r271 26 26 27 27 #include <iostream> 28 #include <iomanip> 28 29 29 30 using namespace std; … … 61 62 , m_vendorName( "" ) 62 63 , m_modelName( "" ) 64 , m_vendorId( 0 ) 65 , m_modelId( 0 ) 66 , m_isIsoResourceManager( false ) 67 , m_isCycleMasterCapable( false ) 68 , m_isSupportIsoOperations( false ) 69 , m_isBusManagerCapable( false ) 70 , m_cycleClkAcc( 0 ) 71 , m_maxRec( 0 ) 72 , m_nodeVendorId( 0 ) 73 , m_chipIdHi( 0 ) 74 , m_chipIdLow( 0 ) 63 75 , m_vendorNameKv( 0 ) 64 76 , m_modelNameKv( 0 ) … … 90 102 } 91 103 104 // Process Bus_Info_Block 105 m_isIsoResourceManager = m_csr->bus_info_data[2] >> 31; 106 m_isCycleMasterCapable = ( m_csr->bus_info_data[2] >> 30 ) & 0x1; 107 m_isSupportIsoOperations = ( m_csr->bus_info_data[2] >> 29 ) & 0x1; 108 m_isBusManagerCapable = ( m_csr->bus_info_data[2] >> 28 ) & 0x1; 109 m_cycleClkAcc = ( m_csr->bus_info_data[2] >> 16 ) & 0xff; 110 m_maxRec = ( m_csr->bus_info_data[2] >> 12 ) & 0xf; 111 m_nodeVendorId = ( m_csr->bus_info_data[3] >> 8 ); 112 m_chipIdHi = ( m_csr->bus_info_data[3] ) & 0xff; 113 m_chipIdLow = m_csr->bus_info_data[4]; 114 115 // Process Root Directory 92 116 processRootDirectory(m_csr); 93 117 … … 180 204 struct config_csr_info* csr_info = (struct config_csr_info*) private_data; 181 205 182 if ( csr_info->service->read( csr_info->nodeId,183 addr,184 length,185 ( quadlet_t* )buffer) )206 if ( !csr_info->service->read( csr_info->nodeId, 207 addr, 208 length/4, 209 ( quadlet_t* )buffer) ) 186 210 { 187 211 //debugOutput( DEBUG_LEVEL_VERBOSE, "ConfigRom: Read failed\n"); … … 354 378 return m_vendorName; 355 379 } 380 381 bool 382 ConfigRom::updatedNodeId() 383 { 384 for ( fb_nodeid_t nodeId = 0; 385 nodeId < m_1394Service->getNodeCount(); 386 ++nodeId ) 387 { 388 struct config_csr_info csr_info; 389 csr_info.service = m_1394Service; 390 csr_info.nodeId = 0xffc0 | nodeId; 391 392 struct csr1212_csr* csr = 393 csr1212_create_csr( &configrom_csr1212_ops, 394 5 * sizeof(fb_quadlet_t), // XXX Why 5 ?!? 395 &csr_info ); 396 397 if (!csr || csr1212_parse_csr( csr ) != CSR1212_SUCCESS) { 398 if (csr) { 399 csr1212_destroy_csr(csr); 400 } 401 return false; 402 } 403 404 405 octlet_t guid = 406 ((u_int64_t)CSR1212_BE32_TO_CPU(csr->bus_info_data[3]) << 32) 407 | CSR1212_BE32_TO_CPU(csr->bus_info_data[4]); 408 409 if ( guid == m_guid ) { 410 if ( nodeId != m_nodeId ) { 411 debugOutput( DEBUG_LEVEL_VERBOSE, 412 "Device with GUID 0%08x%08x changed node id " 413 "from %d to %d\n", 414 m_guid >> 32, 415 m_guid & 0xffffffff, 416 m_nodeId, 417 nodeId ); 418 m_nodeId = nodeId; 419 } 420 return true; 421 } 422 } 423 424 debugOutput( DEBUG_LEVEL_NORMAL, 425 "Device with GUID 0x%08x%08x could not be found on " 426 "the bus anymore (removed?)\n", 427 m_guid >> 32, 428 m_guid & 0xffffffff ); 429 return false; 430 } 431 432 void 433 ConfigRom::printConfigRom() const 434 { 435 using namespace std; 436 cout << "Config ROM" << endl; 437 cout << "\tCurrent Node Id:\t" << getNodeId() << endl; 438 cout << "\tGUID:\t\t\t0x" << setfill( '0' ) << setw( 16 ) << hex << getGuid() << endl; 439 cout << "\tVendor Name:\t\t" << getVendorName() << endl; 440 cout << "\tModel Name:\t\t" << getModelName() << endl; 441 } 442 443 unsigned short 444 ConfigRom::getAsyMaxPayload() const 445 { 446 // XXX use pow instead 447 return 1 << ( m_maxRec + 1 ); 448 } branches/libfreebob-downloader/src/configrom.h
r241 r271 44 44 const std::string getModelName() const; 45 45 const std::string getVendorName() const; 46 bool isIsoResourseManager() const 47 { return m_isIsoResourceManager; } 48 bool isCycleMasterCapable() const 49 { return m_isCycleMasterCapable; } 50 bool isSupportsIsoOperations() const 51 { return m_isSupportIsoOperations; } 52 bool isBusManagerCapable() const 53 { return m_isBusManagerCapable; } 54 fb_byte_t getCycleClockAccurancy() const 55 { return m_cycleClkAcc; } 56 fb_byte_t getMaxRec() const 57 { return m_maxRec; } 58 unsigned short getAsyMaxPayload() const; 46 59 60 bool updatedNodeId(); 61 62 void printConfigRom() const; 47 63 48 64 protected: … … 61 77 unsigned int m_vendorId; 62 78 unsigned int m_modelId; 79 bool m_isIsoResourceManager; 80 bool m_isCycleMasterCapable; 81 bool m_isSupportIsoOperations; 82 bool m_isBusManagerCapable; 83 fb_byte_t m_cycleClkAcc; 84 fb_byte_t m_maxRec; 85 unsigned short m_nodeVendorId; 86 fb_byte_t m_chipIdHi; 87 fb_quadlet_t m_chipIdLow; 63 88 64 89 /* only used during parsing */ branches/libfreebob-downloader/src/libfreebobavc/ieee1394service.cpp
r241 r271 26 26 27 27 #include <iostream> 28 29 using namespace std; 28 #include <iomanip> 29 30 30 31 31 Ieee1394Service::Ieee1394Service() 32 32 : m_handle( 0 ) 33 33 , m_port( -1 ) 34 { 34 , m_verbose( false ) 35 , m_threadRunning( false ) 36 { 37 pthread_mutex_init( &m_mutex, 0 ); 35 38 } 36 39 37 40 Ieee1394Service::~Ieee1394Service() 38 41 { 39 if (m_handle) { 40 raw1394_destroy_handle(m_handle); 41 } 42 42 stopRHThread(); 43 44 if ( m_handle ) { 45 raw1394_destroy_handle( m_handle ); 46 } 47 if ( m_resetHandle ) { 48 raw1394_destroy_handle( m_resetHandle ); 49 } 43 50 } 44 51 … … 46 53 Ieee1394Service::initialize( int port ) 47 54 { 55 using namespace std; 56 48 57 m_handle = raw1394_new_handle_on_port( port ); 49 58 if ( !m_handle ) { … … 57 66 } 58 67 68 m_resetHandle = raw1394_new_handle_on_port( port ); 69 if ( !m_handle ) { 70 if ( !errno ) { 71 cerr << "libraw1394 not compatible" << endl; 72 } else { 73 perror( "Ieee1394Service::initialize: Could not get 1394 handle" ); 74 cerr << "Is ieee1394 and raw1394 driver loaded?" << endl; 75 } 76 return false; 77 } 78 59 79 m_port = port; 80 81 raw1394_set_userdata( m_handle, this ); 82 raw1394_set_userdata( m_resetHandle, this ); 83 raw1394_set_bus_reset_handler( m_resetHandle, 84 this->resetHandlerLowLevel ); 85 startRHThread(); 86 60 87 return true; 61 88 } … … 70 97 Ieee1394Service::read( fb_nodeid_t nodeId, 71 98 fb_nodeaddr_t addr, 72 size_t size,99 size_t length, 73 100 fb_quadlet_t* buffer ) 74 101 { 75 return raw1394_read( m_handle, nodeId, addr, size, buffer ) != 0; 76 } 77 78 bool 79 Ieee1394Service::write( fb_nodeid_t nodeId, 102 using namespace std; 103 if ( raw1394_read( m_handle, nodeId, addr, length*4, buffer ) == 0 ) { 104 105 #ifdef DEBUG 106 if ( m_verbose ) { 107 cout << "read: node 0x" << hex << nodeId <<", addr = 0x" 108 << setfill( '0' ) << setw( 16 ) << addr 109 << ", length = " << dec << length << " quadlets" << endl; 110 printBuffer( length, buffer ); 111 } 112 #endif 113 114 return true; 115 } else { 116 #ifdef DEBUG 117 if ( m_verbose ) { 118 cerr << "raw1394_read failed: node 0x" << hex << nodeId 119 << ", addr 0x" << setfill( '0' ) << setw( 16 ) << addr 120 << ", length = " << dec << length << " quadlets" << endl; 121 } 122 #endif 123 124 return false; 125 } 126 } 127 128 129 bool 130 Ieee1394Service::read_quadlet( fb_nodeid_t nodeId, 131 fb_nodeaddr_t addr, 132 fb_quadlet_t* buffer ) 133 { 134 return read( nodeId, addr, sizeof( *buffer )/4, buffer ); 135 } 136 137 bool 138 Ieee1394Service::read_octlet( fb_nodeid_t nodeId, 139 fb_nodeaddr_t addr, 140 fb_octlet_t* buffer ) 141 { 142 return read( nodeId, addr, sizeof( *buffer )/4, 143 reinterpret_cast<fb_quadlet_t*>( buffer ) ); 144 } 145 146 147 bool 148 Ieee1394Service::write( fb_nodeid_t nodeId, 80 149 fb_nodeaddr_t addr, 81 size_t length, 82 fb_quadlet_t *data ) 83 { 84 return raw1394_write( m_handle, nodeId, addr, length, data ) != 0; 150 size_t length, 151 fb_quadlet_t* data ) 152 { 153 using namespace std; 154 155 #ifdef DEBUG 156 if ( m_verbose ) { 157 cout << "write: node 0x" << hex << nodeId << ", addr = 0x" 158 << setfill( '0' ) << setw( 16 ) << addr 159 << ", length = " << dec << length << " quadlets" << endl; 160 printBuffer( length, data ); 161 } 162 #endif 163 164 return raw1394_write( m_handle, nodeId, addr, length*4, data ) == 0; 165 } 166 167 168 bool 169 Ieee1394Service::write_quadlet( fb_nodeid_t nodeId, 170 fb_nodeaddr_t addr, 171 fb_quadlet_t data ) 172 { 173 return write( nodeId, addr, sizeof( data )/4, &data ); 174 } 175 176 bool 177 Ieee1394Service::write_octlet( fb_nodeid_t nodeId, 178 fb_nodeaddr_t addr, 179 fb_octlet_t data ) 180 { 181 return write( nodeId, addr, sizeof( data )/4, 182 reinterpret_cast<fb_quadlet_t*>( &data ) ); 85 183 } 86 184 … … 117 215 return true; 118 216 } 217 218 void 219 Ieee1394Service::setVerbose( bool isVerbose ) 220 { 221 m_verbose = isVerbose; 222 } 223 224 void 225 Ieee1394Service::printBuffer( size_t length, fb_quadlet_t* buffer ) const 226 { 227 using namespace std; 228 229 for ( unsigned int i=0; i < length; ++i ) { 230 if ( ( i % 4 ) == 0 ) { 231 if ( i > 0 ) { 232 cout << endl; 233 } 234 cout << setfill( ' ' ) << setw( 4 ) << i*4 << ": "; 235 } 236 cout << setfill( '0' ) << setw( 8 ) << hex << buffer[i] << " "; 237 } 238 cout << endl; 239 } 240 241 int 242 Ieee1394Service::resetHandlerLowLevel( raw1394handle_t handle, 243 unsigned int generation ) 244 { 245 raw1394_update_generation ( handle, generation ); 246 Ieee1394Service* instance 247 = (Ieee1394Service*) raw1394_get_userdata( handle ); 248 instance->resetHandler( generation ); 249 250 return 0; 251 } 252 253 bool 254 Ieee1394Service::resetHandler( unsigned int generation ) 255 { 256 m_generation = generation; 257 258 for ( reset_handler_vec_t::iterator it = m_busResetHandlers.begin(); 259 it != m_busResetHandlers.end(); 260 ++it ) 261 { 262 Functor* func = *it; 263 ( *func )(); 264 } 265 266 return true; 267 } 268 269 bool 270 Ieee1394Service::startRHThread() 271 { 272 if ( m_threadRunning ) { 273 return true; 274 } 275 pthread_mutex_lock( &m_mutex ); 276 pthread_create( &m_thread, 0, rHThread, this ); 277 pthread_mutex_unlock( &m_mutex ); 278 m_threadRunning = true; 279 280 return true; 281 } 282 283 void 284 Ieee1394Service::stopRHThread() 285 { 286 if ( m_threadRunning ) { 287 pthread_mutex_lock (&m_mutex); 288 pthread_cancel (m_thread); 289 pthread_join (m_thread, 0); 290 pthread_mutex_unlock (&m_mutex); 291 m_threadRunning = false; 292 } 293 } 294 295 void* 296 Ieee1394Service::rHThread( void* arg ) 297 { 298 Ieee1394Service* pIeee1394Service = (Ieee1394Service*) arg; 299 300 while (true) { 301 raw1394_loop_iterate (pIeee1394Service->m_resetHandle); 302 pthread_testcancel (); 303 } 304 305 return 0; 306 } 307 308 bool 309 Ieee1394Service::addBusResetHandler( Functor* functor ) 310 { 311 m_busResetHandlers.push_back( functor ); 312 return true; 313 } 314 315 bool 316 Ieee1394Service::remBusResetHandler( Functor* functor ) 317 { 318 for ( reset_handler_vec_t::iterator it = m_busResetHandlers.begin(); 319 it != m_busResetHandlers.end(); 320 ++it ) 321 { 322 if ( *it == functor ) { 323 m_busResetHandlers.erase( it ); 324 return true; 325 } 326 } 327 return false; 328 } branches/libfreebob-downloader/src/libfreebobavc/ieee1394service.h
r241 r271 1 1 /* Ieee1394Service.cpp 2 * Copyright (C) 2005 by Daniel Wagner2 * Copyright (C) 2005,06 by Daniel Wagner 3 3 * 4 4 * This file is part of FreeBoB. … … 23 23 24 24 #include "fbtypes.h" 25 #include "threads.h" 25 26 26 27 #include <libraw1394/raw1394.h> 28 #include <pthread.h> 29 30 #include <vector> 27 31 28 32 class Ieee1394Service{ … … 49 53 /** 50 54 * read - send async read request to a node and wait for response. 51 * @node: target node 55 * @node: target node (\XXX needs 0xffc0 stuff) 52 56 * @addr: address to read from 53 57 * @length: amount of data to read in quadlets … … 56 60 * This does the complete transaction and will return when it's finished. 57 61 * 58 * Returns: true eon success or false on failure (sets errno)62 * Returns: true on success or false on failure (sets errno) 59 63 */ 60 64 bool read( fb_nodeid_t nodeId, 61 65 fb_nodeaddr_t addr, 62 size_t size,66 size_t length, 63 67 fb_quadlet_t* buffer ); 64 68 65 /** 69 bool read_quadlet( fb_nodeid_t nodeId, 70 fb_nodeaddr_t addr, 71 fb_quadlet_t* buffer ); 72 73 bool read_octlet( fb_nodeid_t nodeId, 74 fb_nodeaddr_t addr, 75 fb_octlet_t* buffer ); 76 77 /** 66 78 * write - send async write request to a node and wait for response. 67 * @node: target node 79 * @node: target node (\XXX needs 0xffc0 stuff) 68 80 * @addr: address to write to 69 81 * @length: amount of data to write in quadlets … … 74 86 * Returns: true on success or false on failure (sets errno) 75 87 */ 76 bool write( fb_nodeid_t 88 bool write( fb_nodeid_t nodeId, 77 89 fb_nodeaddr_t addr, 78 size_t 79 fb_quadlet_t *data );90 size_t length, 91 fb_quadlet_t* data ); 80 92 93 bool write_quadlet( fb_nodeid_t nodeId, 94 fb_nodeaddr_t addr, 95 fb_quadlet_t data ); 96 97 bool write_octlet( fb_nodeid_t nodeId, 98 fb_nodeaddr_t addr, 99 fb_octlet_t data ); 81 100 82 101 fb_quadlet_t* transactionBlock( fb_nodeid_t nodeId, … … 86 105 87 106 bool transactionBlockClose(); 88 107 108 109 void setVerbose( bool isVerbose ); 110 111 112 bool addBusResetHandler( Functor* functor ); 113 bool remBusResetHandler( Functor* functor ); 114 89 115 private: 116 117 bool startRHThread(); 118 void stopRHThread(); 119 static void* rHThread( void* arg ); 120 121 void printBuffer( size_t length, fb_quadlet_t* buffer ) const; 122 123 static int resetHandlerLowLevel( raw1394handle_t handle, 124 unsigned int generation ); 125 bool resetHandler( unsigned int generation ); 126 90 127 raw1394handle_t m_handle; 128 raw1394handle_t m_resetHandle; 91 129 int m_port; 130 bool m_verbose; 131 unsigned int m_generation; 132 133 pthread_t m_thread; 134 pthread_mutex_t m_mutex; 135 bool m_threadRunning; 136 137 typedef std::vector< Functor* > reset_handler_vec_t; 138 reset_handler_vec_t m_busResetHandlers; 92 139 }; 93 140 branches/libfreebob-downloader/src/libfreebobavc/serialize.cpp
r241 r271 97 97 bool result = false; 98 98 if ( isCurPosValid() ) { 99 *value = * m_curPos;99 *value = *( ( quadlet_t* )m_curPos ); 100 100 m_curPos += sizeof( quadlet_t ); 101 101 result = true; branches/libfreebob-downloader/src/Makefile.am
r259 r271 35 35 freebob.cpp \ 36 36 xmlparser.c \ 37 threads.h \ 37 38 bebob/bebob_avdevice.h \ 38 39 bebob/bebob_avdevice.cpp \ … … 45 46 bebob/bebob_functionblock.h \ 46 47 bebob/bebob_functionblock.cpp \ 48 bebob/bebob_dl_mgr.h \ 49 bebob/bebob_dl_mgr.cpp \ 50 bebob/bebob_dl_codes.h \ 51 bebob/bebob_dl_codes.cpp \ 52 bebob/bebob_dl_bcd.h \ 53 bebob/bebob_dl_bcd.cpp \ 47 54 bebob_light/bebob_light_avdevice.h \ 48 55 bebob_light/bebob_light_avdevice.cpp \ … … 101 108 102 109 110 bin_PROGRAMS = freebob_downloader 111 112 freebob_downloader_SOURCES = \ 113 freebob-downloader.cpp 114 freebob_downloader_LDADD = \ 115 libfreebob.la \ 116 $(LIBRAW1394_LIBS) \ 117 $(LIBIEC61883_LIBS) \ 118 $(LIBAVC1394_LIBS) \ 119 -lpthread