From fa3e4103abd1a0d8af787cf79b757797a86bedd1 Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Wed, 16 Nov 2016 20:11:32 +0100 Subject: [PATCH 1/6] docs: Hyperlinks to guides --- CONTRIBUTING.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 968826790a..5810d06b98 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -15,7 +15,9 @@ Before sending us a Pull Request, please consider this list of points: * Is the contribution entirely your own work, or already licensed under an Apache License 2.0 compatible Open Source License? If not then we unfortunately cannot accept it. -* Does any new code conform to the esp-idf Style Guide? (Style Guide currently pending). +* Does any new code conform to the esp-idf :doc:`Style Guide `? + +* Does the code documentation follow requirements in :doc:`documenting-code`? * Is the code adequately commented for people to understand how it is structured? From 4e9e8f52acdba97d7f10d16ba440904d9c709425 Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Wed, 16 Nov 2016 20:13:18 +0100 Subject: [PATCH 2/6] doc: Documenting Code clean up --- .../_static/doc-code-documentation-inline.png | Bin 52513 -> 52554 bytes docs/documenting-code.rst | 121 +++++++++--------- 2 files changed, 57 insertions(+), 64 deletions(-) diff --git a/docs/_static/doc-code-documentation-inline.png b/docs/_static/doc-code-documentation-inline.png index 72bf22f156224e4e32e7934828ccc73f15cea67e..9de5d51a2bd0c0fca7f0cb53b8b0a6c3ff9ed38c 100644 GIT binary patch delta 14525 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 delta 14441 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

