@@ -654,19 +654,27 @@ static void scan_fw(uint8_t *buf, unsigned size, int flags) {
654
654
printf ("0x%x: COLB, name = \"%s\", offs = 0x%x (0x%x), size = 0x%x, 0x%x\n" ,
655
655
(unsigned )((uint8_t * )p2 - buf ), name , p2 [2 ], i + p2 [2 ], p2 [3 ], p2 [4 ]);
656
656
#if WITH_LZMADEC
657
- if ( flags & 1 ) {
657
+ do {
658
658
const char * s = "unknown" ; int k = 0 ;
659
659
switch (p2 [1 ]) {
660
660
case 0x494d4147 : s = "kern" ; k = 1 ; break ;
661
661
case 0x75736572 : s = "user" ; k = 2 ; break ;
662
662
case 0x7253736f : s = "rsrc" ; k = 3 ; break ;
663
663
}
664
664
clues .drps_type = k ;
665
- k = drps_cnt [k ]++ ;
666
- if (!k ) snprintf (name , sizeof (name ), "%s.bin" , s );
667
- else snprintf (name , sizeof (name ), "%s%u.bin" , s , k );
668
- drps_decode (buf , size , i , j , name );
669
- }
665
+ if (flags & 1 ) {
666
+ k = drps_cnt [k ]++ ;
667
+ if (!k ) snprintf (name , sizeof (name ), "%s.bin" , s );
668
+ else snprintf (name , sizeof (name ), "%s%u.bin" , s , k );
669
+ s = name ;
670
+ } else {
671
+ if (k != 1 || !clues .kern_addr ) break ;
672
+ if (clues .keymap_addr < clues .kern_addr ) break ;
673
+ // Decode to scan keymap.
674
+ s = NULL ;
675
+ }
676
+ drps_decode (buf , size , i , j , s );
677
+ } while (0 );
670
678
#endif
671
679
}
672
680
} while (0 );
@@ -1161,8 +1169,10 @@ static int drps_decode(uint8_t *mem, size_t size,
1161
1169
mem += colb_offs ;
1162
1170
p = (uint32_t * )mem ;
1163
1171
1164
- fo = fopen (outfn , "wb" );
1165
- if (!fo ) ERR_EXIT ("fopen(output) failed\n" );
1172
+ if (outfn ) {
1173
+ fo = fopen (outfn , "wb" );
1174
+ if (!fo ) ERR_EXIT ("fopen(output) failed\n" );
1175
+ }
1166
1176
1167
1177
if (* p == 0x4e504143 ) {
1168
1178
uint32_t data_size = p [2 ], num , offs , next ;
@@ -1190,7 +1200,7 @@ static int drps_decode(uint8_t *mem, size_t size,
1190
1200
size2 = READ32_LE(mem + 5); \
1191
1201
if (size2 > dst_size) FATAL(); \
1192
1202
result = sprd_lzmadec(mem, &src_size, dst, size2); \
1193
- fwrite(dst, 1, result, fo);
1203
+ if (fo) fwrite(dst, 1, result, fo);
1194
1204
1195
1205
RUN_LZMADEC (mem + offs )
1196
1206
if (result != size2 ) {
@@ -1208,10 +1218,10 @@ static int drps_decode(uint8_t *mem, size_t size,
1208
1218
FATAL ();
1209
1219
}
1210
1220
if (clues .drps_type == 1 && clues .kern_addr )
1211
- check_keymap2 (dst , result , clues .kern_addr , 1 );
1221
+ check_keymap2 (dst , result , clues .kern_addr , outfn ? 1 : 0 );
1212
1222
#undef RUN_LZMADEC
1213
1223
}
1214
- fclose (fo );
1224
+ if ( fo ) fclose (fo );
1215
1225
}
1216
1226
free (dst );
1217
1227
return 0 ;
0 commit comments