Browse Source

Merge branch 'feature/nvs_part_gen_improvements' into 'master'

Feature/nvs part gen improvements

See merge request idf/esp-idf!2555
Ivan Grokhotkov 7 năm trước cách đây
mục cha
commit
6ee3cf67bd

+ 2 - 2
components/nvs_flash/nvs_partition_generator/README.rst

@@ -19,9 +19,9 @@ Type
 	Supported values are ``file``, ``data`` and ``namespace``.
 	Supported values are ``file``, ``data`` and ``namespace``.
 
 
 Encoding
 Encoding
-    Supported values are: ``u8``, ``i8``, ``u16``, ``u32``, ``i32``, ``string``, ``hex2bin`` and ``binary``. This specifies how actual data values are encoded in the resultant binary file. Difference between ``string`` and ``binary`` encoding is that ``string`` data is terminated with a NULL character, whereas ``binary`` data is not.
+    Supported values are: ``u8``, ``i8``, ``u16``, ``u32``, ``i32``, ``string``, ``hex2bin``, ``base64`` and ``binary``. This specifies how actual data values are encoded in the resultant binary file. Difference between ``string`` and ``binary`` encoding is that ``string`` data is terminated with a NULL character, whereas ``binary`` data is not.
 
 
-    .. note:: For ``file`` type, only ``hex2bin``, ``string`` and ``binary`` is supported as of now.
+    .. note:: For ``file`` type, only ``hex2bin``, ``base64``, ``string`` and ``binary`` is supported as of now.
 
 
 Value
 Value
 	Data value.
 	Data value.

+ 29 - 13
components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py

@@ -132,7 +132,7 @@ class Page(object):
         # set Type
         # set Type
         if encoding == "string":
         if encoding == "string":
             entry_struct[1] = Page.SZ
             entry_struct[1] = Page.SZ
-        elif encoding == "hex2bin" or encoding == "binary":
+        elif encoding in ["hex2bin", "binary", "base64"]:
             entry_struct[1] = Page.BLOB
             entry_struct[1] = Page.BLOB
 
 
         # compute CRC of data
         # compute CRC of data
@@ -248,11 +248,14 @@ class NVS(object):
                 raise InputError("%s: Invalid data length. Should be multiple of 2." % key)
                 raise InputError("%s: Invalid data length. Should be multiple of 2." % key)
             value = binascii.a2b_hex(value)
             value = binascii.a2b_hex(value)
 
 
+        if encoding == "base64":
+            value = binascii.a2b_base64(value)
+
         if encoding == "string":
         if encoding == "string":
             value += '\0'
             value += '\0'
 
 
         encoding = encoding.lower()
         encoding = encoding.lower()
-        varlen_encodings = ["string", "binary", "hex2bin"]
+        varlen_encodings = ["string", "binary", "hex2bin", "base64"]
         primitive_encodings = ["u8", "i8", "u16", "u32", "i32"]
         primitive_encodings = ["u8", "i8", "u16", "u32", "i32"]
         if encoding in varlen_encodings:
         if encoding in varlen_encodings:
             try:
             try:
@@ -308,7 +311,7 @@ def write_entry(nvs_instance, key, datatype, encoding, value):
     :param nvs_instance: Instance of an NVS class returned by nvs_open()
     :param nvs_instance: Instance of an NVS class returned by nvs_open()
     :param key: Key of the data
     :param key: Key of the data
     :param datatype: Data type. Valid values are "file", "data" and "namespace"
     :param datatype: Data type. Valid values are "file", "data" and "namespace"
-    :param encoding: Data encoding. Valid values are "u8", "i8", "u16", "u32", "i32", "string", "binary" and "hex2bin"
+    :param encoding: Data encoding. Valid values are "u8", "i8", "u16", "u32", "i32", "string", "binary", "hex2bin" and "base64"
     :param value: Data value in ascii encoded string format for "data" datatype and filepath for "file" datatype
     :param value: Data value in ascii encoded string format for "data" datatype and filepath for "file" datatype
     :return: None
     :return: None
     """
     """
@@ -333,29 +336,42 @@ def nvs_close(nvs_instance):
     """
     """
     nvs_instance.__exit__(None, None, None)
     nvs_instance.__exit__(None, None, None)
 
 
