From eafa002b5c6be8079ef8ad9a7beeee8af9cb2527 Mon Sep 17 00:00:00 2001 From: Andreas Tsouchlos Date: Fri, 25 Aug 2023 12:16:18 +0200 Subject: [PATCH] Add helloworld project; Add Dockerfile and idf.sh; Update README.md --- CMakeLists.txt | 6 ++++ Dockerfile | 11 +++++++ README.md | 28 +++++++++++++++++- components/ble/CMakeLists.txt | 0 components/wifi/CMakeLists.txt | 0 idf.sh | 9 ++++++ main/CMakeLists.txt | 4 +++ main/src/main.cpp | 52 ++++++++++++++++++++++++++++++++++ 8 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 Dockerfile create mode 100644 components/ble/CMakeLists.txt create mode 100644 components/wifi/CMakeLists.txt create mode 100755 idf.sh create mode 100644 main/CMakeLists.txt create mode 100644 main/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..205bc2a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.16) + +set(CMAKE_CXX_STANDARD 20) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(HyperLink) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..faf2c56 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM espressif/idf:release-v5.1 + +LABEL maintainer="andreas.tsouchlos@gmail.com" + +# Make building with a non-root user possible +RUN mkdir -p /home/build +RUN chmod -R 777 /home/build +ENV HOME=/home/build + +ENV IDF_TARGET=esp32c3 + diff --git a/README.md b/README.md index a067d00..d89c31f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ # HyperLink_SW -Firmware for the HyperLink board. \ No newline at end of file +Firmware for the HyperLink board. + +## Build and run + +This project is built using the [ESP IDF](https://docs.espressif.com/projects/esp-idf/en/release-v5.1/esp32/index.html) toolchain. +In order to ease the build process, a custom `Dockerfile` is provided. +Any ESP IDF toolchain command can be run by replacing `idf.py` by `./idf.sh`, e.g., `./idf.sh build`, +after having built the docker image. + +As the docker container has to be able to access the serial device for flashing, +some configuration may have to take place. +Make sure the `USB_GUID` and `USB_DEV` in `idf.py` have the correct values. + +1. Build the docker image + ```bash + $ sudo docker build . --tag hyperlink + ``` + +2. Compile the project + ```bash + $ ./idf.sh build + ``` + +3. Flash the executable + ```bash + $ ./idf.sh flash + ``` diff --git a/components/ble/CMakeLists.txt b/components/ble/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/components/wifi/CMakeLists.txt b/components/wifi/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/idf.sh b/idf.sh new file mode 100755 index 0000000..cba1a1c --- /dev/null +++ b/idf.sh @@ -0,0 +1,9 @@ +# This variabe should contain the GUID of the group responsible for the serial +# devices (e.g., 'dialout' for Ubuntu or 'uucp' for Arch) +USB_GUID=986 + +# This variable should contain the path to the serial device corresponding to +# the ESP32 board (e.g., '/dev/ttyUSB0' or '/dev/ttyACM0'). +USB_DEV=/dev/ttyUSB0 + +sudo docker run --device=${USB_DEV} --rm --user $(id -u):${USB_GUID} -v $PWD:/project -w /project -it hyperlink idf.py $@ diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt new file mode 100644 index 0000000..91aef2d --- /dev/null +++ b/main/CMakeLists.txt @@ -0,0 +1,4 @@ +set(SOURCES src/main.cpp) +set(INCLUDES include) + +idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${INCLUDES}) diff --git a/main/src/main.cpp b/main/src/main.cpp new file mode 100644 index 0000000..90b17a7 --- /dev/null +++ b/main/src/main.cpp @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_chip_info.h" +#include "esp_flash.h" +#include "esp_system.h" + +extern "C" void app_main(void) +{ + printf("Hello world!\n"); + + /* Print chip information */ + esp_chip_info_t chip_info; + uint32_t flash_size; + esp_chip_info(&chip_info); + printf("This is %s chip with %d CPU core(s), %s%s%s%s, ", + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "", + (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "", + (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : ""); + + unsigned major_rev = chip_info.revision / 100; + unsigned minor_rev = chip_info.revision % 100; + printf("silicon revision v%d.%d, ", major_rev, minor_rev); + if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + printf("Get flash size failed"); + return; + } + + printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024), + (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); + + printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + + for (int i = 10; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + esp_restart(); +}