From 30edcca1fbf15909ea9b5a096f93f353feea7d9f Mon Sep 17 00:00:00 2001 From: krzychb Date: Tue, 2 May 2017 10:36:01 +0200 Subject: [PATCH] docs: Generate Doxygen directives for API documentation This is to resolve issue reported in https://github.com/espressif/esp-idf/issues/130. --- .gitignore | 1 + components/driver/include/driver/dac.h | 3 +- components/driver/include/driver/gpio.h | 22 +- components/driver/include/driver/spi_common.h | 4 +- components/ethernet/include/eth_phy/phy.h | 8 +- .../ethernet/include/eth_phy/phy_lan8720.h | 14 +- .../ethernet/include/eth_phy/phy_tlk110.h | 14 +- components/vfs/README.rst | 20 +- docs/Doxyfile | 159 +++++++-- docs/Makefile | 8 +- docs/_static/about-doc.png | Bin 68380 -> 108678 bytes docs/api-guides/build-system.rst | 14 +- .../bluetooth/controller_vhci.rst | 44 +-- docs/api-reference/bluetooth/esp_a2dp.rst | 66 +--- docs/api-reference/bluetooth/esp_avrc.rst | 44 +-- docs/api-reference/bluetooth/esp_blufi.rst | 116 +------ docs/api-reference/bluetooth/esp_bt_defs.rst | 46 +-- .../api-reference/bluetooth/esp_bt_device.rst | 30 +- docs/api-reference/bluetooth/esp_bt_main.rst | 32 +- docs/api-reference/bluetooth/esp_gap_ble.rst | 172 +--------- docs/api-reference/bluetooth/esp_gap_bt.rst | 29 +- .../api-reference/bluetooth/esp_gatt_defs.rst | 148 +-------- docs/api-reference/bluetooth/esp_gattc.rst | 109 +------ docs/api-reference/bluetooth/esp_gatts.rst | 112 +------ docs/api-reference/bluetooth/index.rst | 2 +- docs/api-reference/ethernet/esp_eth.rst | 81 ++--- docs/api-reference/index.rst | 5 +- docs/api-reference/peripherals/adc.rst | 19 +- docs/api-reference/peripherals/dac.rst | 19 +- docs/api-reference/peripherals/gpio.rst | 175 +--------- docs/api-reference/peripherals/i2c.rst | 68 +--- docs/api-reference/peripherals/i2s.rst | 56 +--- docs/api-reference/peripherals/index.rst | 3 +- docs/api-reference/peripherals/ledc.rst | 61 +--- .../peripherals/mcpwm.rst | 77 +---- docs/api-reference/peripherals/pcnt.rst | 50 +-- docs/api-reference/peripherals/rmt.rst | 77 +---- docs/api-reference/peripherals/sigmadelta.rst | 34 +- docs/api-reference/peripherals/spi_master.rst | 60 +--- docs/api-reference/peripherals/spi_slave.rst | 48 +-- docs/api-reference/peripherals/timer.rst | 55 +--- docs/api-reference/peripherals/uart.rst | 79 +---- docs/api-reference/protocols/mdns.rst | 67 +--- docs/api-reference/storage/fatfs.rst | 4 - docs/api-reference/storage/index.rst | 2 +- docs/api-reference/storage/nvs_flash.rst | 63 +--- docs/api-reference/storage/spi_flash.rst | 83 +---- docs/api-reference/storage/vfs.rst | 35 +- docs/api-reference/storage/wear-levelling.rst | 22 +- .../api-reference/system/base_mac_address.rst | 41 +-- docs/api-reference/system/intr_alloc.rst | 39 +-- docs/api-reference/system/log.rst | 52 +-- docs/api-reference/system/mem_alloc.rst | 49 +-- docs/api-reference/system/ota.rst | 31 +- docs/api-reference/template.rst | 134 ++++---- docs/api-reference/wifi/esp_smartconfig.rst | 20 +- docs/api-reference/wifi/esp_wifi.rst | 71 +---- docs/conf.py | 14 +- docs/contribute/documenting-code.rst | 38 ++- docs/doxygen_xml_to_rst.xslt | 58 ---- docs/gen-dxd.py | 301 ++++++++++++++++++ docs/hw-reference/index.rst | 3 +- 62 files changed, 771 insertions(+), 2540 deletions(-) mode change 100755 => 100644 docs/Doxyfile rename docs/{api => api-reference}/peripherals/mcpwm.rst (56%) delete mode 100644 docs/doxygen_xml_to_rst.xslt create mode 100644 docs/gen-dxd.py diff --git a/.gitignore b/.gitignore index 5490ebb93..e571eeb68 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ examples/**/build #Doc build artifacts docs/_build/ docs/doxygen-warning-log.txt +docs/sphinx-warning-log.txt docs/xml/ docs/man/ diff --git a/components/driver/include/driver/dac.h b/components/driver/include/driver/dac.h index 07e1ff80d..842894d0e 100644 --- a/components/driver/include/driver/dac.h +++ b/components/driver/include/driver/dac.h @@ -28,7 +28,7 @@ typedef enum { DAC_CHANNEL_MAX, } dac_channel_t; - +/** @cond */ /** * @brief Set DAC output voltage. * @@ -45,6 +45,7 @@ typedef enum { * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t dac_out_voltage(dac_channel_t channel, uint8_t dac_value) __attribute__ ((deprecated)); +/** @endcond */ /** * @brief Set DAC output voltage. diff --git a/components/driver/include/driver/gpio.h b/components/driver/include/driver/gpio.h index 33f87bdfa..53f2021a1 100644 --- a/components/driver/include/driver/gpio.h +++ b/components/driver/include/driver/gpio.h @@ -31,7 +31,13 @@ extern "C" { #define GPIO_SEL_0 (BIT(0)) /*!< Pin 0 selected */ #define GPIO_SEL_1 (BIT(1)) /*!< Pin 1 selected */ -#define GPIO_SEL_2 (BIT(2)) /*!< Pin 2 selected */ +#define GPIO_SEL_2 (BIT(2)) /*!< Pin 2 selected + @note There are more macros + like that up to pin 39, + excluding pins 20, 24 and 28..31. + They are not shown here + to reduce redundant information. */ +/** @cond */ #define GPIO_SEL_3 (BIT(3)) /*!< Pin 3 selected */ #define GPIO_SEL_4 (BIT(4)) /*!< Pin 4 selected */ #define GPIO_SEL_5 (BIT(5)) /*!< Pin 5 selected */ @@ -114,14 +120,21 @@ extern "C" { #define GPIO_MODE_DEF_OD (BIT2) #define GPIO_PIN_COUNT 40 +/** @endcond */ + extern const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT]; -#define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num < GPIO_PIN_COUNT && GPIO_PIN_MUX_REG[gpio_num] != 0)) //to decide whether it is a valid GPIO number -#define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((GPIO_IS_VALID_GPIO(gpio_num)) && (gpio_num < 34)) //to decide whether it can be a valid GPIO number of output mode +#define GPIO_IS_VALID_GPIO(gpio_num) ((gpio_num < GPIO_PIN_COUNT && GPIO_PIN_MUX_REG[gpio_num] != 0)) /*!< Check whether it is a valid GPIO number */ +#define GPIO_IS_VALID_OUTPUT_GPIO(gpio_num) ((GPIO_IS_VALID_GPIO(gpio_num)) && (gpio_num < 34)) /*!< Check whether it can be a valid GPIO number of output mode */ typedef enum { GPIO_NUM_0 = 0, /*!< GPIO0, input and output */ GPIO_NUM_1 = 1, /*!< GPIO1, input and output */ - GPIO_NUM_2 = 2, /*!< GPIO2, input and output */ + GPIO_NUM_2 = 2, /*!< GPIO2, input and output + @note There are more enumerations like that + up to GPIO39, excluding GPIO20, GPIO24 and GPIO28..31. + They are not shown here to reduce redundant information. + @note GPIO34..29 are input mode only. */ +/** @cond */ GPIO_NUM_3 = 3, /*!< GPIO3, input and output */ GPIO_NUM_4 = 4, /*!< GPIO4, input and output */ GPIO_NUM_5 = 5, /*!< GPIO5, input and output */ @@ -157,6 +170,7 @@ typedef enum { GPIO_NUM_38 = 38, /*!< GPIO38, input mode only */ GPIO_NUM_39 = 39, /*!< GPIO39, input mode only */ GPIO_NUM_MAX = 40, +/** @endcond */ } gpio_num_t; typedef enum { diff --git a/components/driver/include/driver/spi_common.h b/components/driver/include/driver/spi_common.h index 5d4270fd1..53cde6ffa 100644 --- a/components/driver/include/driver/spi_common.h +++ b/components/driver/include/driver/spi_common.h @@ -48,6 +48,8 @@ typedef enum { * You can use this structure to specify the GPIO pins of the bus. Normally, the driver will use the * GPIO matrix to route the signals. An exception is made when all signals either can be routed through * the IO_MUX or are -1. In that case, the IO_MUX is used, allowing for >40MHz speeds. + * + * @note Be advised that the slave driver does not use the quadwp/quadhd lines and fields in spi_bus_config_t refering to these lines will be ignored and can thus safely be left uninitialized. */ typedef struct { int mosi_io_num; ///< GPIO pin for Master Out Slave In (=spi_d) signal, or -1 if not used. @@ -230,4 +232,4 @@ void spicommon_dmaworkaround_transfer_active(int dmachan); } #endif -#endif \ No newline at end of file +#endif diff --git a/components/ethernet/include/eth_phy/phy.h b/components/ethernet/include/eth_phy/phy.h index 44edd7491..18b8f3f6c 100644 --- a/components/ethernet/include/eth_phy/phy.h +++ b/components/ethernet/include/eth_phy/phy.h @@ -20,13 +20,13 @@ extern "C" { #include "esp_eth.h" -/* Common PHY-management functions. +/** Common PHY-management functions. These are not enough to drive any particular Ethernet PHY, but they provide a common configuration structure and management functions. */ -/* Configure fixed pins for RMII data interface. +/** Configure fixed pins for RMII data interface. This configures GPIOs 0, 19, 22, 25, 26, 27 for use with RMII data interface. These pins cannot be changed, and must be wired to @@ -38,7 +38,7 @@ extern "C" { */ void phy_rmii_configure_data_interface_pins(void); -/* Configure variable pins for SMI (MDIO) ethernet functions. +/** Configure variable pins for SMI (MDIO) ethernet functions. Calling this function along with mii_configure_default_pins() will fully configure the GPIOs for the ethernet PHY. @@ -46,7 +46,7 @@ void phy_rmii_configure_data_interface_pins(void); void phy_rmii_smi_configure_pins(uint8_t mdc_gpio, uint8_t mdio_gpio); -/* Enable flow control in standard PHY MII register. +/** Enable flow control in standard PHY MII register. */ void phy_mii_enable_flow_ctrl(void); diff --git a/components/ethernet/include/eth_phy/phy_lan8720.h b/components/ethernet/include/eth_phy/phy_lan8720.h index 7bde42eca..8c579ef5e 100644 --- a/components/ethernet/include/eth_phy/phy_lan8720.h +++ b/components/ethernet/include/eth_phy/phy_lan8720.h @@ -21,26 +21,26 @@ extern "C" { #include "phy.h" -/* @brief Dump all LAN8720 PHY SMI configuration registers +/** @brief Dump all LAN8720 PHY SMI configuration registers * * @note These registers are dumped at 'debug' level, so output * may not be visible depending on default log levels. */ void phy_lan8720_dump_registers(); -/* @brief Default LAN8720 phy_check_init function. +/** @brief Default LAN8720 phy_check_init function. */ void phy_lan8720_check_phy_init(void); -/* @brief Default LAN8720 phy_get_speed_mode function. +/** @brief Default LAN8720 phy_get_speed_mode function. */ eth_speed_mode_t phy_lan8720_get_speed_mode(void); -/* @brief Default LAN8720 phy_get_duplex_mode function. +/** @brief Default LAN8720 phy_get_duplex_mode function. */ eth_duplex_mode_t phy_lan8720_get_duplex_mode(void); -/* @brief Default LAN8720 phy_power_enable function. +/** @brief Default LAN8720 phy_power_enable function. * * @note This function may need to be replaced with a custom function * if the PHY has a GPIO to enable power or start a clock. @@ -49,11 +49,11 @@ eth_duplex_mode_t phy_lan8720_get_duplex_mode(void); */ void phy_lan8720_power_enable(bool); -/* @brief Default LAN8720 phy_init function. +/** @brief Default LAN8720 phy_init function. */ void phy_lan8720_init(void); -/* @brief Default LAN8720 PHY configuration +/** @brief Default LAN8720 PHY configuration * * This configuration is not suitable for use as-is, it will need * to be modified for your particular PHY hardware setup. diff --git a/components/ethernet/include/eth_phy/phy_tlk110.h b/components/ethernet/include/eth_phy/phy_tlk110.h index 1019044e9..ff61c322c 100644 --- a/components/ethernet/include/eth_phy/phy_tlk110.h +++ b/components/ethernet/include/eth_phy/phy_tlk110.h @@ -20,26 +20,26 @@ extern "C" { #include "phy.h" -/* @brief Dump all TLK110 PHY SMI configuration registers +/** @brief Dump all TLK110 PHY SMI configuration registers * * @note These registers are dumped at 'debug' level, so output * may not be visible depending on default log levels. */ void phy_tlk110_dump_registers(); -/* @brief Default TLK110 phy_check_init function. +/** @brief Default TLK110 phy_check_init function. */ void phy_tlk110_check_phy_init(void); -/* @brief Default TLK110 phy_get_speed_mode function. +/** @brief Default TLK110 phy_get_speed_mode function. */ eth_speed_mode_t phy_tlk110_get_speed_mode(void); -/* @brief Default TLK110 phy_get_duplex_mode function. +/** @brief Default TLK110 phy_get_duplex_mode function. */ eth_duplex_mode_t phy_tlk110_get_duplex_mode(void); -/* @brief Default TLK110 phy_power_enable function. +/** @brief Default TLK110 phy_power_enable function. * * @note This function may need to be replaced with a custom function * if the PHY has a GPIO to enable power or start a clock. @@ -48,11 +48,11 @@ eth_duplex_mode_t phy_tlk110_get_duplex_mode(void); */ void phy_tlk110_power_enable(bool); -/* @brief Default TLK110 phy_init function. +/** @brief Default TLK110 phy_init function. */ void phy_tlk110_init(void); -/* @brief Default TLK110 PHY configuration +/** @brief Default TLK110 PHY configuration * * This configuration is not suitable for use as-is, it will need * to be modified for your particular PHY hardware setup. diff --git a/components/vfs/README.rst b/components/vfs/README.rst index 26d857fc8..318004c25 100644 --- a/components/vfs/README.rst +++ b/components/vfs/README.rst @@ -13,7 +13,13 @@ For example, one can register a FAT filesystem driver with ``/fat`` prefix, and FS registration --------------- -To register an FS driver, application needs to define in instance of esp_vfs_t structure and populate it with function pointers to FS APIs:: + + +To register an FS driver, application needs to define in instance of esp_vfs_t structure and populate it with function pointers to FS APIs: + +.. highlight:: c + +:: esp_vfs_t myfs = { .fd_offset = 0, @@ -97,6 +103,8 @@ Lower ``CONFIG_MAX_FD_BITS`` bits are used to store zero-based file descriptor. When VFS component receives a call from newlib which has a file descriptor, this file descriptor is translated back to the FS-specific file descriptor. First, higher bits of FD are used to identify the FS. Then ``fd_offset`` field of the FS is added to the lower ``CONFIG_MAX_FD_BITS`` bits of the fd, and resulting FD is passed to the FS driver. +.. highlight:: none + :: FD as seen by newlib FD as seen by FS driver @@ -132,15 +140,19 @@ Note that while writing to ``stdout`` or ``stderr`` will block until all charact Standard streams and FreeRTOS tasks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -``FILE`` objects for ``stdin``, ``stdout``, and ``stderr`` are shared between all FreeRTOS tasks, but the pointers to these objects are are stored in per-task ``struct _reent``. The following code:: +``FILE`` objects for ``stdin``, ``stdout``, and ``stderr`` are shared between all FreeRTOS tasks, but the pointers to these objects are are stored in per-task ``struct _reent``. The following code: + +.. highlight:: c + +:: fprintf(stderr, "42\n"); -actually is translated to to this (by the preprocessor): +actually is translated to to this (by the preprocessor):: fprintf(__getreent()->_stderr, "42\n"); -where the ``__getreent()`` function returns a per-task pointer to ``struct _reent`` (:component_file:`newlib/include/sys/reent.h#L370-L417>`). This structure is allocated on the TCB of each task. When a task is initialized, ``_stdin``, ``_stdout`` and ``_stderr`` members of ``struct _reent`` are set to the values of ``_stdin``, ``_stdout`` and ``_stderr`` of ``_GLOBAL_REENT`` (i.e. the structure which is used before FreeRTOS is started). +where the ``__getreent()`` function returns a per-task pointer to ``struct _reent`` (:component_file:`newlib/include/sys/reent.h#L370-L417`). This structure is allocated on the TCB of each task. When a task is initialized, ``_stdin``, ``_stdout`` and ``_stderr`` members of ``struct _reent`` are set to the values of ``_stdin``, ``_stdout`` and ``_stderr`` of ``_GLOBAL_REENT`` (i.e. the structure which is used before FreeRTOS is started). Such a design has the following consequences: diff --git a/docs/Doxyfile b/docs/Doxyfile old mode 100755 new mode 100644 index 9b7d602b9..b5ca4b7f8 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -15,51 +15,145 @@ PROJECT_NAME = "ESP32 Programming Guide" -INPUT = ../components/esp32/include/esp_wifi.h \ - ../components/driver/include/driver \ - ../components/bt/include \ - ../components/bt/bluedroid/api/include \ - ../components/nvs_flash/include \ - ../components/log/include \ - ../components/vfs/include \ - ../components/spi_flash/include \ - ../components/esp32/include/esp_int_wdt.h \ - ../components/esp32/include/esp_task_wdt.h \ - ../components/app_update/include/esp_ota_ops.h \ - ../components/ethernet/include/esp_eth.h \ - ../components/ulp/include/esp32/ulp.h \ - ../components/esp32/include/esp_intr_alloc.h \ - ../components/esp32/include/esp_heap_alloc_caps.h \ - ../components/freertos/include/freertos/heap_regions.h \ - ../components/esp32/include/esp_smartconfig.h \ - ../components/esp32/include/esp_deep_sleep.h \ - ../components/sdmmc/include/sdmmc_cmd.h \ - ../components/fatfs/src/esp_vfs_fat.h \ - ../components/fatfs/src/diskio.h \ - ../components/esp32/include/esp_core_dump.h \ - ../components/mdns/include/mdns.h \ - ../components/bootloader_support/include/esp_flash_encrypt.h \ - ../components/wear_levelling/include/wear_levelling.h +## 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_smartconfig.h \ + ## Bluetooth - API Reference + ## Controller && VHCI + ../components/bt/include/bt.h \ + ## Bluetooth COMMON + ## Issue with __attribute__ + ../components/bt/bluedroid/api/include/esp_bt_defs.h \ + ../components/bt/bluedroid/api/include/esp_bt_main.h \ + ../components/bt/bluedroid/api/include/esp_bt_device.h \ + ## Bluetooth LE + ../components/bt/bluedroid/api/include/esp_gap_ble_api.h \ + ## Issue with __attribute__ + ../components/bt/bluedroid/api/include/esp_gatt_defs.h \ + ../components/bt/bluedroid/api/include/esp_gatts_api.h \ + ../components/bt/bluedroid/api/include/esp_gattc_api.h \ + ../components/bt/bluedroid/api/include/esp_blufi_api.h \ + ## Bluetooth Classic + ../components/bt/bluedroid/api/include/esp_gap_bt_api.h \ + ## Issue with __attribute__ + ../components/bt/bluedroid/api/include/esp_a2dp_api.h \ + ../components/bt/bluedroid/api/include/esp_avrc_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/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/uart.h \ + ## + ## Protocols - API Reference + ## + ../components/mdns/include/mdns.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 \ + ## SD/MMC Card Host + ## NOTE: for three lines below header_file.inc is not used + ../components/sdmmc/include/sdmmc_cmd.h \ + ../components/driver/include/driver/sdmmc_host.h \ + ../components/driver/include/driver/sdmmc_types.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/esp32/include/esp_heap_alloc_caps.h \ + ../components/freertos/include/freertos/heap_regions.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 \ + ## Over The Air Updates (OTA) + ../components/app_update/include/esp_ota_ops.h \ + ## Deep Sleep + ## NOTE: for line below header_file.inc is not used + ../components/esp32/include/esp_deep_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 ## 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)= + ## Do not complain about not having dot ## HAVE_DOT = NO ## Generate XML that is required for Breathe ## -GENERATE_XML = YES -XML_OUTPUT = xml +GENERATE_XML = YES +XML_OUTPUT = xml -GENERATE_HTML = NO -HAVE_DOT = NO -GENERATE_LATEX = NO -GENERATE_MAN = YES -GENERATE_RTF = NO +GENERATE_HTML = NO +HAVE_DOT = NO +GENERATE_LATEX = NO +GENERATE_MAN = YES +GENERATE_RTF = NO ## Skip distracting progress messages ## @@ -67,3 +161,4 @@ QUIET = YES ## Log warnings in a file for further review ## WARN_LOGFILE = "doxygen-warning-log.txt" + diff --git a/docs/Makefile b/docs/Makefile index 8076416b7..cc32abbd5 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -15,7 +15,7 @@ endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +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) . @@ -170,14 +170,14 @@ gh-linkcheck: 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_blob:\`file\` - points to file 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_blob:\`file\` - points to file 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_blob:\`file\` - points to file 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"; \ diff --git a/docs/_static/about-doc.png b/docs/_static/about-doc.png index 4af663dbfab9871e1f7f7fb1754e1e3ed20b2cc6..f52f1658a90838ef83216a61d032b7c45138992a 100644 GIT binary patch literal 108678 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 z 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
?nMT$CT$W)i^XTjz_P}qC$LVq8u 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 Bluetooth Common Bluetooth LE - Bluetooth Classic BT + Bluetooth Classic Example code for this API section is provided in :example:`bluetooth` directory of ESP-IDF examples. diff --git a/docs/api-reference/ethernet/esp_eth.rst b/docs/api-reference/ethernet/esp_eth.rst index 223c7b226..4025ed231 100644 --- a/docs/api-reference/ethernet/esp_eth.rst +++ b/docs/api-reference/ethernet/esp_eth.rst @@ -6,69 +6,42 @@ Application Example Ethernet example: :example:`ethernet/ethernet`. -API Reference -------------- - -Header Files -^^^^^^^^^^^^ - - * :component_file:`ethernet/include/esp_eth.h` - * :component_file:`ethernet/include/phy/phy.h` - PHY Interfaces -^^^^^^^^^^^^^^ +-------------- The configured PHY model(s) are set in software by configuring the eth_config_t structure for the given PHY. Headers include a default configuration structure. These default configurations will need some members overriden or re-set before they can be used for a particular PHY hardware configuration. Consult the Ethernet example to see how this is done. - * :component_file:`ethernet/include/phy/phy_tlk110.h` - * :component_file:`ethernet/include/phy/phy_lan8720.h` - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: eth_phy_check_link_func -.. doxygentypedef:: eth_phy_check_init_func -.. doxygentypedef:: eth_phy_get_speed_mode_func -.. doxygentypedef:: eth_phy_get_duplex_mode_func -.. doxygentypedef:: eth_phy_func -.. doxygentypedef:: eth_tcpip_input_func -.. doxygentypedef:: eth_gpio_config_func -.. doxygentypedef:: eth_phy_get_partner_pause_enable_func - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: eth_mode_t -.. doxygenenum:: eth_speed_mode_t -.. doxygenenum:: eth_duplex_mode_t -.. doxygenenum:: eth_phy_base_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: eth_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_eth_init -.. doxygenfunction:: esp_eth_tx -.. doxygenfunction:: esp_eth_enable -.. doxygenfunction:: esp_eth_disable -.. doxygenfunction:: esp_eth_get_mac -.. doxygenfunction:: esp_eth_smi_write -.. doxygenfunction:: esp_eth_smi_read -.. doxygenfunction:: esp_eth_smi_wait_value -.. doxygenfunction:: esp_eth_smi_wait_set -.. doxygenfunction:: esp_eth_free_rx_buf - + * :component_file:`ethernet/include/eth_phy/phy.h` (common) + * :component_file:`ethernet/include/eth_phy/phy_tlk110.h` + * :component_file:`ethernet/include/eth_phy/phy_lan8720.h` PHY Configuration Constants ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. doxygenvariable:: phy_tlk110_default_ethernet_config .. doxygenvariable:: phy_lan8720_default_ethernet_config + + +API Reference - Ethernet +------------------------ + +.. include:: /_build/inc/esp_eth.inc + +API Reference - PHY Common +-------------------------- + +.. include:: /_build/inc/phy.inc + +API Reference - PHY TLK110 +-------------------------- + +.. include:: /_build/inc/phy_tlk110.inc + +API Reference - PHY LAN8720 +--------------------------- + +.. include:: /_build/inc/phy_lan8720.inc + + diff --git a/docs/api-reference/index.rst b/docs/api-reference/index.rst index 28bb8b250..104df9231 100644 --- a/docs/api-reference/index.rst +++ b/docs/api-reference/index.rst @@ -9,6 +9,7 @@ API Reference Bluetooth Ethernet Peripherals - System - Storage Protocols + Storage + System + diff --git a/docs/api-reference/peripherals/adc.rst b/docs/api-reference/peripherals/adc.rst index 8d598f327..122848f45 100644 --- a/docs/api-reference/peripherals/adc.rst +++ b/docs/api-reference/peripherals/adc.rst @@ -40,23 +40,6 @@ The value read in both these examples is 12 bits wide (range 0-4095). API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/adc.inc - * `components/driver/include/driver/adc.h` - -Enumerations -^^^^^^^^^^^^ - - .. doxygenenum:: adc1_channel_t - .. doxygenenum:: adc_atten_t - .. doxygenenum:: adc_bits_width_t - -Functions -^^^^^^^^^ - - .. doxygenfunction:: adc1_config_width - .. doxygenfunction:: adc1_config_channel_atten - .. doxygenfunction:: adc1_get_voltage - .. doxygenfunction:: hall_sensor_read diff --git a/docs/api-reference/peripherals/dac.rst b/docs/api-reference/peripherals/dac.rst index 905b9b21e..7d860f3bf 100644 --- a/docs/api-reference/peripherals/dac.rst +++ b/docs/api-reference/peripherals/dac.rst @@ -28,22 +28,5 @@ Setting DAC channel 1 (GPIO 25) voltage to approx 0.78 of VDD_A voltage (VDD * 2 API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/dac.inc - * `components/driver/include/driver/dac.h` - -Enumerations -^^^^^^^^^^^^ - - .. doxygenenum:: dac_channel_t - -Functions -^^^^^^^^^ - - .. doxygenfunction:: dac_output_voltage - .. doxygenfunction:: dac_output_enable - .. doxygenfunction:: dac_output_disable - .. doxygenfunction:: dac_i2s_enable - .. doxygenfunction:: dac_i2s_disable - \ No newline at end of file diff --git a/docs/api-reference/peripherals/gpio.rst b/docs/api-reference/peripherals/gpio.rst index 16d012084..9cb78f6f1 100644 --- a/docs/api-reference/peripherals/gpio.rst +++ b/docs/api-reference/peripherals/gpio.rst @@ -16,176 +16,13 @@ Application Example GPIO output and input interrupt example: :example:`peripherals/gpio`. -API Reference -------------- +API Reference - Normal GPIO +--------------------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/gpio.inc - * :component_file:`driver/include/driver/gpio.h` - * :component_file:`driver/include/driver/rtc_io.h` +API Reference - RTC GPIO +------------------------ -Macros -^^^^^^ +.. include:: /_build/inc/rtc_io.inc -Normal GPIO -~~~~~~~~~~~ - -.. doxygendefine:: GPIO_SEL_0 -.. doxygendefine:: GPIO_SEL_1 -.. doxygendefine:: GPIO_SEL_2 -.. doxygendefine:: GPIO_SEL_3 -.. doxygendefine:: GPIO_SEL_4 -.. doxygendefine:: GPIO_SEL_5 -.. doxygendefine:: GPIO_SEL_6 -.. doxygendefine:: GPIO_SEL_7 -.. doxygendefine:: GPIO_SEL_8 -.. doxygendefine:: GPIO_SEL_9 -.. doxygendefine:: GPIO_SEL_10 -.. doxygendefine:: GPIO_SEL_11 -.. doxygendefine:: GPIO_SEL_12 -.. doxygendefine:: GPIO_SEL_13 -.. doxygendefine:: GPIO_SEL_14 -.. doxygendefine:: GPIO_SEL_15 -.. doxygendefine:: GPIO_SEL_16 -.. doxygendefine:: GPIO_SEL_17 -.. doxygendefine:: GPIO_SEL_18 -.. doxygendefine:: GPIO_SEL_19 -.. doxygendefine:: GPIO_SEL_21 -.. doxygendefine:: GPIO_SEL_22 -.. doxygendefine:: GPIO_SEL_23 -.. doxygendefine:: GPIO_SEL_25 -.. doxygendefine:: GPIO_SEL_26 -.. doxygendefine:: GPIO_SEL_27 -.. doxygendefine:: GPIO_SEL_32 -.. doxygendefine:: GPIO_SEL_33 -.. doxygendefine:: GPIO_SEL_34 -.. doxygendefine:: GPIO_SEL_35 -.. doxygendefine:: GPIO_SEL_36 -.. doxygendefine:: GPIO_SEL_37 -.. doxygendefine:: GPIO_SEL_38 -.. doxygendefine:: GPIO_SEL_39 -.. doxygendefine:: GPIO_PIN_REG_0 -.. doxygendefine:: GPIO_PIN_REG_1 -.. doxygendefine:: GPIO_PIN_REG_2 -.. doxygendefine:: GPIO_PIN_REG_3 -.. doxygendefine:: GPIO_PIN_REG_4 -.. doxygendefine:: GPIO_PIN_REG_5 -.. doxygendefine:: GPIO_PIN_REG_6 -.. doxygendefine:: GPIO_PIN_REG_7 -.. doxygendefine:: GPIO_PIN_REG_8 -.. doxygendefine:: GPIO_PIN_REG_9 -.. doxygendefine:: GPIO_PIN_REG_10 -.. doxygendefine:: GPIO_PIN_REG_11 -.. doxygendefine:: GPIO_PIN_REG_12 -.. doxygendefine:: GPIO_PIN_REG_13 -.. doxygendefine:: GPIO_PIN_REG_14 -.. doxygendefine:: GPIO_PIN_REG_15 -.. doxygendefine:: GPIO_PIN_REG_16 -.. doxygendefine:: GPIO_PIN_REG_17 -.. doxygendefine:: GPIO_PIN_REG_18 -.. doxygendefine:: GPIO_PIN_REG_19 -.. doxygendefine:: GPIO_PIN_REG_20 -.. doxygendefine:: GPIO_PIN_REG_21 -.. doxygendefine:: GPIO_PIN_REG_22 -.. doxygendefine:: GPIO_PIN_REG_23 -.. doxygendefine:: GPIO_PIN_REG_25 -.. doxygendefine:: GPIO_PIN_REG_26 -.. doxygendefine:: GPIO_PIN_REG_27 -.. doxygendefine:: GPIO_PIN_REG_32 -.. doxygendefine:: GPIO_PIN_REG_33 -.. doxygendefine:: GPIO_PIN_REG_34 -.. doxygendefine:: GPIO_PIN_REG_35 -.. doxygendefine:: GPIO_PIN_REG_36 -.. doxygendefine:: GPIO_PIN_REG_37 -.. doxygendefine:: GPIO_PIN_REG_38 -.. doxygendefine:: GPIO_PIN_REG_39 -.. doxygendefine:: GPIO_APP_CPU_INTR_ENA -.. doxygendefine:: GPIO_APP_CPU_NMI_INTR_ENA -.. doxygendefine:: GPIO_PRO_CPU_INTR_ENA -.. doxygendefine:: GPIO_PRO_CPU_NMI_INTR_ENA -.. doxygendefine:: GPIO_SDIO_EXT_INTR_ENA -.. doxygendefine:: GPIO_MODE_DEF_INPUT -.. doxygendefine:: GPIO_MODE_DEF_OUTPUT -.. doxygendefine:: GPIO_MODE_DEF_OD -.. doxygendefine:: GPIO_PIN_COUNT -.. doxygendefine:: GPIO_IS_VALID_GPIO -.. doxygendefine:: GPIO_IS_VALID_OUTPUT_GPIO - -Type Definitions -^^^^^^^^^^^^^^^^ - -Normal GPIO -~~~~~~~~~~~ - -.. doxygentypedef:: gpio_isr_t -.. doxygentypedef:: gpio_isr_handle_t - -Enumerations -^^^^^^^^^^^^ - -Normal GPIO -~~~~~~~~~~~ - -.. doxygenenum:: gpio_num_t -.. doxygenenum:: gpio_int_type_t -.. doxygenenum:: gpio_mode_t -.. doxygenenum:: gpio_pullup_t -.. doxygenenum:: gpio_pulldown_t -.. doxygenenum:: gpio_pull_mode_t - -RTC GPIO -~~~~~~~~ - -.. doxygenenum:: rtc_gpio_mode_t - -Structures -^^^^^^^^^^ - -Normal GPIO -~~~~~~~~~~~ - -.. doxygenstruct:: gpio_config_t - :members: - -Functions -^^^^^^^^^ - -Normal GPIO -~~~~~~~~~~~ - -.. doxygenfunction:: gpio_config -.. doxygenfunction:: gpio_set_intr_type -.. doxygenfunction:: gpio_intr_enable -.. doxygenfunction:: gpio_intr_disable -.. doxygenfunction:: gpio_set_level -.. doxygenfunction:: gpio_get_level -.. doxygenfunction:: gpio_set_direction -.. doxygenfunction:: gpio_set_pull_mode -.. doxygenfunction:: gpio_wakeup_enable -.. doxygenfunction:: gpio_wakeup_disable -.. doxygenfunction:: gpio_isr_register -.. doxygenfunction:: gpio_pullup_en -.. doxygenfunction:: gpio_pullup_dis -.. doxygenfunction:: gpio_pulldown_en -.. doxygenfunction:: gpio_pulldown_dis -.. doxygenfunction:: gpio_install_isr_service -.. doxygenfunction:: gpio_uninstall_isr_service -.. doxygenfunction:: gpio_isr_handler_add -.. doxygenfunction:: gpio_isr_handler_remove - - -RTC GPIO -~~~~~~~~ - -.. doxygenfunction:: rtc_gpio_is_valid_gpio -.. doxygenfunction:: rtc_gpio_init -.. doxygenfunction:: rtc_gpio_deinit -.. doxygenfunction:: rtc_gpio_get_level -.. doxygenfunction:: rtc_gpio_set_level -.. doxygenfunction:: rtc_gpio_set_direction -.. doxygenfunction:: rtc_gpio_pullup_en -.. doxygenfunction:: rtc_gpio_pulldown_en -.. doxygenfunction:: rtc_gpio_pullup_dis -.. doxygenfunction:: rtc_gpio_pulldown_dis -.. doxygenfunction:: rtc_gpio_unhold_all diff --git a/docs/api-reference/peripherals/i2c.rst b/docs/api-reference/peripherals/i2c.rst index bd30a345d..130119fd3 100644 --- a/docs/api-reference/peripherals/i2c.rst +++ b/docs/api-reference/peripherals/i2c.rst @@ -1,5 +1,5 @@ I2C -=========== +=== Overview -------- @@ -14,69 +14,5 @@ I2C master and slave example: :example:`peripherals/i2c`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/i2c.h` - -Macros -^^^^^^ - -.. doxygendefine:: I2C_APB_CLK_FREQ -.. doxygendefine:: I2C_FIFO_LEN - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: i2c_cmd_handle_t - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: i2c_mode_t -.. doxygenenum:: i2c_rw_t -.. doxygenenum:: i2c_trans_mode_t -.. doxygenenum:: i2c_opmode_t -.. doxygenenum:: i2c_port_t -.. doxygenenum:: i2c_addr_mode_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: i2c_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: i2c_driver_install -.. doxygenfunction:: i2c_driver_delete -.. doxygenfunction:: i2c_param_config -.. doxygenfunction:: i2c_reset_tx_fifo -.. doxygenfunction:: i2c_reset_rx_fifo -.. doxygenfunction:: i2c_isr_register -.. doxygenfunction:: i2c_isr_free -.. doxygenfunction:: i2c_set_pin -.. doxygenfunction:: i2c_master_start -.. doxygenfunction:: i2c_master_write_byte -.. doxygenfunction:: i2c_master_write -.. doxygenfunction:: i2c_master_read_byte -.. doxygenfunction:: i2c_master_read -.. doxygenfunction:: i2c_master_stop -.. doxygenfunction:: i2c_master_cmd_begin -.. doxygenfunction:: i2c_slave_write_buffer -.. doxygenfunction:: i2c_slave_read -.. doxygenfunction:: i2c_set_period -.. doxygenfunction:: i2c_get_period -.. doxygenfunction:: i2c_set_start_timing -.. doxygenfunction:: i2c_get_start_timing -.. doxygenfunction:: i2c_set_stop_timing -.. doxygenfunction:: i2c_get_stop_timing -.. doxygenfunction:: i2c_set_data_timing -.. doxygenfunction:: i2c_get_data_timing -.. doxygenfunction:: i2c_set_data_mode -.. doxygenfunction:: i2c_get_data_mode -.. doxygenfunction:: i2c_cmd_link_create -.. doxygenfunction:: i2c_cmd_link_delete +.. include:: /_build/inc/i2c.inc diff --git a/docs/api-reference/peripherals/i2s.rst b/docs/api-reference/peripherals/i2s.rst index 3d05f129b..f3d372978 100644 --- a/docs/api-reference/peripherals/i2s.rst +++ b/docs/api-reference/peripherals/i2s.rst @@ -15,7 +15,11 @@ Application Example A full I2S example is available in esp-idf: :example:`peripherals/i2s`. -Short example of I2S configuration:: +Short example of I2S configuration: + +.. highlight:: c + +:: #include "driver/i2s.h" #include "freertos/queue.h" @@ -84,53 +88,5 @@ Short example configuring I2S to use internal DAC for analog output:: API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * `components/driver/include/driver/i2s.h` - -Data Structures -^^^^^^^^^^^^^^^ - - .. doxygenstruct:: i2s_config_t - :members: - .. doxygenstruct:: i2s_event_t - :members: - .. doxygenstruct:: i2s_pin_config_t - :members: - -Macros -^^^^^^ - - .. doxygendefine:: I2S_PIN_NO_CHANGE - -Enumerations -^^^^^^^^^^^^ - - .. doxygenenum:: i2s_bits_per_sample_t - .. doxygenenum:: i2s_comm_format_t - .. doxygenenum:: i2s_channel_fmt_t - .. doxygenenum:: pdm_sample_rate_ratio_t - .. doxygenenum:: pdm_pcm_conv_t - .. doxygenenum:: i2s_port_t - .. doxygenenum:: i2s_mode_t - .. doxygenenum:: i2s_event_type_t - .. doxygenenum:: i2s_dac_mode_t - -Functions -^^^^^^^^^ - - .. doxygenfunction:: i2s_set_pin - .. doxygenfunction:: i2s_set_dac_mode - .. doxygenfunction:: i2s_driver_install - .. doxygenfunction:: i2s_driver_uninstall - .. doxygenfunction:: i2s_write_bytes - .. doxygenfunction:: i2s_read_bytes - .. doxygenfunction:: i2s_push_sample - .. doxygenfunction:: i2s_pop_sample - .. doxygenfunction:: i2s_set_sample_rates - .. doxygenfunction:: i2s_start - .. doxygenfunction:: i2s_stop - .. doxygenfunction:: i2s_zero_dma_buffer - +.. include:: /_build/inc/i2s.inc diff --git a/docs/api-reference/peripherals/index.rst b/docs/api-reference/peripherals/index.rst index c0cb3008d..491d98033 100644 --- a/docs/api-reference/peripherals/index.rst +++ b/docs/api-reference/peripherals/index.rst @@ -10,12 +10,13 @@ Peripherals API I2C I2S LED Control + MCPWM Pulse Counter + Remote Control SD/MMC Card Host <../storage/sdmmc> Sigma-delta Modulation SPI Master SPI Slave - Remote Control Timer UART diff --git a/docs/api-reference/peripherals/ledc.rst b/docs/api-reference/peripherals/ledc.rst index a1a96543d..c30aa2dac 100644 --- a/docs/api-reference/peripherals/ledc.rst +++ b/docs/api-reference/peripherals/ledc.rst @@ -17,64 +17,5 @@ LEDC change duty cycle and fading control example: :example:`peripherals/ledc`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/ledc.h` - -Macros -^^^^^^ - -.. doxygendefine:: LEDC_APB_CLK_HZ -.. doxygendefine:: LEDC_REF_CLK_HZ - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: ledc_isr_handle_t - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: ledc_mode_t -.. doxygenenum:: ledc_intr_type_t -.. doxygenenum:: ledc_duty_direction_t -.. doxygenenum:: ledc_clk_src_t -.. doxygenenum:: ledc_timer_t -.. doxygenenum:: ledc_channel_t -.. doxygenenum:: ledc_timer_bit_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: ledc_channel_config_t - :members: - -.. doxygenstruct:: ledc_timer_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: ledc_channel_config -.. doxygenfunction:: ledc_timer_config -.. doxygenfunction:: ledc_update_duty -.. doxygenfunction:: ledc_stop -.. doxygenfunction:: ledc_set_freq -.. doxygenfunction:: ledc_get_freq -.. doxygenfunction:: ledc_set_duty -.. doxygenfunction:: ledc_get_duty -.. doxygenfunction:: ledc_set_fade -.. doxygenfunction:: ledc_isr_register -.. doxygenfunction:: ledc_timer_set -.. doxygenfunction:: ledc_timer_rst -.. doxygenfunction:: ledc_timer_pause -.. doxygenfunction:: ledc_timer_resume -.. doxygenfunction:: ledc_bind_channel_timer -.. doxygenfunction:: ledc_set_fade_with_step -.. doxygenfunction:: ledc_set_fade_with_time -.. doxygenfunction:: ledc_fade_func_install -.. doxygenfunction:: ledc_fade_func_uninstall -.. doxygenfunction:: ledc_fade_start +.. include:: /_build/inc/ledc.inc diff --git a/docs/api/peripherals/mcpwm.rst b/docs/api-reference/peripherals/mcpwm.rst similarity index 56% rename from docs/api/peripherals/mcpwm.rst rename to docs/api-reference/peripherals/mcpwm.rst index a6533e6a8..6e208436a 100644 --- a/docs/api/peripherals/mcpwm.rst +++ b/docs/api-reference/peripherals/mcpwm.rst @@ -50,84 +50,11 @@ The block diagram of MCPWM unit is as shown. Application Example ------------------- -MCPWM different motor example: :example:`peripherals/mcpwm`. +Examples of using MCPWM for motor control: :example:`peripherals/mcpwm`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/mcpwm.h` - -Type Definitions -^^^^^^^^^^^^^^^^ +.. include:: /_build/inc/mcpwm.inc -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: mcpwm_io_signals_t -.. doxygenenum:: mcpwm_unit_t -.. doxygenenum:: mcpwm_timer_t -.. doxygenenum:: mcpwm_operator_t -.. doxygenenum:: mcpwm_counter_type_t -.. doxygenenum:: mcpwm_duty_type_t -.. doxygenenum:: mcpwm_carrier_os_t -.. doxygenenum:: mcpwm_carrier_out_ivt_t -.. doxygenenum:: mcpwm_sync_signal_t -.. doxygenenum:: mcpwm_fault_signal_t -.. doxygenenum:: mcpwm_fault_input_level_t -.. doxygenenum:: mcpwm_action_on_pwmxa_t -.. doxygenenum:: mcpwm_action_on_pwmxb_t -.. doxygenenum:: mcpwm_capture_signal_t -.. doxygenenum:: mcpwm_capture_on_edge_t -.. doxygenenum:: mcpwm_deadtime_type_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: mcpwm_config_t - :members: - -.. doxygenstruct:: mcpwm_carrier_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: mcpwm_gpio_init -.. doxygenfunction:: mcpwm_init -.. doxygenfunction:: mcpwm_set_frequency -.. doxygenfunction:: mcpwm_set_duty -.. doxygenfunction:: mcpwm_set_duty_in_us -.. doxygenfunction:: mcpwm_set_duty_type -.. doxygenfunction:: mcpwm_get_frequency -.. doxygenfunction:: mcpwm_get_duty -.. doxygenfunction:: mcpwm_set_signal_high -.. doxygenfunction:: mcpwm_set_signal_low -.. doxygenfunction:: mcpwm_start -.. doxygenfunction:: mcpwm_stop -.. doxygenfunction:: mcpwm_carrier_init -.. doxygenfunction:: mcpwm_carrier_enable -.. doxygenfunction:: mcpwm_carrier_disable -.. doxygenfunction:: mcpwm_carrier_set_period -.. doxygenfunction:: mcpwm_carrier_set_duty_cycle -.. doxygenfunction:: mcpwm_carrier_oneshot_mode_enable -.. doxygenfunction:: mcpwm_carrier_oneshot_mode_disable -.. doxygenfunction:: mcpwm_carrier_output_invert -.. doxygenfunction:: mcpwm_deadtime_enable -.. doxygenfunction:: mcpwm_deadtime_disable -.. doxygenfunction:: mcpwm_fault_init -.. doxygenfunction:: mcpwm_fault_set_oneshot_mode -.. doxygenfunction:: mcpwm_fault_set_cyc_mode -.. doxygenfunction:: mcpwm_fault_deinit -.. doxygenfunction:: mcpwm_capture_enable -.. doxygenfunction:: mcpwm_capture_disable -.. doxygenfunction:: mcpwm_capture_signal_get_value -.. doxygenfunction:: mcpwm_capture_signal_get_edge -.. doxygenfunction:: mcpwm_sync_enable -.. doxygenfunction:: mcpwm_sync_disable -.. doxygenfunction:: mcpwm_isr_register - diff --git a/docs/api-reference/peripherals/pcnt.rst b/docs/api-reference/peripherals/pcnt.rst index 63e6ad644..23123bd85 100644 --- a/docs/api-reference/peripherals/pcnt.rst +++ b/docs/api-reference/peripherals/pcnt.rst @@ -14,53 +14,5 @@ Pulse counter with control signal and event interrupt example: :example:`periphe API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/pcnt.h` - - -Macros -^^^^^^ - - -Type Definitions -^^^^^^^^^^^^^^^^ - - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: pcnt_ctrl_mode_t -.. doxygenenum:: pcnt_count_mode_t -.. doxygenenum:: pcnt_unit_t -.. doxygenenum:: pcnt_channel_t -.. doxygenenum:: pcnt_evt_type_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: pcnt_config_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: pcnt_unit_config -.. doxygenfunction:: pcnt_get_counter_value -.. doxygenfunction:: pcnt_counter_pause -.. doxygenfunction:: pcnt_counter_resume -.. doxygenfunction:: pcnt_counter_clear -.. doxygenfunction:: pcnt_intr_enable -.. doxygenfunction:: pcnt_intr_disable -.. doxygenfunction:: pcnt_event_enable -.. doxygenfunction:: pcnt_event_disable -.. doxygenfunction:: pcnt_set_event_value -.. doxygenfunction:: pcnt_get_event_value -.. doxygenfunction:: pcnt_isr_register -.. doxygenfunction:: pcnt_set_pin -.. doxygenfunction:: pcnt_filter_enable -.. doxygenfunction:: pcnt_filter_disable -.. doxygenfunction:: pcnt_set_filter_value -.. doxygenfunction:: pcnt_get_filter_value -.. doxygenfunction:: pcnt_set_mode +.. include:: /_build/inc/pcnt.inc diff --git a/docs/api-reference/peripherals/rmt.rst b/docs/api-reference/peripherals/rmt.rst index 276ed939e..5097a5f0e 100644 --- a/docs/api-reference/peripherals/rmt.rst +++ b/docs/api-reference/peripherals/rmt.rst @@ -14,80 +14,5 @@ NEC remote control TX and RX example: :example:`peripherals/rmt_nec_tx_rx`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/rmt.h` - -Macros -^^^^^^ - -.. doxygendefine:: RMT_MEM_BLOCK_BYTE_NUM -.. doxygendefine:: RMT_MEM_ITEM_NUM - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: rmt_channel_t -.. doxygenenum:: rmt_mem_owner_t -.. doxygenenum:: rmt_source_clk_t -.. doxygenenum:: rmt_data_mode_t -.. doxygenenum:: rmt_mode_t -.. doxygenenum:: rmt_idle_level_t -.. doxygenenum:: rmt_carrier_level_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: rmt_tx_config_t - :members: - -.. doxygenstruct:: rmt_rx_config_t - :members: - -.. doxygenstruct:: rmt_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: rmt_set_clk_div -.. doxygenfunction:: rmt_get_clk_div -.. doxygenfunction:: rmt_set_rx_idle_thresh -.. doxygenfunction:: rmt_get_rx_idle_thresh -.. doxygenfunction:: rmt_set_mem_block_num -.. doxygenfunction:: rmt_get_mem_block_num -.. doxygenfunction:: rmt_set_tx_carrier -.. doxygenfunction:: rmt_set_mem_pd -.. doxygenfunction:: rmt_get_mem_pd -.. doxygenfunction:: rmt_tx_start -.. doxygenfunction:: rmt_tx_stop -.. doxygenfunction:: rmt_rx_start -.. doxygenfunction:: rmt_rx_stop -.. doxygenfunction:: rmt_memory_rw_rst -.. doxygenfunction:: rmt_set_memory_owner -.. doxygenfunction:: rmt_get_memory_owner -.. doxygenfunction:: rmt_set_tx_loop_mode -.. doxygenfunction:: rmt_get_tx_loop_mode -.. doxygenfunction:: rmt_set_rx_filter -.. doxygenfunction:: rmt_set_source_clk -.. doxygenfunction:: rmt_get_source_clk -.. doxygenfunction:: rmt_set_idle_level -.. doxygenfunction:: rmt_get_status -.. doxygenfunction:: rmt_set_intr_enable_mask -.. doxygenfunction:: rmt_clr_intr_enable_mask -.. doxygenfunction:: rmt_set_rx_intr_en -.. doxygenfunction:: rmt_set_err_intr_en -.. doxygenfunction:: rmt_set_tx_intr_en -.. doxygenfunction:: rmt_set_evt_intr_en -.. doxygenfunction:: rmt_set_pin -.. doxygenfunction:: rmt_config -.. doxygenfunction:: rmt_isr_register -.. doxygenfunction:: rmt_fill_tx_items -.. doxygenfunction:: rmt_driver_install -.. doxygenfunction:: rmt_driver_uninstall -.. doxygenfunction:: rmt_write_items -.. doxygenfunction:: rmt_wait_tx_done -.. doxygenfunction:: rmt_get_ringbuf_handler +.. include:: /_build/inc/rmt.inc diff --git a/docs/api-reference/peripherals/sigmadelta.rst b/docs/api-reference/peripherals/sigmadelta.rst index d2e423deb..a70decea6 100644 --- a/docs/api-reference/peripherals/sigmadelta.rst +++ b/docs/api-reference/peripherals/sigmadelta.rst @@ -15,37 +15,5 @@ Sigma-delta Modulation example: :example:`peripherals/sigmadelta`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/sigmadelta.h` - - -Macros -^^^^^^ - - -Type Definitions -^^^^^^^^^^^^^^^^ - - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: sigmadelta_channel_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: sigmadelta_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: sigmadelta_config -.. doxygenfunction:: sigmadelta_set_duty -.. doxygenfunction:: sigmadelta_set_prescale -.. doxygenfunction:: sigmadelta_set_pin +.. include:: /_build/inc/sigmadelta.inc diff --git a/docs/api-reference/peripherals/spi_master.rst b/docs/api-reference/peripherals/spi_master.rst index 31fca3996..bc7a0b4e7 100644 --- a/docs/api-reference/peripherals/spi_master.rst +++ b/docs/api-reference/peripherals/spi_master.rst @@ -109,63 +109,15 @@ Application Example Display graphics on the ILI9341-based 320x240 LCD: :example:`peripherals/spi_master`. -API Reference -------------- -Header Files -^^^^^^^^^^^^ +API Reference - SPI Common +-------------------------- - * :component_file:`driver/include/driver/spi_master.h` - -Macros -^^^^^^ - -.. doxygendefine:: SPI_DEVICE_TXBIT_LSBFIRST -.. doxygendefine:: SPI_DEVICE_RXBIT_LSBFIRST -.. doxygendefine:: SPI_DEVICE_BIT_LSBFIRST -.. doxygendefine:: SPI_DEVICE_3WIRE -.. doxygendefine:: SPI_DEVICE_POSITIVE_CS -.. doxygendefine:: SPI_DEVICE_HALFDUPLEX -.. doxygendefine:: SPI_DEVICE_CLK_AS_CS - -.. doxygendefine:: SPI_TRANS_MODE_DIO -.. doxygendefine:: SPI_TRANS_MODE_QIO -.. doxygendefine:: SPI_TRANS_MODE_DIOQIO_ADDR -.. doxygendefine:: SPI_TRANS_USE_RXDATA -.. doxygendefine:: SPI_TRANS_USE_TXDATA - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: spi_device_handle_t - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: spi_host_device_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: spi_transaction_t - :members: - -.. doxygenstruct:: spi_bus_config_t - :members: - -.. doxygenstruct:: spi_device_interface_config_t - :members: +.. include:: /_build/inc/spi_common.inc +API Reference - SPI Master +-------------------------- -Functions ---------- - -.. doxygenfunction:: spi_bus_initialize -.. doxygenfunction:: spi_bus_free -.. doxygenfunction:: spi_bus_add_device -.. doxygenfunction:: spi_bus_remove_device -.. doxygenfunction:: spi_device_queue_trans -.. doxygenfunction:: spi_device_get_trans_result -.. doxygenfunction:: spi_device_transmit +.. include:: /_build/inc/spi_master.inc diff --git a/docs/api-reference/peripherals/spi_slave.rst b/docs/api-reference/peripherals/spi_slave.rst index fc0e212cd..76f44c494 100644 --- a/docs/api-reference/peripherals/spi_slave.rst +++ b/docs/api-reference/peripherals/spi_slave.rst @@ -92,51 +92,5 @@ Slave/master communication: :example:`peripherals/spi_slave`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/spi_slave.h` - -Macros -^^^^^^ - -.. doxygendefine:: SPI_SLAVE_TXBIT_LSBFIRST -.. doxygendefine:: SPI_SLAVE_RXBIT_LSBFIRST -.. doxygendefine:: SPI_SLAVE_BIT_LSBFIRST -.. doxygendefine:: SPI_SLAVE_POSITIVE_CS - - - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: spi_host_device_t - -Type Definitions -^^^^^^^^^^^^^^^^ - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: spi_slave_transaction_t - :members: - -.. doxygenstruct:: spi_slave_interface_config_t - :members: - -.. doxygenstruct:: spi_bus_config_t - :members: - -Be advised that the slave driver does not use the quadwp/quadhd lines and fields in ``spi_bus_config_t`` refering to these lines -will be ignored and can thus safely be left uninitialized. - - -Functions ---------- - -.. doxygenfunction:: spi_slave_initialize -.. doxygenfunction:: spi_slave_free -.. doxygenfunction:: spi_slave_queue_trans -.. doxygenfunction:: spi_slave_get_trans_result -.. doxygenfunction:: spi_slave_transmit +.. include:: /_build/inc/spi_slave.inc diff --git a/docs/api-reference/peripherals/timer.rst b/docs/api-reference/peripherals/timer.rst index 7b5253fde..5c833ebc0 100644 --- a/docs/api-reference/peripherals/timer.rst +++ b/docs/api-reference/peripherals/timer.rst @@ -8,7 +8,6 @@ ESP32 chip contains two hardware timer groups, each containing two general-purpo They are all 64-bit generic timers based on 16-bit prescalers and 64-bit auto-reload-capable up/down counters. - Application Example ------------------- @@ -17,57 +16,5 @@ Application Example API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`driver/include/driver/timer.h` - -Macros -^^^^^^ - -.. doxygendefine:: TIMER_BASE_CLK - -Type Definitions -^^^^^^^^^^^^^^^^ - - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: timer_group_t -.. doxygenenum:: timer_idx_t -.. doxygenenum:: timer_count_dir_t -.. doxygenenum:: timer_start_t -.. doxygenenum:: timer_alarm_t -.. doxygenenum:: timer_intr_mode_t -.. doxygenenum:: timer_autoreload_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: timer_config_t - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: timer_get_counter_value -.. doxygenfunction:: timer_get_counter_time_sec -.. doxygenfunction:: timer_set_counter_value -.. doxygenfunction:: timer_start -.. doxygenfunction:: timer_pause -.. doxygenfunction:: timer_set_counter_mode -.. doxygenfunction:: timer_set_auto_reload -.. doxygenfunction:: timer_set_divider -.. doxygenfunction:: timer_set_alarm_value -.. doxygenfunction:: timer_get_alarm_value -.. doxygenfunction:: timer_set_alarm -.. doxygenfunction:: timer_isr_register -.. doxygenfunction:: timer_init -.. doxygenfunction:: timer_get_config -.. doxygenfunction:: timer_group_intr_enable -.. doxygenfunction:: timer_group_intr_disable -.. doxygenfunction:: timer_enable_intr -.. doxygenfunction:: timer_disable_intr +.. include:: /_build/inc/timer.inc diff --git a/docs/api-reference/peripherals/uart.rst b/docs/api-reference/peripherals/uart.rst index 1392361d9..921b5eb63 100644 --- a/docs/api-reference/peripherals/uart.rst +++ b/docs/api-reference/peripherals/uart.rst @@ -16,83 +16,6 @@ Configure uart settings and install uart driver to read/write using UART0 and UA API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/uart.inc - * :component_file:`driver/include/driver/uart.h` - -Data Structures -^^^^^^^^^^^^^^^ - -.. doxygenstruct:: uart_config_t - :members: - -.. doxygenstruct:: uart_intr_config_t - :members: - -.. doxygenstruct:: uart_event_t - :members: - -Macros -^^^^^^ - -.. doxygendefine:: UART_FIFO_LEN -.. doxygendefine:: UART_INTR_MASK -.. doxygendefine:: UART_LINE_INV_MASK -.. doxygendefine:: UART_BITRATE_MAX -.. doxygendefine:: UART_PIN_NO_CHANGE -.. doxygendefine:: UART_INVERSE_DISABLE -.. doxygendefine:: UART_INVERSE_RXD -.. doxygendefine:: UART_INVERSE_CTS -.. doxygendefine:: UART_INVERSE_TXD -.. doxygendefine:: UART_INVERSE_RTS - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: uart_word_length_t -.. doxygenenum:: uart_stop_bits_t -.. doxygenenum:: uart_port_t -.. doxygenenum:: uart_parity_t -.. doxygenenum:: uart_hw_flowcontrol_t -.. doxygenenum:: uart_event_type_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: uart_set_word_length -.. doxygenfunction:: uart_get_word_length -.. doxygenfunction:: uart_set_stop_bits -.. doxygenfunction:: uart_get_stop_bits -.. doxygenfunction:: uart_set_parity -.. doxygenfunction:: uart_get_parity -.. doxygenfunction:: uart_set_baudrate -.. doxygenfunction:: uart_get_baudrate -.. doxygenfunction:: uart_set_line_inverse -.. doxygenfunction:: uart_set_hw_flow_ctrl -.. doxygenfunction:: uart_get_hw_flow_ctrl -.. doxygenfunction:: uart_clear_intr_status -.. doxygenfunction:: uart_enable_intr_mask -.. doxygenfunction:: uart_disable_intr_mask -.. doxygenfunction:: uart_enable_rx_intr -.. doxygenfunction:: uart_disable_rx_intr -.. doxygenfunction:: uart_disable_tx_intr -.. doxygenfunction:: uart_enable_tx_intr -.. doxygenfunction:: uart_isr_register -.. doxygenfunction:: uart_set_pin -.. doxygenfunction:: uart_set_rts -.. doxygenfunction:: uart_set_dtr -.. doxygenfunction:: uart_param_config -.. doxygenfunction:: uart_intr_config -.. doxygenfunction:: uart_driver_install -.. doxygenfunction:: uart_driver_delete -.. doxygenfunction:: uart_wait_tx_done -.. doxygenfunction:: uart_tx_chars -.. doxygenfunction:: uart_write_bytes -.. doxygenfunction:: uart_write_bytes_with_break -.. doxygenfunction:: uart_read_bytes -.. doxygenfunction:: uart_flush -.. doxygenfunction:: uart_get_buffered_data_len -.. doxygenfunction:: uart_disable_pattern_det_intr -.. doxygenfunction:: uart_enable_pattern_det_intr diff --git a/docs/api-reference/protocols/mdns.rst b/docs/api-reference/protocols/mdns.rst index 1355642de..751fb0776 100644 --- a/docs/api-reference/protocols/mdns.rst +++ b/docs/api-reference/protocols/mdns.rst @@ -16,7 +16,9 @@ mDNS Properties Example method to start mDNS for the STA interface and set ``hostname`` and ``default_instance``: - :: +.. highlight:: c + +:: mdns_server_t * mdns = NULL; @@ -46,9 +48,7 @@ mDNS can advertise information about network services that your device offers. E * ``instance``: friendly name for your service, like ``Jhon's ESP32 Web Server``. If not defined, ``default_instance`` will be used. * ``txt``: ``var=val`` array of strings, used to define properties for your service -Example method to add a few services and different properties: - - :: +Example method to add a few services and different properties:: void add_mdns_services() { @@ -78,13 +78,10 @@ mDNS Query ^^^^^^^^^^ mDNS provides methods for browsing for services and resolving host's IP/IPv6 addresses. - Results are returned as a linked list of ``mdns_result_t`` objects. If the result is from host query, - it will contain only ``addr`` and ``addrv6`` if found. Service queries will populate all fields - in a result that were found. -Example method to resolve host IPs: +Results are returned as a linked list of ``mdns_result_t`` objects. If the result is from host query, it will contain only ``addr`` and ``addrv6`` if found. Service queries will populate all fields in a result that were found. - :: +Example method to resolve host IPs:: void resolve_mdns_host(const char * hostname) { @@ -110,9 +107,7 @@ Example method to resolve host IPs: } } -Example method to resolve local services: - - :: +Example method to resolve local services:: void find_mdns_service(const char * service, const char * proto) { @@ -140,9 +135,7 @@ Example method to resolve local services: } } -Example of using the methods above: - - :: +Example of using the methods above:: void my_app_some_method(){ //search for esp32-mdns.local @@ -168,48 +161,6 @@ mDNS server/scanner example: :example:`protocols/mdns`. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`mdns/include/mdns.h` - -Macros -^^^^^^ +.. include:: /_build/inc/mdns.inc -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: mdns_server_t -.. doxygentypedef:: mdns_result_t - -Enumerations -^^^^^^^^^^^^ - - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: mdns_result_s - :members: - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: mdns_init -.. doxygenfunction:: mdns_free -.. doxygenfunction:: mdns_set_hostname -.. doxygenfunction:: mdns_set_instance -.. doxygenfunction:: mdns_service_add -.. doxygenfunction:: mdns_service_remove -.. doxygenfunction:: mdns_service_instance_set -.. doxygenfunction:: mdns_service_txt_set -.. doxygenfunction:: mdns_service_port_set -.. doxygenfunction:: mdns_service_remove_all -.. doxygenfunction:: mdns_query -.. doxygenfunction:: mdns_query_end -.. doxygenfunction:: mdns_result_get_count -.. doxygenfunction:: mdns_result_get -.. doxygenfunction:: mdns_result_free - diff --git a/docs/api-reference/storage/fatfs.rst b/docs/api-reference/storage/fatfs.rst index b6735b7c0..9ea2c0685 100644 --- a/docs/api-reference/storage/fatfs.rst +++ b/docs/api-reference/storage/fatfs.rst @@ -42,10 +42,8 @@ Using FatFs with VFS and SD cards ``esp_vfs_fat.h`` header file also provides a convenience function to perform steps 1–3 and 7–9, and also handle SD card initialization: ``esp_vfs_fat_sdmmc_mount``. This function does only limited error handling. Developers are encouraged to look at its source code and incorporate more advanced versions into production applications. ``esp_vfs_fat_sdmmc_unmount`` function unmounts the filesystem and releases resources acquired by ``esp_vfs_fat_sdmmc_mount``. .. doxygenfunction:: esp_vfs_fat_sdmmc_mount - .. doxygenstruct:: esp_vfs_fat_mount_config_t :members: - .. doxygenfunction:: esp_vfs_fat_sdmmc_unmount FatFS disk IO layer @@ -56,9 +54,7 @@ FatFs has been extended with an API to register disk IO driver at runtime. Implementation of disk IO functions for SD/MMC cards is provided. It can be registered for the given FatFs drive number using ``ff_diskio_register_sdmmc`` function. .. doxygenfunction:: ff_diskio_register - .. doxygenstruct:: ff_diskio_impl_t :members: - .. doxygenfunction:: ff_diskio_register_sdmmc diff --git a/docs/api-reference/storage/index.rst b/docs/api-reference/storage/index.rst index a1d3f553d..9c4394bd5 100644 --- a/docs/api-reference/storage/index.rst +++ b/docs/api-reference/storage/index.rst @@ -5,7 +5,7 @@ Storage API :maxdepth: 1 SPI Flash and Partition APIs - SD/MMC + SD/MMC Card Host Non-Volatile Storage Virtual Filesystem FAT Filesystem diff --git a/docs/api-reference/storage/nvs_flash.rst b/docs/api-reference/storage/nvs_flash.rst index b6cf6f221..005b9b04f 100644 --- a/docs/api-reference/storage/nvs_flash.rst +++ b/docs/api-reference/storage/nvs_flash.rst @@ -26,67 +26,8 @@ Two examples are provided in :example:`storage` directory of ESP-IDF examples: API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/nvs_flash.inc - * :component_file:`nvs_flash/include/nvs_flash.h` - * :component_file:`nvs_flash/include/nvs.h` - -Macros -^^^^^^ - -.. doxygendefine:: ESP_ERR_NVS_BASE -.. doxygendefine:: ESP_ERR_NVS_NOT_INITIALIZED -.. doxygendefine:: ESP_ERR_NVS_NOT_FOUND -.. doxygendefine:: ESP_ERR_NVS_TYPE_MISMATCH -.. doxygendefine:: ESP_ERR_NVS_READ_ONLY -.. doxygendefine:: ESP_ERR_NVS_NOT_ENOUGH_SPACE -.. doxygendefine:: ESP_ERR_NVS_INVALID_NAME -.. doxygendefine:: ESP_ERR_NVS_INVALID_HANDLE -.. doxygendefine:: ESP_ERR_NVS_REMOVE_FAILED -.. doxygendefine:: ESP_ERR_NVS_KEY_TOO_LONG -.. doxygendefine:: ESP_ERR_NVS_PAGE_FULL -.. doxygendefine:: ESP_ERR_NVS_INVALID_STATE -.. doxygendefine:: ESP_ERR_NVS_INVALID_LENGTH -.. doxygendefine:: ESP_ERR_NVS_NO_FREE_PAGES - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: nvs_handle - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: nvs_open_mode - -Functions -^^^^^^^^^ -.. doxygenfunction:: nvs_flash_init -.. doxygenfunction:: nvs_open -.. doxygenfunction:: nvs_set_i8 -.. doxygenfunction:: nvs_set_u8 -.. doxygenfunction:: nvs_set_i16 -.. doxygenfunction:: nvs_set_u16 -.. doxygenfunction:: nvs_set_i32 -.. doxygenfunction:: nvs_set_u32 -.. doxygenfunction:: nvs_set_i64 -.. doxygenfunction:: nvs_set_u64 -.. doxygenfunction:: nvs_set_str -.. doxygenfunction:: nvs_set_blob -.. doxygenfunction:: nvs_get_i8 -.. doxygenfunction:: nvs_get_u8 -.. doxygenfunction:: nvs_get_i16 -.. doxygenfunction:: nvs_get_u16 -.. doxygenfunction:: nvs_get_i32 -.. doxygenfunction:: nvs_get_u32 -.. doxygenfunction:: nvs_get_i64 -.. doxygenfunction:: nvs_get_u64 -.. doxygenfunction:: nvs_get_str -.. doxygenfunction:: nvs_get_blob -.. doxygenfunction:: nvs_erase_key -.. doxygenfunction:: nvs_erase_all -.. doxygenfunction:: nvs_commit -.. doxygenfunction:: nvs_close +.. include:: /_build/inc/nvs.inc diff --git a/docs/api-reference/storage/spi_flash.rst b/docs/api-reference/storage/spi_flash.rst index c43af4d8c..e95d93883 100644 --- a/docs/api-reference/storage/spi_flash.rst +++ b/docs/api-reference/storage/spi_flash.rst @@ -7,72 +7,6 @@ See also - :doc:`Over The Air Update (OTA) API <../system/ota>` provides high-level API for updating app firmware stored in flash. - :doc:`Non-Volatile Storage (NVS) API ` provides a structured API for storing small items of data in SPI flash. -API Reference -------------- - -Header Files -^^^^^^^^^^^^ - - * :component_file:`spi_flash/include/esp_spi_flash.h` - * :component_file:`spi_flash/include/esp_partition.h` - * :component_file:`bootloader_support/include/esp_flash_encrypt.h` - -Macros -^^^^^^ - -.. doxygendefine:: ESP_ERR_FLASH_BASE -.. doxygendefine:: ESP_ERR_FLASH_OP_FAIL -.. doxygendefine:: ESP_ERR_FLASH_OP_TIMEOUT -.. doxygendefine:: SPI_FLASH_SEC_SIZE -.. doxygendefine:: SPI_FLASH_MMU_PAGE_SIZE -.. doxygendefine:: ESP_PARTITION_SUBTYPE_OTA -.. doxygendefine:: SPI_FLASH_CACHE2PHYS_FAIL - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: spi_flash_mmap_handle_t -.. doxygentypedef:: esp_partition_iterator_t - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: spi_flash_mmap_memory_t -.. doxygenenum:: esp_partition_type_t -.. doxygenenum:: esp_partition_subtype_t - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: esp_partition_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: spi_flash_init -.. doxygenfunction:: spi_flash_get_chip_size -.. doxygenfunction:: spi_flash_erase_sector -.. doxygenfunction:: spi_flash_erase_range -.. doxygenfunction:: spi_flash_write -.. doxygenfunction:: spi_flash_write_encrypted -.. doxygenfunction:: spi_flash_read -.. doxygenfunction:: spi_flash_read_encrypted -.. doxygenfunction:: spi_flash_mmap -.. doxygenfunction:: spi_flash_munmap -.. doxygenfunction:: spi_flash_mmap_dump -.. doxygenfunction:: spi_flash_cache2phys -.. doxygenfunction:: spi_flash_phys2cache -.. doxygenfunction:: spi_flash_cache_enabled -.. doxygenfunction:: esp_partition_find -.. doxygenfunction:: esp_partition_find_first -.. doxygenfunction:: esp_partition_get -.. doxygenfunction:: esp_partition_next -.. doxygenfunction:: esp_partition_iterator_release -.. doxygenfunction:: esp_partition_read -.. doxygenfunction:: esp_partition_write -.. doxygenfunction:: esp_partition_erase_range -.. doxygenfunction:: esp_partition_mmap -.. doxygenfunction:: esp_flash_encryption_enabled .. _spi-flash-implementation-details: @@ -108,3 +42,20 @@ Additionally, all API functions are protected with a mutex (s_flash_op_mutex). In a single core environment (CONFIG_FREERTOS_UNICORE enabled), we simply disable both caches, no inter-CPU communication takes place. + +API Reference - SPI Flash +------------------------- + +.. include:: /_build/inc/esp_spi_flash.inc + +API Reference - Partition Table +------------------------------- + +.. include:: /_build/inc/esp_partition.inc + +API Reference - Flash Encrypt +----------------------------- + +.. include:: /_build/inc/esp_flash_encrypt.inc + + diff --git a/docs/api-reference/storage/vfs.rst b/docs/api-reference/storage/vfs.rst index 0035229d8..c59177cde 100644 --- a/docs/api-reference/storage/vfs.rst +++ b/docs/api-reference/storage/vfs.rst @@ -10,38 +10,7 @@ Application Example API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/esp_vfs.inc - * :component_file:`vfs/include/esp_vfs.h` - * :component_file:`vfs/include/esp_vfs_dev.h` +.. include:: /_build/inc/esp_vfs_dev.inc -Macros -^^^^^^ - -.. doxygendefine:: ESP_VFS_PATH_MAX -.. doxygendefine:: ESP_VFS_FLAG_DEFAULT -.. doxygendefine:: ESP_VFS_FLAG_CONTEXT_PTR - -Structures -^^^^^^^^^^ - -.. doxygenstruct:: esp_vfs_t - :members: - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_vfs_register -.. doxygenfunction:: esp_vfs_unregister -.. doxygenfunction:: esp_vfs_write -.. doxygenfunction:: esp_vfs_lseek -.. doxygenfunction:: esp_vfs_read -.. doxygenfunction:: esp_vfs_open -.. doxygenfunction:: esp_vfs_close -.. doxygenfunction:: esp_vfs_fstat -.. doxygenfunction:: esp_vfs_stat -.. doxygenfunction:: esp_vfs_link -.. doxygenfunction:: esp_vfs_unlink -.. doxygenfunction:: esp_vfs_rename -.. doxygenfunction:: esp_vfs_dev_uart_register diff --git a/docs/api-reference/storage/wear-levelling.rst b/docs/api-reference/storage/wear-levelling.rst index 0766087df..63dc44058 100644 --- a/docs/api-reference/storage/wear-levelling.rst +++ b/docs/api-reference/storage/wear-levelling.rst @@ -6,12 +6,10 @@ See also - :doc:`FAT Filesystem <../../api-guides/partition-tables>` - :doc:`Partition Table documentation <../../api-guides/partition-tables>` - Application Example ------------------- -An example which combines wear levelling driver with FATFS library is provided in ``examples/storage/wear_levelling`` directory. This example initializes the -wear levelling driver, mounts FATFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information. +An example which combines wear levelling driver with FATFS library is provided in ``examples/storage/wear_levelling`` directory. This example initializes the wear levelling driver, mounts FATFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information. High level API Reference ------------------------ @@ -19,7 +17,7 @@ High level API Reference Header Files ^^^^^^^^^^^^ - * :component_file:`fatfs/src/esp_vfs_fat.h` +* :component_file:`fatfs/src/esp_vfs_fat.h` Functions ^^^^^^^^^ @@ -32,19 +30,5 @@ Functions Mid level API Reference ----------------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`wear_levelling/include/wear_levelling.h` - -Functions -^^^^^^^^^ - -.. doxygenfunction:: wl_mount -.. doxygenfunction:: wl_unmount -.. doxygenfunction:: wl_erase_range -.. doxygenfunction:: wl_write -.. doxygenfunction:: wl_read -.. doxygenfunction:: wl_size -.. doxygenfunction:: wl_sector_size +.. include:: /_build/inc/wear_levelling.inc diff --git a/docs/api-reference/system/base_mac_address.rst b/docs/api-reference/system/base_mac_address.rst index 37cf2bcbb..abb4781d8 100644 --- a/docs/api-reference/system/base_mac_address.rst +++ b/docs/api-reference/system/base_mac_address.rst @@ -4,7 +4,7 @@ Base MAC address Overview -------- -Serveral universally administered(by IEEE) MAC addresses are uniquely assigned to the networking interfaces(WiFi/BT/Ethernet). +Serveral MAC addresses (universally administered by IEEE) are uniquely assigned to the networking interfaces (WiFi/BT/Ethernet). The final octet of each universally administered MAC address increases by one. Only the first one which is called base MAC address of them is stored in EFUSE or external storage, the others are generated from it. Here, 'generate' means adding 0, 1, 2 and 3 (respectively) to the final octet of the base MAC address. @@ -12,7 +12,7 @@ of them is stored in EFUSE or external storage, the others are generated from it If the universally administered MAC addresses are not enough for all of the networking interfaces. Local administered MAC addresses which are derived from universally administered MAC addresses are assigned to the reset of networking interfaces. -A `definition of local vs universal MAC address can be found on Wikipedia`. +A `definition of local vs universal MAC address can be found on Wikipedia `_. The number of universally administered MAC address can be configured using ``make menuconfig``. @@ -21,30 +21,35 @@ Base MAC address If using the default base MAC address factory programmed by Espressif in BLK0 of EFUSE, nothing needs to be done. -If using a custom base MAC address stored in BLK3 of EFUSE, call API esp_efuse_mac_get_custom() to get the base MAC address -which is stored in BLK3 of EFUSE. If correct MAC address is returned, then call esp_base_mac_addr_set() to set the base MAC +If using a custom base MAC address stored in BLK3 of EFUSE, call API ``esp_efuse_mac_get_custom()`` to get the base MAC address +which is stored in BLK3 of EFUSE. If correct MAC address is returned, then call ``esp_base_mac_addr_set()`` to set the base MAC address for system to generate the MAC addresses used by the networking interfaces(WiFi/BT/Ethernet). There are 192 bits storage spaces for custom to store base MAC address in BLK3 of EFUSE. They are EFUSE_BLK3_RDATA0, EFUSE_BLK3_RDATA1, EFUSE_BLK3_RDATA2, EFUSE_BLK3_RDATA3, EFUSE_BLK3_RDATA4 and EFUSE_BLK3_RDATA5, each of them is 32 bits register. The format of the 192 bits storage spaces is: ------------------------------------------------------- -Field |Bits |Range |Description ------------------------------------------------------- -version |8 |[191:184] |1: useful. 0: useless ------------------------------------------------------- -reserve |112 |[183:72] |reserved ------------------------------------------------------- -mac address |64 |[71:8] |base MAC address ------------------------------------------------------- -mac crc |8 |[7:0] |crc of base MAC address ------------------------------------------------------- + +.. highlight:: none + +:: + + ------------------------------------------------------ + Field |Bits |Range |Description + ------------------------------------------------------ + version |8 |[191:184] |1: useful. 0: useless + ------------------------------------------------------ + reserve |112 |[183:72] |reserved + ------------------------------------------------------ + mac address |64 |[71:8] |base MAC address + ------------------------------------------------------ + mac crc |8 |[7:0] |crc of base MAC address + ------------------------------------------------------ If using base MAC address stored in external storage, firstly get the base MAC address stored in external storage, then call -API esp_base_mac_addr_set() to set the base MAC address for system to generate the MAC addresses used by the networking +API ``esp_base_mac_addr_set()`` to set the base MAC address for system to generate the MAC addresses used by the networking interfaces(WiFi/BT/Ethernet). All of the steps must be done before initializing the networking interfaces(WiFi/BT/Ethernet). It is recommended to do it in -app_main() which can be referenced in example `system/base_mac_address`. +``app_main()`` which can be referenced in :example:`system/base_mac_address`. Number of universally administered MAC address ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -74,4 +79,4 @@ Functions --------- .. doxygenfunction:: esp_base_mac_addr_set -.. doxygenfunction:: esp_efuse_mac_get_custom \ No newline at end of file +.. doxygenfunction:: esp_efuse_mac_get_custom diff --git a/docs/api-reference/system/intr_alloc.rst b/docs/api-reference/system/intr_alloc.rst index 8abe47e0f..7411c4936 100644 --- a/docs/api-reference/system/intr_alloc.rst +++ b/docs/api-reference/system/intr_alloc.rst @@ -83,46 +83,9 @@ It can also be useful to keep an interrupt handler in IRAM if it is called very Refer to the :ref:`SPI flash API documentation ` for more details. -Application Example -------------------- - API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`esp32/include/esp_intr_alloc.h` +.. include:: /_build/inc/esp_intr_alloc.inc -Macros -^^^^^^ - -.. doxygendefine:: ESP_INTR_FLAG_LEVEL1 -.. doxygendefine:: ESP_INTR_FLAG_LEVEL2 -.. doxygendefine:: ESP_INTR_FLAG_LEVEL3 -.. doxygendefine:: ESP_INTR_FLAG_LEVEL4 -.. doxygendefine:: ESP_INTR_FLAG_LEVEL5 -.. doxygendefine:: ESP_INTR_FLAG_LEVEL6 -.. doxygendefine:: ESP_INTR_FLAG_NMI -.. doxygendefine:: ESP_INTR_FLAG_LOWMED -.. doxygendefine:: ESP_INTR_FLAG_HIGH -.. doxygendefine:: ESP_INTR_FLAG_SHARED -.. doxygendefine:: ESP_INTR_FLAG_EDGE -.. doxygendefine:: ESP_INTR_FLAG_IRAM -.. doxygendefine:: ESP_INTR_FLAG_INTRDISABLED - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_intr_mark_shared -.. doxygenfunction:: esp_intr_reserve -.. doxygenfunction:: esp_intr_alloc -.. doxygenfunction:: esp_intr_alloc_intrstatus -.. doxygenfunction:: esp_intr_free -.. doxygenfunction:: esp_intr_get_cpu -.. doxygenfunction:: esp_intr_get_intno -.. doxygenfunction:: esp_intr_disable -.. doxygenfunction:: esp_intr_enable -.. doxygenfunction:: esp_intr_noniram_disable -.. doxygenfunction:: esp_intr_noniram_enable diff --git a/docs/api-reference/system/log.rst b/docs/api-reference/system/log.rst index 8aadeac09..c9883693c 100644 --- a/docs/api-reference/system/log.rst +++ b/docs/api-reference/system/log.rst @@ -12,57 +12,7 @@ Log library is commonly used by most of esp-idf components and examples. For dem API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`log/include/esp_log.h` - -Macros -^^^^^^ - -.. doxygendefine:: LOG_COLOR_E -.. doxygendefine:: LOG_COLOR_W -.. doxygendefine:: LOG_COLOR_I -.. doxygendefine:: LOG_COLOR_D -.. doxygendefine:: LOG_COLOR_V -.. doxygendefine:: LOG_RESET_COLOR -.. doxygendefine:: LOG_FORMAT -.. doxygendefine:: LOG_LOCAL_LEVEL -.. doxygendefine:: ESP_EARLY_LOGE -.. doxygendefine:: ESP_EARLY_LOGW -.. doxygendefine:: ESP_EARLY_LOGI -.. doxygendefine:: ESP_EARLY_LOGD -.. doxygendefine:: ESP_EARLY_LOGV -.. doxygendefine:: ESP_LOGE -.. doxygendefine:: ESP_LOGW -.. doxygendefine:: ESP_LOGI -.. doxygendefine:: ESP_LOGD -.. doxygendefine:: ESP_LOGV - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: vprintf_like_t - -Enumerations -^^^^^^^^^^^^ - -.. doxygenenum:: esp_log_level_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_log_level_set -.. doxygenfunction:: esp_log_set_vprintf -.. doxygenfunction:: esp_log_timestamp -.. doxygenfunction:: esp_log_write - - - - - - - +.. include:: /_build/inc/esp_log.inc diff --git a/docs/api-reference/system/mem_alloc.rst b/docs/api-reference/system/mem_alloc.rst index 35868f755..cba326ad1 100644 --- a/docs/api-reference/system/mem_alloc.rst +++ b/docs/api-reference/system/mem_alloc.rst @@ -1,5 +1,5 @@ Memory allocation -==================== +================= Overview -------- @@ -30,48 +30,13 @@ If a certain memory structure is only addressed in 32-bit units, for example an useful to allocate it with the MALLOC_CAP_32BIT flag. This also allows the allocator to give out IRAM memory; something which it can't do for a normal malloc() call. This can help to use all the available memory in the ESP32. +API Reference - Heap Allocation +------------------------------- -API Reference -------------- +.. include:: /_build/inc/esp_heap_alloc_caps.inc -Header Files -^^^^^^^^^^^^ +API Reference - Heap Regions +---------------------------- - * :component_file:`esp32/include/esp_heap_alloc_caps.h` - * :component_file:`freertos/include/freertos/heap_regions.h` +.. include:: /_build/inc/heap_regions.inc - -Macros -^^^^^^ - -.. doxygendefine:: MALLOC_CAP_EXEC -.. doxygendefine:: MALLOC_CAP_32BIT -.. doxygendefine:: MALLOC_CAP_8BIT -.. doxygendefine:: MALLOC_CAP_DMA -.. doxygendefine:: MALLOC_CAP_PID2 -.. doxygendefine:: MALLOC_CAP_PID3 -.. doxygendefine:: MALLOC_CAP_PID4 -.. doxygendefine:: MALLOC_CAP_PID5 -.. doxygendefine:: MALLOC_CAP_PID6 -.. doxygendefine:: MALLOC_CAP_PID7 -.. doxygendefine:: MALLOC_CAP_SPISRAM -.. doxygendefine:: MALLOC_CAP_INVALID - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: HeapRegionTagged_t - - -Functions -^^^^^^^^^ - -.. doxygenfunction:: heap_alloc_caps_init -.. doxygenfunction:: pvPortMallocCaps -.. doxygenfunction:: xPortGetFreeHeapSizeCaps -.. doxygenfunction:: xPortGetMinimumEverFreeHeapSizeCaps -.. doxygenfunction:: vPortDefineHeapRegionsTagged -.. doxygenfunction:: pvPortMallocTagged -.. doxygenfunction:: vPortFreeTagged -.. doxygenfunction:: xPortGetMinimumEverFreeHeapSizeTagged -.. doxygenfunction:: xPortGetFreeHeapSizeTagged diff --git a/docs/api-reference/system/ota.rst b/docs/api-reference/system/ota.rst index 0ecb01d4e..d7dbb5978 100644 --- a/docs/api-reference/system/ota.rst +++ b/docs/api-reference/system/ota.rst @@ -2,7 +2,7 @@ Over The Air Updates (OTA) ========================== OTA Process Overview -^^^^^^^^^^^^^^^^^^^^ +-------------------- The OTA update mechanism allows a device to update itself based on data received while the normal firmware is running (for example, over WiFi or Bluetooth.) @@ -17,7 +17,7 @@ next boot. .. _ota_data_partition: OTA Data Partition -^^^^^^^^^^^^^^^^^^ +------------------ An OTA data partition (type ``data``, subtype ``ota``) must be included in the :doc:`Partition Table <../../api-guides/partition-tables>` of any project which uses the OTA functions. @@ -46,32 +46,7 @@ End-to-end example of OTA firmware update workflow: :example:`system/ota`. API Reference ------------- -Header Files -^^^^^^^^^^^^ +.. include:: /_build/inc/esp_ota_ops.inc - * :component_file:`app_update/include/esp_ota_ops.h` -Macros -^^^^^^ -.. doxygendefine:: ESP_ERR_OTA_BASE -.. doxygendefine:: ESP_ERR_OTA_PARTITION_CONFLICT -.. doxygendefine:: ESP_ERR_OTA_SELECT_INFO_INVALID -.. doxygendefine:: ESP_ERR_OTA_VALIDATE_FAILED -.. doxygendefine:: OTA_SIZE_UNKNOWN - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: esp_ota_handle_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_ota_begin -.. doxygenfunction:: esp_ota_write -.. doxygenfunction:: esp_ota_end -.. doxygenfunction:: esp_ota_get_running_partition -.. doxygenfunction:: esp_ota_set_boot_partition -.. doxygenfunction:: esp_ota_get_boot_partition -.. doxygenfunction:: esp_ota_get_next_update_partition diff --git a/docs/api-reference/template.rst b/docs/api-reference/template.rst index 931ead75e..ccfadb4b1 100644 --- a/docs/api-reference/template.rst +++ b/docs/api-reference/template.rst @@ -3,113 +3,103 @@ API Documentation Template .. note:: - *INSTRUCTIONS* + *INSTRUCTIONS* - 1. Use this file as a template to document API. - 2. Change the file name to the name of the header file that represents documented API. - 3. Include respective files with descriptions from the API folder using ``..include::`` - * README.rst - * example.rst - 4. Optionally provide description right in this file. - 5. Once done, remove all instructions like this one and any superfluous headers. + 1. Use this file (:idf_file:`docs/api-reference/template.rst`) as a template to document API. + 2. Change the file name to the name of the header file that represents documented API. + 3. Include respective files with descriptions from the API folder using ``..include::`` + + * README.rst + * example.rst + * ... + + 4. Optionally provide description right in this file. + 5. Once done, remove all instructions like this one and any superfluous headers. Overview -------- .. note:: - *INSTRUCTIONS* + *INSTRUCTIONS* - 1. Provide overview where and how this API may be used. - 2. Where applicable include code snippets to illustrate functionality of particular functions. - 3. To distinguish between sections, use the following `heading levels `_: + 1. Provide overview where and how this API may be used. + 2. Where applicable include code snippets to illustrate functionality of particular functions. + 3. To distinguish between sections, use the following `heading levels `_: - * ``#`` with overline, for parts - * ``*`` with overline, for chapters - * ``=``, for sections - * ``-``, for subsections - * ``^``, for subsubsections - * ``"``, for paragraphs + * ``#`` with overline, for parts + * ``*`` with overline, for chapters + * ``=``, for sections + * ``-``, for subsections + * ``^``, for subsubsections + * ``"``, for paragraphs Application Example ------------------- .. note:: - *INSTRUCTIONS* + *INSTRUCTIONS* - 1. Prepare one or more practical examples to demonstrate functionality of this API. - 2. Each example should follow pattern of projects located in ``esp-idf/examples/`` folder. - 3. Place example in this folder complete with ``README.md`` file. - 4. Provide overview of demonstrated functionality in ``README.md``. - 5. With good overview reader should be able to understand what example does without opening the source code. - 6. Depending on complexity of example, break down description of code into parts and provide overview of functionality of each part. - 7. Include flow diagram and screenshots of application output if applicable. - 8. Finally add in this section synopsis of each example together with link to respective folder in ``esp-idf/examples/``. + 1. Prepare one or more practical examples to demonstrate functionality of this API. + 2. Each example should follow pattern of projects located in ``esp-idf/examples/`` folder. + 3. Place example in this folder complete with ``README.md`` file. + 4. Provide overview of demonstrated functionality in ``README.md``. + 5. With good overview reader should be able to understand what example does without opening the source code. + 6. Depending on complexity of example, break down description of code into parts and provide overview of functionality of each part. + 7. Include flow diagram and screenshots of application output if applicable. + 8. Finally add in this section synopsis of each example together with link to respective folder in ``esp-idf/examples/``. API Reference ------------- +.. highlight:: none + .. note:: - *INSTRUCTIONS* - - 1. Specify the names of header files used to generate this reference. Each name should be linked to the source on `espressif/esp-idf `_ repository. - 2. Provide list of API members divided into sections. - 3. Use corresponding ``.. doxygen..`` directives, so member documentation is auto updated. + *INSTRUCTIONS* - * Data Structures -``.. doxygenstruct::`` together with ``:members:`` - * Macros - ``.. doxygendefine::`` - * Type Definitions - ``.. doxygentypedef::`` - * Enumerations - ``.. doxygenenum::`` - * Functions - ``.. doxygenfunction::`` + 1. This repository provides for automatic update of API reference documentation using :doc:`code markup retrieved by Doxygen from header files <../contribute/documenting-code>`. + + 2. Update is done on each documentation build by invoking script :idf_file:`docs/gen-dxd.py` for all header files listed in the ``INPUT`` statement of :idf_file:`docs/Doxyfile`. + + 3. Each line of the ``INPUT`` statement (other than a comment that begins with ``##``) contains a path to header file ``*.h`` that will be used to generate corresponding ``*.inc`` files:: - See `Breathe documentation `_ for additional information. + ## + ## Wi-Fi - API Reference + ## + ../components/esp32/include/esp_wifi.h \ + ../components/esp32/include/esp_smartconfig.h \ - 4. Once done remove superfluous headers. - 5. When changes are committed and documentation is build, check how this section rendered. :doc:`Correct annotations <../contribute/documenting-code>` in respective header files, if required. + 4. The ``*.inc`` files contain formatted reference of API members generated automatically on each documentation build. All ``*.inc`` files are placed in Sphinx ``_build`` directory. To see directives generated for e.g. ``esp_wifi.h``, run ``python gen-dxd.py esp32/include/esp_wifi.h``. -Header Files -^^^^^^^^^^^^ + 5. To show contents of ``*.inc`` file in documentation, include it as follows:: - * `path/header-file.h` + .. include:: /_build/inc/esp_wifi.inc -Data Structures -^^^^^^^^^^^^^^^ + For example see :idf_file:`docs/api-reference/wifi/esp_wifi.rst` + + 6. Optionally, rather that using ``*.inc`` files, you may want to describe API in you own way. See :idf_file:`docs/api-reference/system/deep_sleep.rst` for example. -:: + Below is the list of common ``.. doxygen...::`` directives: - .. doxygenstruct:: name_of_structure - :members: + * Functions - ``.. doxygenfunction:: name_of_function`` + * Unions -``.. doxygenunion:: name_of_union`` + * Structures -``.. doxygenstruct:: name_of_structure`` together with ``:members:`` + * Macros - ``.. doxygendefine:: name_of_define`` + * Type Definitions - ``.. doxygentypedef:: name_of_type`` + * Enumerations - ``.. doxygenenum:: name_of_enumeration`` -Macros -^^^^^^ + See `Breathe documentation `_ for additional information. -:: + To provide a link to header file, use the :ref:`link custom role ` as follows:: - .. doxygendefine:: name_of_macro + * :component_file:`path_to/header_file.h` -Type Definitions -^^^^^^^^^^^^^^^^ - -:: - - .. doxygentypedef:: name_of_type - -Enumerations -^^^^^^^^^^^^ - -:: - - .. doxygenenum:: name_of_enumeration - -Functions -^^^^^^^^^ - -:: - - .. doxygenfunction:: name_of_function + 7. In any case, to generate API reference, the file :idf_file:`docs/Doxyfile` should be updated with paths to ``*.h`` headers that are being documented. + + 8. When changes are committed and documentation is build, check how this section has been rendered. :doc:`Correct annotations <../contribute/documenting-code>` in respective header files, if required. diff --git a/docs/api-reference/wifi/esp_smartconfig.rst b/docs/api-reference/wifi/esp_smartconfig.rst index 31295a5d4..7ad26f5fb 100644 --- a/docs/api-reference/wifi/esp_smartconfig.rst +++ b/docs/api-reference/wifi/esp_smartconfig.rst @@ -4,22 +4,4 @@ Smart Config API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`esp32/include/esp_smartconfig.h` - -Type Definitions -^^^^^^^^^^^^^^^^ - -.. doxygentypedef:: sc_callback_t - -Functions -^^^^^^^^^ - -.. doxygenfunction:: esp_smartconfig_get_version -.. doxygenfunction:: esp_smartconfig_start -.. doxygenfunction:: esp_smartconfig_stop -.. doxygenfunction:: esp_esptouch_set_timeout -.. doxygenfunction:: esp_smartconfig_set_type -.. doxygenfunction:: esp_smartconfig_fast_mode +.. include:: /_build/inc/esp_smartconfig.inc diff --git a/docs/api-reference/wifi/esp_wifi.rst b/docs/api-reference/wifi/esp_wifi.rst index 042e810e3..976893e5e 100644 --- a/docs/api-reference/wifi/esp_wifi.rst +++ b/docs/api-reference/wifi/esp_wifi.rst @@ -8,71 +8,18 @@ Overview .. _Instructions: ../template.html -Application Example -------------------- +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`. -Simple code showing how to connect ESP32 module to an Access Point: `esp-idf-template `_. API Reference ------------- -Header Files -^^^^^^^^^^^^ - - * :component_file:`esp32/include/esp_wifi.h` - -Macros ------- - -.. doxygendefine:: WIFI_INIT_CONFIG_DEFAULT - - -Type Definitions ----------------- - -.. doxygentypedef:: wifi_promiscuous_cb_t -.. doxygentypedef:: esp_vendor_ie_cb_t - -Functions ---------- - -.. doxygenfunction:: esp_wifi_init -.. doxygenfunction:: esp_wifi_deinit -.. doxygenfunction:: esp_wifi_set_mode -.. doxygenfunction:: esp_wifi_get_mode -.. doxygenfunction:: esp_wifi_start -.. doxygenfunction:: esp_wifi_stop -.. doxygenfunction:: esp_wifi_connect -.. doxygenfunction:: esp_wifi_disconnect -.. doxygenfunction:: esp_wifi_clear_fast_connect -.. doxygenfunction:: esp_wifi_deauth_sta -.. doxygenfunction:: esp_wifi_scan_start -.. doxygenfunction:: esp_wifi_scan_stop -.. doxygenfunction:: esp_wifi_scan_get_ap_num -.. doxygenfunction:: esp_wifi_scan_get_ap_records -.. doxygenfunction:: esp_wifi_sta_get_ap_info -.. doxygenfunction:: esp_wifi_set_ps -.. doxygenfunction:: esp_wifi_get_ps -.. doxygenfunction:: esp_wifi_set_protocol -.. doxygenfunction:: esp_wifi_get_protocol -.. doxygenfunction:: esp_wifi_set_bandwidth -.. doxygenfunction:: esp_wifi_get_bandwidth -.. doxygenfunction:: esp_wifi_set_channel -.. doxygenfunction:: esp_wifi_get_channel -.. doxygenfunction:: esp_wifi_set_country -.. doxygenfunction:: esp_wifi_get_country -.. doxygenfunction:: esp_wifi_set_mac -.. doxygenfunction:: esp_wifi_get_mac -.. doxygenfunction:: esp_wifi_set_promiscuous_rx_cb -.. doxygenfunction:: esp_wifi_set_promiscuous -.. doxygenfunction:: esp_wifi_get_promiscuous -.. doxygenfunction:: esp_wifi_set_config -.. doxygenfunction:: esp_wifi_get_config -.. doxygenfunction:: esp_wifi_ap_get_sta_list -.. doxygenfunction:: esp_wifi_set_storage -.. doxygenfunction:: esp_wifi_set_auto_connect -.. doxygenfunction:: esp_wifi_get_auto_connect -.. doxygenfunction:: esp_wifi_set_vendor_ie -.. doxygenfunction:: esp_wifi_set_vendor_ie_cb - +.. include:: /_build/inc/esp_wifi.inc diff --git a/docs/conf.py b/docs/conf.py index 380a64386..120de169a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,8 +12,7 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys -import os +import sys, os import re from subprocess import call, Popen, PIPE import shlex @@ -24,10 +23,16 @@ import shlex sys.path.insert(0, os.path.abspath('.')) from repo_util import run_cmd_get_output -# -- Run DoxyGen to prepare XML for Sphinx--------------------------------- -# ref. https://github.com/rtfd/readthedocs.org/issues/388 +# Call Doxygen to get XML files from the header files +print "Calling Doxygen to generate latest XML files" call('doxygen') +# Generate 'api_name.inc' files using the XML files by Doxygen +os.system("python gen-dxd.py") + +# http://stackoverflow.com/questions/12772927/specifying-an-online-image-in-sphinx-restructuredtext-format +# +suppress_warnings = ['image.nonlocal_uri'] # -- General configuration ------------------------------------------------ @@ -290,3 +295,4 @@ if not on_rtd: # only import and set the theme if we're building docs locally html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # otherwise, readthedocs.org uses their theme by default, so no need to specify it + diff --git a/docs/contribute/documenting-code.rst b/docs/contribute/documenting-code.rst index 8df56e643..459f9c5bc 100644 --- a/docs/contribute/documenting-code.rst +++ b/docs/contribute/documenting-code.rst @@ -95,7 +95,7 @@ There is couple of tips, how you can make your documentation even better and mor * @endcode * - The code snippet should be enclosed in a comment block of the function that it illustrates. + The code snippet should be enclosed in a comment block of the function that it illustrates. 2. To highlight some important information use command ``@attention`` or ``@note``. :: @@ -105,9 +105,24 @@ There is couple of tips, how you can make your documentation even better and mor * 2. If the ESP32 is connected to an AP, call esp_wifi_disconnect to disconnect. * - Above example also shows how to use a numbered list. + Above example also shows how to use a numbered list. -3. Use markdown to make your documentation even more readable. You will add headers, links, tables and more. :: +3. To provide common description to a group of similar functions, enclose them using ``/**@{*/`` and ``/**@}*/`` markup commands:: + + /**@{*/ + /** + * @brief common description of similar functions + * + */ + void first_similar_function (void); + void second_similar_function (void); + /**@}*/ + + For practical example see :component_file:`nvs_flash/include/nvs.h`. + +4. You may want to go even further and skip some code like e.g. repetitive defines or enumerations. In such case enclose the code within ``/** @cond */`` and ``/** @endcond */`` commands. Example of such implementation is provided in :component_file:`driver/include/driver/gpio.h`. + +5. Use markdown to make your documentation even more readable. You will add headers, links, tables and more. :: * * [ESP32 Technical Reference](http://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf) @@ -117,8 +132,9 @@ There is couple of tips, how you can make your documentation even better and mor Code snippets, notes, links, etc. will not make it to the documentation, if not enclosed in a comment block associated with one of documented objects. -4. Prepare one or more complete code examples together with description. Place description in a separate file ``README.md`` in specific folder of :idf:`examples` directory. +6. Prepare one or more complete code examples together with description. Place description in a separate file ``README.md`` in specific folder of :idf:`examples` directory. +.. _link-custom-roles: Linking Examples ---------------- @@ -128,13 +144,13 @@ When linking to examples on GitHub do not use absolute / hadcoded URLs. Instead, The following roles are provided: - ``:idf:`path``` - points to directory inside ESP-IDF -- ``:idf_blob:`path``` - points to file inside ESP-IDF +- ``:idf_file:`path``` - points to file inside ESP-IDF - ``:idf_raw:`path``` - points to raw view of the file inside ESP-IDF - ``:component:`path``` - points to directory inside ESP-IDF components dir -- ``:component_blob:`path``` - points to file inside ESP-IDF components dir +- ``:component_file:`path``` - points to file inside ESP-IDF components dir - ``:component_raw:`path``` - points to raw view of the file inside ESP-IDF components dir - ``:example:`path``` - points to directory inside ESP-IDF examples dir -- ``:example_blob:`path``` - points to file inside ESP-IDF examples dir +- ``:example_file:`path``` - points to file inside ESP-IDF examples dir - ``:example_raw:`path``` - points to raw view of the file inside ESP-IDF examples dir A check is added to the CI build script, which searches RST files for presence of hard-coded links (identified by tree/master, blob/master, or raw/master part of the URL). This check can be run manually: ``cd docs`` and then ``make gh-linkcheck``. @@ -170,4 +186,12 @@ We love it even better, if it is well documented, so we can quickly make it run Go ahead, contribute your code and documentation! + +Related Documents +----------------- + +* :doc:`../api-reference/template` + + .. _espressif/esp-idf: https://github.com/espressif/esp-idf/ + diff --git a/docs/doxygen_xml_to_rst.xslt b/docs/doxygen_xml_to_rst.xslt deleted file mode 100644 index 0212457e5..000000000 --- a/docs/doxygen_xml_to_rst.xslt +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - Macros - ^^^^^^ - - .. doxygendefine:: - - - - - - Type Definitions - ^^^^^^^^^^^^^^^^ - - .. doxygentypedef:: - - - - - - Enumerations - ^^^^^^^^^^^^ - - .. doxygenenum:: - - - - - - - Structures - ^^^^^^^^^^ - - .. doxygenstruct:: - - - :members: - - - - - Functions - ^^^^^^^^^ - - .. doxygenfunction:: - - - - - - - diff --git a/docs/gen-dxd.py b/docs/gen-dxd.py new file mode 100644 index 000000000..4be75915b --- /dev/null +++ b/docs/gen-dxd.py @@ -0,0 +1,301 @@ +# 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. +# + +import sys +import os +import re + +# 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 = "_build/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") + + 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) + inc_file = open(inc_file_path, "w") + inc_file.write(rst_output) + inc_file.close() + + +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/hw-reference/index.rst b/docs/hw-reference/index.rst index 58edfa114..dcd736949 100644 --- a/docs/hw-reference/index.rst +++ b/docs/hw-reference/index.rst @@ -7,6 +7,7 @@ Hardware Reference Technical Reference Manual (PDF) Pin List and Functions (PDF) Chip Pinout (PDF) + ESP32 Hardware Design Guidelines (PDF) Silicon Errata (PDF) Modules and Boards - +