+def nvs_part_gen(input_filename=None, output_filename=None):
+    input_file = open(input_filename, 'rb')
+    output_file = open(output_filename, 'wb')
+
+    with nvs_open(output_file) as nvs_obj:
+        reader = csv.DictReader(input_file, delimiter=',')
+        for row in reader:
+            try:
+                write_entry(nvs_obj, row["key"], row["type"], row["encoding"], row["value"])
+            except InputError as e:
+                print(e)
+                input_file.close()
+                output_file.close()
+                exit(-2)
+
+    input_file.close()
+    output_file.close()
+
 def main():
 def main():
     parser = argparse.ArgumentParser(description="ESP32 NVS partition generation utility")
     parser = argparse.ArgumentParser(description="ESP32 NVS partition generation utility")
     parser.add_argument(
     parser.add_argument(
             "input",
             "input",
             help="Path to CSV file to parse. Will use stdin if omitted",
             help="Path to CSV file to parse. Will use stdin if omitted",
-            type=argparse.FileType('rb'),
             default=sys.stdin)
             default=sys.stdin)
 
 
     parser.add_argument(
     parser.add_argument(
             "output",
             "output",
             help='Path to output converted binary file. Will use stdout if omitted',
             help='Path to output converted binary file. Will use stdout if omitted',
-            type=argparse.FileType('wb'),
             default=sys.stdout)
             default=sys.stdout)
 
 
     args = parser.parse_args()
     args = parser.parse_args()
-    with nvs_open(args.output) as nvs_obj:
-        reader = csv.DictReader(args.input, delimiter=',')
-        for row in reader:
-            try:
-                write_entry(nvs_obj, row["key"], row["type"], row["encoding"], row["value"])
-            except InputError as e:
-                print(e)
-                exit(-2)
+    input_filename = args.input
+    output_filename = args.output
+    nvs_part_gen(input_filename, output_filename)
+
+
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
     main()
     main()

+ 2 - 0
components/nvs_flash/nvs_partition_generator/sample.csv

@@ -7,6 +7,8 @@ dummyU32Key,data,u32,4294967295
 dummyI32Key,data,i32,-2147483648
 dummyI32Key,data,i32,-2147483648
 dummyStringKey,data,string,0A:0B:0C:0D:0E:0F
 dummyStringKey,data,string,0A:0B:0C:0D:0E:0F
 dummyHex2BinKey,data,hex2bin,010203abcdef
 dummyHex2BinKey,data,hex2bin,010203abcdef
+dummyBase64Key,data,base64,MTIzYWJj
 hexFileKey,file,hex2bin,testdata/sample.hex
 hexFileKey,file,hex2bin,testdata/sample.hex
+base64FileKey,file,base64,testdata/sample.base64
 stringFileKey,file,string,testdata/sample.txt
 stringFileKey,file,string,testdata/sample.txt
 binFileKey,file,binary,testdata/sample.bin
 binFileKey,file,binary,testdata/sample.bin

+ 1 - 0
components/nvs_flash/nvs_partition_generator/testdata/sample.base64

@@ -0,0 +1 @@
+AQIDBAUGBwgJq83v

+ 3 - 0
components/nvs_flash/test_nvs_host/test_nvs.cpp

@@ -1548,6 +1548,9 @@ TEST_CASE("read data from partition generated via partition generation utility",
     uint8_t hexdata[] = {0x01, 0x02, 0x03, 0xab, 0xcd, 0xef};
     uint8_t hexdata[] = {0x01, 0x02, 0x03, 0xab, 0xcd, 0xef};
     TEST_ESP_OK( nvs_get_blob(handle, "dummyHex2BinKey", buf, &buflen));
     TEST_ESP_OK( nvs_get_blob(handle, "dummyHex2BinKey", buf, &buflen));
     CHECK(memcmp(buf, hexdata, buflen) == 0);
     CHECK(memcmp(buf, hexdata, buflen) == 0);
+    uint8_t base64data[] = {'1', '2', '3', 'a', 'b', 'c'};
+    TEST_ESP_OK( nvs_get_blob(handle, "dummyBase64Key", buf, &buflen));
+    CHECK(memcmp(buf, base64data, buflen) == 0);
 }
 }
 
 
 TEST_CASE("dump all performance data", "[nvs]")
 TEST_CASE("dump all performance data", "[nvs]")

+ 1 - 0
tools/ci/executable-list.txt

@@ -7,6 +7,7 @@ components/partition_table/gen_esp32part.py
 components/partition_table/parttool.py
 components/partition_table/parttool.py
 components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py
 components/partition_table/test_gen_esp32part_host/gen_esp32part_tests.py
 components/ulp/esp32ulp_mapgen.py
 components/ulp/esp32ulp_mapgen.py
+components/nvs_flash/nvs_partition_generator/nvs_partition_gen.py
 docs/check_doc_warnings.sh
 docs/check_doc_warnings.sh
 docs/check_lang_folder_sync.sh
 docs/check_lang_folder_sync.sh
 docs/gen-kconfig-doc.py
 docs/gen-kconfig-doc.py