diff --git a/boards/seeed/lora_e5_dev_board/doc/lora_e5_dev_board.rst b/boards/seeed/lora_e5_dev_board/doc/lora_e5_dev_board.rst index ca23421073480..9c2071abd4fb9 100644 --- a/boards/seeed/lora_e5_dev_board/doc/lora_e5_dev_board.rst +++ b/boards/seeed/lora_e5_dev_board/doc/lora_e5_dev_board.rst @@ -1,7 +1,4 @@ -.. _lora_e5_dev_board: - -Seeed Studio LoRa-E5 Dev Board -############################## +.. zephyr:board:: lora_e5_dev_board Overview ******** @@ -13,10 +10,6 @@ The LoRa-E5-HF STM32WLE5JC Module supports multiple LPWAN protocols on the All GPIOs of the LoRa-E5 Module are laid out supporting various data protocols and interfaces including RS-485 and Grove. -.. image:: img/lora_e5_dev_board.jpg - :align: center - :alt: LoRa-E5 Dev board - Hardware ******** diff --git a/boards/seeed/lora_e5_mini/doc/index.rst b/boards/seeed/lora_e5_mini/doc/index.rst index 78227fcb62bfe..05e94cdaf3ae1 100644 --- a/boards/seeed/lora_e5_mini/doc/index.rst +++ b/boards/seeed/lora_e5_mini/doc/index.rst @@ -1,7 +1,4 @@ -.. _lora_e5_mini: - -Seeed Studio LoRa-E5 mini -######################### +.. zephyr:board:: lora_e5_mini Overview ******** @@ -10,10 +7,6 @@ LoRa-E5 mini is a compacted-sized development board suitable for the rapid testing and building of small-sized LoRa device, exposing all capabilities of Seeed Studio LoRa-E5 STM32WLE5JC module. -.. image:: img/lora_e5_mini.jpg - :align: center - :alt: LoRa-E5 mini - Hardware ******** diff --git a/boards/seeed/seeeduino_xiao/doc/index.rst b/boards/seeed/seeeduino_xiao/doc/index.rst index 48003fdb63c4f..7dc905e39b3b7 100644 --- a/boards/seeed/seeeduino_xiao/doc/index.rst +++ b/boards/seeed/seeeduino_xiao/doc/index.rst @@ -1,7 +1,4 @@ -.. _seeeduino_xiao: - -Seeeduino XIAO -############## +.. zephyr:board:: seeeduino_xiao Overview ******** @@ -10,10 +7,6 @@ The Seeeduino XIAO is a tiny (20 mm x 17.5 mm) ARM development board with onboard LEDs, USB port, and range of I/O broken out onto 14 pins. -.. image:: img/seeeduino_xiao.jpg - :align: center - :alt: Seeeduino XIAO - Hardware ******** diff --git a/boards/seeed/wio_terminal/doc/index.rst b/boards/seeed/wio_terminal/doc/index.rst index f640f11b44591..736d3cb6984c9 100644 --- a/boards/seeed/wio_terminal/doc/index.rst +++ b/boards/seeed/wio_terminal/doc/index.rst @@ -1,7 +1,4 @@ -.. _wio_terminal: - -Wio Terminal -############ +.. zephyr:board:: wio_terminal Overview ******** @@ -11,11 +8,6 @@ wireless connectivity (2.4G/5G dual-band Wi-Fi and BLE 5.0), LCD display, USB C port, FPC connector, microSD card slot, Raspberry Pi compatible 40-pins header and 2 Grove connectors. -.. image:: img/wio_terminal.png - :width: 500px - :align: center - :alt: Seeed Studio Wio Terminal - Hardware ******** diff --git a/boards/seeed/xiao_ble/doc/index.rst b/boards/seeed/xiao_ble/doc/index.rst index c33d786e02415..831eb872a9da0 100644 --- a/boards/seeed/xiao_ble/doc/index.rst +++ b/boards/seeed/xiao_ble/doc/index.rst @@ -1,7 +1,4 @@ -.. _xiao_ble: - -XIAO BLE (Sense) -################ +.. zephyr:board:: xiao_ble Overview ******** @@ -10,10 +7,6 @@ The Seeed XIAO BLE (Sense) is a tiny (21 mm x 17.5 mm) Nordic Semiconductor nRF52840 ARM Cortex-M4F development board with onboard LEDs, USB port, QSPI flash, battery charger, and range of I/O broken out into 14 pins. -.. figure:: img/xiao_ble.jpg - :align: center - :alt: XIAO BLE - Hardware ******** diff --git a/boards/seeed/xiao_esp32c3/doc/index.rst b/boards/seeed/xiao_esp32c3/doc/index.rst index 48ce9ddae0d63..fa9811661a4bd 100644 --- a/boards/seeed/xiao_esp32c3/doc/index.rst +++ b/boards/seeed/xiao_esp32c3/doc/index.rst @@ -1,7 +1,4 @@ -.. _xiao_esp32c3: - -XIAO ESP32C3 -############ +.. zephyr:board:: xiao_esp32c3 Overview ******** @@ -11,12 +8,6 @@ Espressif ESP32-C3 WiFi/Bluetooth dual-mode chip. For more details see the `Seeed Studio XIAO ESP32C3`_ wiki page. -.. figure:: img/xiao_esp32c.jpg - :align: center - :alt: XIAO ESP32C3 - - XIAO ESP32C3 - Hardware ******** diff --git a/boards/seeed/xiao_esp32s3/doc/index.rst b/boards/seeed/xiao_esp32s3/doc/index.rst index 4c029bd5d645e..60aef4a2e7d0e 100644 --- a/boards/seeed/xiao_esp32s3/doc/index.rst +++ b/boards/seeed/xiao_esp32s3/doc/index.rst @@ -1,7 +1,4 @@ -.. _xiao_esp32s3: - -XIAO ESP32S3 -############ +.. zephyr:board:: xiao_esp32s3 Overview ******** @@ -11,12 +8,6 @@ Espressif ESP32-S3 WiFi/Bluetooth dual-mode chip. For more details see the `Seeed Studio XIAO ESP32S3`_ wiki page. -.. figure:: img/xiao_esp32s3.jpg - :align: center - :alt: XIAO ESP32S3 - - XIAO ESP32S3 - Hardware ******** diff --git a/boards/seeed/xiao_rp2040/doc/index.rst b/boards/seeed/xiao_rp2040/doc/index.rst index 7206e9be07f58..0cf39c014c7fe 100644 --- a/boards/seeed/xiao_rp2040/doc/index.rst +++ b/boards/seeed/xiao_rp2040/doc/index.rst @@ -1,7 +1,4 @@ -.. _xiao_rp2040: - -XIAO RP2040 -########### +.. zephyr:board:: xiao_rp2040 Overview ******** @@ -13,12 +10,6 @@ to be flashed without any adapter, in a drag-and-drop manner. For more details see the `Seeed Studio XIAO RP2040`_ wiki page. -.. figure:: img/xiao_rp2040.webp - :align: center - :alt: XIAO RP2040 - - XIAO RP2040 - Hardware ******** diff --git a/doc/_extensions/zephyr/domain/__init__.py b/doc/_extensions/zephyr/domain/__init__.py index 0308be48987d1..4814e3cc59173 100644 --- a/doc/_extensions/zephyr/domain/__init__.py +++ b/doc/_extensions/zephyr/domain/__init__.py @@ -15,12 +15,14 @@ - ``zephyr:code-sample-category::`` - Defines a category for grouping code samples. - ``zephyr:code-sample-listing::`` - Shows a listing of code samples found in a given category. - ``zephyr:board-catalog::`` - Shows a listing of boards supported by Zephyr. +- ``zephyr:board::`` - Flags a document as being the documentation page for a board. Roles ----- - ``:zephyr:code-sample:`` - References a code sample. - ``:zephyr:code-sample-category:`` - References a code sample category. +- ``:zephyr:board:`` - References a board. """ @@ -30,7 +32,7 @@ from typing import Any, Dict, Iterator, List, Tuple, Final from docutils import nodes -from docutils.parsers.rst import Directive, directives +from docutils.parsers.rst import directives from docutils.statemachine import StringList from sphinx import addnodes @@ -85,6 +87,10 @@ class CodeSampleListingNode(nodes.Element): pass +class BoardNode(nodes.Element): + pass + + class ConvertCodeSampleNode(SphinxTransform): default_priority = 100 @@ -213,6 +219,65 @@ def convert_node(self, node): node.replace_self(node.children[0]) +class ConvertBoardNode(SphinxTransform): + default_priority = 100 + + def apply(self): + matcher = NodeMatcher(BoardNode) + for node in self.document.traverse(matcher): + self.convert_node(node) + + def convert_node(self, node): + parent = node.parent + siblings_to_move = [] + if parent is not None: + index = parent.index(node) + siblings_to_move = parent.children[index + 1 :] + + new_section = nodes.section(ids=[node["id"]]) + new_section += nodes.title(text=node["full_name"]) + + # create a sidebar with all the board details + sidebar = nodes.sidebar(classes=["board-overview"]) + new_section += sidebar + sidebar += nodes.title(text="Board Overview") + + if node["image"] is not None: + figure = nodes.figure() + # set a scale of 100% to indicate we want a link to the full-size image + figure += nodes.image(uri=f"/{node['image']}", scale=100) + figure += nodes.caption(text=node["full_name"]) + sidebar += figure + + field_list = nodes.field_list() + sidebar += field_list + + details = [ + ("Vendor", node["vendor"]), + ("Architecture", ", ".join(node["archs"])), + ("SoC", ", ".join(node["socs"])), + ] + + for property_name, value in details: + field = nodes.field() + field_name = nodes.field_name(text=property_name) + field_body = nodes.field_body() + field_body += nodes.paragraph(text=value) + field += field_name + field += field_body + field_list += field + + # Move the sibling nodes under the new section + new_section.extend(siblings_to_move) + + # Replace the custom node with the new section + node.replace_self(new_section) + + # Remove the moved siblings from their original parent + for sibling in siblings_to_move: + parent.remove(sibling) + + class CodeSampleCategoriesTocPatching(SphinxPostTransform): default_priority = 5 # needs to run *before* ReferencesResolver @@ -434,7 +499,7 @@ def run(self, **kwargs: Any) -> None: node.replace_self([]) -class CodeSampleDirective(Directive): +class CodeSampleDirective(SphinxDirective): """ A directive for creating a code sample node in the Zephyr documentation. """ @@ -569,6 +634,45 @@ def run(self): return [code_sample_listing_node] +class BoardDirective(SphinxDirective): + has_content = False + required_arguments = 1 + optional_arguments = 0 + + def run(self): + # board_name is passed as the directive argument + board_name = self.arguments[0] + + boards = self.env.domaindata["zephyr"]["boards"] + vendors = self.env.domaindata["zephyr"]["vendors"] + + if board_name not in boards: + logger.warning( + f"Board {board_name} does not seem to be a valid board name.", + location=(self.env.docname, self.lineno), + ) + return [] + elif "docname" in boards[board_name]: + logger.warning( + f"Board {board_name} is already documented in {boards[board_name]['docname']}.", + location=(self.env.docname, self.lineno), + ) + return [] + else: + board = boards[board_name] + # flag board in the domain data as now having a documentation page so that it can be + # cross-referenced etc. + board["docname"] = self.env.docname + + board_node = BoardNode(id=board_name) + board_node["full_name"] = board["full_name"] + board_node["vendor"] = vendors.get(board["vendor"], board["vendor"]) + board_node["archs"] = board["archs"] + board_node["socs"] = board["socs"] + board_node["image"] = board["image"] + return [board_node] + + class BoardCatalogDirective(SphinxDirective): has_content = False required_arguments = 0 @@ -578,13 +682,16 @@ def run(self): if self.env.app.builder.format == "html": self.env.domaindata["zephyr"]["has_board_catalog"][self.env.docname] = True - # As it is not expected that more than one board-catalog directive is used across - # the documentation, and since the generation is only taking a few seconds, we don't - # store the catalog in the domain data. It might change in the future if the generation - # becomes more expensive. - board_catalog = get_catalog() + domain_data = self.env.domaindata["zephyr"] renderer = SphinxRenderer([TEMPLATES_DIR]) - rendered = renderer.render("board-catalog.html", {"catalog": board_catalog}) + rendered = renderer.render( + "board-catalog.html", + { + "boards": domain_data["boards"], + "vendors": domain_data["vendors"], + "socs": domain_data["socs"], + }, + ) return [nodes.raw("", rendered, format="html")] else: return [nodes.paragraph(text="Board catalog is only available in HTML.")] @@ -599,6 +706,7 @@ class ZephyrDomain(Domain): roles = { "code-sample": XRefRole(innernodeclass=nodes.inline, warn_dangling=True), "code-sample-category": XRefRole(innernodeclass=nodes.inline, warn_dangling=True), + "board": XRefRole(innernodeclass=nodes.inline, warn_dangling=True), } directives = { @@ -606,11 +714,13 @@ class ZephyrDomain(Domain): "code-sample-listing": CodeSampleListingDirective, "code-sample-category": CodeSampleCategoryDirective, "board-catalog": BoardCatalogDirective, + "board": BoardDirective, } object_types: Dict[str, ObjType] = { "code-sample": ObjType("code sample", "code-sample"), "code-sample-category": ObjType("code sample category", "code-sample-category"), + "board": ObjType("board", "board"), } initial_data: Dict[str, Any] = { @@ -644,6 +754,12 @@ def merge_domaindata(self, docnames: List[str], otherdata: Dict) -> None: self.data["code-samples"].update(otherdata["code-samples"]) self.data["code-samples-categories"].update(otherdata["code-samples-categories"]) + # self.data["boards"] contains all the boards right from builder-inited time, but it still # potentially needs merging since a board's docname property is set by BoardDirective to + # indicate the board is documented in a specific document. + for board_name, board in otherdata["boards"].items(): + if "docname" in board: + self.data["boards"][board_name]["docname"] = board["docname"] + # merge category trees by adding all the categories found in the "other" tree that to # self tree other_tree = otherdata["code-samples-categories-tree"] @@ -686,6 +802,18 @@ def get_objects(self): 1, ) + for _, board in self.data["boards"].items(): + # only boards that do have a documentation page are to be considered as valid objects + if "docname" in board: + yield ( + board["name"], + board["full_name"], + "board", + board["docname"], + board["name"], + 1, + ) + # used by Sphinx Immaterial theme def get_object_synopses(self) -> Iterator[Tuple[Tuple[str, str], str]]: for _, code_sample in self.data["code-samples"].items(): @@ -699,18 +827,20 @@ def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode): elem = self.data["code-samples"].get(target) elif type == "code-sample-category": elem = self.data["code-samples-categories"].get(target) + elif type == "board": + elem = self.data["boards"].get(target) else: return if elem: if not node.get("refexplicit"): - contnode = [nodes.Text(elem["name"])] + contnode = [nodes.Text(elem["name"] if type != "board" else elem["full_name"])] return make_refnode( builder, fromdocname, elem["docname"], - elem["id"], + elem["id"] if type != "board" else elem["name"], contnode, elem["description"].astext() if type == "code-sample" else None, ) @@ -804,6 +934,13 @@ def install_static_assets_as_needed( app.add_js_file("js/board-catalog.js") +def load_board_catalog_into_domain(app: Sphinx) -> None: + board_catalog = get_catalog() + app.env.domaindata["zephyr"]["boards"] = board_catalog["boards"] + app.env.domaindata["zephyr"]["vendors"] = board_catalog["vendors"] + app.env.domaindata["zephyr"]["socs"] = board_catalog["socs"] + + def setup(app): app.add_config_value("zephyr_breathe_insert_related_samples", False, "env") @@ -811,6 +948,7 @@ def setup(app): app.add_transform(ConvertCodeSampleNode) app.add_transform(ConvertCodeSampleCategoryNode) + app.add_transform(ConvertBoardNode) app.add_post_transform(ProcessCodeSampleListingNode) app.add_post_transform(CodeSampleCategoriesTocPatching) @@ -820,6 +958,8 @@ def setup(app): "builder-inited", (lambda app: app.config.html_static_path.append(RESOURCES_DIR.as_posix())), ) + app.connect("builder-inited", load_board_catalog_into_domain) + app.connect("html-page-context", install_static_assets_as_needed) app.connect("env-updated", compute_sample_categories_hierarchy) diff --git a/doc/_extensions/zephyr/domain/templates/board-card.html b/doc/_extensions/zephyr/domain/templates/board-card.html index 70a3523e323b6..4c16a3c0cc5ce 100644 --- a/doc/_extensions/zephyr/domain/templates/board-card.html +++ b/doc/_extensions/zephyr/domain/templates/board-card.html @@ -16,9 +16,10 @@ data-vendor="{{ board.vendor }}" data-socs="{{ board.socs | join(" ") }}" tabindex="0"> -
{{ catalog.vendors[board.vendor] }}
+
{{ vendors[board.vendor] }}
{% if board.image -%} - A picture of the {{ board.name }} board + A picture of the {{ board.full_name }} board {% else -%}
{% endif -%} diff --git a/doc/_extensions/zephyr/domain/templates/board-catalog.html b/doc/_extensions/zephyr/domain/templates/board-catalog.html index 623852b18401f..dc3c9147fed61 100644 --- a/doc/_extensions/zephyr/domain/templates/board-catalog.html +++ b/doc/_extensions/zephyr/domain/templates/board-catalog.html @@ -38,8 +38,8 @@ {# Only show those vendors that have actual boards in the catalog. Note: as sorting per vendor name is not feasible in Jinja, the option list is sorted in the JavaScript code later #} - {% for vendor in (catalog.boards | items | map(attribute='1.vendor') | unique ) -%} - + {% for vendor in (boards | items | map(attribute='1.vendor') | unique ) -%} + {% endfor %} @@ -82,11 +82,11 @@
- {% for board_name, board in catalog.boards | items | sort(attribute='1.full_name') -%} + {% for board_name, board in boards | items | sort(attribute='1.full_name') -%} {% include "board-card.html" %} {% endfor %}
diff --git a/doc/_scripts/gen_boards_catalog.py b/doc/_scripts/gen_boards_catalog.py index e7b5a0cbb911b..42e8c06860613 100644 --- a/doc/_scripts/gen_boards_catalog.py +++ b/doc/_scripts/gen_boards_catalog.py @@ -6,7 +6,6 @@ from pathlib import Path import list_boards, list_hardware -import pykwalify import yaml import zephyr_module from gen_devicetree_rest import VndLookup @@ -35,8 +34,8 @@ def guess_image(board_or_shield): img_file = guess_file_from_patterns( board_or_shield.dir, patterns, board_or_shield.name, img_exts ) - return (Path("../_images") / img_file.name).as_posix() if img_file else "" + return (img_file.relative_to(ZEPHYR_BASE)).as_posix() if img_file else None def guess_doc_page(board_or_shield): patterns = [ @@ -52,8 +51,6 @@ def guess_doc_page(board_or_shield): def get_catalog(): - pykwalify.init_logging(1) - vnd_lookup = VndLookup(ZEPHYR_BASE / "dts/bindings/vendor-prefixes.txt", []) module_settings = { @@ -106,6 +103,7 @@ def get_catalog(): doc_page = guess_doc_page(board) board_catalog[board.name] = { + "name": board.name, "full_name": full_name, "doc_page": doc_page.relative_to(ZEPHYR_BASE).as_posix() if doc_page else None, "vendor": vendor, diff --git a/doc/_static/css/custom.css b/doc/_static/css/custom.css index b302ba82026ad..2fc7b6bb54a81 100644 --- a/doc/_static/css/custom.css +++ b/doc/_static/css/custom.css @@ -1060,4 +1060,57 @@ li>a.code-sample-link.reference.internal { li>a.code-sample-link.reference.internal.current { text-decoration: underline; -} \ No newline at end of file +} + +/* Board overview "card" on board documentation pages */ +.sidebar.board-overview { + border-radius: 12px; + padding: 0px; + background: var(--admonition-note-background-color); + color: var(--admonition-note-title-color); + border-color: var(--admonition-note-title-background-color); +} + +@media screen and (max-width: 480px) { + .sidebar.board-overview { + float: none; + margin-left: 0; + } +} + +.sidebar.board-overview .sidebar-title { + font-family: var(--header-font-family); + background: var(--admonition-note-title-background-color); + color: var(--admonition-note-title-color); + border-radius: 12px 12px 0px 0px; + margin: 0px; + text-align: center; +} + +.sidebar.board-overview * { + color: var(--admonition-note-color); +} + +.sidebar.board-overview figure { + padding: 1rem; + margin-bottom: -1rem; +} + +.sidebar.board-overview figure img { + height: auto !important; +} + +.sidebar.board-overview figure figcaption p { + margin-bottom: 0px; +} + +.sidebar.board-overview dl.field-list { + align-items: center; + margin-top: 12px !important; + margin-bottom: 12px !important; + grid-template-columns: auto 1fr !important; +} + +.sidebar.board-overview dl.field-list > dt { + background: transparent !important; +} diff --git a/doc/contribute/documentation/guidelines.rst b/doc/contribute/documentation/guidelines.rst index 6012d3230ea8c..96dda3660e2e1 100644 --- a/doc/contribute/documentation/guidelines.rst +++ b/doc/contribute/documentation/guidelines.rst @@ -1184,6 +1184,31 @@ Code samples Boards ====== +.. rst:directive:: .. zephyr:board:: name + + This directive is used at the beginning of a document to indicate it is the main documentation + page for a board whose name is given as the directive argument. + + For example:: + + .. zephyr:board:: wio_terminal + + The metadata for the board is read from various config files and used to automatically populate + some sections of the board documentation. A board documentation page that uses this directive + can be linked to using the :rst:role:`zephyr:board` role. + +.. rst:role:: zephyr:board + + This role is used to reference a board documented using :rst:dir:`zephyr:board`. + + For example:: + + Check out :zephyr:board:`wio_terminal` for more information. + + Will render as: + + Check out :zephyr:board:`wio_terminal` for more information. + .. rst:directive:: .. zephyr:board-catalog:: This directive is used to generate a catalog of Zephyr-supported boards that can be used to diff --git a/doc/releases/release-notes-3.7.rst b/doc/releases/release-notes-3.7.rst index a8da5a5681304..8519e0a250acf 100644 --- a/doc/releases/release-notes-3.7.rst +++ b/doc/releases/release-notes-3.7.rst @@ -410,7 +410,7 @@ Boards & SoC Support * Added support for :ref:`Ambiq Apollo3 Blue board `: ``apollo3_evb``. * Added support for :ref:`Ambiq Apollo3 Blue Plus board `: ``apollo3p_evb``. * Added support for :ref:`Raspberry Pi 5 board `: ``rpi_5``. - * Added support for :ref:`Seeed Studio XIAO RP2040 board `: ``xiao_rp2040``. + * Added support for :zephyr:board:`Seeed Studio XIAO RP2040 board `: ``xiao_rp2040``. * Added support for :ref:`Mikroe RA4M1 Clicker board `: ``mikroe_clicker_ra4m1``. * Added support for :ref:`Arduino UNO R4 WiFi board `: ``arduino_uno_r4_wifi``. * Added support for :ref:`Renesas EK-RA8M1 board `: ``ek_ra8m1``. @@ -834,15 +834,15 @@ Drivers and Sensors * Added support for Ambiq Apollo3 series. * Added support for multiple instances of the SPI NOR driver (spi_nor.c). * Added preliminary support for non-erase devices with introduction of - device capabilities to c:struct:`flash_parameters` and the utility function - c:func:`flash_params_get_erase_cap` that allows to obtain the erase type - provided by a device; added c:macro:`FLASH_ERASE_C_EXPLICIT`, which is + device capabilities to :c:struct:`flash_parameters` and the utility function + :c:func:`flash_params_get_erase_cap` that allows to obtain the erase type + provided by a device; added :c:macro:`FLASH_ERASE_C_EXPLICIT`, which is currently the only supported erase type and is set by all flash devices. - * Added the c:func:`flash_flatten` function that can be used on devices, + * Added the :c:func:`flash_flatten` function that can be used on devices, with or without erase requirement, when erase has been used not for preparing a device for a random data write, but rather to remove/scramble data from that device. - * Added the c:func:`flash_fill` utility function which allows to write + * Added the :c:func:`flash_fill` utility function which allows to write a single value across a provided range in a selected device. * Added support for RRAM on nrf54l15 devices. * Added support of non busy wait polling in STM32 OSPI driver. @@ -868,7 +868,7 @@ Drivers and Sensors * Added support for Ambiq Apollo3 series. * Added Broadcom Set-top box(brcmstb) SoC GPIO driver. - * Added c:macro:`STM32_GPIO_WKUP` flag which allows to configure specific pins as wakeup source + * Added :c:macro:`STM32_GPIO_WKUP` flag which allows to configure specific pins as wakeup source from Power Off state on STM32 L4, U5, WB, & WL SoC series. * Added driver for Analog Devices MAX32 SoC series. * Added support for Nuvoton Numaker M2L31X series. @@ -1047,7 +1047,7 @@ Drivers and Sensors * Added support for STM32H7R/S series. * Added a Add QTMR PWM driver for NXP imxrt11xx * Made the NXP MCUX PWM driver thread safe - * Fix zephyr:code-sample:`pwm-blinky` code sample to demonstrate PWM support for + * Fix :zephyr:code-sample:`pwm-blinky` code sample to demonstrate PWM support for :ref:`beagleconnect_freedom`. * Added driver for ENE KB1200. * Added support for Nordic nRF54H and nRF54L Series SoCs. @@ -1403,7 +1403,7 @@ Networking * Implemented IPv6 Privacy Extensions according to RFC 8981. * Added :c:func:`net_ipv6_is_private_addr` API function. * Implemented reachability hint for IPv6. Upper layers can use - c:func:`net_if_nbr_reachability_hint` to report Neighbor reachability and + :c:func:`net_if_nbr_reachability_hint` to report Neighbor reachability and avoid unnecessary Neighbor Discovery solicitations. * Added :kconfig:option:`CONFIG_NET_IPV6_MTU` allowing to set custom IPv6 MTU. * Added :kconfig:option:`CONFIG_NET_MCAST_ROUTE_MAX_IFACES` which allows to set diff --git a/doc/templates/board.tmpl b/doc/templates/board.tmpl index 3650699aac515..96201094eed29 100644 --- a/doc/templates/board.tmpl +++ b/doc/templates/board.tmpl @@ -1,20 +1,16 @@ -.. _boardname_linkname: +.. zephyr:board:: board_name -[Board Name] -############# +.. To ensure the board documentation page displays correctly, it is highly + recommended to include a picture alongside the documentation page. + + The picture should be named after the board (e.g., "board_name.webp") + and preferably be in webp format. Alternatively, png or jpg formats + are also accepted. Overview ******** [A short description about the board, its main features and availability] - -.. figure:: board_name.png - :width: 800px - :align: center - :alt: Board Name - - Board Name (Credit: ) - Hardware ******** [General Hardware information] diff --git a/samples/subsys/display/lvgl/README.rst b/samples/subsys/display/lvgl/README.rst index 259413c4ac30b..7858e09409cc8 100644 --- a/samples/subsys/display/lvgl/README.rst +++ b/samples/subsys/display/lvgl/README.rst @@ -41,7 +41,7 @@ for corresponding connectors, for example: - :ref:`adafruit_2_8_tft_touch_v2` and :ref:`nrf52840dk_nrf52840` - :ref:`buydisplay_2_8_tft_touch_arduino` and :ref:`nrf52840dk_nrf52840` - :ref:`ssd1306_128_shield` and :ref:`frdm_k64f` -- :ref:`seeed_xiao_round_display` and :ref:`xiao_ble` +- :ref:`seeed_xiao_round_display` and :zephyr:board:`xiao_ble` or a board with an integrated display: