From 0a0290c5ef23fc792746b5aa81810430e4f87e52 Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Tue, 13 Nov 2018 14:44:13 +0800 Subject: [PATCH] docs(esp8266): Bring docs generating script from esp-idf Commit ID: 13046e76 --- docs/Doxyfile | 251 ++++++++++++ docs/_static/api-guides.gif | Bin 0 -> 3285 bytes docs/_static/api-reference.gif | Bin 0 -> 3100 bytes docs/_static/espressif-logo.svg | 77 ++++ docs/_static/get-started.gif | Bin 0 -> 2865 bytes docs/_static/linux-logo.png | Bin 0 -> 24381 bytes docs/_static/macos-logo.png | Bin 0 -> 23904 bytes docs/_static/msys2-terminal-window.png | Bin 0 -> 11333 bytes docs/_static/project-configuration.png | Bin 0 -> 44035 bytes docs/_static/what-you-need.png | Bin 0 -> 110374 bytes docs/_static/windows-logo.png | Bin 0 -> 3455 bytes docs/conf_common.py | 384 ++++++++++++++++++ docs/docs_common.mk | 216 ++++++++++ docs/en/Makefile | 2 + docs/en/api-guides/index.rst | 32 ++ docs/en/api-reference/index.rst | 19 + .../en/api-reference/wifi/esp_smartconfig.rst | 7 + docs/en/api-reference/wifi/esp_wifi.rst | 33 ++ docs/en/api-reference/wifi/index.rst | 12 + docs/en/conf.py | 19 + docs/en/get-started/eclipse-setup-windows.rst | 90 ++++ docs/en/get-started/eclipse-setup.rst | 120 ++++++ docs/en/get-started/index.rst | 371 +++++++++++++++++ docs/en/get-started/linux-setup.rst | 118 ++++++ docs/en/get-started/macos-setup.rst | 57 +++ docs/en/get-started/windows-setup.rst | 70 ++++ docs/en/index.rst | 55 +++ docs/gen-dxd.py | 318 +++++++++++++++ docs/gen-toolchain-links.py | 77 ++++ docs/gen-version-specific-includes.py | 185 +++++++++ docs/link-roles.py | 70 ++++ docs/local_util.py | 55 +++ docs/requirements.txt | 12 + tools/check_python_dependencies.py | 76 ++++ tools/gen_esp_err_to_name.py | 352 ++++++++++++++++ tools/toolchain_versions.mk | 6 + 36 files changed, 3084 insertions(+) create mode 100644 docs/Doxyfile create mode 100644 docs/_static/api-guides.gif create mode 100644 docs/_static/api-reference.gif create mode 100644 docs/_static/espressif-logo.svg create mode 100644 docs/_static/get-started.gif create mode 100644 docs/_static/linux-logo.png create mode 100644 docs/_static/macos-logo.png create mode 100644 docs/_static/msys2-terminal-window.png create mode 100644 docs/_static/project-configuration.png create mode 100644 docs/_static/what-you-need.png create mode 100644 docs/_static/windows-logo.png create mode 100644 docs/conf_common.py create mode 100644 docs/docs_common.mk create mode 100644 docs/en/Makefile create mode 100644 docs/en/api-guides/index.rst create mode 100644 docs/en/api-reference/index.rst create mode 100644 docs/en/api-reference/wifi/esp_smartconfig.rst create mode 100644 docs/en/api-reference/wifi/esp_wifi.rst create mode 100644 docs/en/api-reference/wifi/index.rst create mode 100644 docs/en/conf.py create mode 100644 docs/en/get-started/eclipse-setup-windows.rst create mode 100644 docs/en/get-started/eclipse-setup.rst create mode 100644 docs/en/get-started/index.rst create mode 100644 docs/en/get-started/linux-setup.rst create mode 100644 docs/en/get-started/macos-setup.rst create mode 100644 docs/en/get-started/windows-setup.rst create mode 100644 docs/en/index.rst create mode 100755 docs/gen-dxd.py create mode 100644 docs/gen-toolchain-links.py create mode 100755 docs/gen-version-specific-includes.py create mode 100644 docs/link-roles.py create mode 100644 docs/local_util.py create mode 100644 docs/requirements.txt create mode 100755 tools/check_python_dependencies.py create mode 100755 tools/gen_esp_err_to_name.py create mode 100644 tools/toolchain_versions.mk diff --git a/docs/Doxyfile b/docs/Doxyfile new file mode 100644 index 00000000..3306fbc0 --- /dev/null +++ b/docs/Doxyfile @@ -0,0 +1,251 @@ +# This is Doxygen configuration file +# +# Doxygen provides over 260 configuration statements +# To make this file easier to follow, +# it contains only statements that are non-default +# +# NOTE: +# It is recommended not to change defaults unless specifically required +# Test any changes how they affect generated documentation +# Make sure that correct warnings are generated to flag issues with documented code +# +# For the complete list of configuration statements see: +# https://www.stack.nl/~dimitri/doxygen/manual/config.html + + +PROJECT_NAME = "ESP32 Programming Guide" + +## The 'INPUT' statement below is used as input by script 'gen-df-input.py' +## to automatically generate API reference list files heder_file.inc +## These files are placed in '_inc' directory +## and used to include in API reference documentation + +INPUT = \ + ## + ## Wi-Fi - API Reference + ## + ../../components/esp32/include/esp_wifi.h \ + ../../components/esp32/include/esp_wifi_types.h \ + ../../components/esp32/include/esp_smartconfig.h \ + ../../components/esp32/include/esp_now.h \ + ## Mesh - API Reference + ../../components/esp32/include/esp_mesh.h \ + ## Bluetooth - API Reference + ## Controller && VHCI + ../../components/bt/include/esp_bt.h \ + ## Bluetooth COMMON + ## Issue with __attribute__ + ../../components/bt/bluedroid/api/include/api/esp_bt_defs.h \ + ../../components/bt/bluedroid/api/include/api/esp_bt_main.h \ + ../../components/bt/bluedroid/api/include/api/esp_bt_device.h \ + ## Bluetooth LE + ../../components/bt/bluedroid/api/include/api/esp_gap_ble_api.h \ + ## Issue with __attribute__ + ../../components/bt/bluedroid/api/include/api/esp_gatt_defs.h \ + ../../components/bt/bluedroid/api/include/api/esp_gatts_api.h \ + ../../components/bt/bluedroid/api/include/api/esp_gattc_api.h \ + ../../components/bt/bluedroid/api/include/api/esp_blufi_api.h \ + ## Bluetooth Classic + ../../components/bt/bluedroid/api/include/api/esp_gap_bt_api.h \ + ## Issue with __attribute__ + ../../components/bt/bluedroid/api/include/api/esp_a2dp_api.h \ + ../../components/bt/bluedroid/api/include/api/esp_avrc_api.h \ + ../../components/bt/bluedroid/api/include/api/esp_spp_api.h \ + ../../components/bt/bluedroid/api/include/api/esp_hf_defs.h \ + ../../components/bt/bluedroid/api/include/api/esp_hf_client_api.h \ + ## + ## Ethernet - API Reference + ## + ../../components/ethernet/include/esp_eth.h \ + ../../components/ethernet/include/eth_phy/phy.h \ + ../../components/ethernet/include/eth_phy/phy_tlk110.h \ + ../../components/ethernet/include/eth_phy/phy_lan8720.h \ + ## + ## Peripherals - API Reference + ## + ../../components/driver/include/driver/adc.h \ + ../../components/driver/include/driver/can.h \ + ../../components/driver/include/driver/dac.h \ + ../../components/driver/include/driver/gpio.h \ + ../../components/driver/include/driver/rtc_io.h \ + ../../components/driver/include/driver/i2c.h \ + ../../components/driver/include/driver/i2s.h \ + ../../components/driver/include/driver/ledc.h \ + ../../components/driver/include/driver/mcpwm.h \ + ../../components/driver/include/driver/pcnt.h \ + ../../components/driver/include/driver/rmt.h \ + ../../components/driver/include/driver/sigmadelta.h \ + ../../components/driver/include/driver/spi_common.h \ + ../../components/driver/include/driver/spi_master.h \ + ../../components/driver/include/driver/spi_slave.h \ + ../../components/driver/include/driver/timer.h \ + ../../components/driver/include/driver/touch_pad.h \ + ../../components/driver/include/driver/uart.h \ + ../../components/esp_adc_cal/include/esp_adc_cal.h \ + ../../components/soc/esp32/include/soc/adc_channel.h \ + ../../components/soc/esp32/include/soc/dac_channel.h \ + ../../components/soc/esp32/include/soc/touch_channel.h \ + ../../components/soc/esp32/include/soc/uart_channel.h \ + ../../components/soc/esp32/include/soc/rtc_gpio_channel.h \ + ## + ## Protocols - API Reference + ## + ## ESP-TLS + ../../components/esp-tls/esp_tls.h \ + ## MQTT + ../../components/mqtt/esp-mqtt/include/mqtt_client.h \ + ## mDNS + ../../components/mdns/include/mdns.h \ + ../../components/esp_http_client/include/esp_http_client.h \ + ../../components/esp_http_server/include/esp_http_server.h \ + ## + ## Provisioning - API Reference + ## + ## Protocol Communication + ../../components/protocomm/include/common/protocomm.h \ + ../../components/protocomm/include/security/protocomm_security.h \ + ../../components/protocomm/include/security/protocomm_security0.h \ + ../../components/protocomm/include/security/protocomm_security1.h \ + ../../components/protocomm/include/transports/protocomm_ble.h \ + ../../components/protocomm/include/transports/protocomm_console.h \ + ../../components/protocomm/include/transports/protocomm_httpd.h \ + ## WiFi Provisioning + ../../components/wifi_provisioning/include/wifi_provisioning/wifi_config.h \ + ## + ## Storage - API Reference + ## + ## SPI Flash and Partition APIs + ../../components/spi_flash/include/esp_spi_flash.h \ + ../../components/spi_flash/include/esp_partition.h \ + ../../components/bootloader_support/include/esp_flash_encrypt.h \ + ## SPIFFS + ../../components/spiffs/include/esp_spiffs.h \ + ## SD/MMC Card Host + ../../components/sdmmc/include/sdmmc_cmd.h \ + ../../components/driver/include/driver/sdmmc_host.h \ + ../../components/driver/include/driver/sdmmc_types.h \ + ../../components/driver/include/driver/sdspi_host.h \ + ## SDIO slave + ../../components/driver/include/driver/sdio_slave.h \ + ## Non-Volatile Storage + ../../components/nvs_flash/include/nvs.h \ + ../../components/nvs_flash/include/nvs_flash.h \ + ## Virtual Filesystem + ../../components/vfs/include/esp_vfs.h \ + ../../components/vfs/include/esp_vfs_dev.h \ + ## FAT Filesystem + ## NOTE: for two lines below header_file.inc is not used + ../../components/fatfs/src/esp_vfs_fat.h \ + ../../components/fatfs/src/diskio.h \ + ## Wear Levelling + ../../components/wear_levelling/include/wear_levelling.h \ + ## + ## System - API Reference + ## + ## Memory Allocation # + ../../components/heap/include/esp_heap_caps.h \ + ../../components/heap/include/esp_heap_trace.h \ + ../../components/heap/include/esp_heap_caps_init.h \ + ../../components/heap/include/multi_heap.h \ + ## Himem + ../../components/esp32/include/esp_himem.h \ + ## Interrupt Allocation + ../../components/esp32/include/esp_intr_alloc.h \ + ## Watchdogs + ## NOTE: for two lines below header_file.inc is not used + ../../components/esp32/include/esp_int_wdt.h \ + ../../components/esp32/include/esp_task_wdt.h \ + ## Hooks + ../../components/esp32/include/esp_freertos_hooks.h \ + ## Inter-Processor Call + ../../components/esp32/include/esp_ipc.h \ + ## Over The Air Updates (OTA) + ../../components/app_update/include/esp_ota_ops.h \ + ## ESP HTTPS OTA + ../../components/esp_https_ota/include/esp_https_ota.h \ + ## Sleep + ../../components/esp32/include/esp_sleep.h \ + ## Logging + ../../components/log/include/esp_log.h \ + ## Base MAC address + ## NOTE: for line below header_file.inc is not used + ../../components/esp32/include/esp_system.h \ + ## + ## ULP Coprocessor - API Guides + ## + ## NOTE: for line below header_file.inc is not used + ../../components/ulp/include/esp32/ulp.h \ + ## + ## Application Level Tracing - API Reference + ## + ../../components/app_trace/include/esp_app_trace.h \ + ### Power management + ../../components/esp32/include/esp_pm.h \ + ../../components/esp32/include/esp32/pm.h \ + ### esp_timer, High Resolution Timer + ../../components/esp32/include/esp_timer.h \ + ### esp_event, Event Loop Library + ../../components/esp_event/include/esp_event.h \ + ../../components/esp_event/include/esp_event_base.h \ + ### ESP Pthread parameters + ../../components/pthread/include/esp_pthread.h \ + ### + ### FreeRTOS + ### + ../../components/freertos/include/freertos/task.h \ + ../../components/freertos/include/freertos/queue.h \ + ../../components/freertos/include/freertos/semphr.h \ + ../../components/freertos/include/freertos/timers.h \ + ../../components/freertos/include/freertos/event_groups.h \ + ### Ringbuffer + ../../components/esp_ringbuf/include/freertos/ringbuf.h \ + ### Helper functions for error codes + ../../components/esp32/include/esp_err.h \ + ### System APIs + ../../components/esp32/include/esp_system.h \ + ### Modbus controller component header file + ../../components/freemodbus/modbus_controller/mbcontroller.h + +## Get warnings for functions that have no documentation for their parameters or return value +## +WARN_NO_PARAMDOC = YES + +## Enable preprocessing and remove __attribute__(...) expressions from the INPUT files +## +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +PREDEFINED = \ + __attribute__(x)= \ + IRAM_ATTR= \ + configSUPPORT_DYNAMIC_ALLOCATION=1 \ + configSUPPORT_STATIC_ALLOCATION=1 \ + configQUEUE_REGISTRY_SIZE=1 \ + configUSE_RECURSIVE_MUTEXES=1 \ + configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS=1 \ + configNUM_THREAD_LOCAL_STORAGE_POINTERS=1 \ + configUSE_APPLICATION_TASK_TAG=1 \ + configTASKLIST_INCLUDE_COREID=1 + +## Do not complain about not having dot +## +HAVE_DOT = NO + +## Generate XML that is required for Breathe +## +GENERATE_XML = YES +XML_OUTPUT = xml + +GENERATE_HTML = NO +HAVE_DOT = NO +GENERATE_LATEX = NO +GENERATE_MAN = YES +GENERATE_RTF = NO + +## Skip distracting progress messages +## +QUIET = YES +## Log warnings in a file for further review +## +WARN_LOGFILE = "doxygen-warning-log.txt" + diff --git a/docs/_static/api-guides.gif b/docs/_static/api-guides.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc9dd36dba1f4c17e6cda59528cf28c8d66bc67e GIT binary patch literal 3285 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 literal 0 HcmV?d00001 diff --git a/docs/_static/api-reference.gif b/docs/_static/api-reference.gif new file mode 100644 index 0000000000000000000000000000000000000000..7fd81755b94f54e4844c0361e0b22809f7ce39bf GIT binary patch literal 3100 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 H4Ez59?Tp%x literal 0 HcmV?d00001 diff --git a/docs/_static/espressif-logo.svg b/docs/_static/espressif-logo.svg new file mode 100644 index 00000000..5fccc316 --- /dev/null +++ b/docs/_static/espressif-logo.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/get-started.gif b/docs/_static/get-started.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a7a8023b694b3fe0baaeaaa00a8110de2181795 GIT binary patch literal 2865 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 literal 0 HcmV?d00001 diff --git a/docs/_static/linux-logo.png b/docs/_static/linux-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1112db655d31bd4f0b517776d806ff1b1a6c2090 GIT binary patch literal 24381 zcmcGV^(8XzDcjL}Fch?Jy+)BvR=l@KIk zq%_hX-@QNI@4xW<;okeWKkVG|Io5004!qj+QCm+56u`0wvrl ziM4wO4SoVvw{wXz@2?#9 zxDIE5h_oc`dQ{nxx3siWSKn|;#!wU8E_(2}igPZ?SW{C1CfLV^2cq!aMCG+0XvlaUEP-HS;52@~w_3T9U7PhS~MHHtlDt zEKIi^Q=u_lzdq~6AXtkG-^h&DI_tYlR%G4s{Areb%Z;~#AlVJ}}CZT7F_hlxo)`Hm^OU#_<@ zkhZd%q?)dmCe(ZqJgiV@{mEM1XA#%ZY6zpBR-H%{6ni7(JV2kOCxyc6sH;%0DtzZj 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 literal 0 HcmV?d00001 diff --git a/docs/_static/macos-logo.png b/docs/_static/macos-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..289d1f601a25aecc21c32f9b63d5eeeaf05abd38 GIT binary patch literal 23904 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 literal 0 HcmV?d00001 diff --git a/docs/_static/project-configuration.png b/docs/_static/project-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..e724556c61a45fce961f904ef61cbdefdc3cede4 GIT binary patch literal 44035 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 jDfpG2@xOpV@|7zMEvjBq8PLbV@f!cXtomcht{! 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 literal 0 HcmV?d00001 diff --git a/docs/conf_common.py b/docs/conf_common.py new file mode 100644 index 00000000..8ffd0b3e --- /dev/null +++ b/docs/conf_common.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +# +# Common (non-language-specific) configuration for Read The Docs & Sphinx +# +# Based on a Read the Docs Template documentation build configuration file, +# created by sphinx-quickstart on Tue Aug 26 14:19:49 2014. +# +# This file is imported from a language-specific conf.py (ie en/conf.py or +# zh_CN/conf.py) +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +from __future__ import print_function +from __future__ import unicode_literals +import sys, os +import re +import subprocess +import shlex + +# Note: If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute + +from local_util import run_cmd_get_output, copy_if_modified + +# build_docs on the CI server sometimes fails under Python3. This is a workaround: +sys.setrecursionlimit(3500) + +try: + builddir = os.environ['BUILDDIR'] +except KeyError: + builddir = '_build' + +# Fill in a default IDF_PATH if it's missing (ie when Read The Docs is building the docs) +try: + idf_path = os.environ['IDF_PATH'] +except KeyError: + idf_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) + +def call_with_python(cmd): + # using sys.executable ensures that the scripts are called with the same Python interpreter + if os.system('{} {}'.format(sys.executable, cmd)) != 0: + raise RuntimeError('{} failed'.format(cmd)) + +# Call Doxygen to get XML files from the header files +print("Calling Doxygen to generate latest XML files") +if os.system("doxygen ../Doxyfile") != 0: + raise RuntimeError('Doxygen call failed') + +# Doxygen has generated XML files in 'xml' directory. +# Copy them to 'xml_in', only touching the files which have changed. +copy_if_modified('xml/', 'xml_in/') + +# Generate 'api_name.inc' files using the XML files by Doxygen +call_with_python('../gen-dxd.py') + +# Generate 'kconfig.inc' file from components' Kconfig files +print("Generating kconfig.inc from kconfig contents") +kconfig_inc_path = '{}/inc/kconfig.inc'.format(builddir) +temp_sdkconfig_path = '{}/sdkconfig.tmp'.format(builddir) +# note: trimming "examples" dir from KConfig/KConfig.projbuild as MQTT submodule +# has its own examples in the submodule. +kconfigs = subprocess.check_output(["find", "../../components", + "-name", "examples", "-prune", + "-o", "-name", "Kconfig", "-print"]).decode() +kconfig_projbuilds = subprocess.check_output(["find", "../../components", + "-name", "examples", "-prune", + "-o", "-name", "Kconfig.projbuild", "-print"]).decode() +confgen_args = [sys.executable, + "../../tools/kconfig_new/confgen.py", + "--kconfig", "../../Kconfig", + "--config", temp_sdkconfig_path, + "--create-config-if-missing", + "--env", "COMPONENT_KCONFIGS={}".format(kconfigs), + "--env", "COMPONENT_KCONFIGS_PROJBUILD={}".format(kconfig_projbuilds), + "--env", "IDF_PATH={}".format(idf_path), + "--output", "docs", kconfig_inc_path + '.in' +] +subprocess.check_call(confgen_args) +copy_if_modified(kconfig_inc_path + '.in', kconfig_inc_path) + +# Generate 'esp_err_defs.inc' file with ESP_ERR_ error code definitions +esp_err_inc_path = '{}/inc/esp_err_defs.inc'.format(builddir) +call_with_python('../../tools/gen_esp_err_to_name.py --rst_output ' + esp_err_inc_path + '.in') +copy_if_modified(esp_err_inc_path + '.in', esp_err_inc_path) + +# Generate version-related includes +# +# (Note: this is in a function as it needs to access configuration to get the language) +def generate_version_specific_includes(app): + print("Generating version-specific includes...") + version_tmpdir = '{}/version_inc'.format(builddir) + call_with_python('../gen-version-specific-includes.py {} {}'.format(app.config.language, version_tmpdir)) + copy_if_modified(version_tmpdir, '{}/inc'.format(builddir)) + +# Generate toolchain download links +print("Generating toolchain download links") +base_url = 'https://dl.espressif.com/dl/' +toolchain_tmpdir = '{}/toolchain_inc'.format(builddir) +call_with_python('../gen-toolchain-links.py ../../tools/toolchain_versions.mk {} {}'.format(base_url, toolchain_tmpdir)) +copy_if_modified(toolchain_tmpdir, '{}/inc'.format(builddir)) + +# http://stackoverflow.com/questions/12772927/specifying-an-online-image-in-sphinx-restructuredtext-format +# +suppress_warnings = ['image.nonlocal_uri'] + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['breathe', + 'link-roles', + 'sphinxcontrib.blockdiag', + 'sphinxcontrib.seqdiag', + 'sphinxcontrib.actdiag', + 'sphinxcontrib.nwdiag', + 'sphinxcontrib.rackdiag', + 'sphinxcontrib.packetdiag' + ] + +# Set up font for blockdiag, nwdiag, rackdiag and packetdiag +blockdiag_fontpath = '../_static/DejaVuSans.ttf' +seqdiag_fontpath = '../_static/DejaVuSans.ttf' +actdiag_fontpath = '../_static/DejaVuSans.ttf' +nwdiag_fontpath = '../_static/DejaVuSans.ttf' +rackdiag_fontpath = '../_static/DejaVuSans.ttf' +packetdiag_fontpath = '../_static/DejaVuSans.ttf' + +# Enabling this fixes cropping of blockdiag edge labels +seqdiag_antialias = True + +# Breathe extension variables + +# Doxygen regenerates files in 'xml/' directory every time, +# but we copy files to 'xml_in/' only when they change, to speed up +# incremental builds. +breathe_projects = { "esp32-idf": "xml_in/" } +breathe_default_project = "esp32-idf" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = ['.rst', '.md'] + +source_parsers = { + '.md': 'recommonmark.parser.CommonMarkParser', + } + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# + +# Readthedocs largely ignores 'version' and 'release', and displays one of +# 'latest', tag name, or branch name, depending on the build type. +# Still, this is useful for non-RTD builds. +# This is supposed to be "the short X.Y version", but it's the only version +# visible when you open index.html. +# Display full version to make things less confusing. +version = run_cmd_get_output('git describe') +# The full version, including alpha/beta/rc tags. +# If needed, nearest tag is returned by 'git describe --abbrev=0'. +release = version +print('Version: {0} Release: {1}'.format(version, release)) + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build','README.md'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = "../_static/espressif-logo.svg" + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['../_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'ReadtheDocsTemplatedoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'ReadtheDocsTemplate.tex', u'Read the Docs Template Documentation', + u'Read the Docs', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'readthedocstemplate', u'Read the Docs Template Documentation', + [u'Read the Docs'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'ReadtheDocsTemplate', u'Read the Docs Template Documentation', + u'Read the Docs', 'ReadtheDocsTemplate', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +# Override RTD CSS theme to introduce the theme corrections +# https://github.com/rtfd/sphinx_rtd_theme/pull/432 +def setup(app): + app.add_stylesheet('theme_overrides.css') + generate_version_specific_includes(app) diff --git a/docs/docs_common.mk b/docs/docs_common.mk new file mode 100644 index 00000000..7a77b572 --- /dev/null +++ b/docs/docs_common.mk @@ -0,0 +1,216 @@ +# "Common" Makefile for Sphinx documentation +# +# (included from en/Makefile & zh_CN/Makefile +# +# NOTE: This makefile runs with cwd=either en or zh_CN subfolder, so this +# (docs/) directory is '..' relative to it. + +# ************ IMPORTANT ***************** +# +# ReadTheDocs DOES NOT USE THIS MAKEFILE, +# so any behaviour additions must be +# done via Sphinx Config not here +# +# **************************************** + +# You can set these variables from the command line. +SPHINXOPTS = +# note: this is changed from sphinx-build so it depends on default python interpreter, not on /bin/sphinx-build +# (which will be the most recently installed version of sphinx and may not match) +SPHINXBUILD = python -m sphinx +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) -w sphinx-warning-log.txt . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext dependencies version-specific-includes check_python_packages + +help: + @echo "Please use \`make \' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled) " + +clean: + rm -rf $(BUILDDIR)/* + +# Notify users when some of the required python packages are not installed. +# Note: This is intended to help developers who generate the documentation on their local machine. Read The Docs uses +# the requirements.txt file directly and calls sphinx also directly without the use of the makefile! +check_python_packages: + $(IDF_PATH)/tools/check_python_dependencies.py -r $(IDF_PATH)/docs/requirements.txt + +html: | check_python_packages + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: | check_python_packages + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: | check_python_packages + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: | check_python_packages + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: | check_python_packages + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: | check_python_packages + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: | check_python_packages + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ReadtheDocsTemplate.qhc" + +devhelp: | check_python_packages + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/ReadtheDocsTemplate" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ReadtheDocsTemplate" + @echo "# devhelp" + +epub: | check_python_packages + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: | check_python_packages + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: | check_python_packages + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: | check_python_packages + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: | check_python_packages + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: | check_python_packages + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: | check_python_packages + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: | check_python_packages + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: | check_python_packages + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: | check_python_packages + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: | check_python_packages + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +gh-linkcheck: | check_python_packages + @echo "Checking for hardcoded GitHub links" + @if (find ../ -name '*.rst' | xargs grep \ + 'https://github.com/espressif/esp-idf/tree\|https://github.com/espressif/esp-idf/blob\|https://github.com/espressif/esp-idf/raw'\ + ); \ + then \ + echo "WARNINIG: Some .rst files contain hardcoded Github links."; \ + echo "Please check above output and replace links with one of the following:"; \ + echo "- :idf:\`dir\` - points to directory inside ESP-IDF"; \ + echo "- :idf_file:\`file\` - points to file inside ESP-IDF"; \ + echo "- :idf_raw:\`file\` - points to raw view of the file inside ESP-IDF"; \ + echo "- :component:\`dir\` - points to directory inside ESP-IDF components dir"; \ + echo "- :component_file:\`file\` - points to file inside ESP-IDF components dir"; \ + echo "- :component_raw:\`file\` - points to raw view of the file inside ESP-IDF"; \ + echo " components dir"; \ + echo "- :example:\`dir\` - points to directory inside ESP-IDF examples dir"; \ + echo "- :example_file:\`file\` - points to file inside ESP-IDF examples dir"; \ + echo "- :example_raw:\`file\` - points to raw view of the file inside ESP-IDF"; \ + echo " examples dir"; \ + echo "These link types will point to the correct GitHub version automatically"; \ + exit 1; \ + fi + @echo "No hardcoded links found" + +doctest: | check_python_packages + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: | check_python_packages + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: | check_python_packages + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/en/Makefile b/docs/en/Makefile new file mode 100644 index 00000000..281b7201 --- /dev/null +++ b/docs/en/Makefile @@ -0,0 +1,2 @@ +LANGUAGE=en +include ../docs_common.mk diff --git a/docs/en/api-guides/index.rst b/docs/en/api-guides/index.rst new file mode 100644 index 00000000..cf104468 --- /dev/null +++ b/docs/en/api-guides/index.rst @@ -0,0 +1,32 @@ +API Guides +********** + +.. toctree:: + :maxdepth: 1 + + General Notes + Build System + Build System (CMake) + Error Handling + Fatal Errors + Deep Sleep Wake Stubs + ESP32 Core Dump + Flash Encryption <../security/flash-encryption> + FreeRTOS SMP Changes + Thread Local Storage + High Level Interrupts + JTAG Debugging + Bootloader + Partition Tables + Secure Boot <../security/secure-boot> + ULP Coprocessor + ULP Coprocessor (CMake) + Unit Testing + Unit Testing (CMake) + Application Level Tracing + Console Component + ROM debug console + WiFi Driver + ESP-MESH + BluFi + External SPI-connected RAM diff --git a/docs/en/api-reference/index.rst b/docs/en/api-reference/index.rst new file mode 100644 index 00000000..0de5c5ae --- /dev/null +++ b/docs/en/api-reference/index.rst @@ -0,0 +1,19 @@ +************* +API Reference +************* + +.. toctree:: + :maxdepth: 2 + + Wi-Fi + Mesh + Bluetooth + Ethernet + Peripherals + Protocols + Provisioning + Storage + System + Configuration Options + Error Codes Reference + diff --git a/docs/en/api-reference/wifi/esp_smartconfig.rst b/docs/en/api-reference/wifi/esp_smartconfig.rst new file mode 100644 index 00000000..7ad26f5f --- /dev/null +++ b/docs/en/api-reference/wifi/esp_smartconfig.rst @@ -0,0 +1,7 @@ +Smart Config +============ + +API Reference +------------- + +.. include:: /_build/inc/esp_smartconfig.inc diff --git a/docs/en/api-reference/wifi/esp_wifi.rst b/docs/en/api-reference/wifi/esp_wifi.rst new file mode 100644 index 00000000..c8091e00 --- /dev/null +++ b/docs/en/api-reference/wifi/esp_wifi.rst @@ -0,0 +1,33 @@ +Wi-Fi +===== + +Introduction +------------ + +The WiFi libraries provide support for configuring and monitoring the ESP32 WiFi networking functionality. This includes configuration for: + +- Station mode (aka STA mode or WiFi client mode). ESP32 connects to an access point. +- AP mode (aka Soft-AP mode or Access Point mode). Stations connect to the ESP32. +- Combined AP-STA mode (ESP32 is concurrently an access point and a station connected to another access point). + +- Various security modes for the above (WPA, WPA2, WEP, etc.) +- Scanning for access points (active & passive scanning). +- Promiscuous mode monitoring of IEEE802.11 WiFi packets. + +Application Examples +-------------------- + +See :example:`wifi` directory of ESP-IDF examples that contains the following applications: + +* Simple application showing how to connect ESP32 module to an Access Point - `esp-idf-template `_. + +* Using power save mode of Wi-Fi - :example:`wifi/power_save`. + + +API Reference +------------- + +.. include:: /_build/inc/esp_wifi.inc +.. include:: /_build/inc/esp_wifi_types.inc + + diff --git a/docs/en/api-reference/wifi/index.rst b/docs/en/api-reference/wifi/index.rst new file mode 100644 index 00000000..1553d359 --- /dev/null +++ b/docs/en/api-reference/wifi/index.rst @@ -0,0 +1,12 @@ +Wi-Fi API +********* + +.. toctree:: + :maxdepth: 1 + + Wi-Fi + Smart Config + ESPNOW + + +Example code for this API section is provided in :example:`wifi` directory of ESP-IDF examples. diff --git a/docs/en/conf.py b/docs/en/conf.py new file mode 100644 index 00000000..a7dde4b1 --- /dev/null +++ b/docs/en/conf.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# +# English Language RTD & Sphinx config file +# +# Uses ../conf_common.py for most non-language-specific settings. + +# Importing conf_common adds all the non-language-specific +# parts to this conf module +import sys, os +sys.path.insert(0, os.path.abspath('..')) +from conf_common import * + +# General information about the project. +project = u'ESP-IDF Programming Guide' +copyright = u'2016 - 2018, Espressif Systems (Shanghai) PTE LTD' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +language = 'en' diff --git a/docs/en/get-started/eclipse-setup-windows.rst b/docs/en/get-started/eclipse-setup-windows.rst new file mode 100644 index 00000000..3e128a09 --- /dev/null +++ b/docs/en/get-started/eclipse-setup-windows.rst @@ -0,0 +1,90 @@ +********************** +Eclipse IDE on Windows +********************** +:link_to_translation:`zh_CN:[中文]` + +Configuring Eclipse on Windows requires some different steps. The full configuration steps for Windows are shown below. + +(For OS X and Linux instructions, see the :doc:`Eclipse IDE page `.) + +Installing Eclipse IDE +====================== + +Follow the steps under :ref:`Installing Eclipse IDE ` for all platforms. + +.. _eclipse-windows-setup: + +Setting up Eclipse on Windows +============================= + +Once your new Eclipse installation launches, follow these steps: + +Import New Project +------------------ + +* Eclipse makes use of the Makefile support in ESP-IDF. This means you need to start by creating an ESP-IDF project. You can use the idf-template project from github, or open one of the examples in the esp-idf examples subdirectory. + +* Once Eclipse is running, choose File -> Import... + +* In the dialog that pops up, choose "C/C++" -> "Existing Code as Makefile Project" and click Next. + +* On the next page, enter "Existing Code Location" to be the directory of your IDF project. Don't specify the path to the ESP-IDF directory itself (that comes later). The directory you specify should contain a file named "Makefile" (the project Makefile). + +* On the same page, under "Toolchain for Indexer Settings" uncheck "Show only available toolchains that support this platform". + +* On the extended list that appears, choose "Cygwin GCC". Then click Finish. + +*Note: you may see warnings in the UI that Cygwin GCC Toolchain could not be found. This is OK, we're going to reconfigure Eclipse to find our toolchain.* + +Project Properties +------------------ + +* The new project will appear under Project Explorer. Right-click the project and choose Properties from the context menu. + +* Click on the "C/C++ Build" properties page (top-level): + + * Uncheck "Use default build command" and enter this for the custom build command: ``python ${IDF_PATH}/tools/windows/eclipse_make.py`` + +* Click on the "Environment" properties page under "C/C++ Build": + + * Click "Add..." and enter name ``BATCH_BUILD`` and value ``1``. + + * Click "Add..." again, and enter name ``IDF_PATH``. The value should be the full path where ESP-IDF is installed. The IDF_PATH directory should be specified using forwards slashes not backslashes, ie *C:/Users/user-name/Development/esp-idf*. + + * Edit the PATH environment variable. Delete the existing value and replace it with ``C:\msys32\usr\bin;C:\msys32\mingw32\bin;C:\msys32\opt\xtensa-esp32-elf\bin`` (If you installed msys32 to a different directory then you'll need to change these paths to match). + +* Click on "C/C++ General" -> "Preprocessor Include Paths, Macros, etc." property page: + + * Click the "Providers" tab + + * In the list of providers, click "CDT Cross GCC Built-in Compiler Settings". Change "Command to get compiler specs" to ``xtensa-esp32-elf-gcc ${FLAGS} -std=c++11 -E -P -v -dD "${INPUTS}"``. + + * In the list of providers, click "CDT GCC Build Output Parser" and change the "Compiler command pattern" to ``xtensa-esp32-elf-(gcc|g\+\+|c\+\+|cc|cpp|clang)`` + +Navigate to "C/C++ General" -> "Indexer" property page: + +* Check "Enable project specific settings" to enable the rest of the settings on this page. + +* Uncheck "Allow heuristic resolution of includes". When this option is enabled Eclipse sometimes fails to find correct header directories. + +Navigate to "C/C++ Build" -> "Behavior" property page: + +* Check "Enable parallel build" to enable multiple build jobs in parallel. + +* Setting the number of jobs slightly higher than the "optimal" may give the absolute fastest builds under Windows, depending on the specific hardware being used. + +Building in Eclipse +------------------- + +Continue from :ref:`Building in Eclipse ` for all platforms. + +Technical Details +================= + +**Of interest to Windows gurus or very curious parties, only.** + +Explanations of the technical reasons for some of these steps. You don't need to know this to use esp-idf with Eclipse on Windows, but it may be helpful background knowledge if you plan to do dig into the Eclipse support: + +* The xtensa-esp32-elf-gcc cross-compiler is *not* a Cygwin toolchain, even though we tell Eclipse that it is one. This is because msys2 uses Cygwin and supports Unix-style paths (of the type ``/c/blah`` instead of ``c:/blah`` or ``c:\\blah``). In particular, xtensa-esp32-elf-gcc reports to the Eclipse "built-in compiler settings" function that its built-in include directories are all under ``/usr/``, which is a Unix/Cygwin-style path that Eclipse otherwise can't resolve. By telling Eclipse the compiler is Cygwin, it resolves these paths internally using the ``cygpath`` utility. + +* The same problem occurs when parsing make output from esp-idf. Eclipse parses this output to find header directories, but it can't resolve include directories of the form ``/c/blah`` without using ``cygpath``. There is a heuristic that Eclipse Build Output Parser uses to determine whether it should call ``cygpath``, but for currently unknown reasons the esp-idf configuration doesn't trigger it. For this reason, the ``eclipse_make.py`` wrapper script is used to call ``make`` and then use ``cygpath`` to process the output for Eclipse. diff --git a/docs/en/get-started/eclipse-setup.rst b/docs/en/get-started/eclipse-setup.rst new file mode 100644 index 00000000..2f02dd4e --- /dev/null +++ b/docs/en/get-started/eclipse-setup.rst @@ -0,0 +1,120 @@ +******************************** +Build and Flash with Eclipse IDE +******************************** +:link_to_translation:`zh_CN:[中文]` + +.. _eclipse-install-steps: + +Installing Eclipse IDE +====================== + +The Eclipse IDE gives you a graphical integrated development environment for writing, compiling and debugging ESP-IDF projects. + +* Start by installing the esp-idf for your platform (see files in this directory with steps for Windows, OS X, Linux). + +* We suggest building a project from the command line first, to get a feel for how that process works. You also need to use the command line to configure your esp-idf project (via ``make menuconfig``), this is not currently supported inside Eclipse. + +* Download the Eclipse Installer for your platform from eclipse.org_. + +* When running the Eclipse Installer, choose "Eclipse for C/C++ Development" (in other places you'll see this referred to as CDT.) + +Windows Users +============= + +Using ESP-IDF with Eclipse on Windows requires different configuration steps. :ref:`See the Eclipse IDE on Windows guide `. + +Setting up Eclipse +================== + +Once your new Eclipse installation launches, follow these steps: + +Import New Project +------------------ + +* Eclipse makes use of the Makefile support in ESP-IDF. This means you need to start by creating an ESP-IDF project. You can use the idf-template project from github, or open one of the examples in the esp-idf examples subdirectory. + +* Once Eclipse is running, choose File -> Import... + +* In the dialog that pops up, choose "C/C++" -> "Existing Code as Makefile Project" and click Next. + +* On the next page, enter "Existing Code Location" to be the directory of your IDF project. Don't specify the path to the ESP-IDF directory itself (that comes later). The directory you specify should contain a file named "Makefile" (the project Makefile). + +* On the same page, under "Toolchain for Indexer Settings" choose "Cross GCC". Then click Finish. + + +Project Properties +------------------ + +* The new project will appear under Project Explorer. Right-click the project and choose Properties from the context menu. + +* Click on the "Environment" properties page under "C/C++ Build". Click "Add..." and enter name ``BATCH_BUILD`` and value ``1``. + +* Click "Add..." again, and enter name ``IDF_PATH``. The value should be the full path where ESP-IDF is installed. + +* Edit the ``PATH`` environment variable. Keep the current value, and append the path to the Xtensa toolchain installed as part of IDF setup, if this is not already listed on the PATH. A typical path to the toolchain looks like ``/home/user-name/esp/xtensa-esp32-elf/bin``. Note that you need to add a colon ``:`` before the appended path. + +* On macOS, add a ``PYTHONPATH`` environment variable and set it to ``/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages``. This is so that the system Python, which has pyserial installed as part of the setup steps, overrides any built-in Eclipse Python. + +Navigate to "C/C++ General" -> "Preprocessor Include Paths" property page: + +* Click the "Providers" tab + +* In the list of providers, click "CDT Cross GCC Built-in Compiler Settings". Change "Command to get compiler specs" to ``xtensa-esp32-elf-gcc ${FLAGS} -std=c++11 -E -P -v -dD "${INPUTS}"``. + +* In the list of providers, click "CDT GCC Build Output Parser" and change the "Compiler command pattern" to ``xtensa-esp32-elf-(gcc|g\+\+|c\+\+|cc|cpp|clang)`` + +Navigate to "C/C++ General" -> "Indexer" property page: + +* Check "Enable project specific settings" to enable the rest of the settings on this page. + +* Uncheck "Allow heuristic resolution of includes". When this option is enabled Eclipse sometimes fails to find correct header directories. + +Navigate to "C/C++ Build" -> "Behavior" property page: + +* Check "Enable parallel build" to enable multiple build jobs in parallel. + +.. _eclipse-build-project: + +Building in Eclipse +------------------- + +Before your project is first built, Eclipse may show a lot of errors and warnings about undefined values. This is because some source files are automatically generated as part of the esp-idf build process. These errors and warnings will go away after you build the project. + +* Click OK to close the Properties dialog in Eclipse. + +* Outside Eclipse, open a command line prompt. Navigate to your project directory, and run ``make menuconfig`` to configure your project's esp-idf settings. This step currently has to be run outside Eclipse. + +*If you try to build without running a configuration step first, esp-idf will prompt for configuration on the command line - but Eclipse is not able to deal with this, so the build will hang or fail.* + +* Back in Eclipse, choose Project -> Build to build your project. + +**TIP**: If your project had already been built outside Eclipse, you may need to do a Project -> Clean before choosing Project -> Build. This is so Eclipse can see the compiler arguments for all source files. It uses these to determine the header include paths. + +Flash from Eclipse +------------------ + +You can integrate the "make flash" target into your Eclipse project to flash using esptool.py from the Eclipse UI: + +* Right-click your project in Project Explorer (important to make sure you select the project, not a directory in the project, or Eclipse may find the wrong Makefile.) + +* Select Build Targets -> Create... from the context menu. + +* Type "flash" as the target name. Leave the other options as their defaults. + +* Now you can use Project -> Build Target -> Build (Shift+F9) to build the custom flash target, which will compile and flash the project. + +Note that you will need to use "make menuconfig" to set the serial port and other config options for flashing. "make menuconfig" still requires a command line terminal (see the instructions for your platform.) + +Follow the same steps to add ``bootloader`` and ``partition_table`` targets, if necessary. + +Related Documents +----------------- + +.. toctree:: + :maxdepth: 1 + + eclipse-setup-windows + + +.. _eclipse.org: https://www.eclipse.org/ + diff --git a/docs/en/get-started/index.rst b/docs/en/get-started/index.rst new file mode 100644 index 00000000..8d027f19 --- /dev/null +++ b/docs/en/get-started/index.rst @@ -0,0 +1,371 @@ +*********** +Get Started +*********** +:link_to_translation:`zh_CN:[中文]` + +This document is intended to help users set up the software environment for development of applications using hardware based on the Espressif ESP32. Through a simple example we would like to illustrate how to use ESP-IDF (Espressif IoT Development Framework), including the menu based configuration, compiling the ESP-IDF and firmware download to ESP32 boards. + +.. include:: /_build/inc/version-note.inc + +Introduction +============ + +ESP32 integrates Wi-Fi (2.4 GHz band) and Bluetooth 4.2 solutions on a single chip, along with dual high performance cores, Ultra Low Power co-processor and several peripherals. Powered by 40 nm technology, ESP32 provides a robust, highly integrated platform to meet the continuous demands for efficient power usage, compact design, security, high performance, and reliability. + +Espressif provides the basic hardware and software resources that help application developers to build their ideas around the ESP32 series hardware. The software development framework by Espressif is intended for rapidly developing Internet-of-Things (IoT) applications, with Wi-Fi, Bluetooth, power management and several other system features. + + +What You Need +============= + +To develop applications for ESP32 you need: + +* **PC** loaded with either Windows, Linux or Mac operating system +* **Toolchain** to build the **Application** for ESP32 +* **ESP-IDF** that essentially contains API for ESP32 and scripts to operate the **Toolchain** +* A text editor to write programs (**Projects**) in C, e.g. `Eclipse `_ +* The **ESP32** board itself and a **USB cable** to connect it to the **PC** + +.. figure:: ../../_static/what-you-need.png + :align: center + :alt: Development of applications for ESP32 + :figclass: align-center + + Development of applications for ESP32 + +Preparation of development environment consists of three steps: + +1. Setup of **Toolchain** +2. Getting of **ESP-IDF** from GitHub +3. Installation and configuration of **Eclipse** + +You may skip the last step, if you prefer to use different editor. + +Having environment set up, you are ready to start the most interesting part - the application development. This process may be summarized in four steps: + +1. Configuration of a **Project** and writing the code +2. Compilation of the **Project** and linking it to build an **Application** +3. Flashing (uploading) of the **Application** to **ESP32** +4. Monitoring / debugging of the **Application** + +See instructions below that will walk you through these steps. + + +Guides +====== + +If you have one of ESP32 development boards listed below, click on provided links to get you up and running. + +.. toctree:: + :maxdepth: 1 + + ESP32 DevKitC + ESP-WROVER-KIT + ESP32-PICO-KIT + +If you have different board, move to sections below. + + +.. _get-started-setup-toolchain: + +Setup Toolchain +=============== + +The quickest way to start development with ESP32 is by installing a prebuilt toolchain. Pick up your OS below and follow provided instructions. + +.. toctree:: + :hidden: + + Windows + Linux + MacOS + ++-------------------+-------------------+-------------------+ +| |windows-logo| | |linux-logo| | |macos-logo| | ++-------------------+-------------------+-------------------+ +| `Windows`_ | `Linux`_ | `Mac OS`_ | ++-------------------+-------------------+-------------------+ + +.. |windows-logo| image:: ../../_static/windows-logo.png + :target: ../get-started/windows-setup.html + +.. |linux-logo| image:: ../../_static/linux-logo.png + :target: ../get-started/linux-setup.html + +.. |macos-logo| image:: ../../_static/macos-logo.png + :target: ../get-started/macos-setup.html + +.. _Windows: ../get-started/windows-setup.html +.. _Linux: ../get-started/linux-setup.html +.. _Mac OS: ../get-started/macos-setup.html + +.. note:: + + We are using ``~/esp`` directory to install the prebuilt toolchain, ESP-IDF and sample applications. You can use different directory, but need to adjust respective commands. + +Depending on your experience and preferences, instead of using a prebuilt toolchain, you may want to customize your environment. To set up the system your own way go to section :ref:`get-started-customized-setup`. + +Once you are done with setting up the toolchain then go to section :ref:`get-started-get-esp-idf`. + + +.. _get-started-get-esp-idf: + +Get ESP-IDF +=========== + +.. highlight:: bash + +Besides the toolchain (that contains programs to compile and build the application), you also need ESP32 specific API / libraries. They are provided by Espressif in `ESP-IDF repository `_. + +.. include:: /_build/inc/git-clone.inc + +Consult :doc:`/versions` for information about which version of ESP-IDF to use in a given situation. + +.. note:: + + Do not miss the ``--recursive`` option. If you have already cloned ESP-IDF without this option, run another command to get all the submodules:: + + cd ~/esp/esp-idf + git submodule update --init --recursive + + +.. _get-started-setup-path: + +Setup Path to ESP-IDF +===================== + +The toolchain programs access ESP-IDF using ``IDF_PATH`` environment variable. This variable should be set up on your PC, otherwise projects will not build. Setting may be done manually, each time PC is restarted. Another option is to set up it permanently by defining ``IDF_PATH`` in user profile. To do so, follow instructions specific to :ref:`Windows ` , :ref:`Linux and MacOS ` in section :doc:`add-idf_path-to-profile`. + +.. _get-started-get-packages: + +Install the Required Python Packages +==================================== + +Python packages required by ESP-IDF are located in the ``$IDF_PATH/requirements.txt`` file. You can install them by running:: + + python -m pip install --user -r $IDF_PATH/requirements.txt + +.. note:: + + Please invoke that version of the Python interpreter which you will be using with ESP-IDF. The version of the + interpreter can be checked by running command ``python --version`` and depending on the result, you might want to + use ``python2``, ``python2.7`` or similar instead of ``python``, e.g.:: + + python2.7 -m pip install --user -r $IDF_PATH/requirements.txt + +.. _get-started-start-project: + +Start a Project +=============== + +Now you are ready to prepare your application for ESP32. To start off quickly, we will use :example:`get-started/hello_world` project from :idf:`examples` directory in IDF. + +Copy :example:`get-started/hello_world` to ``~/esp`` directory:: + + cd ~/esp + cp -r $IDF_PATH/examples/get-started/hello_world . + +You can also find a range of example projects under the :idf:`examples` directory in ESP-IDF. These example project directories can be copied in the same way as presented above, to begin your own projects. + +.. important:: + + The esp-idf build system does not support spaces in paths to esp-idf or to projects. + + +.. _get-started-connect: + +Connect +======= + +You are almost there. To be able to proceed further, connect ESP32 board to PC, check under what serial port the board is visible and verify if serial communication works. If you are not sure how to do it, check instructions in section :doc:`establish-serial-connection`. Note the port number, as it will be required in the next step. + + +.. _get-started-configure: + +Configure +========= + +Being in terminal window, go to directory of ``hello_world`` application by typing ``cd ~/esp/hello_world``. Then start project configuration utility ``menuconfig``:: + + cd ~/esp/hello_world + make menuconfig + +If previous steps have been done correctly, the following menu will be displayed: + +.. figure:: ../../_static/project-configuration.png + :align: center + :alt: Project configuration - Home window + :figclass: align-center + + Project configuration - Home window + +In the menu, navigate to ``Serial flasher config`` > ``Default serial port`` to configure the serial port, where project will be loaded to. Confirm selection by pressing enter, save configuration by selecting ``< Save >`` and then exit application by selecting ``< Exit >``. + +.. note:: + + On Windows, serial ports have names like COM1. On MacOS, they start with ``/dev/cu.``. On Linux, they start with ``/dev/tty``. + (See :doc:`establish-serial-connection` for full details.) + +Here are couple of tips on navigation and use of ``menuconfig``: + +* Use up & down arrow keys to navigate the menu. +* Use Enter key to go into a submenu, Escape key to go out or to exit. +* Type ``?`` to see a help screen. Enter key exits the help screen. +* Use Space key, or ``Y`` and ``N`` keys to enable (Yes) and disable (No) configuration items with checkboxes "``[*]``" +* Pressing ``?`` while highlighting a configuration item displays help about that item. +* Type ``/`` to search the configuration items. + +.. note:: + + If you are **Arch Linux** user, navigate to ``SDK tool configuration`` and change the name of ``Python 2 interpreter`` from ``python`` to ``python2``. + + +.. attention:: + + When using ESP32-DevKitC board with ESP32-SOLO-1 module, enable single core mode (:ref:`CONFIG_FREERTOS_UNICORE`) in menuconfig before flashing example applications. + + +.. _get-started-build-flash: + +Build and Flash +=============== + +Now you can build and flash the application. Run:: + + make flash + +This will compile the application and all the ESP-IDF components, generate bootloader, partition table, and application binaries, and flash these binaries to your ESP32 board. + +.. highlight:: none + +:: + + esptool.py v2.0-beta2 + Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)... + esptool.py v2.0-beta2 + Connecting........___ + Uploading stub... + Running stub... + Stub running... + Changing baud rate to 921600 + Changed. + Attaching SPI flash... + Configuring flash size... + Auto-detected Flash size: 4MB + Flash params set to 0x0220 + Compressed 11616 bytes to 6695... + Wrote 11616 bytes (6695 compressed) at 0x00001000 in 0.1 seconds (effective 920.5 kbit/s)... + Hash of data verified. + Compressed 408096 bytes to 171625... + Wrote 408096 bytes (171625 compressed) at 0x00010000 in 3.9 seconds (effective 847.3 kbit/s)... + Hash of data verified. + Compressed 3072 bytes to 82... + Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 8297.4 kbit/s)... + Hash of data verified. + + Leaving... + Hard resetting... + +If there are no issues, at the end of build process, you should see messages describing progress of loading process. Finally, the end module will be reset and "hello_world" application will start. + +If you'd like to use the Eclipse IDE instead of running ``make``, check out the :doc:`Eclipse guide `. + + +.. _get-started-build-monitor: + +Monitor +======= + +To see if "hello_world" application is indeed running, type ``make monitor``. This command is launching :doc:`IDF Monitor ` application:: + + $ make monitor + MONITOR + --- idf_monitor on /dev/ttyUSB0 115200 --- + --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + ets Jun 8 2016 00:22:57 + + rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) + ets Jun 8 2016 00:22:57 + ... + +Several lines below, after start up and diagnostic log, you should see "Hello world!" printed out by the application. :: + + ... + Hello world! + Restarting in 10 seconds... + I (211) cpu_start: Starting scheduler on APP CPU. + Restarting in 9 seconds... + Restarting in 8 seconds... + Restarting in 7 seconds... + +To exit the monitor use shortcut ``Ctrl+]``. + +.. note:: + + If instead of the messages above, you see a random garbage similar to:: + + e���)(Xn@�y.!��(�PW+)��Hn9a؅/9�!�t5��P�~�k��e�ea�5�jA + ~zY��Y(1�,1�� e���)(Xn@�y.!Dr�zY(�jpi�|�+z5Ymvp + + or monitor fails shortly after upload, your board is likely using 26MHz crystal, while the ESP-IDF assumes default of 40MHz. Exit the monitor, go back to the :ref:`menuconfig `, change :ref:`CONFIG_ESP32_XTAL_FREQ_SEL` to 26MHz, then :ref:`build and flash ` the application again. This is found under ``make menuconfig`` under Component config --> ESP32-specific --> Main XTAL frequency. + +To execute ``make flash`` and ``make monitor`` in one go, type ``make flash monitor``. Check section :doc:`IDF Monitor ` for handy shortcuts and more details on using this application. + +That's all what you need to get started with ESP32! + +Now you are ready to try some other :idf:`examples`, or go right to developing your own applications. + + +Environment Variables +===================== + +Some environment variables can be specified whilst calling ``make`` allowing users to **override arguments without needing to reconfigure them using** ``make menuconfig``. + ++-----------------+--------------------------------------------------------------+ +| Variables | Description & Usage | ++=================+==============================================================+ +| ``ESPPORT`` | Overrides the serial port used in ``flash`` and ``monitor``. | +| | | +| | Examples: ``make flash ESPPORT=/dev/ttyUSB1``, | +| | ``make monitor ESPPORT=COM1`` | ++-----------------+--------------------------------------------------------------+ +| ``ESPBAUD`` | Overrides the serial baud rate when flashing the ESP32. | +| | | +| | Example: ``make flash ESPBAUD=9600`` | ++-----------------+--------------------------------------------------------------+ +| ``MONITORBAUD`` | Overrides the serial baud rate used when monitoring. | +| | | +| | Example: ``make monitor MONITORBAUD=9600`` | ++-----------------+--------------------------------------------------------------+ + +.. note:: + Users can export environment variables (e.g. ``export ESPPORT=/dev/ttyUSB1``). + All subsequent calls of ``make`` within the same terminal session will use + the exported value given that the variable is not simultaneously overridden. + +Updating ESP-IDF +================ + +After some time of using ESP-IDF, you may want to update it to take advantage of new features or bug fixes. The simplest way to do so is by deleting existing ``esp-idf`` folder and cloning it again, exactly as when doing initial installation described in sections :ref:`get-started-get-esp-idf`. + +If downloading to a new path, remember to :doc:`add-idf_path-to-profile` so that the toolchain scripts know where to find the ESP-IDF in its release specific location. + +Another solution is to update only what has changed. :ref:`The update procedure depends on the version of ESP-IDF you are using `. + + +Related Documents +================= + +.. toctree:: + :maxdepth: 1 + + add-idf_path-to-profile + establish-serial-connection + make-project + eclipse-setup + idf-monitor + toolchain-setup-scratch + +.. _Stable version: https://docs.espressif.com/projects/esp-idf/en/stable/ +.. _Releases page: https://github.com/espressif/esp-idf/releases + diff --git a/docs/en/get-started/linux-setup.rst b/docs/en/get-started/linux-setup.rst new file mode 100644 index 00000000..c97abda3 --- /dev/null +++ b/docs/en/get-started/linux-setup.rst @@ -0,0 +1,118 @@ +************************************* +Standard Setup of Toolchain for Linux +************************************* +:link_to_translation:`zh_CN:[中文]` + +Install Prerequisites +===================== + +To compile with ESP-IDF you need to get the following packages: + +- CentOS 7:: + + sudo yum install gcc git wget make ncurses-devel flex bison gperf python python2-cryptography + +- Ubuntu and Debian:: + + sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future + +- Arch:: + + sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future + +.. note:: + + Some older Linux distributions may be missing some of the Python packages listed above (or may use ``pyserial`` version 2.x which is not supported by ESP-IDF). It is possible to install these packages via ``pip`` instead - as described in section :ref:`get-started-get-packages`. + +Toolchain Setup +=============== + +.. include:: /_build/inc/download-links.inc + +ESP32 toolchain for Linux is available for download from Espressif website: + +- for 64-bit Linux: + + |download_link_linux64| + +- for 32-bit Linux: + + |download_link_linux32| + +1. Download this file, then extract it in ``~/esp`` directory: + + - for 64-bit Linux: + + .. include:: /_build/inc/unpack-code-linux64.inc + + - for 32-bit Linux: + + .. include:: /_build/inc/unpack-code-linux32.inc + +.. _setup-linux-toolchain-add-it-to-path: + +2. The toolchain will be extracted into ``~/esp/xtensa-esp32-elf/`` directory. + + To use it, you will need to update your ``PATH`` environment variable in ``~/.profile`` file. To make ``xtensa-esp32-elf`` available for all terminal sessions, add the following line to your ``~/.profile`` file:: + + export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH" + + Alternatively, you may create an alias for the above command. This way you can get the toolchain only when you need it. To do this, add different line to your ``~/.profile`` file:: + + alias get_esp32='export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"' + + Then when you need the toolchain you can type ``get_esp32`` on the command line and the toolchain will be added to your ``PATH``. + + .. note:: + + If you have ``/bin/bash`` set as login shell, and both ``.bash_profile`` and ``.profile`` exist, then update ``.bash_profile`` instead. In CentOS, ``alias`` should set in ``.bashrc``. + +3. Log off and log in back to make the ``.profile`` changes effective. Run the following command to verify if ``PATH`` is correctly set:: + + printenv PATH + + You are looking for similar result containing toolchain's path at the end of displayed string:: + + $ printenv PATH + /home/user-name/bin:/home/user-name/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/user-name/esp/xtensa-esp32-elf/bin + + Instead of ``/home/user-name`` there should be a home path specific to your installation. + + +Permission issues /dev/ttyUSB0 +------------------------------ + +With some Linux distributions you may get the ``Failed to open port /dev/ttyUSB0`` error message when flashing the ESP32. :ref:`This can be solved by adding the current user to the dialout group`. + + +Arch Linux Users +---------------- + +To run the precompiled gdb (xtensa-esp32-elf-gdb) in Arch Linux requires ncurses 5, but Arch uses ncurses 6. + +Backwards compatibility libraries are available in AUR_ for native and lib32 configurations: + +- https://aur.archlinux.org/packages/ncurses5-compat-libs/ +- https://aur.archlinux.org/packages/lib32-ncurses5-compat-libs/ + +Before installing these packages you might need to add the author's public key to your keyring as described in the "Comments" section at the links above. + +Alternatively, use crosstool-NG to compile a gdb that links against ncurses 6. + + +Next Steps +========== + +To carry on with development environment setup, proceed to section :ref:`get-started-get-esp-idf`. + + +Related Documents +================= + +.. toctree:: + :maxdepth: 1 + + linux-setup-scratch + + +.. _AUR: https://wiki.archlinux.org/index.php/Arch_User_Repository diff --git a/docs/en/get-started/macos-setup.rst b/docs/en/get-started/macos-setup.rst new file mode 100644 index 00000000..7e1921a6 --- /dev/null +++ b/docs/en/get-started/macos-setup.rst @@ -0,0 +1,57 @@ +************************************** +Standard Setup of Toolchain for Mac OS +************************************** +:link_to_translation:`zh_CN:[中文]` + +Install Prerequisites +===================== + +- install pip:: + + sudo easy_install pip + +.. note:: + + ``pip`` will be used later for installing :ref:`the required Python packages `. + +Toolchain Setup +=============== + +.. include:: /_build/inc/download-links.inc + +ESP32 toolchain for macOS is available for download from Espressif website: + +|download_link_osx| + +Download this file, then extract it in ``~/esp`` directory: + +.. include:: /_build/inc/unpack-code-osx.inc + +.. _setup-macos-toolchain-add-it-to-path: + +The toolchain will be extracted into ``~/esp/xtensa-esp32-elf/`` directory. + +To use it, you will need to update your ``PATH`` environment variable in ``~/.profile`` file. To make ``xtensa-esp32-elf`` available for all terminal sessions, add the following line to your ``~/.profile`` file:: + + export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH + +Alternatively, you may create an alias for the above command. This way you can get the toolchain only when you need it. To do this, add different line to your ``~/.profile`` file:: + + alias get_esp32="export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH" + +Then when you need the toolchain you can type ``get_esp32`` on the command line and the toolchain will be added to your ``PATH``. + + +Next Steps +========== + +To carry on with development environment setup, proceed to section :ref:`get-started-get-esp-idf`. + + +Related Documents +================= + +.. toctree:: + :maxdepth: 1 + + macos-setup-scratch diff --git a/docs/en/get-started/windows-setup.rst b/docs/en/get-started/windows-setup.rst new file mode 100644 index 00000000..ad7d8210 --- /dev/null +++ b/docs/en/get-started/windows-setup.rst @@ -0,0 +1,70 @@ +*************************************** +Standard Setup of Toolchain for Windows +*************************************** +:link_to_translation:`zh_CN:[中文]` + +Introduction +============ + +Windows doesn't have a built-in "make" environment, so as well as installing the toolchain you will need a GNU-compatible environment. We use the MSYS2_ environment to provide this. You don't need to use this environment all the time (you can use :doc:`Eclipse ` or some other front-end), but it runs behind the scenes. + + +Toolchain Setup +=============== + +The quick setup is to download the Windows all-in-one toolchain & MSYS2 zip file from dl.espressif.com: + +https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20181001.zip + +Unzip the zip file to ``C:\`` (or some other location, but this guide assumes ``C:\``) and it will create an ``msys32`` directory with a pre-prepared environment. + + +Check it Out +============ + +Open a MSYS2 MINGW32 terminal window by running ``C:\msys32\mingw32.exe``. The environment in this window is a bash shell. Create a directory named ``esp`` that is a default location to develop ESP32 applications. To do so, run the following shell command:: + + mkdir -p ~/esp + +By typing ``cd ~/esp`` you can then move to the newly created directory. If there are no error messages you are done with this step. + +.. figure:: ../../_static/msys2-terminal-window.png + :align: center + :alt: MSYS2 MINGW32 shell window + :figclass: align-center + + MSYS2 MINGW32 shell window + +Use this window in the following steps setting up development environment for ESP32. + + +Next Steps +========== + +To carry on with development environment setup, proceed to section :ref:`get-started-get-esp-idf`. + +Updating The Environment +======================== + +When IDF is updated, sometimes new toolchains are required or new requirements are added to the Windows MSYS2 environment. To move any data from an old version of the precompiled environment to a new one: + +- Take the old MSYS2 environment (ie ``C:\msys32``) and move/rename it to a different directory (ie ``C:\msys32_old``). +- Download the new precompiled environment using the steps above. +- Unzip the new MSYS2 environment to ``C:\msys32`` (or another location). +- Find the old ``C:\msys32_old\home`` directory and move this into ``C:\msys32``. +- You can now delete the ``C:\msys32_old`` directory if you no longer need it. + +You can have independent different MSYS2 environments on your system, as long as they are in different directories. + +There are :ref:`also steps to update the existing environment without downloading a new one `, although this is more complex. + +Related Documents +================= + +.. toctree:: + :maxdepth: 1 + + windows-setup-scratch + + +.. _MSYS2: https://msys2.github.io/ diff --git a/docs/en/index.rst b/docs/en/index.rst new file mode 100644 index 00000000..b6a85246 --- /dev/null +++ b/docs/en/index.rst @@ -0,0 +1,55 @@ +ESP-IDF Programming Guide +========================= +:link_to_translation:`zh_CN:[中文]` + +This is the documentation for Espressif IoT Development Framework (`esp-idf `_). ESP-IDF is the official development framework for the `ESP32 `_ chip. + +================== ================== ================== +|Get Started|_ |API Reference|_ |H/W Reference|_ +------------------ ------------------ ------------------ +`Get Started`_ `API Reference`_ `H/W Reference`_ +------------------ ------------------ ------------------ +|API Guides|_ |Contribute|_ |Resources|_ +------------------ ------------------ ------------------ +`API Guides`_ `Contribute`_ `Resources`_ +================== ================== ================== + +.. |Get Started| image:: ../_static/get-started.gif +.. _Get Started: get-started/index.html + +.. |API Reference| image:: ../_static/api-reference.gif +.. _API Reference: api-reference/index.html + +.. |H/W Reference| image:: ../_static/hw-reference.gif +.. _H/W Reference: hw-reference/index.html + +.. |API Guides| image:: ../_static/api-guides.gif +.. _API Guides: api-guides/index.html + +.. |Contribute| image:: ../_static/contribute.gif +.. _Contribute: contribute/index.html + +.. |Resources| image:: ../_static/resources.gif +.. _Resources: resources.html + + +.. toctree:: + :hidden: + + Get Started + Get Started (CMake Preview) + API Reference + H/W Reference + API Guides + Contribute + Versions + Resources + Copyrights + About + 语言/Languages + Guide Downloads + +* :ref:`genindex` + + + diff --git a/docs/gen-dxd.py b/docs/gen-dxd.py new file mode 100755 index 00000000..ee2c692c --- /dev/null +++ b/docs/gen-dxd.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python +# +# gen-dxd.py - Generate Doxygen Directives +# +# This code is in the Public Domain (or CC0 licensed, at your option.) +# Unless required by applicable law or agreed to in writing, this +# software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. +# + +from __future__ import print_function +from __future__ import unicode_literals +from builtins import range +from io import open +import sys +import os +import re + +# Determime build directory +builddir = '_build' +if 'BUILDDIR' in os.environ: + builddir = os.environ['BUILDDIR'] + +# Script configuration +header_file_path_prefix = "../../components/" +"""string: path prefix for header files. +""" +doxyfile_path = "../Doxyfile" +"""string: path to a file containing header files to processs. +""" +xml_directory_path = "xml" +"""string: path to directory with XML files by Doxygen. +""" +inc_directory_path = os.path.join(builddir, 'inc') +"""string: path prefix for header files. +""" +all_kinds = [ + ("function", "Functions"), + ("union", "Unions"), + ("struct", "Structures"), + ("define", "Macros"), + ("typedef", "Type Definitions"), + ("enum", "Enumerations") + ] +"""list of items that will be generated for a single API file +""" + + +def get_doxyfile_input(): + """Get contents of Doxyfile's INPUT statement. + + Returns: + Contents of Doxyfile's INPUT. + + """ + if not os.path.isfile(doxyfile_path): + print("Doxyfile '%s' does not exist!" % doxyfile_path) + sys.exit() + + print("Getting Doxyfile's INPUT") + + input_file = open(doxyfile_path, "r", encoding='utf-8') + + line = input_file.readline() + # read contents of Doxyfile until 'INPUT' statement + while line: + if line.find("INPUT") == 0: + break + line = input_file.readline() + + doxyfile_INPUT = "" + line = input_file.readline() + # skip input_file contents until end of 'INPUT' statement + while line: + if line.isspace(): + # we have reached the end of 'INPUT' statement + break + # process only lines that are not comments + if line.find("#") == -1: + # extract header file path inside components folder + m = re.search(header_file_path_prefix + "(.*\.h)", line) + header_file_path = m.group(1) + doxyfile_INPUT += header_file_path + "\n" + # proceed reading next line + line = input_file.readline() + + input_file.close() + return doxyfile_INPUT + + +def get_api_name(header_file_path): + """Get name of API from header file path. + + Args: + header_file_path: path to the header file. + + Returns: + The name of API. + + """ + api_name = "" + regex = r".*/(.*)\.h" + m = re.search(regex, header_file_path) + if m: + api_name = m.group(1) + + return api_name + + +def get_rst_header(header_name): + """Get rst formatted code with a header. + + Args: + header_name: name of header. + + Returns: + Formatted rst code with the header. + + """ + + rst_output = "" + rst_output += header_name + "\n" + rst_output += "^" * len(header_name) + "\n" + rst_output += "\n" + + return rst_output + + +def select_unions(innerclass_list): + """Select unions from innerclass list. + + Args: + innerclass_list: raw list with unions and structures + extracted from Dogygen's xml file. + + Returns: + Doxygen directives with unions selected from the list. + + """ + + rst_output = "" + for line in innerclass_list.splitlines(): + # union is denoted by "union" at the beginning of line + if line.find("union") == 0: + union_id, union_name = re.split(r"\t+", line) + rst_output += ".. doxygenunion:: " + rst_output += union_name + rst_output += "\n" + + return rst_output + + +def select_structs(innerclass_list): + """Select structures from innerclass list. + + Args: + innerclass_list: raw list with unions and structures + extracted from Dogygen's xml file. + + Returns: + Doxygen directives with structures selected from the list. + Note: some structures are excluded as described on code below. + + """ + + rst_output = "" + for line in innerclass_list.splitlines(): + # structure is denoted by "struct" at the beginning of line + if line.find("struct") == 0: + # skip structures that are part of union + # they are documented by 'doxygenunion' directive + if line.find("::") > 0: + continue + struct_id, struct_name = re.split(r"\t+", line) + rst_output += ".. doxygenstruct:: " + rst_output += struct_name + rst_output += "\n" + rst_output += " :members:\n" + rst_output += "\n" + + return rst_output + + +def get_directives(tree, kind): + """Get directives for specific 'kind'. + + Args: + tree: the ElementTree 'tree' of XML by Doxygen + kind: name of API "kind" to be generated + + Returns: + Doxygen directives for selected 'kind'. + Note: the header with "kind" name is included. + + """ + + rst_output = "" + if kind in ["union", "struct"]: + innerclass_list = "" + for elem in tree.iterfind('compounddef/innerclass'): + innerclass_list += elem.attrib["refid"] + "\t" + elem.text + "\n" + if kind == "union": + rst_output += select_unions(innerclass_list) + else: + rst_output += select_structs(innerclass_list) + else: + for elem in tree.iterfind( + 'compounddef/sectiondef/memberdef[@kind="%s"]' % kind): + name = elem.find('name') + rst_output += ".. doxygen%s:: " % kind + rst_output += name.text + "\n" + if rst_output: + all_kinds_dict = dict(all_kinds) + rst_output = get_rst_header(all_kinds_dict[kind]) + rst_output + "\n" + + return rst_output + + +def generate_directives(header_file_path): + """Generate API reference with Doxygen directives for a header file. + + Args: + header_file_path: a path to the header file with API. + + Returns: + Doxygen directives for the header file. + + """ + + api_name = get_api_name(header_file_path) + + # in XLT file name each "_" in the api name is expanded by Doxygen to "__" + xlt_api_name = api_name.replace("_", "__") + xml_file_path = "%s/%s_8h.xml" % (xml_directory_path, xlt_api_name) + + rst_output = "" + rst_output = ".. File automatically generated by 'gen-dxd.py'\n" + rst_output += "\n" + rst_output += get_rst_header("Header File") + rst_output += "* :component_file:`" + header_file_path + "`\n" + rst_output += "\n" + + try: + import xml.etree.cElementTree as ET + except ImportError: + import xml.etree.ElementTree as ET + + tree = ET.ElementTree(file=xml_file_path) + for i in range(len(all_kinds)): + kind = all_kinds[i][0] + rst_output += get_directives(tree, kind) + + return rst_output + + +def generate_api_inc_files(): + """Generate header_file.inc files + with API reference made of doxygen directives + for each header file + specified in the 'INPUT' statement of Doxyfile. + + """ + + if not os.path.isdir(xml_directory_path): + print("Directory %s does not exist!" % xml_directory_path) + sys.exit() + + if not os.path.exists(inc_directory_path): + os.makedirs(inc_directory_path) + + list_to_generate = get_doxyfile_input() + print("Generating 'api_name.inc' files with Doxygen directives") + for header_file_path in list_to_generate.splitlines(): + api_name = get_api_name(header_file_path) + inc_file_path = inc_directory_path + "/" + api_name + ".inc" + rst_output = generate_directives(header_file_path) + + previous_rst_output = '' + if os.path.isfile(inc_file_path): + with open(inc_file_path, "r", encoding='utf-8') as inc_file_old: + previous_rst_output = inc_file_old.read() + + if previous_rst_output != rst_output: + with open(inc_file_path, "w", encoding='utf-8') as inc_file: + inc_file.write(rst_output) + + +if __name__ == "__main__": + """The main script that generates + Doxygen directives. + + """ + + # Process command line arguments, if any + if len(sys.argv) > 1: + if not os.path.isdir(xml_directory_path): + print("Directory %s does not exist!" % xml_directory_path) + sys.exit() + header_file_path = sys.argv[1] + api_name = get_api_name(header_file_path) + if api_name: + rst_output = generate_directives(header_file_path) + print("Doxygen directives for '%s'" % header_file_path) + print() + print(rst_output) + else: + print("Options to execute 'gen-dxd.py' application:") + print("1: $ python gen-dxd.py") + print(" Generate API 'header_file.inc' files for headers defined in '%s'" % doxyfile_path) + print("2: $ python gen-dxd.py header_file_path") + print(" Print out Doxygen directives for a single header file") + print(" example: $ python gen-dxd.py mdns/include/mdns.h") + print(" NOTE: Run Doxygen first to get XML files for the header file") + + sys.exit() + + # No command line arguments given + generate_api_inc_files() diff --git a/docs/gen-toolchain-links.py b/docs/gen-toolchain-links.py new file mode 100644 index 00000000..aa824b93 --- /dev/null +++ b/docs/gen-toolchain-links.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# This script generates toolchain download links and toolchain unpacking +# code snippets based on information found in $IDF_PATH/tools/toolchain_versions.mk +# + +from __future__ import print_function + +import sys +import os + +def main(): + if len(sys.argv) != 4: + print("Usage: gen-toolchain-links.py ") + sys.exit(1) + + out_dir = sys.argv[3] + if not os.path.exists(out_dir): + print("Creating directory %s" % out_dir) + os.mkdir(out_dir) + + base_url = sys.argv[2] + + versions_file = sys.argv[1] + version_vars = {} + with open(versions_file) as f: + for line in f: + name, var = line.partition("=")[::2] + version_vars[name.strip()] = var.strip() + + gcc_version = version_vars["CURRENT_TOOLCHAIN_GCC_VERSION"] + toolchain_desc = version_vars["CURRENT_TOOLCHAIN_COMMIT_DESC_SHORT"] + + unpack_code_linux_macos = """ +:: + + mkdir -p ~/esp + cd ~/esp + tar -x{}f ~/Downloads/{} +""" + + scratch_build_code_linux_macos = """ +:: + + git clone -b xtensa-1.22.x https://github.com/espressif/crosstool-NG.git + cd crosstool-NG + ./bootstrap && ./configure --enable-local && make install +""" + + platform_info = [ ["linux64", "tar.gz", "z", unpack_code_linux_macos], + ["linux32", "tar.gz", "z", unpack_code_linux_macos], + ["osx", "tar.gz", "z", unpack_code_linux_macos], + ["win32", "zip", None, None]] + + with open(os.path.join(out_dir, 'download-links.inc'), "w") as links_file: + for p in platform_info: + platform_name = p[0] + extension = p[1] + unpack_cmd = p[2] + unpack_code = p[3] + + archive_name = 'xtensa-esp32-elf-{}-{}-{}.{}'.format( + platform_name, toolchain_desc, gcc_version, extension) + + print('.. |download_link_{}| replace:: {}{}'.format( + platform_name, base_url, archive_name), file=links_file) + + if unpack_code is not None: + with open(os.path.join(out_dir, 'unpack-code-%s.inc' % platform_name), "w") as f: + print(unpack_code.format(unpack_cmd, archive_name), file=f) + + with open(os.path.join(out_dir, 'scratch-build-code.inc'), "w") as code_file: + print(scratch_build_code_linux_macos, file=code_file) + +if __name__ == "__main__": + main() diff --git a/docs/gen-version-specific-includes.py b/docs/gen-version-specific-includes.py new file mode 100755 index 00000000..fd226407 --- /dev/null +++ b/docs/gen-version-specific-includes.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Python script to generate ReSTructured Text .inc snippets +# with version-based content for this IDF version + +from __future__ import print_function +from __future__ import unicode_literals +from io import open +import subprocess +import os +import sys +import re + +TEMPLATES = { + "en" : { + "git-clone" : { + "template" : """ +To obtain a local copy: open terminal, navigate to the directory you want to put ESP-IDF, and clone the repository using ``git clone`` command:: + + cd ~/esp + git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git + +ESP-IDF will be downloaded into ``~/esp/esp-idf``. + +.. note:: + + %(extra_note)s + +.. note:: + + %(zipfile_note)s +""" + ,"master" : 'This command will clone the master branch, which has the latest development ("bleeding edge") version of ESP-IDF. It is fully functional and updated on weekly basis with the most recent features and bugfixes.' + ,"branch" : 'The ``git clone`` option ``-b %(clone_arg)s`` tells git to clone the %(ver_type)s in the ESP-IDF repository corresponding to this version of the documentation.' + ,"zipfile" : { + "stable" : 'As a fallback, it is also possible to download a zip file of this stable release from the `Releases page`_. Do not download the "Source code" zip file(s) generated automatically by GitHub, they do not work with ESP-IDF.' + ,"unstable" : 'GitHub\'s "Download zip file" feature does not work with ESP-IDF, a ``git clone`` is required. As a fallback, `Stable version`_ can be installed without Git.' + }, # zipfile + }, # git-clone + "version-note" : { + "master" : """ +.. note:: + This is documentation for the master branch (latest version) of ESP-IDF. This version is under continual development. `Stable version`_ documentation is available, as well as other :doc:`/versions`. +""" + ,"stable" : """ +.. note:: + This is documentation for stable version %s of ESP-IDF. Other :doc:`/versions` are also available. +""" + ,"branch" : """ +.. note:: + This is documentation for %s ``%s`` of ESP-IDF. Other :doc:`/versions` are also available. +""" + }, # version-note + }, # en + "zh_CN" : { + "git-clone" : { + "template" : """ +获取本地副本:打开终端,切换到你要存放 ESP-IDF 的工作目录,使用 ``git clone`` 命令克隆远程仓库:: + + cd ~/esp + git clone %(clone_args)s--recursive https://github.com/espressif/esp-idf.git + +ESP-IDF 将会被下载到 ``~/esp/esp-idf`` 目录下。 + +.. note:: + + %(extra_note)s + +.. note:: + + %(zipfile_note)s +""" + ,"master" : '此命令将克隆 master 分支,该分支保存着 ESP-IDF 的最新版本,它功能齐全,每周都会更新一些新功能并修正一些错误。' + ,"branch" : '``git clone`` 命令的 ``-b %(clone_arg)s`` 选项告诉 git 从 ESP-IDF 仓库中克隆与此版本的文档对应的分支。' + ,"zipfile" : { + "stable" : '作为备份,还可以从 `Releases page`_ 下载此稳定版本的 zip 文件。不要下载由 GitHub 自动生成的"源代码"的 zip 文件,它们不适用于 ESP-IDF。' + ,"unstable" : 'GitHub 中"下载 zip 文档"的功能不适用于 ESP-IDF,所以需要使用 ``git clone`` 命令。作为备份,可以在没有安装 Git 的环境中下载 `Stable version`_ 的 zip 归档文件。' + }, # zipfile + }, # git-clone + "version-note" : { + "master" : """ +.. note:: + 这是ESP-IDF master 分支(最新版本)的文档,该版本在持续开发中。还有 `Stable version`_ 的文档,以及其他版本的文档 :doc:`/versions` 供参考。 + This is documentation for the master branch (latest version) of ESP-IDF. This version is under continual development. `Stable version`_ documentation is available, as well as other :doc:`/versions`. +""" + ,"stable" : """ +.. note:: + 这是ESP-IDF 稳定版本 %s 的文档,还有其他版本的文档 :doc:`/versions` 供参考。 +""" + ,"branch" : """ +.. note:: + 这是ESP-IDF %s ``%s`` 版本的文档,还有其他版本的文档 :doc:`/versions` 供参考。 +""" + }, # version-note + }# zh_CN +} + + +def main(): + if len(sys.argv) != 3: + print("Usage: gen-git-clone.py ") + sys.exit(1) + + language = sys.argv[1] + out_dir = sys.argv[2] + if not os.path.exists(out_dir): + print("Creating directory %s" % out_dir) + os.mkdir(out_dir) + + template = TEMPLATES[language] + + version, ver_type, is_stable = get_version() + + write_git_clone_inc(template["git-clone"], out_dir, version, ver_type, is_stable) + write_version_note(template["version-note"], out_dir, version, ver_type, is_stable) + print("Done") + + +def write_git_clone_inc(template, out_dir, version, ver_type, is_stable): + zipfile = template["zipfile"] + if version == "master": + args = { + "clone_args" : "", + "extra_note" : template["master"], + "zipfile_note" : zipfile["unstable"] + } + else: + args = { + "clone_args" : "-b %s " % version, + "extra_note" : template["branch"] % {"clone_arg" : version, "ver_type" : ver_type}, + "zipfile_note" : zipfile["stable"] if is_stable else zipfile["unstable"] + } + out_file = os.path.join(out_dir, "git-clone.inc") + with open(out_file, "w", encoding='utf-8') as f: + f.write(template["template"] % args) + print("%s written" % out_file) + + +def write_version_note(template, out_dir, version, ver_type, is_stable): + if version == "master": + content = template["master"] + elif ver_type == "tag" and is_stable: + content = template["stable"] % version + else: + content = template["branch"] % (ver_type, version) + out_file = os.path.join(out_dir, "version-note.inc") + with open(out_file, "w", encoding='utf-8') as f: + f.write(content) + print("%s written" % out_file) + + +def get_version(): + """ + Returns a tuple of (name of branch/tag, type branch/tag, is_stable) + """ + # Trust what RTD says our version is, if it is set + version = os.environ.get("READTHEDOCS_VERSION", None) + if version == "latest": + return ("master", "branch", False) + + # Otherwise, use git to look for a tag + try: + tag = subprocess.check_output(["git", "describe", "--tags", "--exact-match"]).strip() + is_stable = re.match(r"v[0-9\.]+$", tag) is not None + return (tag, "tag", is_stable) + except subprocess.CalledProcessError: + pass + + # No tag, look for a branch + refs = subprocess.check_output(["git", "for-each-ref", "--points-at", "HEAD", "--format", "%(refname)"]) + print("refs:\n%s" % refs) + refs = refs.split(b"\n") + # Note: this looks for branches in 'origin' because GitLab CI doesn't check out a local branch + branches = [ r.replace(b"refs/remotes/origin/",b"").strip() for r in refs if r.startswith(b"refs/remotes/origin/") ] + if len(branches) == 0: + # last resort, return the commit (may happen on Gitlab CI sometimes, unclear why) + return (subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).strip(), "commit", False) + if "master" in branches: + return ("master", "branch", False) + else: + return (branches[0], "branch", False) # take whatever the first branch is + +if __name__ == "__main__": + main() diff --git a/docs/link-roles.py b/docs/link-roles.py new file mode 100644 index 00000000..c24d2007 --- /dev/null +++ b/docs/link-roles.py @@ -0,0 +1,70 @@ +# based on http://protips.readthedocs.io/link-roles.html + +from __future__ import print_function +from __future__ import unicode_literals +import re +import os +from docutils import nodes +from local_util import run_cmd_get_output + +def get_github_rev(): + path = run_cmd_get_output('git rev-parse --short HEAD') + tag = run_cmd_get_output('git describe --exact-match') + print('Git commit ID: ', path) + if len(tag): + print('Git tag: ', tag) + path = tag + return path + +def setup(app): + rev = get_github_rev() + + # links to files or folders on the GitHub + baseurl = 'https://github.com/espressif/esp-idf' + app.add_role('idf', autolink('{}/tree/{}/%s'.format(baseurl, rev))) + app.add_role('idf_file', autolink('{}/blob/{}/%s'.format(baseurl, rev))) + app.add_role('idf_raw', autolink('{}/raw/{}/%s'.format(baseurl, rev))) + app.add_role('component', autolink('{}/tree/{}/components/%s'.format(baseurl, rev))) + app.add_role('component_file', autolink('{}/blob/{}/components/%s'.format(baseurl, rev))) + app.add_role('component_raw', autolink('{}/raw/{}/components/%s'.format(baseurl, rev))) + app.add_role('example', autolink('{}/tree/{}/examples/%s'.format(baseurl, rev))) + app.add_role('example_file', autolink('{}/blob/{}/examples/%s'.format(baseurl, rev))) + app.add_role('example_raw', autolink('{}/raw/{}/examples/%s'.format(baseurl, rev))) + + # link to the current documentation file in specific language version + on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + if on_rtd: + # provide RTD specific commit identification to be included in the link + tag_rev = 'latest' + if (run_cmd_get_output('git rev-parse --short HEAD') != rev): + tag_rev = rev + else: + # if not on the RTD then provide generic identification + tag_rev = run_cmd_get_output('git describe --always') + + app.add_role('link_to_translation', crosslink('%s../../%s/{}/%s.html'.format(tag_rev))) + +def autolink(pattern): + def role(name, rawtext, text, lineno, inliner, options={}, content=[]): + m = re.search('(.*)\s*<(.*)>', text) + if m: + link_text = m.group(1) + link = m.group(2) + else: + link_text = text + link = text + url = pattern % (link,) + node = nodes.reference(rawtext, link_text, refuri=url, **options) + return [node], [] + return role + +def crosslink(pattern): + def role(name, rawtext, text, lineno, inliner, options={}, content=[]): + (language, link_text) = text.split(':') + docname = inliner.document.settings.env.docname + doc_path = inliner.document.settings.env.doc2path(docname, None, None) + return_path = '../' * doc_path.count('/') + url = pattern % (return_path, language, docname) + node = nodes.reference(rawtext, link_text, refuri=url, **options) + return [node], [] + return role diff --git a/docs/local_util.py b/docs/local_util.py new file mode 100644 index 00000000..38b324bd --- /dev/null +++ b/docs/local_util.py @@ -0,0 +1,55 @@ +# Utility functions used in conf.py +# +# Copyright 2017 Espressif Systems (Shanghai) PTE LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http:#www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import unicode_literals +from io import open +import re +import os +import shutil + +def run_cmd_get_output(cmd): + return os.popen(cmd).read().strip() + +def files_equal(path_1, path_2): + if not os.path.exists(path_1) or not os.path.exists(path_2): + return False + file_1_contents = '' + with open(path_1, "r", encoding='utf-8') as f_1: + file_1_contents = f_1.read() + file_2_contents = '' + with open(path_2, "r", encoding='utf-8') as f_2: + file_2_contents = f_2.read() + return file_1_contents == file_2_contents + +def copy_file_if_modified(src_file_path, dst_file_path): + if not files_equal(src_file_path, dst_file_path): + dst_dir_name = os.path.dirname(dst_file_path) + if not os.path.isdir(dst_dir_name): + os.makedirs(dst_dir_name) + shutil.copy(src_file_path, dst_file_path) + +def copy_if_modified(src_path, dst_path): + if os.path.isfile(src_path): + copy_file_if_modified(src_path, dst_path) + return + + src_path_len = len(src_path) + for root, dirs, files in os.walk(src_path): + for src_file_name in files: + src_file_path = os.path.join(root, src_file_name) + dst_file_path = os.path.join(dst_path + root[src_path_len:], src_file_name) + copy_file_if_modified(src_file_path, dst_file_path) + diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..6a4de8f3 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,12 @@ +# This is a list of python packages used to generate documentation. This file is used with pip: +# pip install --user -r requirements.txt +# +sphinx==1.6.5 +sphinx-rtd-theme +breathe==4.7.3 +sphinxcontrib-blockdiag==1.5.3 +sphinxcontrib-seqdiag==0.8.5 +sphinxcontrib-actdiag==0.8.5 +sphinxcontrib-nwdiag==0.9.5 +recommonmark +future>=0.16.0 # for ../tools/gen_esp_err_to_name.py diff --git a/tools/check_python_dependencies.py b/tools/check_python_dependencies.py new file mode 100755 index 00000000..d8767004 --- /dev/null +++ b/tools/check_python_dependencies.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +# +# Copyright 2018 Espressif Systems (Shanghai) PTE LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys +import argparse +try: + import pkg_resources +except: + print('pkg_resources cannot be imported probably because the pip package is not installed and/or using a ' + 'legacy Python interpreter. Please refer to the Get Started section of the ESP-IDF Programming Guide for ' + 'setting up the required packages.') + sys.exit(1) + +if __name__ == "__main__": + idf_path = os.getenv("IDF_PATH") + + parser = argparse.ArgumentParser(description='ESP32 Python package dependency checker') + parser.add_argument('--requirements', '-r', + help='Path to the requrements file', + default=idf_path + '/requirements.txt') + args = parser.parse_args() + + # Special case for MINGW32 Python, needs some packages + # via MSYS2 not via pip or system breaks... + if sys.platform == "win32" and \ + os.environ.get("MSYSTEM", None) == "MINGW32" and \ + "/mingw32/bin/python" in sys.executable: + failed = False + try: + import cryptography + except ImportError: + print("Please run the following command to install MSYS2's MINGW Python cryptography package:") + print("pacman -S mingw-w64-i686-python%d-cryptography" % (sys.version_info[0],)) + failed = True + try: + import setuptools + except ImportError: + print("Please run the following command to install MSYS2's MINGW Python setuptools package:") + print("pacman -S mingw-w64-i686-python%d-setuptools" % (sys.version_info[0],)) + failed = True + if failed: + sys.exit(1) + + not_satisfied = [] + with open(args.requirements) as f: + for line in f: + line = line.strip() + try: + pkg_resources.require(line) + except: + not_satisfied.append(line) + + if len(not_satisfied) > 0: + print('The following Python requirements are not satisfied:') + for requirement in not_satisfied: + print(requirement) + print('Please refer to the Get Started section of the ESP-IDF Programming Guide for setting up the required ' + 'packages. Alternatively, you can run "{} -m pip install --user -r {}" for resolving the issue.' + ''.format(sys.executable, args.requirements)) + sys.exit(1) + + print('Python requirements from {} are satisfied.'.format(args.requirements)) diff --git a/tools/gen_esp_err_to_name.py b/tools/gen_esp_err_to_name.py new file mode 100755 index 00000000..2beb5ac9 --- /dev/null +++ b/tools/gen_esp_err_to_name.py @@ -0,0 +1,352 @@ +#!/usr/bin/env python +# +# Copyright 2018 Espressif Systems (Shanghai) PTE LTD +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function +from __future__ import unicode_literals +import sys +try: + from builtins import str + from builtins import range + from builtins import object +except ImportError: + # This should not happen because the Python packages are checked before invoking this script. However, here is + # some output which should help if we missed something. + print('Import has failed probably because of the missing "future" package. Please install all the packages for ' + 'interpreter {} from the requirements.txt file.'.format(sys.executable)) + # The path to requirements.txt is not provided because this script could be invoked from an IDF project (then the + # requirements.txt from the IDF_PATH should be used) or from the documentation project (then the requirements.txt + # for the documentation directory should be used). + sys.exit(1) +from io import open +import os +import argparse +import re +import fnmatch +import collections +import textwrap +import functools + +# list files here which should not be parsed +ignore_files = [ 'components/mdns/test_afl_fuzz_host/esp32_compat.h' ] + +# add directories here which should not be parsed +ignore_dirs = ( 'examples' ) + +# macros from here have higher priorities in case of collisions +priority_headers = [ 'components/esp32/include/esp_err.h' ] + +err_dict = collections.defaultdict(list) #identified errors are stored here; mapped by the error code +rev_err_dict = dict() #map of error string to error code +unproc_list = list() #errors with unknown codes which depend on other errors + +class ErrItem(object): + """ + Contains information about the error: + - name - error string + - file - relative path inside the IDF project to the file which defines this error + - include_as - (optional) overwrites the include determined from file + - comment - (optional) comment for the error + - rel_str - (optional) error string which is a base for the error + - rel_off - (optional) offset in relation to the base error + """ + def __init__(self, name, file, include_as = None, comment = "", rel_str = "", rel_off = 0): + self.name = name + self.file = file + self.include_as = include_as + self.comment = comment + self.rel_str = rel_str + self.rel_off = rel_off + def __str__(self): + ret = self.name + " from " + self.file + if (self.rel_str != ""): + ret += " is (" + self.rel_str + " + " + str(self.rel_off) + ")" + if self.comment != "": + ret += " // " + self.comment + return ret + def __cmp__(self, other): + if self.file in priority_headers and other.file not in priority_headers: + return -1 + elif self.file not in priority_headers and other.file in priority_headers: + return 1 + + base = "_BASE" + + if self.file == other.file: + if self.name.endswith(base) and not(other.name.endswith(base)): + return 1 + elif not(self.name.endswith(base)) and other.name.endswith(base): + return -1 + + self_key = self.file + self.name + other_key = other.file + other.name + if self_key < other_key: + return -1 + elif self_key > other_key: + return 1 + else: + return 0 + +class InputError(RuntimeError): + """ + Represents and error on the input + """ + def __init__(self, p, e): + super(InputError, self).__init__(p + ": " + e) + +def process(line, idf_path, include_as): + """ + Process a line of text from file idf_path (relative to IDF project). + Fills the global list unproc_list and dictionaries err_dict, rev_err_dict + """ + if idf_path.endswith(".c"): + # We would not try to include a C file + raise InputError(idf_path, "This line should be in a header file: %s" % line) + + words = re.split(r' +', line, 2) + # words[1] is the error name + # words[2] is the rest of the line (value, base + value, comment) + if len(words) < 3: + raise InputError(idf_path, "Error at line %s" % line) + + line = "" + todo_str = words[2] + + comment = "" + # identify possible comment + m = re.search(r'/\*!<(.+?(?=\*/))', todo_str) + if m: + comment = m.group(1).strip() + todo_str = todo_str[:m.start()].strip() # keep just the part before the comment + + # identify possible parentheses () + m = re.search(r'\((.+)\)', todo_str) + if m: + todo_str = m.group(1) #keep what is inside the parentheses + + # identify BASE error code, e.g. from the form BASE + 0x01 + m = re.search(r'\s*(\w+)\s*\+(.+)', todo_str) + if m: + related = m.group(1) # BASE + todo_str = m.group(2) # keep and process only what is after "BASE +" + + # try to match a hexadecimal number + m = re.search(r'0x([0-9A-Fa-f]+)', todo_str) + if m: + num = int(m.group(1), 16) + else: + # Try to match a decimal number. Negative value is possible for some numbers, e.g. ESP_FAIL + m = re.search(r'(-?[0-9]+)', todo_str) + if m: + num = int(m.group(1), 10) + elif re.match(r'\w+', todo_str): + # It is possible that there is no number, e.g. #define ERROR BASE + related = todo_str # BASE error + num = 0 # (BASE + 0) + else: + raise InputError(idf_path, "Cannot parse line %s" % line) + + try: + related + except NameError: + # The value of the error is known at this moment because it do not depends on some other BASE error code + err_dict[num].append(ErrItem(words[1], idf_path, include_as, comment)) + rev_err_dict[words[1]] = num + else: + # Store the information available now and compute the error code later + unproc_list.append(ErrItem(words[1], idf_path, include_as, comment, related, num)) + +def process_remaining_errors(): + """ + Create errors which could not be processed before because the error code + for the BASE error code wasn't known. + This works for sure only if there is no multiple-time dependency, e.g.: + #define BASE1 0 + #define BASE2 (BASE1 + 10) + #define ERROR (BASE2 + 10) - ERROR will be processed successfully only if it processed later than BASE2 + """ + for item in unproc_list: + if item.rel_str in rev_err_dict: + base_num = rev_err_dict[item.rel_str] + base = err_dict[base_num][0] + num = base_num + item.rel_off + err_dict[num].append(ErrItem(item.name, item.file, item.include_as, item.comment)) + rev_err_dict[item.name] = num + else: + print(item.rel_str + " referenced by " + item.name + " in " + item.file + " is unknown") + + del unproc_list[:] + +def path_to_include(path): + """ + Process the path (relative to the IDF project) in a form which can be used + to include in a C file. Using just the filename does not work all the + time because some files are deeper in the tree. This approach tries to + find an 'include' parent directory an include its subdirectories, e.g. + "components/XY/include/esp32/file.h" will be transported into "esp32/file.h" + So this solution works only works when the subdirectory or subdirectories + are inside the "include" directory. Other special cases need to be handled + here when the compiler gives an unknown header file error message. + """ + spl_path = path.split(os.sep) + try: + i = spl_path.index('include') + except ValueError: + # no include in the path -> use just the filename + return os.path.basename(path) + else: + return os.sep.join(spl_path[i+1:]) # subdirectories and filename in "include" + +def print_warning(error_list, error_code): + """ + Print warning about errors with the same error code + """ + print("[WARNING] The following errors have the same code (%d):" % error_code) + for e in error_list: + print(" " + str(e)) + +def max_string_width(): + max = 0 + for k in err_dict: + for e in err_dict[k]: + x = len(e.name) + if x > max: + max = x + return max + +def generate_c_output(fin, fout): + """ + Writes the output to fout based on th error dictionary err_dict and + template file fin. + """ + # make includes unique by using a set + includes = set() + for k in err_dict: + for e in err_dict[k]: + if e.include_as: + includes.add(e.include_as) + else: + includes.add(path_to_include(e.file)) + + # The order in a set in non-deterministic therefore it could happen that the + # include order will be different in other machines and false difference + # in the output file could be reported. In order to avoid this, the items + # are sorted in a list. + include_list = list(includes) + include_list.sort() + + max_width = max_string_width() + 17 + 1 # length of " ERR_TBL_IT()," with spaces is 17 + max_decdig = max(len(str(k)) for k in err_dict) + + for line in fin: + if re.match(r'@COMMENT@', line): + fout.write("//Do not edit this file because it is autogenerated by " + os.path.basename(__file__) + "\n") + + elif re.match(r'@HEADERS@', line): + for i in include_list: + fout.write("#if __has_include(\"" + i + "\")\n#include \"" + i + "\"\n#endif\n") + elif re.match(r'@ERROR_ITEMS@', line): + last_file = "" + for k in sorted(err_dict.keys()): + if len(err_dict[k]) > 1: + err_dict[k].sort(key=functools.cmp_to_key(ErrItem.__cmp__)) + print_warning(err_dict[k], k) + for e in err_dict[k]: + if e.file != last_file: + last_file = e.file + fout.write(" // %s\n" % last_file) + table_line = (" ERR_TBL_IT(" + e.name + "), ").ljust(max_width) + "/* " + str(k).rjust(max_decdig) + fout.write("# ifdef %s\n" % e.name) + fout.write(table_line) + hexnum_length = 0 + if k > 0: # negative number and zero should be only ESP_FAIL and ESP_OK + hexnum = " 0x%x" % k + hexnum_length = len(hexnum) + fout.write(hexnum) + if e.comment != "": + if len(e.comment) < 50: + fout.write(" %s" % e.comment) + else: + indent = " " * (len(table_line) + hexnum_length + 1) + w = textwrap.wrap(e.comment, width=120, initial_indent = indent, subsequent_indent = indent) + # this couldn't be done with initial_indent because there is no initial_width option + fout.write(" %s" % w[0].strip()) + for i in range(1, len(w)): + fout.write("\n%s" % w[i]) + fout.write(" */\n# endif\n") + else: + fout.write(line) + +def generate_rst_output(fout): + for k in sorted(err_dict.keys()): + v = err_dict[k][0] + fout.write(':c:macro:`{}` '.format(v.name)) + if k > 0: + fout.write('**(0x{:x})**'.format(k)) + else: + fout.write('({:d})'.format(k)) + if len(v.comment) > 0: + fout.write(': {}'.format(v.comment)) + fout.write('\n\n') + +def main(): + if 'IDF_PATH' in os.environ: + idf_path = os.environ['IDF_PATH'] + else: + idf_path = os.path.realpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) + + parser = argparse.ArgumentParser(description='ESP32 esp_err_to_name lookup generator for esp_err_t') + parser.add_argument('--c_input', help='Path to the esp_err_to_name.c.in template input.', default=idf_path + '/components/esp32/esp_err_to_name.c.in') + parser.add_argument('--c_output', help='Path to the esp_err_to_name.c output.', default=idf_path + '/components/esp32/esp_err_to_name.c') + parser.add_argument('--rst_output', help='Generate .rst output and save it into this file') + args = parser.parse_args() + + include_as_pattern = re.compile(r'\s*//\s*{}: [^"]* "([^"]+)"'.format(os.path.basename(__file__))) + define_pattern = re.compile(r'\s*#define\s+(ESP_ERR_|ESP_OK|ESP_FAIL)') + + for root, dirnames, filenames in os.walk(idf_path): + for filename in fnmatch.filter(filenames, '*.[ch]'): + full_path = os.path.join(root, filename) + path_in_idf = os.path.relpath(full_path, idf_path) + if path_in_idf in ignore_files or path_in_idf.startswith(ignore_dirs): + continue + with open(full_path, encoding='utf-8') as f: + try: + include_as = None + for line in f: + line = line.strip() + m = include_as_pattern.search(line) + if m: + include_as = m.group(1) + # match also ESP_OK and ESP_FAIL because some of ESP_ERRs are referencing them + elif define_pattern.match(line): + try: + process(line, path_in_idf, include_as) + except InputError as e: + print(e) + except UnicodeDecodeError: + raise ValueError("The encoding of {} is not Unicode.".format(path_in_idf)) + + process_remaining_errors() + + if args.rst_output is not None: + with open(args.rst_output, 'w', encoding='utf-8') as fout: + generate_rst_output(fout) + else: + with open(args.c_input, 'r', encoding='utf-8') as fin, open(args.c_output, 'w', encoding='utf-8') as fout: + generate_c_output(fin, fout) + +if __name__ == "__main__": + main() diff --git a/tools/toolchain_versions.mk b/tools/toolchain_versions.mk new file mode 100644 index 00000000..cf74ef5e --- /dev/null +++ b/tools/toolchain_versions.mk @@ -0,0 +1,6 @@ +SUPPORTED_TOOLCHAIN_COMMIT_DESC = crosstool-ng-1.22.0-80-g6c4433a +SUPPORTED_TOOLCHAIN_GCC_VERSIONS = 5.2.0 + +CURRENT_TOOLCHAIN_COMMIT_DESC = crosstool-ng-1.22.0-80-g6c4433a +CURRENT_TOOLCHAIN_COMMIT_DESC_SHORT = 1.22.0-80-g6c4433a +CURRENT_TOOLCHAIN_GCC_VERSION = 5.2.0