7
7
* Provide such images by mean of a byte array
8
8
*/
9
9
#if defined(ICM_20948_USE_DMP ) // Only include the 14301 Bytes of DMP if ICM_20948_USE_DMP is defined
10
+
11
+ #if defined(__AVR__ ) || defined(__arm__ ) || defined(__ARDUINO_ARC__ ) // Store the DMP firmware in PROGMEM on older AVR (ATmega) platforms
12
+ #define ICM_20948_USE_PROGMEM_FOR_DMP
13
+ #include <avr/pgmspace.h>
14
+ const uint8_t dmp3_image [] PROGMEM = {
15
+ #else
10
16
const uint8_t dmp3_image [] = {
17
+ #endif
18
+
11
19
#include "icm20948_img.dmp3a.h"
12
20
};
13
21
#endif
@@ -1249,6 +1257,9 @@ ICM_20948_Status_e inv_icm20948_firmware_load(ICM_20948_Device_t *pdev, const un
1249
1257
data = data_start ;
1250
1258
size = size_start ;
1251
1259
memaddr = load_addr ;
1260
+ #ifdef ICM_20948_USE_PROGMEM_FOR_DMP
1261
+ unsigned char data_not_pg [INV_MAX_SERIAL_READ ]; // Suggested by @HyperKokichi in Issue #63
1262
+ #endif
1252
1263
while (size > 0 )
1253
1264
{
1254
1265
//write_size = min(size, INV_MAX_SERIAL_WRITE); // Write in chunks of INV_MAX_SERIAL_WRITE
@@ -1261,7 +1272,12 @@ ICM_20948_Status_e inv_icm20948_firmware_load(ICM_20948_Device_t *pdev, const un
1261
1272
// Moved across a bank
1262
1273
write_size = (memaddr & 0xff ) + write_size - 0x100 ;
1263
1274
}
1275
+ #ifdef ICM_20948_USE_PROGMEM_FOR_DMP
1276
+ memcpy_P (data_not_pg , data , write_size ); // Suggested by @HyperKokichi in Issue #63
1277
+ result = inv_icm20948_write_mems (pdev , memaddr , write_size , (unsigned char * )data_not_pg );
1278
+ #else
1264
1279
result = inv_icm20948_write_mems (pdev , memaddr , write_size , (unsigned char * )data );
1280
+ #endif
1265
1281
if (result != ICM_20948_Stat_Ok )
1266
1282
return result ;
1267
1283
data += write_size ;
@@ -1289,7 +1305,12 @@ ICM_20948_Status_e inv_icm20948_firmware_load(ICM_20948_Device_t *pdev, const un
1289
1305
result = inv_icm20948_read_mems (pdev , memaddr , write_size , data_cmp );
1290
1306
if (result != ICM_20948_Stat_Ok )
1291
1307
flag ++ ; // Error, DMP not written correctly
1308
+ #ifdef ICM_20948_USE_PROGMEM_FOR_DMP
1309
+ memcpy_P (data_not_pg , data , write_size ); // Suggested by @HyperKokichi in Issue #63
1310
+ if (memcmp (data_cmp , data_not_pg , write_size ))
1311
+ #else
1292
1312
if (memcmp (data_cmp , data , write_size )) // Compare the data
1313
+ #endif
1293
1314
return ICM_20948_Stat_DMPVerifyFail ;
1294
1315
data += write_size ;
1295
1316
size -= write_size ;
0 commit comments