gnqNgsd-rC0@|9-?9@pqq%hiic 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 Date: Wed, 16 Nov 2016 20:14:48 +0100 Subject: [PATCH 3/6] doc: API Reference - examples & fixes --- docs/api/bt.rst | 11 +++++++---- docs/api/ledc.rst | 3 +++ docs/api/nvs_flash.rst | 19 +++++++++++++++++-- docs/api/vfs.rst | 1 + 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/docs/api/bt.rst b/docs/api/bt.rst index 0ab17b2aa5..1824bc454a 100644 --- a/docs/api/bt.rst +++ b/docs/api/bt.rst @@ -9,15 +9,19 @@ Overview Application Example ------------------- -`Instructions`_ +Check `/examples `_ folder of `espressif/esp-idf `_ repository, that contains the following example: -API Reference -------------- +`05_ble_adv `_ + + This is a BLE advertising demo with virtual HCI interface. Send Reset/ADV_PARAM/ADV_DATA/ADV_ENABLE HCI command for BLE advertising. `Instructions`_ .. _Instructions: template.html +API Reference +------------- + Header Files ^^^^^^^^^^^^ @@ -35,4 +39,3 @@ Functions .. doxygenfunction:: API_vhci_host_register_callback .. doxygenfunction:: API_vhci_host_send_packet .. doxygenfunction:: bt_controller_init - diff --git a/docs/api/ledc.rst b/docs/api/ledc.rst index f379e9d008..855f822163 100644 --- a/docs/api/ledc.rst +++ b/docs/api/ledc.rst @@ -27,7 +27,10 @@ Data Structures ^^^^^^^^^^^^^^^ .. doxygenstruct:: ledc_channel_config_t + :members: + .. doxygenstruct:: ledc_timer_config_t + :members: Macros ^^^^^^ diff --git a/docs/api/nvs_flash.rst b/docs/api/nvs_flash.rst index 5d36343552..a765f7608e 100644 --- a/docs/api/nvs_flash.rst +++ b/docs/api/nvs_flash.rst @@ -5,8 +5,23 @@ Application Example Two examples are provided in ESP-IDF examples directory: -- `07_nvs_rw_value `_ demostrates how to read and write integer values -- `08_nvs_rw_blob `_ demostrates how to read and write variable length binary values +`07_nvs_rw_value `_ + + Demonstrates how to read and write a single integer value using NVS. + + The value holds the number of ESP32 module restarts. Since it is written to NVS, the value is preserved between restarts. + + Example also shows how to check if read / write operation was successful, or certain value is not initialized in NVS. Diagnostic is provided in plain text to help track program flow and capture any issues on the way. + +`08_nvs_rw_blob `_ + + Demonstrates how to read and write a single integer value and a blob (binary large object) using NVS to preserve them between ESP32 module restarts. + + * value - tracks number of ESP32 module soft and hard restarts. + * blob - contains a table with module run times. The table is read from NVS to dynamically allocated RAM. New run time is added to the table on each manually triggered soft restart and written back to NVS. Triggering is done by pulling down GPIO0. + + Example also shows how to implement diagnostics if read / write operation was successful. + API Reference ------------- diff --git a/docs/api/vfs.rst b/docs/api/vfs.rst index df6cd03f67..798aac5492 100644 --- a/docs/api/vfs.rst +++ b/docs/api/vfs.rst @@ -25,6 +25,7 @@ Structures ^^^^^^^^^^ .. doxygenstruct:: esp_vfs_t + :members: Functions ^^^^^^^^^ From a86c431f981cb20031997c95352232d49865a5dd Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Wed, 16 Nov 2016 20:16:47 +0100 Subject: [PATCH 4/6] doc: Formating clean up --- docs/build_system.rst | 15 ++++++++++----- docs/security/secure-boot.rst | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/build_system.rst b/docs/build_system.rst index aa14cdda56..4ba89f8652 100644 --- a/docs/build_system.rst +++ b/docs/build_system.rst @@ -57,6 +57,7 @@ Example Project --------------- An example project directory tree might look like this:: + - myProject/ - Makefile - sdkconfig @@ -66,11 +67,11 @@ An example project directory tree might look like this:: - component2/ - component.mk - Kconfig - src1.c - - include/ - - component2.h + - include/ - component2.h - main/ - src1.c - src2.c - component.mk + - build/ This example "myProject" contains the following elements: @@ -101,6 +102,7 @@ Minimal Example Makefile ^^^^^^^^^^^^^^^^^^^^^^^^ :: + PROJECT_NAME := myProject include $(IDF_PATH)/make/project.mk @@ -135,7 +137,8 @@ Minimal Component Makefile ^^^^^^^^^^^^^^^^^^^^^^^^^^ The minimal ``component.mk`` file is an empty file(!). If the file is empty, the default component behaviour is set: -- All source files in the same directory as the makefile (*.c, *.cpp, *.S) will be compiled into the component library + +- All source files in the same directory as the makefile (``*.c``, ``*.cpp``, ``*.S``) will be compiled into the component library - A sub-directory "include" will be added to the global include search path for all other components. - The component library will be linked into the project app. @@ -209,8 +212,8 @@ The following variables can be set inside ``component.mk`` to control the build ``COMPONENT_PRIV_INCLUDEDIRS`` variable, except these paths are not expanded relative to the component directory. - ``COMPONENT_SRCDIRS``: Directory paths, must be relative to the - component directory, which will be searched for source files (*.cpp, - *.c, *.S). Defaults to '.', ie the component directory + component directory, which will be searched for source files (``*.cpp``, + ``*.c``, ``*.S``). Defaults to '.', ie the component directory itself. Override this to specify a different list of directories which contain source files. - ``COMPONENT_OBJS``: Object files to compile. Default value is a .o @@ -366,12 +369,14 @@ The configuration system can be used to conditionally compile some files depending on the options selected in ``make menuconfig``: ``Kconfig``:: + config FOO_ENABLE_BAR bool "Enable the BAR feature." help This enables the BAR feature of the FOO component. ``component.mk``:: + COMPONENT_OBJS := foo_a.o foo_b.o ifdef CONFIG_FOO_BAR diff --git a/docs/security/secure-boot.rst b/docs/security/secure-boot.rst index b352b3964c..113d250902 100644 --- a/docs/security/secure-boot.rst +++ b/docs/security/secure-boot.rst @@ -27,18 +27,18 @@ This is a high level overview of the secure boot process. Step by step instructi 2. Secure Boot Configuration includes "Secure boot signing key", which is a file path. This file is a ECDSA public/private key pair in a PEM format file. -2. The software bootloader image is built by esp-idf with secure boot support enabled and the public key (signature verification) portion of the secure boot signing key compiled in. This software bootloader image is flashed at offset 0x1000. +3. The software bootloader image is built by esp-idf with secure boot support enabled and the public key (signature verification) portion of the secure boot signing key compiled in. This software bootloader image is flashed at offset 0x1000. -3. On first boot, the software bootloader follows the following process to enable secure boot: +4. On first boot, the software bootloader follows the following process to enable secure boot: - Hardware secure boot support generates a device secure bootloader key (generated via hardware RNG, then stored read/write protected in efuse), and a secure digest. The digest is derived from the key, an IV, and the bootloader image contents. - The secure digest is flashed at offset 0x0 in the flash. - Depending on Secure Boot Configuration, efuses are burned to disable JTAG and the ROM BASIC interpreter (it is strongly recommended these options are turned on.) - Bootloader permanently enables secure boot by burning the ABS_DONE_0 efuse. The software bootloader then becomes protected (the chip will only boot a bootloader image if the digest matches.) -4. On subsequent boots the ROM bootloader sees that the secure boot efuse is burned, reads the saved digest at 0x0 and uses hardware secure boot support to compare it with a newly calculated digest. If the digest does not match then booting will not continue. The digest and comparison are performed entirely by hardware, and the calculated digest is not readable by software. For technical details see `Hardware Secure Boot Support`. +5. On subsequent boots the ROM bootloader sees that the secure boot efuse is burned, reads the saved digest at 0x0 and uses hardware secure boot support to compare it with a newly calculated digest. If the digest does not match then booting will not continue. The digest and comparison are performed entirely by hardware, and the calculated digest is not readable by software. For technical details see `Hardware Secure Boot Support`. -5. When running in secure boot mode, the software bootloader uses the secure boot signing key (the public key of which is embedded in the bootloader itself, and therefore validated as part of the bootloader) to verify the signature appended to all subsequent partition tables and app images before they are booted. +6. When running in secure boot mode, the software bootloader uses the secure boot signing key (the public key of which is embedded in the bootloader itself, and therefore validated as part of the bootloader) to verify the signature appended to all subsequent partition tables and app images before they are booted. Keys ---- From dd0585e84e6e28039131bc227b1b0010eeeea28a Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Wed, 16 Nov 2016 20:17:44 +0100 Subject: [PATCH 5/6] doc: Index clean up --- docs/index.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 8bc7a72f29..adf07b586e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,6 +5,9 @@ ESP32 Programming Guide Until ESP-IDF release 1.0, this documentation is a draft. It is incomplete and may have mistakes. Please mind your step! +Documentation adressed to developers of applications for `ESP32 `_ by `Espressif `_ using `esp-idf `_. + + Contents: .. toctree:: @@ -41,7 +44,7 @@ Contents: 1. System - TBA 1.1. Fundamentals of multiprocessor programming with FreeRTOS - TBA 1.2. Application startup flow - TBA - 1.3. Flash encryption and secure boot: how they work and APIs - TBA + 1.3. Flash encryption and secure boot: how they work and APIs 1.4. Lower Power Coprocessor - TBA 1.5. Watchdogs 1.6. ... @@ -61,7 +64,7 @@ Contents: 6.1. GPIO 6.2. ADC - TBA 6.3. DAC - TBA - 6.4. UART - TBA + 6.4. UART 6.5. I2C - TBA 6.6. I2S - TBA 6.7. SPI - TBA @@ -78,9 +81,9 @@ Contents: 7.3. Touch Sensor - TBA 8. Protocols - TBA 9. Components - 9.1. Logging - 9.2 Non-Volatile Storage - 9.3 Virtual Filesystem + 9.1. Logging + 9.2 Non-Volatile Storage + 9.3 Virtual Filesystem 9.3. Http sever - TBA 10. Applications - TBA .. @@ -128,11 +131,9 @@ Contents: COPYRIGHT -.. About - TBA - Indices -======= +------- * :ref:`genindex` * :ref:`search` From d4b5bd347da854a79bee24a3ee88741fcca4a362 Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Wed, 16 Nov 2016 20:27:55 +0100 Subject: [PATCH 6/6] Doxygen configuration clean up --- docs/Doxyfile | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/docs/Doxyfile b/docs/Doxyfile index 1f53a85931..eeb4fe740d 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -1,3 +1,18 @@ +# 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: +# http://www.stack.nl/~dimitri/doxygen/manual/config.html + + PROJECT_NAME = "ESP32 Programming Guide" INPUT = ../components/esp32/include/esp_wifi.h \ @@ -10,14 +25,18 @@ INPUT = ../components/esp32/include/esp_wifi.h \ ../components/esp32/include/esp_int_wdt.h \ ../components/esp32/include/esp_task_wdt.h -WARN_NO_PARAMDOC = YES +## Get warnings for functions that have no documentation for their parameters or return value +## +WARN_NO_PARAMDOC = YES -RECURSIVE = NO -CASE_SENSE_NAMES = NO -EXTRACT_ALL = NO +## Do not complain about not having dot +## +HAVE_DOT = NO -GENERATE_XML = YES -XML_OUTPUT = xml +## Generate XML that is required for Breathe +## +GENERATE_XML = YES +XML_OUTPUT = xml GENERATE_HTML = NO HAVE_DOT = NO @@ -25,5 +44,9 @@ 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" -