Просмотр исходного кода

rbextract: support devices directly showing ERD magic

Older ath79-based MikroTik devices have the ERD calibration data
compressed and stored different to newer IPQ40xx ones. This commit
adds support for these former ones.

Signed-off-by: Roger Pueyo Centelles <[email protected]>
Acked-by: Koen Vandeputte <[email protected]>
Roger Pueyo Centelles 6 лет назад
Родитель
Сommit
7d39946ea0
2 измененных файлов с 30 добавлено и 1 удалено
  1. 2 1
      package/utils/rbextract/Makefile
  2. 28 0
      package/utils/rbextract/src/rbextract.c

+ 2 - 1
package/utils/rbextract/Makefile

@@ -2,6 +2,7 @@
 # Copyright (C) 2010 Gabor Juhos <[email protected]>
 # Copyright (C) 2018 Chris Schimp <[email protected]>
 # Copyright (C) 2019 Robert Marko <[email protected]>
+# Copyright (C) 2019 Roger Pueyo Centelles <[email protected]>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,7 +11,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=rbextract
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 CMAKE_INSTALL:=1
 
 include $(INCLUDE_DIR)/package.mk

+ 28 - 0
package/utils/rbextract/src/rbextract.c

@@ -333,7 +333,35 @@ __rb_get_wlan_data(void)
 			goto err_free_rle_out;
 		}
 	}
+	/* Older ath79-based boards directly show the RB_MAGIC_ERD bytes followed by
+	the LZO-compressed calibration data with no RLE */
+	if (magic == RB_MAGIC_ERD) {
+		if (tag_len > RB_ART_SIZE) {
+			printf("Calibration data too large\n");
+			goto err_free_lzo_in;
+		}
+
+		err = routerboot_find_tag(tag, tag_len,
+					  0x1, &buf_lzo_in, &erd_tag_len);
+		if (err) {
+			printf("No ERD chunk found\n");
+			goto err_free_lzo_out;
+		}
+
+		printf("Decompressing with LZO\n");
+		lzo_out_len = RB_ART_SIZE;
+		err = lzo1x_decompress_safe(buf_lzo_in, tag_len,
+					    buf_lzo_out, &lzo_out_len, NULL);
+		/* For some reason, I get this "input not consumed" error
+		 * even though the output is correct, so ignore it. */
+		if (err && err != LZO_E_INPUT_NOT_CONSUMED) {
+			printf("unable to decompress calibration data: %d\n",
+			       err);
+			goto err_free_lzo_out;
+		}
 
+		buf_rle_out = buf_lzo_out;
+	}
 	return buf_rle_out;
 
 err_free_rle_out: