Changeset 689
- Timestamp:
- 11/03/07 08:12:39 (15 years ago)
- Files:
-
- trunk/libffado/src/fireworks/fireworks_device.cpp (modified) (1 diff)
- trunk/libffado/src/fireworks/fireworks_firmware.cpp (modified) (7 diffs)
- trunk/libffado/src/fireworks/fireworks_firmware.h (modified) (5 diffs)
- trunk/libffado/support/firmware/fireworks-downloader.cpp (added)
- trunk/libffado/support/firmware/SConscript (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/fireworks/fireworks_device.cpp
r685 r689 63 63 { 64 64 debugOutput(DEBUG_LEVEL_VERBOSE, "This is a FireWorks::Device\n"); 65 if ( !m_efc_discovery_done) { 66 if (!discoverUsingEFC()) { 67 debugError("EFC discovery failed\n"); 68 } 69 } 70 m_HwInfo.showEfcCmd(); 71 65 72 GenericAVC::AvDevice::showDevice(); 66 73 } trunk/libffado/src/fireworks/fireworks_firmware.cpp
r688 r689 30 30 #include <string> 31 31 #include <sstream> 32 #include <iostream> 33 #include <fstream> 32 34 33 35 using namespace std; 36 37 template <class T> 38 bool from_string(T& t, 39 const std::string& s, 40 std::ios_base& (*f)(std::ios_base&)) 41 { 42 std::istringstream iss(s); 43 return !(iss >> f >> t).fail(); 44 } 34 45 35 46 // These classes provide support for reading/writing the firmware on 36 47 // echo fireworks based devices 37 48 namespace FireWorks { 49 38 50 IMPL_DEBUG_MODULE( Firmware, Firmware, DEBUG_LEVEL_NORMAL ); 39 51 IMPL_DEBUG_MODULE( FirmwareUtil, FirmwareUtil, DEBUG_LEVEL_NORMAL ); … … 42 54 43 55 // some generic string generation functions 44 const char *Firmware::eDatTypeToString(const enum eDatType type) {56 const char *Firmware::eDatTypeToString(const enum Firmware::eDatType type) { 45 57 switch (type) { 46 58 case eDT_DspCode: … … 59 71 } 60 72 73 const enum Firmware::eDatType Firmware::intToeDatType(int type) { 74 switch (type) { 75 case (int)eDT_DspCode: return eDT_DspCode; 76 case (int)eDT_IceLynxCode: return eDT_IceLynxCode; 77 case (int)eDT_Data: return eDT_Data; 78 case (int)eDT_FPGACode: return eDT_FPGACode; 79 case (int)eDT_DeviceName: return eDT_DeviceName; 80 default: 81 return eDT_Invalid; 82 } 83 } 84 61 85 Firmware::Firmware() 86 : m_Type ( eDT_Invalid ) 87 , m_flash_offset_address ( 0 ) 88 , m_length_quads ( 0 ) 89 , m_CRC32 ( 0 ) 90 , m_checksum ( 0 ) 91 , m_version ( 0 ) 92 , m_append_crc ( false ) 93 , m_footprint_quads ( 0 ) 94 , m_data( NULL ) 62 95 { 63 96 } … … 65 98 Firmware::~Firmware() 66 99 { 100 if (m_data) delete[] m_data; 67 101 } 68 102 … … 72 106 debugOutput(DEBUG_LEVEL_NORMAL, "Firmware from %s\n", m_filename.c_str()); 73 107 debugOutput(DEBUG_LEVEL_NORMAL, " Type : %s\n", eDatTypeToString(m_Type)); 74 debugOutput(DEBUG_LEVEL_NORMAL, " Address Offset : %08llX\n", m_flash_offset_address); 75 debugOutput(DEBUG_LEVEL_NORMAL, " Lenght (Quadlets) : %08llX\n", m_length_quads); 76 debugOutput(DEBUG_LEVEL_NORMAL, " CRC 32 : %08llX\n", m_CRC32); 77 debugOutput(DEBUG_LEVEL_NORMAL, " Checksum : %08llX\n", m_checksum); 78 debugOutput(DEBUG_LEVEL_NORMAL, " Firmware version : %08llX\n", m_version); 108 if (m_Type == eDT_Invalid) return; 109 110 unsigned int version_major = (m_version & 0xFF000000) >> 24; 111 unsigned int version_minor = (m_version & 0x00FF0000) >> 16; 112 unsigned int version_build = (m_version & 0x0000FFFF); 113 debugOutput(DEBUG_LEVEL_NORMAL, " Address Offset : 0x%08lX\n", m_flash_offset_address); 114 debugOutput(DEBUG_LEVEL_NORMAL, " Lenght (Quadlets) : 0x%08lX\n", m_length_quads); 115 debugOutput(DEBUG_LEVEL_NORMAL, " CRC 32 : 0x%08lX\n", m_CRC32); 116 debugOutput(DEBUG_LEVEL_NORMAL, " Checksum : 0x%08lX\n", m_checksum); 117 debugOutput(DEBUG_LEVEL_NORMAL, " Firmware version : %02u.%02u.%02u (0x%08X)\n", 118 version_major, version_minor, version_build, m_version); 79 119 debugOutput(DEBUG_LEVEL_NORMAL, " Append CRC : %s\n", (m_append_crc?"Yes":"No")); 80 debugOutput(DEBUG_LEVEL_NORMAL, " Footprint (Quadlets) : %08llX\n", m_footprint_quads); 81 120 debugOutput(DEBUG_LEVEL_NORMAL, " Footprint (Quadlets) : 0x%08lX\n", m_footprint_quads); 82 121 } 83 122 … … 86 125 { 87 126 debugOutput(DEBUG_LEVEL_VERBOSE, "Loading firmware from file %s\n", filename.c_str()); 88 89 127 fstream fwfile; 128 129 debugOutput(DEBUG_LEVEL_VERBOSE, " Loading file...\n"); 130 fwfile.open( filename.c_str(), ios::in | ios::ate); 131 if ( !fwfile.is_open() ) { 132 debugError("Could not open file.\n"); 133 return false; 134 } 135 // get file size 136 int size; 137 size = (int)fwfile.tellg(); 138 139 if( size > ECHO_FIRMWARE_FILE_MAX_LENGTH_BYTES) { 140 debugError("File too large (%d bytes).\n", size); 141 return false; 142 } 143 144 debugOutput(DEBUG_LEVEL_VERBOSE, " Checking magic...\n"); 145 // read magic 146 if( size < ECHO_FIRMWARE_MAGIC_LENGTH_BYTES) { 147 debugError("File too small (%d bytes) to contain the magic header.\n", size); 148 return false; 149 } 150 151 fwfile.seekg (0, ios::beg); 152 getline(fwfile, m_magic); 153 // get rid of the DOS-Style end of line 154 string::size_type loc = m_magic.find( '\r' ); 155 if( loc != string::npos ) { 156 m_magic.erase(loc); 157 } 158 loc = m_magic.find( '\n' ); 159 if( loc != string::npos ) { 160 m_magic.erase(loc); 161 } 162 163 // check the magic 164 if (m_magic != ECHO_FIRMWARE_MAGIC) { 165 debugError("Magic was '%s' but should have been '%s'\n", 166 m_magic.c_str(), ECHO_FIRMWARE_MAGIC); 167 return false; 168 } 169 170 debugOutput(DEBUG_LEVEL_VERBOSE, " magic OK...\n"); 171 172 debugOutput(DEBUG_LEVEL_VERBOSE, " Reading header...\n"); 173 // read header 174 if( size < ECHO_FIRMWARE_MAGIC_LENGTH_BYTES + ECHO_FIRMWARE_HEADER_LENGTH_BYTES) { 175 debugError("File too small to contain the header.\n"); 176 return false; 177 } 178 179 for (int i=0; i < ECHO_FIRMWARE_HEADER_LENGTH_QUADLETS; i++) { 180 std::string buffer; 181 getline(fwfile, buffer); 182 // get rid of the DOS-Style end of line 183 string::size_type loc = buffer.find( '\r' ); 184 if( loc != string::npos ) { 185 buffer.erase(loc); 186 } 187 loc = buffer.find( '\n' ); 188 if( loc != string::npos ) { 189 buffer.erase(loc); 190 } 191 192 if (!from_string<uint32_t>(m_header[i], buffer, std::hex)) { 193 debugWarning("Could not convert '%s' to uint32_t\n", buffer.c_str()); 194 return false; 195 } 196 197 debugOutput(DEBUG_LEVEL_VERY_VERBOSE, " Header %02d: %08lX\n", 198 i, m_header[i]); 199 } 200 201 m_Type = intToeDatType(m_header[0]); 202 m_flash_offset_address = m_header[1]; 203 m_length_quads = m_header[2]; 204 m_CRC32 = m_header[3]; 205 m_checksum = m_header[4]; 206 m_version = m_header[5]; 207 m_append_crc = m_header[6] != 0; 208 m_footprint_quads = m_header[7]; 209 debugOutput(DEBUG_LEVEL_VERBOSE, " header ok...\n"); 210 211 debugOutput(DEBUG_LEVEL_VERBOSE, " Reading data...\n"); 212 delete m_data; 213 m_data = new uint32_t[m_length_quads]; 214 for (uint32_t i=0; i < m_length_quads; i++) { 215 std::string buffer; 216 getline(fwfile, buffer); 217 // get rid of the DOS-Style end of line 218 string::size_type loc = buffer.find( '\r' ); 219 if( loc != string::npos ) { 220 buffer.erase(loc); 221 } 222 loc = buffer.find( '\n' ); 223 if( loc != string::npos ) { 224 buffer.erase(loc); 225 } 226 227 if (!from_string<uint32_t>(m_data[i], buffer, std::hex)) { 228 debugWarning("Could not convert '%s' to uint32_t\n", buffer.c_str()); 229 return false; 230 } 231 232 debugOutput(DEBUG_LEVEL_VERY_VERBOSE, " Data %02d: %08lX\n", 233 i, m_data[i]); 234 } 235 debugOutput(DEBUG_LEVEL_VERBOSE, " data ok...\n"); 236 fwfile.close(); 237 90 238 m_filename = filename; 91 239 return false; … … 93 241 94 242 // the firmware loader helper class 95 FirmwareUtil::FirmwareUtil(FireWorks::Device& p , FireWorks::Firmware& f)243 FirmwareUtil::FirmwareUtil(FireWorks::Device& p) 96 244 : m_Parent(p) 97 , m_Firmware(f)98 245 { 99 246 } trunk/libffado/src/fireworks/fireworks_firmware.h
r688 r689 38 38 namespace FireWorks { 39 39 40 #define ECHO_FIRMWARE_MAGIC _VALUES {1651,1,0,0,0}41 #define ECHO_FIRMWARE_ NB_MAGIC_VALUES 540 #define ECHO_FIRMWARE_MAGIC "1651 1 0 0 0" 41 #define ECHO_FIRMWARE_MAGIC_LENGTH_BYTES 14 42 42 43 #define ECHO_FIRMWARE_HEADER_LENGTH_BYTES 256 44 #define ECHO_FIRMWARE_HEADER_LENGTH_QUADLETS (ECHO_FIRMWARE_HEADER_LENGTH_BYTES / 4) 43 // the number of quadlets in the file 44 #define ECHO_FIRMWARE_HEADER_LENGTH_QUADLETS 64 45 // note that the dat files are not binary files but have the quadlets 46 // as "0x0ABCDE12\n" lines 47 #define ECHO_FIRMWARE_HEADER_LENGTH_BYTES ( 12 * ECHO_FIRMWARE_HEADER_LENGTH_QUADLETS ) 45 48 46 #define ECHO_FIRMWARE_FILE_MAX_LENGTH_ BYTES (384*1024 + ECHO_FIRMWARE_HEADER_LENGTH_BYTES)47 #define ECHO_FIRMWARE_FILE_MAX_LENGTH_ QUADLETS (ECHO_FIRMWARE_HEADER_LENGTH_BYTES / 4)49 #define ECHO_FIRMWARE_FILE_MAX_LENGTH_QUADLETS ((384 * 1024) / 4) 50 #define ECHO_FIRMWARE_FILE_MAX_LENGTH_BYTES (ECHO_FIRMWARE_FILE_MAX_LENGTH_QUADLETS * 12 + ECHO_FIRMWARE_HEADER_LENGTH_BYTES) 48 51 49 52 class Firmware … … 59 62 }; 60 63 static const char *eDatTypeToString(const enum eDatType target); 61 64 static const enum eDatType intToeDatType(int type); 62 65 public: 63 66 Firmware(); … … 67 70 68 71 virtual void show(); 72 virtual void setVerboseLevel(int l) 73 {setDebugLevel(l);}; 69 74 70 75 protected: … … 82 87 uint32_t m_footprint_quads; 83 88 89 std::string m_magic; 90 uint32_t m_header[ECHO_FIRMWARE_HEADER_LENGTH_QUADLETS]; 91 uint32_t *m_data; 92 84 93 private: 85 94 DECLARE_DEBUG_MODULE; … … 90 99 91 100 public: 92 FirmwareUtil(FireWorks::Device& parent, 93 FireWorks::Firmware& f); 101 FirmwareUtil(FireWorks::Device& parent); 94 102 virtual ~FirmwareUtil(); 95 103 96 104 virtual void show(); 105 virtual void setVerboseLevel(int l) 106 {setDebugLevel(l);}; 97 107 98 108 protected: 99 109 FireWorks::Device& m_Parent; 100 FireWorks::Firmware& m_Firmware;101 110 private: 102 111 DECLARE_DEBUG_MODULE; trunk/libffado/support/firmware/SConscript
r688 r689 30 30 installapps += [ "bridgeco-downloader" ] 31 31 32 if env['ENABLE_FIREWORKS']: 33 apps["fireworks-downloader"] = "fireworks-downloader.cpp" 34 installapps += [ "fireworks-downloader" ] 32 35 33 36 for app in apps.keys():