diff --git a/CODEOWNERS b/CODEOWNERS index 45cbbb43e7e..57fd18d9f8e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -514,6 +514,7 @@ /samples/bluetooth/ @jhedberg @Vudentz @joerchan /samples/boards/intel_s1000_crb/ @sathishkuttan @dcpleung @nashif /samples/subsys/display/ @vanwinkeljan +/samples/compression/ @Navin-Sankar /samples/drivers/can/ @alexanderwachter /samples/drivers/clock_control_litex/ @mateusz-holenko @kgugala @pgielda /samples/drivers/display/ @vanwinkeljan diff --git a/modules/Kconfig b/modules/Kconfig index a27870641b4..30943f14300 100644 --- a/modules/Kconfig +++ b/modules/Kconfig @@ -59,6 +59,9 @@ comment "Trusted-firmware-m module not available." comment "Nanopb module not available." depends on !ZEPHYR_NANOPB_MODULE +comment "Lz4 module not available." + depends on !ZEPHYR_LZ4_MODULE + # This ensures that symbols are available in Kconfig for dependency checking # and referencing, while keeping the settings themselves unavailable when the # modules are not present in the workspace diff --git a/modules/lz4/CMakeLists.txt b/modules/lz4/CMakeLists.txt new file mode 100644 index 00000000000..9b9a56976eb --- /dev/null +++ b/modules/lz4/CMakeLists.txt @@ -0,0 +1,16 @@ +# Copyright (c) 2020 Linumiz +# SPDX-License-Identifier: Apache-2.0 + +if(CONFIG_LZ4) + + set(LZ4_DIR ${ZEPHYR_CURRENT_MODULE_DIR}) + + zephyr_library() + + zephyr_include_directories(${LZ4_DIR}/lib) + + zephyr_library_sources( + ${LZ4_DIR}/lib/lz4.c + ) + +endif() diff --git a/modules/lz4/Kconfig b/modules/lz4/Kconfig new file mode 100644 index 00000000000..06c1e9226c7 --- /dev/null +++ b/modules/lz4/Kconfig @@ -0,0 +1,11 @@ +# Copyright (c) 2020 Linumiz +# SPDX-License-Identifier: Apache-2.0 + +config ZEPHYR_LZ4_MODULE + bool + +config LZ4 + bool "Enable lz4 data compression and decompression" + help + This option enables lz4 compression & decompression library + support. diff --git a/samples/compression/compression.rst b/samples/compression/compression.rst new file mode 100644 index 00000000000..9cc3cd3d3c3 --- /dev/null +++ b/samples/compression/compression.rst @@ -0,0 +1,10 @@ +.. _compression-samples: + +Compression Samples +################### + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/samples/compression/lz4/CMakeLists.txt b/samples/compression/lz4/CMakeLists.txt new file mode 100644 index 00000000000..939cf708767 --- /dev/null +++ b/samples/compression/lz4/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.13.1) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(lz4) + +target_sources(app PRIVATE src/main.c) diff --git a/samples/compression/lz4/README.rst b/samples/compression/lz4/README.rst new file mode 100644 index 00000000000..e3368e93517 --- /dev/null +++ b/samples/compression/lz4/README.rst @@ -0,0 +1,23 @@ +.. _lz4: + +LZ4 +### + +Overview +******** + +A simple sample that can be used with any :ref:`supported board ` and +compress & decompress the user data to the console. + +Building and Running +******************** + +The sample can be built and executed on frdm_k64f as follows: + +.. zephyr-app-commands:: + :zephyr-app: samples/compression/lz4 + :board: nrf52840dk_nrf52840 + :goals: build flash + :compact: + +To build for another board, change "nrf52840dk_nrf52840" above to that board's name. diff --git a/samples/compression/lz4/prj.conf b/samples/compression/lz4/prj.conf new file mode 100644 index 00000000000..34e20dad07d --- /dev/null +++ b/samples/compression/lz4/prj.conf @@ -0,0 +1,3 @@ +CONFIG_LZ4=y +CONFIG_NEWLIB_LIBC=y +CONFIG_HEAP_MEM_POOL_SIZE=16384 diff --git a/samples/compression/lz4/sample.yaml b/samples/compression/lz4/sample.yaml new file mode 100644 index 00000000000..561a66727d9 --- /dev/null +++ b/samples/compression/lz4/sample.yaml @@ -0,0 +1,14 @@ +sample: + name: lz4 sample + description: lz4 data compression library +common: + tags: compression lz4 + min_ram: 32 + harness: console + harness_config: + type: one_line + regex: + - "Validation done. (.*)" +tests: + sample.compression.lz4: + tags: compression lz4 diff --git a/samples/compression/lz4/src/main.c b/samples/compression/lz4/src/main.c new file mode 100644 index 00000000000..5915d443cae --- /dev/null +++ b/samples/compression/lz4/src/main.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2020 Linumiz + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include "lz4.h" + +void main(void) +{ + static const char *src = "Lorem ipsum dolor sit amet, consectetur " + "adipiscing elit. Quisque sodales lorem lorem, sed congue enim " + "vehicula a. Sed finibus diam sed odio ultrices pharetra. Nullam " + "dictum arcu ultricies turpis congue,vel venenatis turpis venenatis. " + "Nam tempus arcu eros, ac congue libero tristique congue. Proin velit " + "lectus, euismod sit amet quam in, maximus condimentum urna. Cras vel " + "erat luctus, mattis orci ut, varius urna. Nam eu lobortis velit." + "\n" + "Nullam sit amet diam vel odio sodales cursus vehicula eu arcu. Proin " + "fringilla, enim nec consectetur mollis, lorem orci interdum nisi, " + "vitae suscipit nisi mauris eu mi. Proin diam enim, mollis ac rhoncus " + "vitae, placerat et eros. Suspendisse convallis, ipsum nec rhoncus " + "aliquam, ex augue ultrices nisl, id aliquet mi diam quis ante. " + "Pellentesque venenatis ornare ultrices. Quisque et porttitor lectus. " + "Ut venenatis nunc et urna imperdiet porttitor non laoreet massa." + "Donec eleifend eros in mi sagittis egestas. Sed et mi nunc. Nunc " + "vulputate,mauris non ullamcorper viverra, lorem nulla vulputate " + "diam, et congue dui velit non erat. Duis interdum leo et ipsum " + "tempor consequat. In faucibus enim quis purus vulputate nullam." + "\n"; + + const int src_size = (int)(strlen(src) + 1); + const int max_dst_size = LZ4_compressBound(src_size); + + char *compressed_data = malloc((size_t)max_dst_size); + + if (compressed_data == NULL) { + printk("Failed to allocate memory for compressed data\n"); + return; + } + + const int compressed_data_size = LZ4_compress_default(src, + compressed_data, src_size, + max_dst_size); + if (compressed_data_size <= 0) { + printk("Failed to compress the data\n"); + return; + } + + printk("Original Data size: %d\n", src_size); + printk("Compressed Data size : %d\n", compressed_data_size); + + compressed_data = (char *)realloc(compressed_data, + (size_t)compressed_data_size); + if (compressed_data == NULL) { + printk("Failed to re-alloc memory for compressed data\n"); + return; + } + + char * const decompressed_data = malloc(src_size); + + if (decompressed_data == NULL) { + printk("Failed to allocate memory to decompress data\n"); + return; + } + + const int decompressed_size = LZ4_decompress_safe(compressed_data, + decompressed_data, compressed_data_size, + src_size); + if (decompressed_size < 0) { + printk("Failed to decompress the data\n"); + return; + } + + free(compressed_data); + + if (decompressed_size >= 0) { + printk("Successfully decompressed some data\n"); + } + + if (decompressed_size != src_size) { + printk("Decompressed data is different from original\n"); + return; + } + + if (memcmp(src, decompressed_data, src_size) != 0) { + printk("Validation failed.\n"); + printk("*src and *new_src are not identical\n"); + return; + } + + printk("Validation done. The string we ended up with is:\n%s\n", + decompressed_data); +} diff --git a/samples/index.rst b/samples/index.rst index 533afb36b1a..350cdaaba35 100644 --- a/samples/index.rst +++ b/samples/index.rst @@ -24,6 +24,7 @@ Samples and Demos kernel/* tfm_integration/tfm_integration.rst modules/* + compression/* .. comment To add a new sample document, please use the template available under diff --git a/west.yml b/west.yml index 9aa26c25238..53cb2f88794 100644 --- a/west.yml +++ b/west.yml @@ -155,6 +155,9 @@ manifest: repo-path: tensorflow path: modules/lib/tensorflow revision: dc70a45a7cc12c25726a32cd91b28be59e7bc596 + - name: lz4 + path: modules/lib/lz4 + revision: 8e303c264fc21c2116dc612658003a22e933124d self: path: zephyr