commit
da696786ed
10 changed files with 457 additions and 0 deletions
@ -0,0 +1,48 @@ |
|||||
|
FROM espressif/idf |
||||
|
|
||||
|
ARG DEBIAN_FRONTEND=nointeractive |
||||
|
ARG CONTAINER_USER=esp |
||||
|
ARG USER_UID=1000 |
||||
|
ARG USER_GID=$USER_UID |
||||
|
|
||||
|
RUN apt-get update \ |
||||
|
&& apt install -y -q \ |
||||
|
cmake \ |
||||
|
git \ |
||||
|
hwdata \ |
||||
|
libglib2.0-0 \ |
||||
|
libnuma1 \ |
||||
|
libpixman-1-0 \ |
||||
|
linux-tools-virtual \ |
||||
|
&& rm -rf /var/lib/apt/lists/* |
||||
|
|
||||
|
RUN update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20 |
||||
|
|
||||
|
# QEMU |
||||
|
ENV QEMU_REL=esp-develop-20220919 |
||||
|
ENV QEMU_SHA256=f6565d3f0d1e463a63a7f81aec94cce62df662bd42fc7606de4b4418ed55f870 |
||||
|
ENV QEMU_DIST=qemu-${QEMU_REL}.tar.bz2 |
||||
|
ENV QEMU_URL=https://github.com/espressif/qemu/releases/download/${QEMU_REL}/${QEMU_DIST} |
||||
|
|
||||
|
ENV LC_ALL=C.UTF-8 |
||||
|
ENV LANG=C.UTF-8 |
||||
|
|
||||
|
RUN wget --no-verbose ${QEMU_URL} \ |
||||
|
&& echo "${QEMU_SHA256} *${QEMU_DIST}" | sha256sum --check --strict - \ |
||||
|
&& tar -xf $QEMU_DIST -C /opt \ |
||||
|
&& rm ${QEMU_DIST} |
||||
|
|
||||
|
ENV PATH=/opt/qemu/bin:${PATH} |
||||
|
|
||||
|
RUN groupadd --gid $USER_GID $CONTAINER_USER \ |
||||
|
&& adduser --uid $USER_UID --gid $USER_GID --disabled-password --gecos "" ${CONTAINER_USER} \ |
||||
|
&& usermod -a -G dialout $CONTAINER_USER |
||||
|
USER ${CONTAINER_USER} |
||||
|
ENV USER=${CONTAINER_USER} |
||||
|
WORKDIR /home/${CONTAINER_USER} |
||||
|
|
||||
|
RUN echo "source /opt/esp/idf/export.sh > /dev/null 2>&1" >> ~/.bashrc |
||||
|
|
||||
|
ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] |
||||
|
|
||||
|
CMD ["/bin/bash", "-c"] |
||||
@ -0,0 +1,47 @@ |
|||||
|
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: |
||||
|
// https://github.com/microsoft/vscode-dev-containers/tree/v0.183.0/containers/ubuntu |
||||
|
{ |
||||
|
"name": "ESP-IDF QEMU", |
||||
|
"build": { |
||||
|
"dockerfile": "Dockerfile" |
||||
|
}, |
||||
|
// Add the IDs of extensions you want installed when the container is created |
||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=${localWorkspaceFolder},type=bind", |
||||
|
/* the path of workspace folder to be opened after container is running |
||||
|
*/ |
||||
|
"workspaceFolder": "${localWorkspaceFolder}", |
||||
|
"mounts": [ |
||||
|
"source=extensionCache,target=/root/.vscode-server/extensions,type=volume" |
||||
|
], |
||||
|
"customizations": { |
||||
|
"vscode": { |
||||
|
"settings": { |
||||
|
"terminal.integrated.defaultProfile.linux": "bash", |
||||
|
"idf.espIdfPath": "/opt/esp/idf", |
||||
|
"idf.customExtraPaths": "", |
||||
|
"idf.pythonBinPath": "/opt/esp/python_env/idf5.1_py3.8_env/bin/python", |
||||
|
"idf.toolsPath": "/opt/esp", |
||||
|
"idf.gitPath": "/usr/bin/git" |
||||
|
}, |
||||
|
"extensions": [ |
||||
|
"ms-vscode.cpptools", |
||||
|
"espressif.esp-idf-extension" |
||||
|
], |
||||
|
}, |
||||
|
"codespaces": { |
||||
|
"settings": { |
||||
|
"terminal.integrated.defaultProfile.linux": "bash", |
||||
|
"idf.espIdfPath": "/opt/esp/idf", |
||||
|
"idf.customExtraPaths": "", |
||||
|
"idf.pythonBinPath": "/opt/esp/python_env/idf5.1_py3.8_env/bin/python", |
||||
|
"idf.toolsPath": "/opt/esp", |
||||
|
"idf.gitPath": "/usr/bin/git" |
||||
|
}, |
||||
|
"extensions": [ |
||||
|
"ms-vscode.cpptools", |
||||
|
"espressif.esp-idf-extension" |
||||
|
], |
||||
|
} |
||||
|
}, |
||||
|
"runArgs": ["--privileged"] |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
{ |
||||
|
"configurations": [ |
||||
|
{ |
||||
|
"name": "ESP-IDF", |
||||
|
"compilerPath": "${config:idf.toolsPath}\\tools\\xtensa-esp32-elf\\esp-2022r1-11.2.0\\xtensa-esp32-elf\\bin\\xtensa-esp32-elf-gcc.exe", |
||||
|
"includePath": [ |
||||
|
"${config:idf.espIdfPath}/components/**", |
||||
|
"${config:idf.espIdfPathWin}/components/**", |
||||
|
"${config:idf.espAdfPath}/components/**", |
||||
|
"${config:idf.espAdfPathWin}/components/**", |
||||
|
"${workspaceFolder}/**" |
||||
|
], |
||||
|
"browse": { |
||||
|
"path": [ |
||||
|
"${config:idf.espIdfPath}/components", |
||||
|
"${config:idf.espIdfPathWin}/components", |
||||
|
"${config:idf.espAdfPath}/components/**", |
||||
|
"${config:idf.espAdfPathWin}/components/**", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"limitSymbolsToIncludedHeaders": false |
||||
|
} |
||||
|
} |
||||
|
], |
||||
|
"version": 4 |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
{ |
||||
|
"version": "0.2.0", |
||||
|
"configurations": [ |
||||
|
{ |
||||
|
"type": "espidf", |
||||
|
"name": "Launch", |
||||
|
"request": "launch" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
{ |
||||
|
"C_Cpp.intelliSenseEngine": "default", |
||||
|
"idf.adapterTargetName": "esp32", |
||||
|
"idf.customExtraPaths": "C:\\Users\\lucas\\.espressif\\tools\\xtensa-esp-elf-gdb\\11.2_20220823\\xtensa-esp-elf-gdb\\bin;C:\\Users\\lucas\\.espressif\\tools\\riscv32-esp-elf-gdb\\11.2_20220823\\riscv32-esp-elf-gdb\\bin;C:\\Users\\lucas\\.espressif\\tools\\xtensa-esp32-elf\\esp-2022r1-11.2.0\\xtensa-esp32-elf\\bin;C:\\Users\\lucas\\.espressif\\tools\\xtensa-esp32s2-elf\\esp-2022r1-11.2.0\\xtensa-esp32s2-elf\\bin;C:\\Users\\lucas\\.espressif\\tools\\xtensa-esp32s3-elf\\esp-2022r1-11.2.0\\xtensa-esp32s3-elf\\bin;C:\\Users\\lucas\\.espressif\\tools\\riscv32-esp-elf\\esp-2022r1-11.2.0\\riscv32-esp-elf\\bin;C:\\Users\\lucas\\.espressif\\tools\\esp32ulp-elf\\2.35_20220830\\esp32ulp-elf\\bin;C:\\Users\\lucas\\.espressif\\tools\\cmake\\3.24.0\\bin;C:\\Users\\lucas\\.espressif\\tools\\openocd-esp32\\v0.11.0-esp32-20221026\\openocd-esp32\\bin;C:\\Users\\lucas\\.espressif\\tools\\ninja\\1.10.2;C:\\Users\\lucas\\.espressif\\tools\\idf-exe\\1.0.3;C:\\Users\\lucas\\.espressif\\tools\\ccache\\4.6.2\\ccache-4.6.2-windows-x86_64;C:\\Users\\lucas\\.espressif\\tools\\dfu-util\\0.9\\dfu-util-0.9-win64;C:\\Users\\lucas\\.espressif\\tools\\esp-rom-elfs\\20220823", |
||||
|
"idf.customExtraVars": { |
||||
|
"OPENOCD_SCRIPTS": "C:\\Users\\lucas\\.espressif\\tools\\openocd-esp32\\v0.11.0-esp32-20221026/openocd-esp32/share/openocd/scripts", |
||||
|
"IDF_CCACHE_ENABLE": "1", |
||||
|
"ESP_ROM_ELF_DIR": "C:\\Users\\lucas\\.espressif\\tools\\esp-rom-elfs\\20220823/" |
||||
|
}, |
||||
|
"idf.espIdfPathWin": "C:\\Users\\lucas\\esp\\esp-idf", |
||||
|
"idf.openOcdConfigs": [ |
||||
|
"board/esp32-wrover-kit-3.3v.cfg" |
||||
|
], |
||||
|
"idf.portWin": "COM3", |
||||
|
"idf.pythonBinPathWin": "C:\\Users\\lucas\\.espressif\\python_env\\idf5.0_py3.8_env\\Scripts\\python.exe", |
||||
|
"idf.toolsPathWin": "C:\\Users\\lucas\\.espressif" |
||||
|
} |
||||
@ -0,0 +1,258 @@ |
|||||
|
{ |
||||
|
"version": "2.0.0", |
||||
|
"tasks": [ |
||||
|
{ |
||||
|
"label": "Build - Build project", |
||||
|
"type": "shell", |
||||
|
"command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py build", |
||||
|
"windows": { |
||||
|
"command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py build", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": [ |
||||
|
{ |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
], |
||||
|
"group": { |
||||
|
"kind": "build", |
||||
|
"isDefault": true |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"label": "Set ESP-IDF Target", |
||||
|
"type": "shell", |
||||
|
"command": "${command:espIdf.setTarget}", |
||||
|
"problemMatcher": { |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"label": "Clean - Clean the project", |
||||
|
"type": "shell", |
||||
|
"command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py fullclean", |
||||
|
"windows": { |
||||
|
"command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py fullclean", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": [ |
||||
|
{ |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"label": "Flash - Flash the device", |
||||
|
"type": "shell", |
||||
|
"command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py -p ${config:idf.port} -b ${config:idf.flashBaudRate} flash", |
||||
|
"windows": { |
||||
|
"command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py flash -p ${config:idf.portWin} -b ${config:idf.flashBaudRate}", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": [ |
||||
|
{ |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"label": "Monitor: Start the monitor", |
||||
|
"type": "shell", |
||||
|
"command": "${config:idf.pythonBinPath} ${config:idf.espIdfPath}/tools/idf.py -p ${config:idf.port} monitor", |
||||
|
"windows": { |
||||
|
"command": "${config:idf.pythonBinPathWin} ${config:idf.espIdfPathWin}\\tools\\idf.py -p ${config:idf.portWin} monitor", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": [ |
||||
|
{ |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
], |
||||
|
"dependsOn": "Flash - Flash the device" |
||||
|
}, |
||||
|
{ |
||||
|
"label": "OpenOCD: Start openOCD", |
||||
|
"type": "shell", |
||||
|
"presentation": { |
||||
|
"echo": true, |
||||
|
"reveal": "never", |
||||
|
"focus": false, |
||||
|
"panel": "new" |
||||
|
}, |
||||
|
"command": "openocd -s ${command:espIdf.getOpenOcdScriptValue} ${command:espIdf.getOpenOcdConfigs}", |
||||
|
"windows": { |
||||
|
"command": "openocd.exe -s ${command:espIdf.getOpenOcdScriptValue} ${command:espIdf.getOpenOcdConfigs}", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": { |
||||
|
"owner": "cpp", |
||||
|
"fileLocation": [ |
||||
|
"autoDetect", |
||||
|
"${workspaceFolder}" |
||||
|
], |
||||
|
"pattern": { |
||||
|
"regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", |
||||
|
"file": 1, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 5 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"label": "adapter", |
||||
|
"type": "shell", |
||||
|
"command": "${config:idf.pythonBinPath}", |
||||
|
"isBackground": true, |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH}:${config:idf.customExtraPaths}", |
||||
|
"PYTHONPATH": "${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter" |
||||
|
} |
||||
|
}, |
||||
|
"problemMatcher": { |
||||
|
"background": { |
||||
|
"beginsPattern": "\bDEBUG_ADAPTER_STARTED\b", |
||||
|
"endsPattern": "DEBUG_ADAPTER_READY2CONNECT", |
||||
|
"activeOnStart": true |
||||
|
}, |
||||
|
"pattern": { |
||||
|
"regexp": "(\\d+)-(\\d+)-(\\d+)\\s(\\d+):(\\d+):(\\d+),(\\d+)\\s-(.+)\\s(ERROR)", |
||||
|
"file": 8, |
||||
|
"line": 2, |
||||
|
"column": 3, |
||||
|
"severity": 4, |
||||
|
"message": 9 |
||||
|
} |
||||
|
}, |
||||
|
"args": [ |
||||
|
"${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter_main.py", |
||||
|
"-e", |
||||
|
"${workspaceFolder}/build/${command:espIdf.getProjectName}.elf", |
||||
|
"-s", |
||||
|
"${command:espIdf.getOpenOcdScriptValue}", |
||||
|
"-ip", |
||||
|
"localhost", |
||||
|
"-dn", |
||||
|
"${config:idf.adapterTargetName}", |
||||
|
"-om", |
||||
|
"connect_to_instance" |
||||
|
], |
||||
|
"windows": { |
||||
|
"command": "${config:idf.pythonBinPathWin}", |
||||
|
"options": { |
||||
|
"env": { |
||||
|
"PATH": "${env:PATH};${config:idf.customExtraPaths}", |
||||
|
"PYTHONPATH": "${command:espIdf.getExtensionPath}/esp_debug_adapter/debug_adapter" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
# For more information about build system see |
||||
|
# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html |
||||
|
# The following five lines of boilerplate have to be in your project's |
||||
|
# CMakeLists in this exact order for cmake to work correctly |
||||
|
cmake_minimum_required(VERSION 3.16) |
||||
|
|
||||
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake) |
||||
|
project(SPI_TEST_0) |
||||
@ -0,0 +1,35 @@ |
|||||
|
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | |
||||
|
| ----------------- | ----- | -------- | -------- | -------- | -------- | |
||||
|
|
||||
|
# _Sample project_ |
||||
|
|
||||
|
(See the README.md file in the upper level 'examples' directory for more information about examples.) |
||||
|
|
||||
|
This is the simplest buildable example. The example is used by command `idf.py create-project` |
||||
|
that copies the project to user specified path and set it's name. For more information follow the [docs page](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html#start-a-new-project) |
||||
|
|
||||
|
|
||||
|
|
||||
|
## How to use example |
||||
|
We encourage the users to use the example as a template for the new projects. |
||||
|
A recommended way is to follow the instructions on a [docs page](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html#start-a-new-project). |
||||
|
|
||||
|
## Example folder contents |
||||
|
|
||||
|
The project **sample_project** contains one source file in C language [main.c](main/main.c). The file is located in folder [main](main). |
||||
|
|
||||
|
ESP-IDF projects are built using CMake. The project build configuration is contained in `CMakeLists.txt` |
||||
|
files that provide set of directives and instructions describing the project's source files and targets |
||||
|
(executable, library, or both). |
||||
|
|
||||
|
Below is short explanation of remaining files in the project folder. |
||||
|
|
||||
|
``` |
||||
|
├── CMakeLists.txt |
||||
|
├── main |
||||
|
│ ├── CMakeLists.txt |
||||
|
│ └── main.c |
||||
|
└── README.md This is the file you are currently reading |
||||
|
``` |
||||
|
Additionally, the sample project contains Makefile and component.mk files, used for the legacy Make based build system. |
||||
|
They are not used or needed when building with CMake and idf.py. |
||||
@ -0,0 +1,2 @@ |
|||||
|
idf_component_register(SRCS "main.c" |
||||
|
INCLUDE_DIRS ".") |
||||
@ -0,0 +1,6 @@ |
|||||
|
#include <stdio.h> |
||||
|
|
||||
|
void app_main(void) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
Loading…
Reference in new issue