From e4300b155170104f6dee82a9df67f5be25973498 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Thu, 13 Sep 2018 11:02:11 +0200 Subject: [PATCH 01/20] cmake: Add zephyr base address when looking file into soc/ When checking availability of soc/${ARCH}/CMakeLists.txt, we should use ${ZEPHYR_BASE} as path base. Fixes #9956 Signed-off-by: Erwan Gouriou --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 226d834181bc..b55df69f0064 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,7 +336,7 @@ add_subdirectory(misc) # property which is set implicitly for custom command outputs include(misc/generated/CMakeLists.txt) -if(EXISTS soc/${ARCH}/CMakeLists.txt) +if(EXISTS ${ZEPHYR_BASE}/soc/${ARCH}/CMakeLists.txt) add_subdirectory(${SOC_DIR}/${ARCH} soc/${ARCH}) else() add_subdirectory(${SOC_DIR}/${ARCH}/${SOC_PATH} soc/${ARCH}/${SOC_PATH}) From 7bacaa7a3d6c801c11571e7e82f1a74357b03e1e Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Mon, 20 Aug 2018 13:45:55 +0200 Subject: [PATCH 02/20] dts/bindings: Add 'generation' directive on for 'compatible' property Add 'generation: define' directive to 'compatible' property. When existing for a type of device, move compatible property description in device base structure (eg: i2c.yaml) Signed-off-by: Erwan Gouriou --- dts/bindings/arc/arc,dccm.yaml | 1 + dts/bindings/arc/arc,iccm.yaml | 1 + dts/bindings/arm/atmel,sam0-sercom.yaml | 1 + dts/bindings/arm/nxp,kinetis-sim.yaml | 1 + dts/bindings/arm/nxp,lpc-mailbox.yaml | 1 + dts/bindings/arm/st,stm32-ccm.yaml | 20 +++++++++---------- dts/bindings/arm/ti,cc2650-prcm.yaml | 1 + dts/bindings/can/can-device.yaml | 1 + dts/bindings/can/can.yaml | 5 +++++ dts/bindings/can/st,stm32-can.yaml | 3 --- dts/bindings/clock/nxp,imx-ccm.yaml | 1 + dts/bindings/clock/st,stm32-rcc.yaml | 1 + dts/bindings/device_node.yaml.template | 1 + dts/bindings/gpio/arm,cmsdk-gpio.yaml | 1 + dts/bindings/gpio/atmel,sam0-gpio.yaml | 1 + dts/bindings/gpio/atmel.sam-gpio.yaml | 1 + dts/bindings/gpio/gpio-keys.yaml | 1 + dts/bindings/gpio/gpio-leds.yaml | 1 + dts/bindings/gpio/intel,qmsi-gpio.yaml | 3 ++- dts/bindings/gpio/intel,qmsi-ss-gpio.yaml | 3 ++- dts/bindings/gpio/nordic,nrf-gpio.yaml | 5 +++-- dts/bindings/gpio/nordic,nrf-gpiote.yaml | 5 +++-- dts/bindings/gpio/nxp,imx-gpio.yaml | 1 + dts/bindings/gpio/nxp,kinetis-gpio.yaml | 1 + dts/bindings/gpio/semtech,sx1509b-gpio.yaml | 1 - dts/bindings/gpio/snps,designware-gpio.yaml | 3 ++- dts/bindings/gpio/st,stm32-gpio.yaml | 1 + dts/bindings/gpio/ti,cc2650-gpio.yaml | 1 + dts/bindings/i2c/arm,versatile-i2c.yaml | 3 --- dts/bindings/i2c/atmel,sam-i2c-twi.yaml | 3 --- dts/bindings/i2c/atmel,sam-i2c-twihs.yaml | 3 --- dts/bindings/i2c/fsl,imx7d-i2c.yaml | 3 --- dts/bindings/i2c/i2c-device.yaml | 1 + dts/bindings/i2c/i2c.yaml | 5 +++++ dts/bindings/i2c/intel,qmsi-i2c.yaml | 3 --- dts/bindings/i2c/intel,qmsi-ss-i2c.yaml | 3 --- dts/bindings/i2c/nxp,kinetis-i2c.yaml | 3 --- dts/bindings/i2c/snps,designware-i2c.yaml | 3 --- dts/bindings/i2c/st,stm32-i2c-v1.yaml | 3 --- dts/bindings/i2c/st,stm32-i2c-v2.yaml | 3 --- dts/bindings/i2c/ti,cc32xx-i2c.yaml | 3 --- dts/bindings/iio/adc/adc.yaml | 6 ++++++ dts/bindings/iio/adc/nxp,kinetis-adc16.yaml | 3 --- .../interrupt-controller/arm,v6m-nvic.yaml | 1 + .../interrupt-controller/arm,v7m-nvic.yaml | 1 + .../interrupt-controller/arm,v8m-nvic.yaml | 1 + .../interrupt-controller/intel,cavs-intc.yaml | 1 + .../interrupt-controller/intel,ioapic.yaml | 1 + .../interrupt-controller/intel,mvic.yaml | 1 + .../interrupt-controller/snps,arcv2-intc.yaml | 1 + .../snps,designware-intc.yaml | 1 + .../interrupt-controller/xtensa,intc.yaml | 1 + dts/bindings/led/nxp,pca9633.yaml | 3 --- dts/bindings/led/ti,lp3943.yaml | 3 --- dts/bindings/led_strip/apa,apa-102.yaml | 3 --- .../memory-controllers/nxp,imx-semc.yaml | 1 + dts/bindings/modem/wnc,m14a2a.yaml | 1 + dts/bindings/mtd/partition.yaml | 1 + dts/bindings/mtd/soc-nv-flash.yaml | 1 + dts/bindings/pinctrl/atmel,sam0-pinmux.yaml | 1 + dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml | 1 + dts/bindings/pinctrl/st,stm32-pinmux.yaml | 1 + dts/bindings/pinctrl/ti,cc2650-pinmux.yaml | 1 + dts/bindings/pwm/fsl,imx7d-pwm.yaml | 3 --- dts/bindings/pwm/nxp,kinetis-ftm.yaml | 3 --- dts/bindings/pwm/pwm.yaml | 6 ++++++ dts/bindings/pwm/st,stm32-pwm.yaml | 3 --- dts/bindings/rtc/intel,qmsi-rtc.yaml | 3 --- dts/bindings/rtc/nxp,kinetis-rtc.yaml | 3 --- dts/bindings/rtc/rtc.yaml | 5 +++++ dts/bindings/serial/altera,jtag-uart.yaml | 3 --- dts/bindings/serial/arm,cmsdk-uart.yaml | 3 --- dts/bindings/serial/atmel,sam-uart.yaml | 3 --- dts/bindings/serial/atmel,sam-usart.yaml | 3 --- dts/bindings/serial/atmel,sam0-uart.yaml | 3 --- dts/bindings/serial/intel,qmsi-uart.yaml | 3 --- dts/bindings/serial/nordic,nrf-uart.yaml | 3 --- dts/bindings/serial/nordic,nrf-uarte.yaml | 3 --- dts/bindings/serial/ns16550.yaml | 3 --- dts/bindings/serial/nxp,imx-uart.yaml | 3 --- dts/bindings/serial/nxp,kinetis-lpsci.yaml | 3 --- dts/bindings/serial/nxp,kinetis-lpuart.yaml | 3 --- dts/bindings/serial/nxp,kinetis-uart.yaml | 3 --- dts/bindings/serial/nxp,lpc-usart.yaml | 3 --- dts/bindings/serial/riscv,qemu-uart.yaml | 3 --- dts/bindings/serial/silabs,efm32-uart.yaml | 3 --- dts/bindings/serial/silabs,efm32-usart.yaml | 3 --- dts/bindings/serial/st,stm32-lpuart.yaml | 3 --- dts/bindings/serial/st,stm32-uart.yaml | 3 --- dts/bindings/serial/st,stm32-usart.yaml | 3 --- dts/bindings/serial/ti,cc32xx-uart.yaml | 3 --- dts/bindings/serial/ti,msp432p4xx-uart.yaml | 3 --- dts/bindings/serial/ti,stellaris-uart.yaml | 3 --- dts/bindings/serial/uart-device.yaml | 1 + dts/bindings/serial/uart.yaml | 5 +++++ dts/bindings/spi/atmel,sam0-spi.yaml | 3 --- dts/bindings/spi/nxp,imx-flexspi.yaml | 3 --- dts/bindings/spi/nxp,kinetis-dspi.yaml | 3 --- dts/bindings/spi/snps,designware-spi.yaml | 3 --- dts/bindings/spi/spi-device.yaml | 1 + dts/bindings/spi/spi.yaml | 5 +++++ dts/bindings/spi/st,stm32-spi-fifo.yaml | 3 --- dts/bindings/spi/st,stm32-spi.yaml | 3 --- dts/bindings/timer/arm,cmsdk-dtimer.yaml | 1 + dts/bindings/timer/arm,cmsdk-timer.yaml | 1 + dts/bindings/timer/st,stm32-timers.yaml | 1 + dts/bindings/usb/usb.yaml | 1 + dts/bindings/watchdog/arm,cmsdk-watchdog.yaml | 1 + .../watchdog/atmel,sam0-watchdog.yaml | 1 + .../watchdog/nordic,nrf-watchdog.yaml | 1 + dts/bindings/watchdog/nxp,kinetis-wdog.yaml | 1 + 111 files changed, 106 insertions(+), 168 deletions(-) diff --git a/dts/bindings/arc/arc,dccm.yaml b/dts/bindings/arc/arc,dccm.yaml index 6cd1a790fb7b..f7214ee5cafd 100644 --- a/dts/bindings/arc/arc,dccm.yaml +++ b/dts/bindings/arc/arc,dccm.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "arc,dccm" + generation: define reg: type: array diff --git a/dts/bindings/arc/arc,iccm.yaml b/dts/bindings/arc/arc,iccm.yaml index 5183e08b9b66..f37b44992807 100644 --- a/dts/bindings/arc/arc,iccm.yaml +++ b/dts/bindings/arc/arc,iccm.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "arc,iccm" + generation: define reg: type: array diff --git a/dts/bindings/arm/atmel,sam0-sercom.yaml b/dts/bindings/arm/atmel,sam0-sercom.yaml index 95ecb140372a..f34dc4b8020d 100644 --- a/dts/bindings/arm/atmel,sam0-sercom.yaml +++ b/dts/bindings/arm/atmel,sam0-sercom.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "atmel,sam0-sercom" + generation: define reg: type: array diff --git a/dts/bindings/arm/nxp,kinetis-sim.yaml b/dts/bindings/arm/nxp,kinetis-sim.yaml index 4bd8cd649a77..7fe3cb66b39b 100644 --- a/dts/bindings/arm/nxp,kinetis-sim.yaml +++ b/dts/bindings/arm/nxp,kinetis-sim.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nxp,kinetis-sim" + generation: define reg: type: int diff --git a/dts/bindings/arm/nxp,lpc-mailbox.yaml b/dts/bindings/arm/nxp,lpc-mailbox.yaml index d2b9dca96d6f..6294218bbfbb 100644 --- a/dts/bindings/arm/nxp,lpc-mailbox.yaml +++ b/dts/bindings/arm/nxp,lpc-mailbox.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nxp,lpc-mailbox" + generation: define reg: type: array diff --git a/dts/bindings/arm/st,stm32-ccm.yaml b/dts/bindings/arm/st,stm32-ccm.yaml index f39ee5327e43..1ec102986926 100644 --- a/dts/bindings/arm/st,stm32-ccm.yaml +++ b/dts/bindings/arm/st,stm32-ccm.yaml @@ -8,19 +8,19 @@ description: > This binding gives a base representation of the STM32 CCM (Core Coupled Memory) properties: - compatible: - type: string - category: required - constraint: "st,stm32-ccm" + compatible: + type: string + category: required + constraint: "st,stm32-ccm" + generation: define - reg: - type: int - description: mmio register space - generation: define - category: required + reg: + type: int + description: mmio register space + generation: define + category: required base_label: CCM use-property-label: yes ... - diff --git a/dts/bindings/arm/ti,cc2650-prcm.yaml b/dts/bindings/arm/ti,cc2650-prcm.yaml index 68f8b35fd5fb..04959a06f037 100644 --- a/dts/bindings/arm/ti,cc2650-prcm.yaml +++ b/dts/bindings/arm/ti,cc2650-prcm.yaml @@ -13,6 +13,7 @@ properties: category: required description: compatible strings constraint: "ti,cc2650-prcm" + generation: define reg: type: array diff --git a/dts/bindings/can/can-device.yaml b/dts/bindings/can/can-device.yaml index 980f4b9ae59d..851d7f915f8a 100644 --- a/dts/bindings/can/can-device.yaml +++ b/dts/bindings/can/can-device.yaml @@ -19,6 +19,7 @@ properties: type: string category: required description: compatible strings + generation: define reg: type: array description: register base address diff --git a/dts/bindings/can/can.yaml b/dts/bindings/can/can.yaml index d490304b9a7f..abf7e2f83772 100644 --- a/dts/bindings/can/can.yaml +++ b/dts/bindings/can/can.yaml @@ -10,6 +10,11 @@ child: bus: can properties: + compatible: + type: string + category: required + description: compatible strings + generation: define "#address-cells": type: int category: required diff --git a/dts/bindings/can/st,stm32-can.yaml b/dts/bindings/can/st,stm32-can.yaml index 93425f993f82..ea9cb3fd30fc 100644 --- a/dts/bindings/can/st,stm32-can.yaml +++ b/dts/bindings/can/st,stm32-can.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-can" reg: diff --git a/dts/bindings/clock/nxp,imx-ccm.yaml b/dts/bindings/clock/nxp,imx-ccm.yaml index c176e0da5148..e7fe2599f78f 100644 --- a/dts/bindings/clock/nxp,imx-ccm.yaml +++ b/dts/bindings/clock/nxp,imx-ccm.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nxp,imx-ccm" + generation: define reg: type: int diff --git a/dts/bindings/clock/st,stm32-rcc.yaml b/dts/bindings/clock/st,stm32-rcc.yaml index 2e93da9ac83e..bed7f91bff48 100644 --- a/dts/bindings/clock/st,stm32-rcc.yaml +++ b/dts/bindings/clock/st,stm32-rcc.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "st,stm32-rcc" + generation: define reg: type: array diff --git a/dts/bindings/device_node.yaml.template b/dts/bindings/device_node.yaml.template index bb6d77517352..1d0e6851b3fa 100644 --- a/dts/bindings/device_node.yaml.template +++ b/dts/bindings/device_node.yaml.template @@ -37,6 +37,7 @@ properties: category: required type: string description: compatible of node + generation: define # reg is used to denote mmio registers reg: diff --git a/dts/bindings/gpio/arm,cmsdk-gpio.yaml b/dts/bindings/gpio/arm,cmsdk-gpio.yaml index cf8fcd079589..46c180b0e3ed 100644 --- a/dts/bindings/gpio/arm,cmsdk-gpio.yaml +++ b/dts/bindings/gpio/arm,cmsdk-gpio.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "arm,cmsdk-gpio" + generation: define reg: type: array diff --git a/dts/bindings/gpio/atmel,sam0-gpio.yaml b/dts/bindings/gpio/atmel,sam0-gpio.yaml index 817c94e3d7a6..90235b63c713 100644 --- a/dts/bindings/gpio/atmel,sam0-gpio.yaml +++ b/dts/bindings/gpio/atmel,sam0-gpio.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "atmel,sam0-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/atmel.sam-gpio.yaml b/dts/bindings/gpio/atmel.sam-gpio.yaml index 8ebf12e2ce69..ee433bd4d2cd 100644 --- a/dts/bindings/gpio/atmel.sam-gpio.yaml +++ b/dts/bindings/gpio/atmel.sam-gpio.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "atmel,sam-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/gpio-keys.yaml b/dts/bindings/gpio/gpio-keys.yaml index 3e25bccc1607..f11559b3e985 100644 --- a/dts/bindings/gpio/gpio-keys.yaml +++ b/dts/bindings/gpio/gpio-keys.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "gpio-keys" + generation: define gpios: type: compound diff --git a/dts/bindings/gpio/gpio-leds.yaml b/dts/bindings/gpio/gpio-leds.yaml index 042fa0368660..306deffeed5f 100644 --- a/dts/bindings/gpio/gpio-leds.yaml +++ b/dts/bindings/gpio/gpio-leds.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "gpio-leds" + generation: define gpios: type: compound diff --git a/dts/bindings/gpio/intel,qmsi-gpio.yaml b/dts/bindings/gpio/intel,qmsi-gpio.yaml index d0af21553d93..e03101b3816a 100644 --- a/dts/bindings/gpio/intel,qmsi-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-gpio.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "intel,qmsi-gpio" + generation: define reg: type: int @@ -41,4 +42,4 @@ cell_string: GPIO "#cells": - pin - flags -... \ No newline at end of file +... diff --git a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml index daf2c4cda8c1..c2c518385592 100644 --- a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "intel,qmsi-ss-gpio" + generation: define reg: type: int @@ -41,4 +42,4 @@ cell_string: GPIO "#cells": - pin - flags -... \ No newline at end of file +... diff --git a/dts/bindings/gpio/nordic,nrf-gpio.yaml b/dts/bindings/gpio/nordic,nrf-gpio.yaml index 25cf80222b91..e8145910b653 100644 --- a/dts/bindings/gpio/nordic,nrf-gpio.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpio.yaml @@ -4,12 +4,12 @@ # SPDX-License-Identifier: Apache-2.0 # --- -title: nRF GPIO +title: NRF5 GPIO id: nordic,nrf-gpio version: 0.1 description: > - This is a representation of the nRF GPIO nodes + This is a representation of the NRF GPIO nodes properties: compatible: @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nordic,nrf-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/nordic,nrf-gpiote.yaml b/dts/bindings/gpio/nordic,nrf-gpiote.yaml index 28eb7702cba1..223674d9c215 100644 --- a/dts/bindings/gpio/nordic,nrf-gpiote.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpiote.yaml @@ -4,12 +4,12 @@ # SPDX-License-Identifier: Apache-2.0 # --- -title: nRF GPIOTE +title: NRF5 GPIOTE id: nordic,nrf-gpiote version: 0.1 description: > - This is a representation of the nRF GPIOTE node + This is a representation of the NRF GPIOTE node properties: compatible: @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nordic,nrf-gpiote" + generation: define reg: type: int diff --git a/dts/bindings/gpio/nxp,imx-gpio.yaml b/dts/bindings/gpio/nxp,imx-gpio.yaml index 8867b4ad9063..517cb859679a 100644 --- a/dts/bindings/gpio/nxp,imx-gpio.yaml +++ b/dts/bindings/gpio/nxp,imx-gpio.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nxp,imx-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/nxp,kinetis-gpio.yaml b/dts/bindings/gpio/nxp,kinetis-gpio.yaml index c6f032961d1e..a4057a4d1c7c 100644 --- a/dts/bindings/gpio/nxp,kinetis-gpio.yaml +++ b/dts/bindings/gpio/nxp,kinetis-gpio.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "nxp,kinetis-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/semtech,sx1509b-gpio.yaml b/dts/bindings/gpio/semtech,sx1509b-gpio.yaml index 70b4fb3d4d3a..b0cfca0b6334 100644 --- a/dts/bindings/gpio/semtech,sx1509b-gpio.yaml +++ b/dts/bindings/gpio/semtech,sx1509b-gpio.yaml @@ -17,5 +17,4 @@ inherits: properties: compatible: constraint: "semtech,sx1509b" - ... diff --git a/dts/bindings/gpio/snps,designware-gpio.yaml b/dts/bindings/gpio/snps,designware-gpio.yaml index f732f6358212..4fe11d98100e 100644 --- a/dts/bindings/gpio/snps,designware-gpio.yaml +++ b/dts/bindings/gpio/snps,designware-gpio.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "snps,designware-gpio" + generation: define reg: type: int @@ -47,4 +48,4 @@ cell_string: GPIO "#cells": - pin - flags -... \ No newline at end of file +... diff --git a/dts/bindings/gpio/st,stm32-gpio.yaml b/dts/bindings/gpio/st,stm32-gpio.yaml index 36b824a3a649..3cffa44f307c 100644 --- a/dts/bindings/gpio/st,stm32-gpio.yaml +++ b/dts/bindings/gpio/st,stm32-gpio.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "st,stm32-gpio" + generation: define reg: type: int diff --git a/dts/bindings/gpio/ti,cc2650-gpio.yaml b/dts/bindings/gpio/ti,cc2650-gpio.yaml index 2c163e5afc6a..cf3519fb4fff 100644 --- a/dts/bindings/gpio/ti,cc2650-gpio.yaml +++ b/dts/bindings/gpio/ti,cc2650-gpio.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "ti,cc2650-gpio" + generation: define reg: type: int diff --git a/dts/bindings/i2c/arm,versatile-i2c.yaml b/dts/bindings/i2c/arm,versatile-i2c.yaml index a59a3f2330bc..250738bc45e5 100644 --- a/dts/bindings/i2c/arm,versatile-i2c.yaml +++ b/dts/bindings/i2c/arm,versatile-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "arm,versatile-i2c" reg: diff --git a/dts/bindings/i2c/atmel,sam-i2c-twi.yaml b/dts/bindings/i2c/atmel,sam-i2c-twi.yaml index 1a8f53d7cf9f..7e42eb5b5fac 100644 --- a/dts/bindings/i2c/atmel,sam-i2c-twi.yaml +++ b/dts/bindings/i2c/atmel,sam-i2c-twi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam-i2c-twi" reg: diff --git a/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml b/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml index e4e660488b8f..646d857ee857 100644 --- a/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml +++ b/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam-i2c-twihs" reg: diff --git a/dts/bindings/i2c/fsl,imx7d-i2c.yaml b/dts/bindings/i2c/fsl,imx7d-i2c.yaml index fd9e9e86e09e..d46ed989b9de 100644 --- a/dts/bindings/i2c/fsl,imx7d-i2c.yaml +++ b/dts/bindings/i2c/fsl,imx7d-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "fsl,imx7d-i2c" reg: diff --git a/dts/bindings/i2c/i2c-device.yaml b/dts/bindings/i2c/i2c-device.yaml index 8e8b61a1f1ee..6de235b63c73 100644 --- a/dts/bindings/i2c/i2c-device.yaml +++ b/dts/bindings/i2c/i2c-device.yaml @@ -19,6 +19,7 @@ properties: type: string category: required description: compatible strings + generation: define reg: type: array description: address on i2c bus diff --git a/dts/bindings/i2c/i2c.yaml b/dts/bindings/i2c/i2c.yaml index 664a7346e1f6..d43af5ad7b90 100644 --- a/dts/bindings/i2c/i2c.yaml +++ b/dts/bindings/i2c/i2c.yaml @@ -15,6 +15,11 @@ child: bus: i2c properties: + compatible: + type: string + category: required + description: compatible strings + generation: define "#address-cells": type: int category: required diff --git a/dts/bindings/i2c/intel,qmsi-i2c.yaml b/dts/bindings/i2c/intel,qmsi-i2c.yaml index bbf195838535..f46888fe50df 100644 --- a/dts/bindings/i2c/intel,qmsi-i2c.yaml +++ b/dts/bindings/i2c/intel,qmsi-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "intel,qmsi-i2c" reg: diff --git a/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml b/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml index d572d4e58d6b..1531397d8910 100644 --- a/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml +++ b/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "intel,qmsi-ss-i2c" reg: diff --git a/dts/bindings/i2c/nxp,kinetis-i2c.yaml b/dts/bindings/i2c/nxp,kinetis-i2c.yaml index ab0ef4dea257..17f6c47c07cf 100644 --- a/dts/bindings/i2c/nxp,kinetis-i2c.yaml +++ b/dts/bindings/i2c/nxp,kinetis-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-i2c" reg: diff --git a/dts/bindings/i2c/snps,designware-i2c.yaml b/dts/bindings/i2c/snps,designware-i2c.yaml index 0058ae65bd2d..71b95b5d6b9e 100644 --- a/dts/bindings/i2c/snps,designware-i2c.yaml +++ b/dts/bindings/i2c/snps,designware-i2c.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "snps,designware-i2c" reg: diff --git a/dts/bindings/i2c/st,stm32-i2c-v1.yaml b/dts/bindings/i2c/st,stm32-i2c-v1.yaml index 14fd19e09b7c..4404731f4def 100644 --- a/dts/bindings/i2c/st,stm32-i2c-v1.yaml +++ b/dts/bindings/i2c/st,stm32-i2c-v1.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-i2c-v1" reg: diff --git a/dts/bindings/i2c/st,stm32-i2c-v2.yaml b/dts/bindings/i2c/st,stm32-i2c-v2.yaml index c2e462e13b75..632213e673ce 100644 --- a/dts/bindings/i2c/st,stm32-i2c-v2.yaml +++ b/dts/bindings/i2c/st,stm32-i2c-v2.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-i2c-v2" reg: diff --git a/dts/bindings/i2c/ti,cc32xx-i2c.yaml b/dts/bindings/i2c/ti,cc32xx-i2c.yaml index df39c7e34763..c740e6033a77 100644 --- a/dts/bindings/i2c/ti,cc32xx-i2c.yaml +++ b/dts/bindings/i2c/ti,cc32xx-i2c.yaml @@ -10,9 +10,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ti,cc32xx-i2c" reg: diff --git a/dts/bindings/iio/adc/adc.yaml b/dts/bindings/iio/adc/adc.yaml index 82496bffe770..517363f41391 100644 --- a/dts/bindings/iio/adc/adc.yaml +++ b/dts/bindings/iio/adc/adc.yaml @@ -12,6 +12,12 @@ description: > This binding gives the base structures for all ADC devices properties: + compatible: + type: string + category: required + description: compatible strings + generation: define + clocks: type: array category: required diff --git a/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml b/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml index b93e0ad13ee7..9cfff796fbca 100644 --- a/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml +++ b/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-adc16" reg: diff --git a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml index c75bd7563d40..c3cc7b8eb241 100644 --- a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml @@ -12,6 +12,7 @@ properties: type: string description: compatible strings constraint: "arm,v6m-nvic" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml index d6fede048b8b..19b347d26157 100644 --- a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml @@ -12,6 +12,7 @@ properties: type: string description: compatible strings constraint: "arm,v7m-nvic" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml index 786c4b87dc65..9b514fa16036 100644 --- a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml @@ -12,6 +12,7 @@ properties: type: string description: compatible strings constraint: "arm,v8m-nvic" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml index 93562ad32874..b2c7838bc795 100644 --- a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml +++ b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml @@ -11,6 +11,7 @@ properties: type: string description: compatible strings constraint: "intel,cavs-intc" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/intel,ioapic.yaml b/dts/bindings/interrupt-controller/intel,ioapic.yaml index 6f6504e8911b..f6524595e11b 100644 --- a/dts/bindings/interrupt-controller/intel,ioapic.yaml +++ b/dts/bindings/interrupt-controller/intel,ioapic.yaml @@ -12,6 +12,7 @@ properties: type: string description: compatible strings constraint: "intel,ioapic" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/intel,mvic.yaml b/dts/bindings/interrupt-controller/intel,mvic.yaml index 736ed6a0aaa2..c88ae1a43a85 100644 --- a/dts/bindings/interrupt-controller/intel,mvic.yaml +++ b/dts/bindings/interrupt-controller/intel,mvic.yaml @@ -12,6 +12,7 @@ properties: type: string description: compatible strings constraint: "intel,mvic" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml index 4ea7c1c7fbb8..e6783d0fecae 100644 --- a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml @@ -17,6 +17,7 @@ properties: type: string description: compatible strings constraint: "snps,arcv2-intc" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/snps,designware-intc.yaml b/dts/bindings/interrupt-controller/snps,designware-intc.yaml index 8fcef832d84c..9efa81d28fa4 100644 --- a/dts/bindings/interrupt-controller/snps,designware-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,designware-intc.yaml @@ -11,6 +11,7 @@ properties: type: string description: compatible strings constraint: "snps,designware-intc" + generation: define reg: category: required diff --git a/dts/bindings/interrupt-controller/xtensa,intc.yaml b/dts/bindings/interrupt-controller/xtensa,intc.yaml index 0825bb8438d4..2c841affacd3 100644 --- a/dts/bindings/interrupt-controller/xtensa,intc.yaml +++ b/dts/bindings/interrupt-controller/xtensa,intc.yaml @@ -11,6 +11,7 @@ properties: type: string description: compatible strings constraint: "xtensa,core-intc" + generation: define reg: category: required diff --git a/dts/bindings/led/nxp,pca9633.yaml b/dts/bindings/led/nxp,pca9633.yaml index 62a2517bb830..18d0cd711b32 100644 --- a/dts/bindings/led/nxp,pca9633.yaml +++ b/dts/bindings/led/nxp,pca9633.yaml @@ -10,8 +10,5 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,pca9633" ... diff --git a/dts/bindings/led/ti,lp3943.yaml b/dts/bindings/led/ti,lp3943.yaml index 57b8145cdbea..37d78531da6a 100644 --- a/dts/bindings/led/ti,lp3943.yaml +++ b/dts/bindings/led/ti,lp3943.yaml @@ -10,8 +10,5 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ti,lp3943" ... diff --git a/dts/bindings/led_strip/apa,apa-102.yaml b/dts/bindings/led_strip/apa,apa-102.yaml index 4ee0464fd9e6..5dea38cac7bc 100644 --- a/dts/bindings/led_strip/apa,apa-102.yaml +++ b/dts/bindings/led_strip/apa,apa-102.yaml @@ -10,8 +10,5 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "apa,apa102" ... diff --git a/dts/bindings/memory-controllers/nxp,imx-semc.yaml b/dts/bindings/memory-controllers/nxp,imx-semc.yaml index e11578f47f96..b192e857e56c 100644 --- a/dts/bindings/memory-controllers/nxp,imx-semc.yaml +++ b/dts/bindings/memory-controllers/nxp,imx-semc.yaml @@ -18,6 +18,7 @@ properties: category: required description: compatible strings constraint: "nxp,imx-semc" + generation: define reg: type: array diff --git a/dts/bindings/modem/wnc,m14a2a.yaml b/dts/bindings/modem/wnc,m14a2a.yaml index 2617aa48f5c0..6310306b6781 100644 --- a/dts/bindings/modem/wnc,m14a2a.yaml +++ b/dts/bindings/modem/wnc,m14a2a.yaml @@ -19,6 +19,7 @@ properties: type: string category: required constraint: "wnc,m14a2a" + generation: define mdm-boot-mode-sel-gpios: type: compound diff --git a/dts/bindings/mtd/partition.yaml b/dts/bindings/mtd/partition.yaml index 2e193631be1b..d34278cd9dd2 100644 --- a/dts/bindings/mtd/partition.yaml +++ b/dts/bindings/mtd/partition.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "fixed-partitions" + generation: define partition\d+: type: string diff --git a/dts/bindings/mtd/soc-nv-flash.yaml b/dts/bindings/mtd/soc-nv-flash.yaml index edd60243abf6..02b762e2a5e4 100644 --- a/dts/bindings/mtd/soc-nv-flash.yaml +++ b/dts/bindings/mtd/soc-nv-flash.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "soc-nv-flash" + generation: define label: type: string diff --git a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml index 66afb6164f58..5bd1d690e21f 100644 --- a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml +++ b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "atmel,sam0-pinmux" + generation: define reg: type: int diff --git a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml index b368eaf2dd9c..70deb3fa98e3 100644 --- a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml +++ b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "nxp,kinetis-pinmux" + generation: define reg: type: int diff --git a/dts/bindings/pinctrl/st,stm32-pinmux.yaml b/dts/bindings/pinctrl/st,stm32-pinmux.yaml index 72d6fe0d0f01..030606340c04 100644 --- a/dts/bindings/pinctrl/st,stm32-pinmux.yaml +++ b/dts/bindings/pinctrl/st,stm32-pinmux.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "st,stm32-pinmux" + generation: define reg: type: int diff --git a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml index 623bc97d7c19..24a926cc2951 100644 --- a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml +++ b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "ti,cc2650-pinmux" + generation: define reg: type: int diff --git a/dts/bindings/pwm/fsl,imx7d-pwm.yaml b/dts/bindings/pwm/fsl,imx7d-pwm.yaml index 6661771ce524..96908df14325 100644 --- a/dts/bindings/pwm/fsl,imx7d-pwm.yaml +++ b/dts/bindings/pwm/fsl,imx7d-pwm.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "fsl,imx7d-pwm" reg: diff --git a/dts/bindings/pwm/nxp,kinetis-ftm.yaml b/dts/bindings/pwm/nxp,kinetis-ftm.yaml index 1b21157fd827..04cc3a83caf7 100644 --- a/dts/bindings/pwm/nxp,kinetis-ftm.yaml +++ b/dts/bindings/pwm/nxp,kinetis-ftm.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-ftm" reg: diff --git a/dts/bindings/pwm/pwm.yaml b/dts/bindings/pwm/pwm.yaml index 91ab63137fc3..31016697c5c9 100644 --- a/dts/bindings/pwm/pwm.yaml +++ b/dts/bindings/pwm/pwm.yaml @@ -12,6 +12,12 @@ description: > This binding gives the base structures for all PWM devices properties: + compatible: + type: string + category: required + description: compatible strings + generation: define + clocks: type: array category: required diff --git a/dts/bindings/pwm/st,stm32-pwm.yaml b/dts/bindings/pwm/st,stm32-pwm.yaml index b9e9a62a2e89..f177f06d96f6 100644 --- a/dts/bindings/pwm/st,stm32-pwm.yaml +++ b/dts/bindings/pwm/st,stm32-pwm.yaml @@ -8,9 +8,6 @@ description: > properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-pwm" label: diff --git a/dts/bindings/rtc/intel,qmsi-rtc.yaml b/dts/bindings/rtc/intel,qmsi-rtc.yaml index 32b9eaa164bf..3419b6bbef37 100644 --- a/dts/bindings/rtc/intel,qmsi-rtc.yaml +++ b/dts/bindings/rtc/intel,qmsi-rtc.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "intel,qmsi-rtc" reg: diff --git a/dts/bindings/rtc/nxp,kinetis-rtc.yaml b/dts/bindings/rtc/nxp,kinetis-rtc.yaml index 6098f7f0de39..e5e5d388969e 100644 --- a/dts/bindings/rtc/nxp,kinetis-rtc.yaml +++ b/dts/bindings/rtc/nxp,kinetis-rtc.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-rtc" reg: diff --git a/dts/bindings/rtc/rtc.yaml b/dts/bindings/rtc/rtc.yaml index 36ff04bf20ff..3aee501d1873 100644 --- a/dts/bindings/rtc/rtc.yaml +++ b/dts/bindings/rtc/rtc.yaml @@ -13,6 +13,11 @@ description: > properties: + compatible: + type: string + category: required + description: compatible strings + generation: define clock-frequency: type: int category: optional diff --git a/dts/bindings/serial/altera,jtag-uart.yaml b/dts/bindings/serial/altera,jtag-uart.yaml index 3aefbe5ebd11..ebf505f64562 100644 --- a/dts/bindings/serial/altera,jtag-uart.yaml +++ b/dts/bindings/serial/altera,jtag-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "altera,jtag-uart" reg: diff --git a/dts/bindings/serial/arm,cmsdk-uart.yaml b/dts/bindings/serial/arm,cmsdk-uart.yaml index 3833699a038f..e48374cc92c9 100644 --- a/dts/bindings/serial/arm,cmsdk-uart.yaml +++ b/dts/bindings/serial/arm,cmsdk-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "arm,cmsdk-uart" reg: diff --git a/dts/bindings/serial/atmel,sam-uart.yaml b/dts/bindings/serial/atmel,sam-uart.yaml index 2a9b6a9e0a25..fefad5ba4f40 100644 --- a/dts/bindings/serial/atmel,sam-uart.yaml +++ b/dts/bindings/serial/atmel,sam-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam-uart" reg: diff --git a/dts/bindings/serial/atmel,sam-usart.yaml b/dts/bindings/serial/atmel,sam-usart.yaml index f6ba47b8e79a..1fadacd677fb 100644 --- a/dts/bindings/serial/atmel,sam-usart.yaml +++ b/dts/bindings/serial/atmel,sam-usart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam-usart" reg: diff --git a/dts/bindings/serial/atmel,sam0-uart.yaml b/dts/bindings/serial/atmel,sam0-uart.yaml index 43de0b32cd19..0cd6dd76d02a 100644 --- a/dts/bindings/serial/atmel,sam0-uart.yaml +++ b/dts/bindings/serial/atmel,sam0-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam0-uart" reg: diff --git a/dts/bindings/serial/intel,qmsi-uart.yaml b/dts/bindings/serial/intel,qmsi-uart.yaml index 76cfdadbfce6..4c66d90cfc3a 100644 --- a/dts/bindings/serial/intel,qmsi-uart.yaml +++ b/dts/bindings/serial/intel,qmsi-uart.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "intel,qmsi-uart" reg: diff --git a/dts/bindings/serial/nordic,nrf-uart.yaml b/dts/bindings/serial/nordic,nrf-uart.yaml index 4025b1651645..383167678b52 100644 --- a/dts/bindings/serial/nordic,nrf-uart.yaml +++ b/dts/bindings/serial/nordic,nrf-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nordic,nrf-uart" reg: diff --git a/dts/bindings/serial/nordic,nrf-uarte.yaml b/dts/bindings/serial/nordic,nrf-uarte.yaml index 9e18bfc6765a..260dd1509205 100644 --- a/dts/bindings/serial/nordic,nrf-uarte.yaml +++ b/dts/bindings/serial/nordic,nrf-uarte.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nordic,nrf-uarte" reg: diff --git a/dts/bindings/serial/ns16550.yaml b/dts/bindings/serial/ns16550.yaml index 26da78123513..a35b6c338557 100644 --- a/dts/bindings/serial/ns16550.yaml +++ b/dts/bindings/serial/ns16550.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ns16550" reg: diff --git a/dts/bindings/serial/nxp,imx-uart.yaml b/dts/bindings/serial/nxp,imx-uart.yaml index 9e6bdd85a16f..b10b20d38c50 100644 --- a/dts/bindings/serial/nxp,imx-uart.yaml +++ b/dts/bindings/serial/nxp,imx-uart.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,imx-uart" reg: diff --git a/dts/bindings/serial/nxp,kinetis-lpsci.yaml b/dts/bindings/serial/nxp,kinetis-lpsci.yaml index 32af1cf3bca9..4b8b21d2898f 100644 --- a/dts/bindings/serial/nxp,kinetis-lpsci.yaml +++ b/dts/bindings/serial/nxp,kinetis-lpsci.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-lpsci" reg: diff --git a/dts/bindings/serial/nxp,kinetis-lpuart.yaml b/dts/bindings/serial/nxp,kinetis-lpuart.yaml index 44da06b2ea2e..58700f130a0d 100644 --- a/dts/bindings/serial/nxp,kinetis-lpuart.yaml +++ b/dts/bindings/serial/nxp,kinetis-lpuart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-lpuart" reg: diff --git a/dts/bindings/serial/nxp,kinetis-uart.yaml b/dts/bindings/serial/nxp,kinetis-uart.yaml index e264f37de01f..9dc8309ce2f4 100644 --- a/dts/bindings/serial/nxp,kinetis-uart.yaml +++ b/dts/bindings/serial/nxp,kinetis-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-uart" reg: diff --git a/dts/bindings/serial/nxp,lpc-usart.yaml b/dts/bindings/serial/nxp,lpc-usart.yaml index a5e14ed0c3af..c2f45c34168e 100644 --- a/dts/bindings/serial/nxp,lpc-usart.yaml +++ b/dts/bindings/serial/nxp,lpc-usart.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,lpc-usart" reg: diff --git a/dts/bindings/serial/riscv,qemu-uart.yaml b/dts/bindings/serial/riscv,qemu-uart.yaml index 01c98b931f39..09b45bb20ab4 100644 --- a/dts/bindings/serial/riscv,qemu-uart.yaml +++ b/dts/bindings/serial/riscv,qemu-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "riscv,qemu-uart" reg: diff --git a/dts/bindings/serial/silabs,efm32-uart.yaml b/dts/bindings/serial/silabs,efm32-uart.yaml index c23857476e11..545dbdc96433 100644 --- a/dts/bindings/serial/silabs,efm32-uart.yaml +++ b/dts/bindings/serial/silabs,efm32-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "silabs,efm32-uart" reg: diff --git a/dts/bindings/serial/silabs,efm32-usart.yaml b/dts/bindings/serial/silabs,efm32-usart.yaml index 7da6bde7030a..5b32aea2ed84 100644 --- a/dts/bindings/serial/silabs,efm32-usart.yaml +++ b/dts/bindings/serial/silabs,efm32-usart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "silabs,efm32-usart" reg: diff --git a/dts/bindings/serial/st,stm32-lpuart.yaml b/dts/bindings/serial/st,stm32-lpuart.yaml index 2e23737fdb54..191765347f87 100644 --- a/dts/bindings/serial/st,stm32-lpuart.yaml +++ b/dts/bindings/serial/st,stm32-lpuart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-lpuart" reg: diff --git a/dts/bindings/serial/st,stm32-uart.yaml b/dts/bindings/serial/st,stm32-uart.yaml index 5b5fae66d9dd..efe7343bdd26 100644 --- a/dts/bindings/serial/st,stm32-uart.yaml +++ b/dts/bindings/serial/st,stm32-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-uart" reg: diff --git a/dts/bindings/serial/st,stm32-usart.yaml b/dts/bindings/serial/st,stm32-usart.yaml index ee09aea9d7a2..c92b638d01af 100644 --- a/dts/bindings/serial/st,stm32-usart.yaml +++ b/dts/bindings/serial/st,stm32-usart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-usart" reg: diff --git a/dts/bindings/serial/ti,cc32xx-uart.yaml b/dts/bindings/serial/ti,cc32xx-uart.yaml index 06b75c93d84f..94b5d2606042 100644 --- a/dts/bindings/serial/ti,cc32xx-uart.yaml +++ b/dts/bindings/serial/ti,cc32xx-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ti,cc32xx-uart" reg: diff --git a/dts/bindings/serial/ti,msp432p4xx-uart.yaml b/dts/bindings/serial/ti,msp432p4xx-uart.yaml index 89be9677c3f8..590ab433c2b2 100644 --- a/dts/bindings/serial/ti,msp432p4xx-uart.yaml +++ b/dts/bindings/serial/ti,msp432p4xx-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ti,msp432p4xx-uart" reg: diff --git a/dts/bindings/serial/ti,stellaris-uart.yaml b/dts/bindings/serial/ti,stellaris-uart.yaml index abb20a6f920c..64f8c01dec92 100644 --- a/dts/bindings/serial/ti,stellaris-uart.yaml +++ b/dts/bindings/serial/ti,stellaris-uart.yaml @@ -11,9 +11,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "ti,stellaris-uart" reg: diff --git a/dts/bindings/serial/uart-device.yaml b/dts/bindings/serial/uart-device.yaml index 68c18ca0fdb9..e6899374650c 100644 --- a/dts/bindings/serial/uart-device.yaml +++ b/dts/bindings/serial/uart-device.yaml @@ -19,6 +19,7 @@ properties: type: string category: required description: compatible strings + generation: define label: type: string category: required diff --git a/dts/bindings/serial/uart.yaml b/dts/bindings/serial/uart.yaml index 195f40636b7a..8bb152132e5c 100644 --- a/dts/bindings/serial/uart.yaml +++ b/dts/bindings/serial/uart.yaml @@ -10,6 +10,11 @@ child: bus: uart properties: + compatible: + type: string + category: required + description: compatible strings + generation: define clock-frequency: type: int category: optional diff --git a/dts/bindings/spi/atmel,sam0-spi.yaml b/dts/bindings/spi/atmel,sam0-spi.yaml index 3e21eb0ef46f..d6fc09a65e4d 100644 --- a/dts/bindings/spi/atmel,sam0-spi.yaml +++ b/dts/bindings/spi/atmel,sam0-spi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "atmel,sam0-spi" reg: diff --git a/dts/bindings/spi/nxp,imx-flexspi.yaml b/dts/bindings/spi/nxp,imx-flexspi.yaml index db0d18bf1436..9f12a3ed1b97 100644 --- a/dts/bindings/spi/nxp,imx-flexspi.yaml +++ b/dts/bindings/spi/nxp,imx-flexspi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,imx-flexspi" reg: diff --git a/dts/bindings/spi/nxp,kinetis-dspi.yaml b/dts/bindings/spi/nxp,kinetis-dspi.yaml index 3f09560c5bbc..f9f570088dc3 100644 --- a/dts/bindings/spi/nxp,kinetis-dspi.yaml +++ b/dts/bindings/spi/nxp,kinetis-dspi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "nxp,kinetis-dspi" reg: diff --git a/dts/bindings/spi/snps,designware-spi.yaml b/dts/bindings/spi/snps,designware-spi.yaml index c80f323e004d..efd3772b4cd3 100644 --- a/dts/bindings/spi/snps,designware-spi.yaml +++ b/dts/bindings/spi/snps,designware-spi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "snps,designware-spi" reg: diff --git a/dts/bindings/spi/spi-device.yaml b/dts/bindings/spi/spi-device.yaml index 74c15c1ea8a1..5c567330b628 100644 --- a/dts/bindings/spi/spi-device.yaml +++ b/dts/bindings/spi/spi-device.yaml @@ -19,6 +19,7 @@ properties: type: string category: required description: compatible strings + generation: define reg: type: array description: Chip select address of device diff --git a/dts/bindings/spi/spi.yaml b/dts/bindings/spi/spi.yaml index 92ac952669ea..3c7a12894669 100644 --- a/dts/bindings/spi/spi.yaml +++ b/dts/bindings/spi/spi.yaml @@ -15,6 +15,11 @@ child: bus: spi properties: + compatible: + type: string + category: required + description: compatible strings + generation: define "#address-cells": type: int category: required diff --git a/dts/bindings/spi/st,stm32-spi-fifo.yaml b/dts/bindings/spi/st,stm32-spi-fifo.yaml index ceb61c44b00f..f95d882d42a7 100644 --- a/dts/bindings/spi/st,stm32-spi-fifo.yaml +++ b/dts/bindings/spi/st,stm32-spi-fifo.yaml @@ -17,9 +17,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-spi-fifo" reg: diff --git a/dts/bindings/spi/st,stm32-spi.yaml b/dts/bindings/spi/st,stm32-spi.yaml index d09d8628d6c4..32db69c0ec0b 100644 --- a/dts/bindings/spi/st,stm32-spi.yaml +++ b/dts/bindings/spi/st,stm32-spi.yaml @@ -16,9 +16,6 @@ inherits: properties: compatible: - type: string - category: required - description: compatible strings constraint: "st,stm32-spi" reg: diff --git a/dts/bindings/timer/arm,cmsdk-dtimer.yaml b/dts/bindings/timer/arm,cmsdk-dtimer.yaml index be52e78b5365..ce690c84ec96 100644 --- a/dts/bindings/timer/arm,cmsdk-dtimer.yaml +++ b/dts/bindings/timer/arm,cmsdk-dtimer.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "arm,cmsdk-dtimer" + generation: define reg: type: array diff --git a/dts/bindings/timer/arm,cmsdk-timer.yaml b/dts/bindings/timer/arm,cmsdk-timer.yaml index 74af075dfbc7..029617f73e59 100644 --- a/dts/bindings/timer/arm,cmsdk-timer.yaml +++ b/dts/bindings/timer/arm,cmsdk-timer.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "arm,cmsdk-timer" + generation: define reg: type: array diff --git a/dts/bindings/timer/st,stm32-timers.yaml b/dts/bindings/timer/st,stm32-timers.yaml index 5d92337fd3de..4b5a440dd450 100644 --- a/dts/bindings/timer/st,stm32-timers.yaml +++ b/dts/bindings/timer/st,stm32-timers.yaml @@ -21,6 +21,7 @@ properties: category: required description: compatible strings constraint: "st,stm32-timers" + generation: define label: type: string diff --git a/dts/bindings/usb/usb.yaml b/dts/bindings/usb/usb.yaml index 158f3c46daa3..de4ea84df573 100644 --- a/dts/bindings/usb/usb.yaml +++ b/dts/bindings/usb/usb.yaml @@ -16,6 +16,7 @@ properties: type: string category: required description: compatible strings + generation: define label: type: string diff --git a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml index b98699a7d831..29e9865bd22b 100644 --- a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml +++ b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "arm,cmsdk-watchdog" + generation: define reg: type: array diff --git a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml index 308b61f93f4f..21903fd79ff4 100644 --- a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml +++ b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml @@ -12,6 +12,7 @@ properties: category: required description: compatible strings constraint: "atmel,sam0-watchdog" + generation: define reg: type: int diff --git a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml index ebfabe9946b4..c069e32aebf7 100644 --- a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml +++ b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nordic,nrf-watchdog" + generation: define reg: type: int diff --git a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml index 392fcf83169f..9d7f6449a44a 100644 --- a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml +++ b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml @@ -17,6 +17,7 @@ properties: category: required description: compatible strings constraint: "nxp,kinetis-wdog" + generation: define reg: type: int From 6dc78f8fbdce0de2813080b06ca6bbd7fb3af00c Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Thu, 6 Sep 2018 14:50:24 +0200 Subject: [PATCH 03/20] scripts/dts: Introduce edts.json generation Introduce python class for extended device tree database generation and extraction. Extended device tree database is a json formatted database. It contains python like dict representation of device tree information amended with zephyr yaml bindings. Signed-off-by: Bobby Noelte --- scripts/dts/edtsdatabase.py | 220 ++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 scripts/dts/edtsdatabase.py diff --git a/scripts/dts/edtsdatabase.py b/scripts/dts/edtsdatabase.py new file mode 100644 index 000000000000..44368aca7209 --- /dev/null +++ b/scripts/dts/edtsdatabase.py @@ -0,0 +1,220 @@ +# +# Copyright (c) 2018 Bobby Noelte +# +# SPDX-License-Identifier: Apache-2.0 +# + +from collections.abc import Mapping +import json + +## +# @brief ETDS Database consumer +# +# Methods for ETDS database usage. +# +class EDTSConsumerMixin(object): + __slots__ = [] + + + ## + # @brief Generate a compatible devices dict, using "device_id" as key + # + # @param compatible + # @return dict of compatible devices + def _generate_device_dict(self, compatibles): + devices = dict() + if not isinstance(compatibles, list): + compatibles = [compatibles, ] + for compatible in compatibles: + for device_id in self._edts['compatibles'].get(compatible, []): + devices[device_id] = self._edts['devices'][device_id] + return devices + + ## + # @brief Get all activated compatible devices. + # + # @param compatibles compatible(s) + # @return list of devices that are compatible + def get_devices_by_compatible(self, compatibles): + return list(_generate_device_dict(compatibles).values()) + + ## + # @brief Get device ids of all activated compatible devices. + # + # @param compatibles compatible(s) + # @return list of device ids of activated devices that are compatible + def get_device_ids_by_compatible(self, compatibles): + return list(_generate_device_dict(compatibles).keys()) + + ## + # @brief Get device id of activated device with given label. + # + # @return device id + def get_device_id_by_label(self, label): + for device_id, device in self._edts['devices'].items(): + if label == device.get('label', None): + return device_id + return None + + ## + # @brief Get device tree property value for the device of the given device id. + # + # @param device_id + # @param property_path Path of the property to access + # (e.g. 'reg/0', 'interrupts/prio', 'device_id', ...) + # @return property value + # + def get_device_property(self, device_id, property_path, default=""): + property_value = self._edts['devices'].get(device_id, None) + property_path_elems = property_path.strip("'").split('/') + for elem_index, key in enumerate(property_path_elems): + if isinstance(property_value, dict): + property_value = property_value.get(key, None) + elif isinstance(property_value, list): + if int(key) < len(property_value): + property_value = property_value[int(key)] + else: + property_value = None + else: + property_value = None + if property_value is None: + if default == "": + default = "Device tree property {} not available in {}" \ + .format(property_path, device_id) + return default + return property_value + + def _device_properties_flattened(self, properties, path, flattened, path_prefix): + if isinstance(properties, dict): + for prop_name in properties: + super_path = "{}/{}".format(path, prop_name).strip('/') + self._device_properties_flattened(properties[prop_name], + super_path, flattened, + path_prefix) + elif isinstance(properties, list): + for i, prop in enumerate(properties): + super_path = "{}/{}".format(path, i).strip('/') + self._device_properties_flattened(prop, super_path, flattened, + path_prefix) + else: + flattened[path_prefix + path] = properties + + ## + # @brief Get the device tree properties for the device of the given device id. + # + # @param device_id + # @param path_prefix + # @return dictionary of proerty_path and property_value + def device_properties_flattened(self, device_id, path_prefix = ""): + flattened = dict() + self._device_properties_flattened(self._edts['devices'][device_id], + '', flattened, path_prefix) + return flattened + + def load(self, file_path): + with open(file_path, "r") as load_file: + self._edts = json.load(load_file) + +## +# @brief ETDS Database provider +# +# Methods for ETDS database creation. +# +class EDTSProviderMixin(object): + __slots__ = [] + + def _update_device_compatible(self, device_id, compatible): + if compatible not in self._edts['compatibles']: + self._edts['compatibles'][compatible] = list() + if device_id not in self._edts['compatibles'][compatible]: + self._edts['compatibles'][compatible].append(device_id) + self._edts['compatibles'][compatible].sort() + + ## + # @brief Insert property value for the device of the given device id. + # + # @param device_id + # @param property_path Path of the property to access + # (e.g. 'reg/0', 'interrupts/prio', 'label', ...) + # @param property_value value + # + def insert_device_property(self, device_id, property_path, property_value): + # special properties + if property_path.startswith('compatible'): + self._update_device_compatible(device_id, property_value) + + # normal property management + if device_id not in self._edts['devices']: + self._edts['devices'][device_id] = dict() + self._edts['devices'][device_id]['device-id'] = device_id + if property_path == 'device-id': + # already set + return + keys = property_path.strip("'").split('/') + property_access_point = self._edts['devices'][device_id] + for i in range(0, len(keys)): + if i < len(keys) - 1: + # there are remaining keys + if keys[i] not in property_access_point: + property_access_point[keys[i]] = dict() + property_access_point = property_access_point[keys[i]] + else: + # we have to set the property value + if keys[i] in property_access_point and \ + property_access_point[keys[i]] != property_value: + # Property is already set and we're overwiting with a new + # different value. Tigger an error + raise Exception("Overwriting edts cell {} with different value\n \ + Initial value: {} \n \ + New value: {}".format(property_access_point, + property_access_point[keys[i]], + property_value + )) + property_access_point[keys[i]] = property_value + + + def save(self, file_path): + with open(file_path, "w") as save_file: + json.dump(self._edts, save_file, indent = 4) + +## +# @brief Extended DTS database +# +# Database schema: +# +# _edts dict( +# 'devices': dict(device-id : device-struct), +# 'compatibles': dict(compatible : sorted list(device-id)), +# ... +# ) +# +# device-struct dict( +# 'device-id' : device-id, +# 'compatible' : list(compatible) or compatible, +# 'label' : label, +# property-name : property-value ... +# ) +# +# Database types: +# +# device-id: opaque id for a device (do not use for other purposes), +# compatible: any of ['st,stm32-spi-fifo', ...] - 'compatibe' from .yaml +# label: any of ['UART_0', 'SPI_11', ...] - label directive from DTS +# +class EDTSDatabase(EDTSConsumerMixin, EDTSProviderMixin, Mapping): + + def __init__(self, *args, **kw): + self._edts = dict(*args, **kw) + # setup basic database schema + for edts_key in ('devices', 'compatibles'): + if not edts_key in self._edts: + self._edts[edts_key] = dict() + + def __getitem__(self, key): + return self._edts[key] + + def __iter__(self): + return iter(self._edts) + + def __len__(self): + return len(self._edts) From 625ba1954ef57d89dab6a6cb47e42d96169e3329 Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Thu, 6 Sep 2018 10:48:43 +0200 Subject: [PATCH 04/20] scripts: extract_dts_includes.py: create EDTS database for codegen Create extended DTS database to be used by codegen and others. Signed-off-by: Bobby Noelte --- cmake/dts.cmake | 2 ++ scripts/dts/extract/edts.py | 44 +++++++++++++++++++++++++++++ scripts/dts/extract/globals.py | 2 +- scripts/dts/extract_dts_includes.py | 4 +++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 scripts/dts/extract/edts.py diff --git a/cmake/dts.cmake b/cmake/dts.cmake index f4cf47100539..a67df33d9ae1 100644 --- a/cmake/dts.cmake +++ b/cmake/dts.cmake @@ -10,6 +10,7 @@ # See ~/zephyr/doc/dts set(GENERATED_DTS_BOARD_H ${PROJECT_BINARY_DIR}/include/generated/generated_dts_board.h) set(GENERATED_DTS_BOARD_CONF ${PROJECT_BINARY_DIR}/include/generated/generated_dts_board.conf) +set(GENERATED_EDTS ${PROJECT_BINARY_DIR}/edts.json) set_ifndef(DTS_SOURCE ${BOARD_ROOT}/boards/${ARCH}/${BOARD_FAMILY}/${BOARD}.dts) set_ifndef(DTS_COMMON_OVERLAYS ${ZEPHYR_BASE}/dts/common/common.dts) set_ifndef(DTS_APP_BINDINGS ${APPLICATION_SOURCE_DIR}/dts/bindings) @@ -113,6 +114,7 @@ if(CONFIG_HAS_DTS) ${DTS_FIXUPS} --keyvalue ${GENERATED_DTS_BOARD_CONF} --include ${GENERATED_DTS_BOARD_H} + --edts ${GENERATED_EDTS} ) # Run extract_dts_includes.py to create a .conf and a header file that can be diff --git a/scripts/dts/extract/edts.py b/scripts/dts/extract/edts.py new file mode 100644 index 000000000000..02268c869af6 --- /dev/null +++ b/scripts/dts/extract/edts.py @@ -0,0 +1,44 @@ +# +# Copyright (c) 2018 Bobby Noelte +# +# SPDX-License-Identifier: Apache-2.0 +# + +from .globals import * +import edtsdatabase + +edts = edtsdatabase.EDTSDatabase() + +## +# @brief Get EDTS device id associated to node address. +# +# @return ETDS device id +def edts_device_id(node_address): + return node_address + +## +# @brief Insert device property into EDTS +# +def edts_insert_device_property(node_address, property_path, property_value): + device_id = edts_device_id(node_address) + edts.insert_device_property(device_id, property_path, property_value) + +## +# @brief Insert device parent-device property into EDTS +# +def edts_insert_device_parent_device_property(node_address): + # Check for a parent device this device is subordinated + parent_device_id = None + parent_node_address = '' + for comp in node_address.split('/')[1:-1]: + parent_node_address += '/' + comp + compatibles = reduced[parent_node_address]['props'] \ + .get('compatible', None) + if compatibles: + # there is a parent device, + # only use the ones that have a minimum control on the child + if 'simple-bus' not in compatibles: + parent_device_id = edts_device_id(parent_node_address) + if parent_device_id: + edts_insert_device_property(edts_device_id(node_address), + 'parent-device', parent_device_id) diff --git a/scripts/dts/extract/globals.py b/scripts/dts/extract/globals.py index cf59ebcacbad..ad89647c87e7 100644 --- a/scripts/dts/extract/globals.py +++ b/scripts/dts/extract/globals.py @@ -5,6 +5,7 @@ # SPDX-License-Identifier: Apache-2.0 # +import sys from collections import defaultdict # globals @@ -13,7 +14,6 @@ chosen = {} reduced = {} defs = {} -structs = {} regs_config = { 'zephyr,flash' : 'CONFIG_FLASH', diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 429352867080..513c1a1474a3 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -19,6 +19,7 @@ from devicetree import parse_file from extract.globals import * +from extract.edts import edts from extract.clocks import clocks from extract.interrupts import interrupts @@ -769,6 +770,8 @@ def parse_arguments(): parser.add_argument("-d", "--dts", nargs=1, required=True, help="DTS file") parser.add_argument("-y", "--yaml", nargs='+', required=True, help="YAML file directories, we allow multiple") + parser.add_argument("-e", "--edts", nargs=1, required=True, + help="Generate EDTS database file for the build system") parser.add_argument("-f", "--fixup", nargs='+', help="Fixup file(s), we allow multiple") parser.add_argument("-i", "--include", nargs=1, required=True, @@ -797,6 +800,7 @@ def main(): generate_keyvalue_file(args.keyvalue[0]) generate_include_file(args.include[0], args.fixup) + edts.save(args.edts[0]) if __name__ == '__main__': From dba3f36da7e5acc14693315329faee270ce653dd Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Fri, 15 Jun 2018 11:38:14 +0200 Subject: [PATCH 05/20] scripts: extract_dts_includes.py: extract compatible to EDTS database Extract compatible info and make it available by EDTS. This way the compatible info of all activated devices can be used in drivers. Signed-off-by: Bobby Noelte --- scripts/dts/extract/compatible.py | 50 +++++++++++++++++++++++++++++ scripts/dts/extract_dts_includes.py | 3 ++ 2 files changed, 53 insertions(+) create mode 100644 scripts/dts/extract/compatible.py diff --git a/scripts/dts/extract/compatible.py b/scripts/dts/extract/compatible.py new file mode 100644 index 000000000000..7bfb3bbe7013 --- /dev/null +++ b/scripts/dts/extract/compatible.py @@ -0,0 +1,50 @@ +# +# Copyright (c) 2018 Bobby Noelte +# +# SPDX-License-Identifier: Apache-2.0 +# + +from extract.globals import * +from extract.edts import * +from extract.directive import DTDirective + +## +# @brief Manage compatible directives. +# +# Handles: +# - compatible +# +# Generates in EDTS: +# - compatible/ : compatible +class DTCompatible(DTDirective): + + def __init__(self): + pass + + ## + # @brief Extract compatible + # + # @param node_address Address of node owning the + # compatible definition. + # @param yaml YAML definition for the owning node. + # @param prop compatible property name + # @param names (unused) + # @param def_label Define label string of node owning the + # compatible definition. + # + def extract(self, node_address, yaml, prop, names, def_label): + + # compatible definition + compatible = reduced[node_address]['props'][prop] + if not isinstance(compatible, list): + compatible = [compatible, ] + + # generate EDTS + device_id = edts_device_id(node_address) + for i, comp in enumerate(compatible): + edts_insert_device_property(device_id, 'compatible/{}'.format(i), + comp) + +## +# @brief Management information for compatible. +compatible = DTCompatible() diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 513c1a1474a3..727b8eb40fa5 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -22,6 +22,7 @@ from extract.edts import edts from extract.clocks import clocks +from extract.compatible import compatible from extract.interrupts import interrupts from extract.reg import reg from extract.flash import flash @@ -444,6 +445,8 @@ def extract_property(node_compat, yaml, node_address, prop, prop_val, names, reg.extract(node_address, yaml, prop, names, def_label) elif prop == 'interrupts' or prop == 'interrupts-extended': interrupts.extract(node_address, yaml, prop, names, def_label) + elif prop == 'compatible': + compatible.extract(node_address, yaml, prop, names, def_label) elif 'pinctrl-' in prop: pinctrl.extract(node_address, yaml, prop, names, def_label) elif 'clocks' in prop: From 40fc54cc35588de3d7357ee0000f1f52f78fd648 Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Sun, 19 Aug 2018 10:07:14 +0200 Subject: [PATCH 06/20] scripts: extract_dts_includes.py: extract reg to EDTS database Extend reg directive handling to fill the EDTS datanbase. Signed-off-by: Bobby Noelte --- scripts/dts/extract/reg.py | 55 ++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/scripts/dts/extract/reg.py b/scripts/dts/extract/reg.py index aeec78ab2d64..57dee545a069 100644 --- a/scripts/dts/extract/reg.py +++ b/scripts/dts/extract/reg.py @@ -6,6 +6,7 @@ from extract.globals import * from extract.directive import DTDirective +from extract.edts import * ## # @brief Manage reg directive. @@ -32,18 +33,43 @@ def extract(self, node_address, yaml, prop, names, def_label): node_compat = get_compat(node_address) reg = reduced[node_address]['props']['reg'] - if type(reg) is not list: reg = [ reg ] - props = list(reg) + if type(reg) is not list: reg = [ reg, ] + reg_names = node['props'].get('reg-names', []) - address_cells = reduced['/']['props'].get('#address-cells') - size_cells = reduced['/']['props'].get('#size-cells') + nr_address_cells = reduced['/']['props'].get('#address-cells') + nr_size_cells = reduced['/']['props'].get('#size-cells') address = '' for comp in node_address.split('/')[1:-1]: address += '/' + comp - address_cells = reduced[address]['props'].get( - '#address-cells', address_cells) - size_cells = reduced[address]['props'].get('#size-cells', size_cells) - + nr_address_cells = reduced[address]['props'].get( + '#address-cells', nr_address_cells) + nr_size_cells = reduced[address]['props'].get('#size-cells', nr_size_cells) + + # generate EDTS + device_id = edts_device_id(node_address) + reg_index = 0 + reg_cell_index = 0 + reg_nr_cells = nr_address_cells + nr_size_cells + for cell in reg: + if len(reg_names) > reg_index: + reg_name = reg_names[reg_index] + else: + reg_name = str(reg_index) + if reg_cell_index < nr_address_cells: + edts_insert_device_property(device_id, + 'reg/{}/address/{}'.format(reg_name, reg_cell_index), + cell) + else: + size_cell_index = reg_cell_index - nr_address_cells + edts_insert_device_property(device_id, + 'reg/{}/size/{}'.format(reg_name, size_cell_index), + cell) + reg_cell_index += 1 + if reg_cell_index >= reg_nr_cells: + reg_cell_index = 0 + reg_index += 1 + + # generate defines post_label = "BASE_ADDRESS" if yaml[node_compat].get('use-property-label', False): label = node['props'].get('label', None) @@ -55,6 +81,7 @@ def extract(self, node_address, yaml, prop, names, def_label): l_addr = [convert_string_to_label(post_label)] l_size = ["SIZE"] + props = list(reg) while props: prop_def = {} prop_alias = {} @@ -72,21 +99,21 @@ def extract(self, node_address, yaml, prop, names, def_label): except: name = [] - for x in range(address_cells): + for x in range(nr_address_cells): addr += props.pop(0) << (32 * x) - for x in range(size_cells): + for x in range(nr_size_cells): size += props.pop(0) << (32 * x) l_addr_fqn = '_'.join(l_base + l_addr + l_idx) l_size_fqn = '_'.join(l_base + l_size + l_idx) - if address_cells: + if nr_address_cells: prop_def[l_addr_fqn] = hex(addr) - if size_cells: + if nr_size_cells: prop_def[l_size_fqn] = int(size) if len(name): - if address_cells: + if nr_address_cells: prop_alias['_'.join(l_base + name + l_addr)] = l_addr_fqn - if size_cells: + if nr_size_cells: prop_alias['_'.join(l_base + name + l_size)] = l_size_fqn # generate defs for node aliases From dc1cc90f815a96313597c7212188304964619bf6 Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Sun, 19 Aug 2018 10:11:47 +0200 Subject: [PATCH 07/20] scripts: extract_dts_includes.py: extract interrupts to EDTS database Extend interrupts directive handling to fill the EDTS database. Signed-off-by: Bobby Noelte --- scripts/dts/extract/interrupts.py | 39 +++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/scripts/dts/extract/interrupts.py b/scripts/dts/extract/interrupts.py index a6e2cebc1dd6..0ef9558ef63d 100644 --- a/scripts/dts/extract/interrupts.py +++ b/scripts/dts/extract/interrupts.py @@ -6,6 +6,7 @@ from extract.globals import * from extract.directive import DTDirective +from extract.edts import * ## # @brief Manage interrupts directives. @@ -47,7 +48,38 @@ def extract(self, node_address, yaml, prop, names, def_label): props = [node['props'].get(prop)] irq_parent = self._find_parent_irq_node(node_address) - + irq_nr_cells = reduced[irq_parent]['props']['#interrupt-cells'] + irq_cell_yaml = yaml[get_compat(irq_parent)] + irq_cell_names = irq_cell_yaml.get('#cells', []) + irq_names = node['props'].get('interrupt-names', []) + if not isinstance(irq_names, list): + irq_names = [irq_names, ] + + # generate EDTS + device_id = edts_device_id(node_address) + irq_index = 0 + irq_cell_index = 0 + for cell in props: + if len(irq_names) > irq_index: + irq_name = irq_names[irq_index] + else: + irq_name = str(irq_index) + if len(irq_cell_names) > irq_cell_index: + irq_cell_name = irq_cell_names[irq_cell_index] + else: + irq_cell_name = str(irq_cell_index) + edts_insert_device_property(device_id, + 'interrupts/{}/parent'.format(irq_name), + edts_device_id(irq_parent)) + edts_insert_device_property(device_id, + 'interrupts/{}/{}'.format(irq_name, irq_cell_name), + cell) + irq_cell_index += 1 + if irq_cell_index >= irq_nr_cells: + irq_cell_index = 0 + irq_index += 1 + + # generate defines l_base = def_label.split('/') index = 0 @@ -67,11 +99,10 @@ def extract(self, node_address, yaml, prop, names, def_label): except: name = [] - cell_yaml = yaml[get_compat(irq_parent)] l_cell_prefix = ['IRQ'] - for i in range(reduced[irq_parent]['props']['#interrupt-cells']): - l_cell_name = [cell_yaml['#cells'][i].upper()] + for i in range(irq_nr_cells): + l_cell_name = [irq_cell_names[i].upper()] if l_cell_name == l_cell_prefix: l_cell_name = [] From f3d9cb38528ac1bd0fc3e908fafcfd1ee670b5bf Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Sun, 19 Aug 2018 10:32:23 +0200 Subject: [PATCH 08/20] scripts: extract_dts_includes.py: extract clocks to EDTS database Extend clocks directive handling to fill the EDTS database. Signed-off-by: Bobby Noelte --- scripts/dts/extract/clocks.py | 94 +++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 26 deletions(-) diff --git a/scripts/dts/extract/clocks.py b/scripts/dts/extract/clocks.py index caa15adf1f72..2d0f9592d274 100644 --- a/scripts/dts/extract/clocks.py +++ b/scripts/dts/extract/clocks.py @@ -5,6 +5,7 @@ # from extract.globals import * +from extract.edts import * from extract.directive import DTDirective ## @@ -12,15 +13,53 @@ # # Handles: # - clocks -# directives. +# +# Generates in EDTS: +# +# Clock consumer +# -------------- +# - clocks// : +# (cell-name from cell-names of provider) # class DTClocks(DTDirective): def __init__(self): pass + ## + # @brief Insert clock cells into EDTS + # + # @param clock_consumer + # @param yaml + # @param clock_provider + # @param clock_cells + # @param property_path_templ "xxx/yyy/{}" + # + def _edts_insert_clock_cells(self, clock_consumer_node_address, yaml, + clock_provider_node_address, clock_cells, + property_path_templ): + if len(clock_cells) == 0: + return + clock_consumer_device_id = edts_device_id(clock_consumer_node_address) + clock_provider_device_id = edts_device_id(clock_provider_node_address) + clock_provider = reduced[clock_provider_node_address] + clock_provider_compat = get_compat(clock_provider_node_address) + clock_provider_bindings = yaml[clock_provider_compat] + clock_nr_cells = int(clock_provider['props'].get('#clock-cells', 0)) + clock_cells_names = clock_provider_bindings.get( + '#cells', ['ID', 'CELL1', "CELL2", "CELL3"]) + for i, cell in enumerate(clock_cells): + if i >= len(clock_cells_names): + clock_cell_name = 'CELL{}'.format(i).lower() + else: + clock_cell_name = clock_cells_names[i].lower() + edts_insert_device_property(clock_consumer_device_id, + property_path_templ.format(clock_cell_name), cell) + + def _extract_consumer(self, node_address, yaml, clocks, names, def_label): + clock_consumer_device_id = edts_device_id(node_address) clock_consumer = reduced[node_address] clock_consumer_compat = get_compat(node_address) clock_consumer_bindings = yaml[clock_consumer_compat] @@ -28,7 +67,7 @@ def _extract_consumer(self, node_address, yaml, clocks, names, def_label): clock_index = 0 clock_cell_index = 0 - nr_clock_cells = 0 + clock_nr_cells = 0 clock_provider_node_address = '' clock_provider = {} for cell in clocks: @@ -42,27 +81,37 @@ def _extract_consumer(self, node_address, yaml, clocks, names, def_label): str(clock_provider))) clock_provider_node_address = phandles[cell] clock_provider = reduced[clock_provider_node_address] - clock_provider_compat = get_compat(clock_provider_node_address) - clock_provider_bindings = yaml[clock_provider_compat] - clock_provider_label = self.get_node_label_string( \ - clock_provider_node_address) - nr_clock_cells = int(clock_provider['props'].get( - '#clock-cells', 0)) - clock_cells_string = clock_provider_bindings.get( - 'cell_string', 'CLOCK') - clock_cells_names = clock_provider_bindings.get( - '#cells', ['ID', 'CELL1', "CELL2", "CELL3"]) + clock_nr_cells = int(clock_provider['props'].get('#clock-cells', 0)) clock_cells = [] else: clock_cells.append(cell) clock_cell_index += 1 - if clock_cell_index > nr_clock_cells: - # clock consumer device - clocks info - ##################################### + if clock_cell_index > clock_nr_cells: + + # generate EDTS + edts_insert_device_property(clock_consumer_device_id, + 'clocks/{}/provider'.format(clock_index), + clock_provider_node_address) + self._edts_insert_clock_cells(node_address, yaml, + clock_provider_node_address, + clock_cells, + "clocks/{}/{{}}".format(clock_index)) + + # generate defines prop_def = {} prop_alias = {} + # legacy definitions for backwards compatibility + # @todo remove legacy definitions + # Legacy clocks definitions by extract_cells + clock_provider_compat = get_compat(clock_provider_node_address) + clock_provider_bindings = yaml[clock_provider_compat] + clock_cells_string = clock_provider_bindings.get( + 'cell_string', 'CLOCK') + clock_cells_names = clock_provider_bindings.get( + '#cells', ['ID', 'CELL1', "CELL2", "CELL3"]) + for i, cell in enumerate(clock_cells): if i >= len(clock_cells_names): clock_cell_name = 'CELL{}'.format(i) @@ -93,25 +142,17 @@ def _extract_consumer(self, node_address, yaml, clocks, names, def_label): clock_cell_name, index]) prop_alias[clock_alias_label] = clock_label # alias - if i < nr_clock_cells: + if i < clock_nr_cells: # clocks info for first clock clock_alias_label = self.get_label_string([ clock_consumer_label, clock_cells_string, clock_cell_name]) prop_alias[clock_alias_label] = clock_label - # Legacy clocks definitions by extract_controller + # ----- legacy clocks definitions clock_provider_label_str = clock_provider['props'].get('label', None) if clock_provider_label_str is not None: - try: - generation = clock_consumer_bindings['properties'][ - 'clocks']['generation'] - except: - generation = '' - if 'use-prop-name' in generation: - clock_cell_name = 'CLOCKS_CONTROLLER' - else: - clock_cell_name = 'CLOCK_CONTROLLER' + clock_cell_name = 'CLOCK_CONTROLLER' if clock_index == 0 and \ len(clocks) == (len(clock_cells) + 1): index = '' @@ -128,6 +169,7 @@ def _extract_consumer(self, node_address, yaml, clocks, names, def_label): prop_alias[clock_alias_label] = clock_label insert_defs(node_address, prop_def, prop_alias) + # ------ legacy end clock_cell_index = 0 clock_index += 1 From 800bd1848a7968e2c9642ca4b4ca5baabc1f7d69 Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Sun, 19 Aug 2018 18:05:21 +0200 Subject: [PATCH 09/20] scripts: extract_dts_includes.py: default extract to EDTS database Extend default directive handling to fill the EDTS database. Signed-off-by: Bobby Noelte --- scripts/dts/extract/default.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/dts/extract/default.py b/scripts/dts/extract/default.py index f66c0dd496a4..1319d2a38831 100644 --- a/scripts/dts/extract/default.py +++ b/scripts/dts/extract/default.py @@ -5,6 +5,7 @@ # from extract.globals import * +from extract.edts import * from extract.directive import DTDirective ## @@ -18,17 +19,21 @@ def __init__(self): ## # @brief Extract directives in a default way # - # @param node_address Address of node owning the clockxxx definition. + # @param node_address Address of node owning the directive definition. # @param yaml YAML definition for the owning node. # @param prop property name # @param names (unused) # @param def_label Define label string of node owning the directive. # def extract(self, node_address, yaml, prop, names, def_label): - prop_def = {} - prop_alias = {} prop_values = reduced[node_address]['props'][prop] + # generate EDTS + edts_insert_device_property(node_address, prop, prop_values) + + # generate defines + prop_def = {} + prop_alias = {} if isinstance(prop_values, list): for i, prop_value in enumerate(prop_values): prop_name = convert_string_to_label(prop) From 8e2b0d3ac3b8831bfc02668fafb983f2a71c232e Mon Sep 17 00:00:00 2001 From: Bobby Noelte Date: Sun, 19 Aug 2018 18:16:38 +0200 Subject: [PATCH 10/20] scripts: extract_dts_includes.py: extract heuristics to EDTS database Extend directive handling to use heuristics to fill the EDTS database. Signed-off-by: Bobby Noelte --- scripts/dts/extract/heuristics.py | 73 +++++++++++++++++++++++++++++ scripts/dts/extract_dts_includes.py | 4 ++ 2 files changed, 77 insertions(+) create mode 100644 scripts/dts/extract/heuristics.py diff --git a/scripts/dts/extract/heuristics.py b/scripts/dts/extract/heuristics.py new file mode 100644 index 000000000000..e7ff5f884527 --- /dev/null +++ b/scripts/dts/extract/heuristics.py @@ -0,0 +1,73 @@ +# +# Copyright (c) 2018 Bobby Noelte +# +# SPDX-License-Identifier: Apache-2.0 +# + +from extract.globals import * +from extract.edts import * +from extract.directive import DTDirective + +from extract.default import default + +## +# @brief Generate device tree information based on heuristics. +# +# Generates in EDTS: +# - bus/master : device id of bus master for a bus device +# - parent-device : device id of parent device +class DTHeuristics(DTDirective): + + def __init__(self): + pass + + ## + # @brief Generate device tree information based on heuristics. + # + # Device tree properties may have to be deduced by heuristics + # as the property definitions are not always consistent across + # different node types. + # + # @param node_address Address of node owning the + # compatible definition. + # @param yaml YAML definition for the owning node. + # @param prop compatible property name + # @param names (unused) + # @param def_label Define label string of node owning the + # compatible definition. + # + def extract(self, node_address, yaml, prop, names, def_label): + compatible = reduced[node_address]['props']['compatible'] + if not isinstance(compatible, list): + compatible = [compatible] + + # Check for -device that is connected to a bus + for compat in compatible: + for device_type in yaml[compat].get('node_type', []): + if not device_type.endswith('-device'): + continue + + bus_master_device_type = device_type.replace('-device', '') + + # get parent + parent_node_address = '' + for comp in node_address.split('/')[1:-1]: + parent_node_address += '/' + comp + + # get parent yaml + parent_yaml = yaml[reduced[parent_node_address] \ + ['props']['compatible']] + + if bus_master_device_type not in parent_yaml['node_type']: + continue + + # generate EDTS + edts_insert_device_property(node_address, 'bus/master', + parent_node_address) + + # Check for a parent device this device is subordinated + edts_insert_device_parent_device_property(node_address) + +## +# @brief Management information for heuristics. +heuristics = DTHeuristics() diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 727b8eb40fa5..e2b7585ab8ff 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -27,6 +27,7 @@ from extract.reg import reg from extract.flash import flash from extract.pinctrl import pinctrl +from extract.heuristics import heuristics from extract.default import default class Bindings(yaml.Loader): @@ -447,6 +448,9 @@ def extract_property(node_compat, yaml, node_address, prop, prop_val, names, interrupts.extract(node_address, yaml, prop, names, def_label) elif prop == 'compatible': compatible.extract(node_address, yaml, prop, names, def_label) + # do extra property definition based on heuristics + # do it here as the compatible property is mandatory + heuristics.extract(node_address, yaml, prop, names, def_label) elif 'pinctrl-' in prop: pinctrl.extract(node_address, yaml, prop, names, def_label) elif 'clocks' in prop: From 4d82a85d81be0e14f4fdb28471ff9309f863b398 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Mon, 10 Sep 2018 13:37:44 +0200 Subject: [PATCH 11/20] scripts/dts: extract_dts_includes: remove unused 'names' argument Parameter 'names' is provided as argument of several property extract functions. Thought it is actually used only once. Remove when not needed. Signed-off-by: Erwan Gouriou --- scripts/dts/extract/clocks.py | 7 +++---- scripts/dts/extract/compatible.py | 3 +-- scripts/dts/extract/default.py | 3 +-- scripts/dts/extract/directive.py | 3 +-- scripts/dts/extract/flash.py | 17 ++++++++--------- scripts/dts/extract/heuristics.py | 3 +-- scripts/dts/extract/pinctrl.py | 3 +-- scripts/dts/extract/reg.py | 3 +-- scripts/dts/extract_dts_includes.py | 19 +++++++++---------- 9 files changed, 26 insertions(+), 35 deletions(-) diff --git a/scripts/dts/extract/clocks.py b/scripts/dts/extract/clocks.py index 2d0f9592d274..105bfad1f57e 100644 --- a/scripts/dts/extract/clocks.py +++ b/scripts/dts/extract/clocks.py @@ -57,7 +57,7 @@ def _edts_insert_clock_cells(self, clock_consumer_node_address, yaml, property_path_templ.format(clock_cell_name), cell) - def _extract_consumer(self, node_address, yaml, clocks, names, def_label): + def _extract_consumer(self, node_address, yaml, clocks, def_label): clock_consumer_device_id = edts_device_id(node_address) clock_consumer = reduced[node_address] @@ -180,10 +180,9 @@ def _extract_consumer(self, node_address, yaml, clocks, names, def_label): # @param node_address Address of node owning the clockxxx definition. # @param yaml YAML definition for the owning node. # @param prop clockxxx property name - # @param names (unused) # @param def_label Define label string of node owning the directive. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): properties = reduced[node_address]['props'][prop] @@ -195,7 +194,7 @@ def extract(self, node_address, yaml, prop, names, def_label): if prop == 'clocks': # indicator for clock consumers - self._extract_consumer(node_address, yaml, prop_list, names, def_label) + self._extract_consumer(node_address, yaml, prop_list, def_label) else: raise Exception( "DTClocks.extract called with unexpected directive ({})." diff --git a/scripts/dts/extract/compatible.py b/scripts/dts/extract/compatible.py index 7bfb3bbe7013..a6cf7f01c92b 100644 --- a/scripts/dts/extract/compatible.py +++ b/scripts/dts/extract/compatible.py @@ -28,11 +28,10 @@ def __init__(self): # compatible definition. # @param yaml YAML definition for the owning node. # @param prop compatible property name - # @param names (unused) # @param def_label Define label string of node owning the # compatible definition. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): # compatible definition compatible = reduced[node_address]['props'][prop] diff --git a/scripts/dts/extract/default.py b/scripts/dts/extract/default.py index 1319d2a38831..ad0cea99cc3e 100644 --- a/scripts/dts/extract/default.py +++ b/scripts/dts/extract/default.py @@ -22,10 +22,9 @@ def __init__(self): # @param node_address Address of node owning the directive definition. # @param yaml YAML definition for the owning node. # @param prop property name - # @param names (unused) # @param def_label Define label string of node owning the directive. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): prop_values = reduced[node_address]['props'][prop] # generate EDTS diff --git a/scripts/dts/extract/directive.py b/scripts/dts/extract/directive.py index b4496a1c419e..ad8291f436bb 100644 --- a/scripts/dts/extract/directive.py +++ b/scripts/dts/extract/directive.py @@ -57,8 +57,7 @@ def __init__(): # @param node_address Address of node issueuing the directive. # @param yaml YAML definition for the node. # @param prop Directive property name - # @param names Names assigned to directive. # @param def_label Define label string of node owning the directive. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): pass diff --git a/scripts/dts/extract/flash.py b/scripts/dts/extract/flash.py index 312e79842ec3..4e2ed88ad583 100644 --- a/scripts/dts/extract/flash.py +++ b/scripts/dts/extract/flash.py @@ -19,7 +19,7 @@ def __init__(self): # Node of the flash self._flash_node = None - def _extract_partition(self, node_address, yaml, prop, names, def_label): + def _extract_partition(self, node_address, yaml, prop, def_label): prop_def = {} prop_alias = {} node = reduced[node_address] @@ -53,7 +53,7 @@ def _extract_partition(self, node_address, yaml, prop, names, def_label): insert_defs(node_address, prop_def, prop_alias) - def _extract_flash(self, node_address, yaml, prop, names, def_label): + def _extract_flash(self, node_address, yaml, prop, def_label): load_defs = {} if node_address == 'dummy-flash': @@ -72,14 +72,14 @@ def _extract_flash(self, node_address, yaml, prop, names, def_label): flash_props = ["label", "write-block-size", "erase-block-size"] for prop in flash_props: if prop in self._flash_node['props']: - default.extract(node_address, None, prop, None, def_label) + default.extract(node_address, None, prop, def_label) insert_defs(node_address, load_defs, {}) #for address in reduced: # if address.startswith(node_address) and 'partition@' in address: # self._extract_partition(address, yaml, 'partition', None, def_label) - def _extract_code_partition(self, node_address, yaml, prop, names, def_label): + def _extract_code_partition(self, node_address, yaml, prop, def_label): load_defs = {} if node_address == 'dummy-flash': @@ -113,21 +113,20 @@ def _extract_code_partition(self, node_address, yaml, prop, names, def_label): # flash definition. # @param yaml YAML definition for the owning node. # @param prop compatible property name - # @param names (unused) # @param def_label Define label string of node owning the # compatible definition. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): if prop == 'zephyr,flash': # indicator for flash - self._extract_flash(node_address, yaml, prop, names, def_label) + self._extract_flash(node_address, yaml, prop, def_label) elif prop == 'zephyr,code-partition': # indicator for code_partition - self._extract_code_partition(node_address, yaml, prop, names, def_label) + self._extract_code_partition(node_address, yaml, prop, def_label) elif prop == 'reg': # indicator for partition - self._extract_partition(node_address, yaml, prop, names, def_label) + self._extract_partition(node_address, yaml, prop, def_label) else: raise Exception( "DTFlash.extract called with unexpected directive ({})." diff --git a/scripts/dts/extract/heuristics.py b/scripts/dts/extract/heuristics.py index e7ff5f884527..f6d00f954cab 100644 --- a/scripts/dts/extract/heuristics.py +++ b/scripts/dts/extract/heuristics.py @@ -32,11 +32,10 @@ def __init__(self): # compatible definition. # @param yaml YAML definition for the owning node. # @param prop compatible property name - # @param names (unused) # @param def_label Define label string of node owning the # compatible definition. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): compatible = reduced[node_address]['props']['compatible'] if not isinstance(compatible, list): compatible = [compatible] diff --git a/scripts/dts/extract/pinctrl.py b/scripts/dts/extract/pinctrl.py index 7ca63dccd8e5..f79a80677eee 100644 --- a/scripts/dts/extract/pinctrl.py +++ b/scripts/dts/extract/pinctrl.py @@ -21,11 +21,10 @@ def __init__(self): # @param node_address Address of node owning the pinctrl definition. # @param yaml YAML definition for the owning node. # @param prop pinctrl-x key - # @param names Names assigned to pinctrl state pinctrl-. # @param def_label Define label string of client node owning the pinctrl # definition. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): pinconf = reduced[node_address]['props'][prop] diff --git a/scripts/dts/extract/reg.py b/scripts/dts/extract/reg.py index 57dee545a069..dde65c73706b 100644 --- a/scripts/dts/extract/reg.py +++ b/scripts/dts/extract/reg.py @@ -23,11 +23,10 @@ def __init__(self): # reg definition. # @param yaml YAML definition for the owning node. # @param prop reg property name - # @param names (unused) # @param def_label Define label string of node owning the # compatible definition. # - def extract(self, node_address, yaml, prop, names, def_label): + def extract(self, node_address, yaml, prop, def_label): node = reduced[node_address] node_compat = get_compat(node_address) diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index e2b7585ab8ff..7fd861edbd21 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -441,20 +441,20 @@ def extract_property(node_compat, yaml, node_address, prop, prop_val, names, if prop == 'reg': if 'partition@' in node_address: # reg in partition is covered by flash handling - flash.extract(node_address, yaml, prop, names, def_label) + flash.extract(node_address, yaml, prop, def_label) else: - reg.extract(node_address, yaml, prop, names, def_label) + reg.extract(node_address, yaml, prop, def_label) elif prop == 'interrupts' or prop == 'interrupts-extended': interrupts.extract(node_address, yaml, prop, names, def_label) elif prop == 'compatible': - compatible.extract(node_address, yaml, prop, names, def_label) + compatible.extract(node_address, yaml, prop, def_label) # do extra property definition based on heuristics # do it here as the compatible property is mandatory - heuristics.extract(node_address, yaml, prop, names, def_label) + heuristics.extract(node_address, yaml, prop, def_label) elif 'pinctrl-' in prop: - pinctrl.extract(node_address, yaml, prop, names, def_label) + pinctrl.extract(node_address, yaml, prop, def_label) elif 'clocks' in prop: - clocks.extract(node_address, yaml, prop, names, def_label) + clocks.extract(node_address, yaml, prop, def_label) elif 'gpios' in prop: try: prop_values = list(reduced[node_address]['props'].get(prop)) @@ -466,7 +466,7 @@ def extract_property(node_compat, yaml, node_address, prop, prop_val, names, extract_cells(node_address, yaml, prop, prop_values, names, 0, def_label, 'gpio') else: - default.extract(node_address, yaml, prop, names, def_label) + default.extract(node_address, yaml, prop, def_label) def extract_node_include_info(reduced, root_node_address, sub_node_address, @@ -762,10 +762,9 @@ def generate_node_definitions(yaml_list): extract_string_prop(chosen[k], None, "label", v) node_address = chosen.get('zephyr,flash', 'dummy-flash') - flash.extract(node_address, yaml_list, 'zephyr,flash', None, 'FLASH') + flash.extract(node_address, yaml_list, 'zephyr,flash', 'FLASH') node_address = chosen.get('zephyr,code-partition', node_address) - flash.extract(node_address, yaml_list, 'zephyr,code-partition', None, - 'FLASH') + flash.extract(node_address, yaml_list, 'zephyr,code-partition', 'FLASH') return defs From 16e445801af0e5a04150eda90bff496e38110bbf Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Mon, 10 Sep 2018 16:14:40 +0200 Subject: [PATCH 12/20] scripts: extract_dts_includes: extract gpios to EDTS database Extract gpio property for injection in EDTS. Cleanup no more needed function from extract_dts_includes script Signed-off-by: Erwan Gouriou --- scripts/dts/extract/gpios.py | 207 ++++++++++++++++++++++++++++ scripts/dts/extract_dts_includes.py | 149 +------------------- 2 files changed, 209 insertions(+), 147 deletions(-) create mode 100644 scripts/dts/extract/gpios.py diff --git a/scripts/dts/extract/gpios.py b/scripts/dts/extract/gpios.py new file mode 100644 index 000000000000..aa530f5340ee --- /dev/null +++ b/scripts/dts/extract/gpios.py @@ -0,0 +1,207 @@ +# +# Copyright (c) 2018 Linaro Limited +# +# SPDX-License-Identifier: Apache-2.0 +# + +import pprint + +from extract.globals import * +from extract.directive import DTDirective +from extract.edts import * + +## +# @brief Manage gpio-x directive. +# insert -_controller +# insert gpio cells based on gpio-controller definitions +# +class DTGpios(DTDirective): + + def __init__(self): + pass + + ## + # @brief Extract gpio information. + # + # @param node_address Address of node owning the pinctrl definition. + # @param yaml YAML definition for the owning node. + # @param prop gpio key + # @param def_label Define label string of client node owning the gpio + # definition. + # + def _extract_controller(self, node_address, yaml, prop, prop_values, def_label, index): + + prop_def = {} + prop_alias = {} + + # get controller node (referenced via phandle) + cell_parent = phandles[prop_values[0]] + + for k in reduced[cell_parent]['props'].keys(): + if k[0] == '#' and '-cells' in k: + num_cells = reduced[cell_parent]['props'].get(k) + + try: + l_cell = reduced[cell_parent]['props'].get('label') + except KeyError: + l_cell = None + + if l_cell is not None: + + l_base = def_label.split('/') + + # Check is defined should be indexed (_0, _1) + if index == 0 and len(prop_values) < (num_cells + 2): + # 0 or 1 element in prop_values + # ( ie len < num_cells + phandle + 1 ) + l_idx = [] + else: + l_idx = [str(index)] + + # Check node generation requirements + try: + generation = yaml[get_compat(node_address)]['properties'][prop][ + 'generation'] + except: + generation = '' + + if 'use-prop-name' in generation: + l_cellname = convert_string_to_label(prop + '_' + 'controller') + else: + l_cellname = convert_string_to_label('gpio' + '_' + + 'controller') + + edts_insert_device_property(edts_device_id(node_address), + '{}/{}/controller'.format(prop, index), + cell_parent) + + label = l_base + [l_cellname] + l_idx + + prop_def['_'.join(label)] = "\"" + l_cell + "\"" + + #generate defs also if node is referenced as an alias in dts + if node_address in aliases: + for i in aliases[node_address]: + alias_label = \ + convert_string_to_label(i) + alias = [alias_label] + label[1:] + prop_alias['_'.join(alias)] = '_'.join(label) + + insert_defs(node_address, prop_def, prop_alias) + + # prop off phandle + num_cells to get to next list item + prop_values = prop_values[num_cells+1:] + + # recurse if we have anything left + if len(prop_values): + self._extract_controller(node_address, yaml, prop, prop_values, + def_label, index + 1) + + + def _extract_cells(self, node_address, yaml, prop, prop_values, def_label, index): + + cell_parent = phandles[prop_values.pop(0)] + + try: + cell_yaml = yaml[get_compat(cell_parent)] + except: + raise Exception( + "Could not find yaml description for " + + reduced[cell_parent]['name']) + + + # Get number of cells per element of current property + for k in reduced[cell_parent]['props'].keys(): + if k[0] == '#' and '-cells' in k: + num_cells = reduced[cell_parent]['props'].get(k) + + l_cell = [convert_string_to_label(str(prop))] + + + # Check node generation requirements + try: + generation = yaml[get_compat(node_address)]['properties'][prop][ + 'generation'] + except: + generation = '' + + if 'use-prop-name' in generation: + l_cell = [convert_string_to_label(str(prop))] + else: + l_cell = [convert_string_to_label('gpio')] + + l_base = def_label.split('/') + # Check if #define should be indexed (_0, _1, ...) + if index == 0 and len(prop_values) < (num_cells + 2): + # Less than 2 elements in prop_values + # (ie len < num_cells + phandle + 1) + # Indexing is not needed + l_idx = [] + else: + l_idx = [str(index)] + + prop_def = {} + prop_alias = {} + + # Generate label for each field of the property element + for i in range(num_cells): + cell_name = cell_yaml['#cells'][i] + l_cellname = [str(cell_name).upper()] + if l_cell == l_cellname: + label = l_base + l_cell + l_idx + else: + label = l_base + l_cell + l_cellname + l_idx + # label_name = l_base + name + l_cellname + label_name = l_base + l_cellname + cell_value = prop_values.pop(0) + prop_def['_'.join(label)] = cell_value + # if len(name): + # prop_alias['_'.join(label_name)] = '_'.join(label) + + # generate defs for node aliases + if node_address in aliases: + for i in aliases[node_address]: + alias_label = convert_string_to_label(i) + alias = [alias_label] + label[1:] + prop_alias['_'.join(alias)] = '_'.join(label) + + edts_insert_device_property(edts_device_id(node_address), + '{}/{}/{}'.format(prop, index, cell_name), cell_value) + + insert_defs(node_address, prop_def, prop_alias) + + # recurse if we have anything left + if len(prop_values): + extract_cells(node_address, yaml, prop, prop_values, def_label, + index + 1) + + + ## + # @brief Extract gpio related directives + # + # @param node_address Address of node owning the gpio definition. + # @param yaml YAML definition for the owning node. + # @param prop gpio property name + # @param def_label Define label string of node owning the directive. + # + def extract(self, node_address, yaml, prop, def_label): + + try: + prop_values = list(reduced[node_address]['props'].get(prop)) + except: + prop_values = reduced[node_address]['props'].get(prop) + + if 'gpio' in prop: + # indicator for clock consumers + self._extract_controller(node_address, yaml, prop, prop_values, + def_label, 0) + self._extract_cells(node_address, yaml, prop, prop_values, + def_label, 0) + else: + raise Exception( + "DTGpios.extract called with unexpected directive ({})." + .format(prop)) + +## +# @brief Management information for gpio +gpios = DTGpios() diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 7fd861edbd21..53083db4b79f 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -22,6 +22,7 @@ from extract.edts import edts from extract.clocks import clocks +from extract.gpios import gpios from extract.compatible import compatible from extract.interrupts import interrupts from extract.reg import reg @@ -200,144 +201,6 @@ def extract_reg_prop(node_address, names, def_label, div, post_label): index += 1 -def extract_controller(node_address, yaml, prop, prop_values, index, def_label, generic): - - prop_def = {} - prop_alias = {} - - # get controller node (referenced via phandle) - cell_parent = phandles[prop_values[0]] - - for k in reduced[cell_parent]['props'].keys(): - if k[0] == '#' and '-cells' in k: - num_cells = reduced[cell_parent]['props'].get(k) - - # get controller node (referenced via phandle) - cell_parent = phandles[prop_values[0]] - - try: - l_cell = reduced[cell_parent]['props'].get('label') - except KeyError: - l_cell = None - - if l_cell is not None: - - l_base = def_label.split('/') - - # Check is defined should be indexed (_0, _1) - if index == 0 and len(prop_values) < (num_cells + 2): - # 0 or 1 element in prop_values - # ( ie len < num_cells + phandle + 1 ) - l_idx = [] - else: - l_idx = [str(index)] - - # Check node generation requirements - try: - generation = yaml[get_compat(node_address)]['properties'][prop][ - 'generation'] - except: - generation = '' - - if 'use-prop-name' in generation: - l_cellname = convert_string_to_label(prop + '_' + 'controller') - else: - l_cellname = convert_string_to_label(generic + '_' + 'controller') - - label = l_base + [l_cellname] + l_idx - - prop_def['_'.join(label)] = "\"" + l_cell + "\"" - - #generate defs also if node is referenced as an alias in dts - if node_address in aliases: - for i in aliases[node_address]: - alias_label = \ - convert_string_to_label(i) - alias = [alias_label] + label[1:] - prop_alias['_'.join(alias)] = '_'.join(label) - - insert_defs(node_address, prop_def, prop_alias) - - # prop off phandle + num_cells to get to next list item - prop_values = prop_values[num_cells+1:] - - # recurse if we have anything left - if len(prop_values): - extract_controller(node_address, yaml, prop, prop_values, index + 1, - def_label, generic) - - -def extract_cells(node_address, yaml, prop, prop_values, names, index, - def_label, generic): - - cell_parent = phandles[prop_values.pop(0)] - - try: - cell_yaml = yaml[get_compat(cell_parent)] - except: - raise Exception( - "Could not find yaml description for " + - reduced[cell_parent]['name']) - - try: - name = names.pop(0).upper() - except: - name = [] - - # Get number of cells per element of current property - for k in reduced[cell_parent]['props'].keys(): - if k[0] == '#' and '-cells' in k: - num_cells = reduced[cell_parent]['props'].get(k) - try: - generation = yaml[get_compat(node_address)]['properties'][prop][ - 'generation'] - except: - generation = '' - - if 'use-prop-name' in generation: - l_cell = [convert_string_to_label(str(prop))] - else: - l_cell = [convert_string_to_label(str(generic))] - - l_base = def_label.split('/') - # Check if #define should be indexed (_0, _1, ...) - if index == 0 and len(prop_values) < (num_cells + 2): - # Less than 2 elements in prop_values (ie len < num_cells + phandle + 1) - # Indexing is not needed - l_idx = [] - else: - l_idx = [str(index)] - - prop_def = {} - prop_alias = {} - - # Generate label for each field of the property element - for i in range(num_cells): - l_cellname = [str(cell_yaml['#cells'][i]).upper()] - if l_cell == l_cellname: - label = l_base + l_cell + l_idx - else: - label = l_base + l_cell + l_cellname + l_idx - label_name = l_base + name + l_cellname - prop_def['_'.join(label)] = prop_values.pop(0) - if len(name): - prop_alias['_'.join(label_name)] = '_'.join(label) - - # generate defs for node aliases - if node_address in aliases: - for i in aliases[node_address]: - alias_label = convert_string_to_label(i) - alias = [alias_label] + label[1:] - prop_alias['_'.join(alias)] = '_'.join(label) - - insert_defs(node_address, prop_def, prop_alias) - - # recurse if we have anything left - if len(prop_values): - extract_cells(node_address, yaml, prop, prop_values, names, - index + 1, def_label, generic) - - def extract_single(node_address, yaml, prop, key, def_label): prop_def = {} @@ -456,15 +319,7 @@ def extract_property(node_compat, yaml, node_address, prop, prop_val, names, elif 'clocks' in prop: clocks.extract(node_address, yaml, prop, def_label) elif 'gpios' in prop: - try: - prop_values = list(reduced[node_address]['props'].get(prop)) - except: - prop_values = reduced[node_address]['props'].get(prop) - - extract_controller(node_address, yaml, prop, prop_values, 0, - def_label, 'gpio') - extract_cells(node_address, yaml, prop, prop_values, - names, 0, def_label, 'gpio') + gpios.extract(node_address, yaml, prop, def_label) else: default.extract(node_address, yaml, prop, def_label) From baa92cfc061c50f4ac3a6761245766c3f56202c3 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou Date: Tue, 11 Sep 2018 09:21:34 +0200 Subject: [PATCH 13/20] dts/bindings: Replace id with generic zephyr type 'id' field of yaml bindings was carrying, free and generally redundant information. Replace with zephyr generic device type (i2c, usb, ...), which is a meaningful information that could be handy for various usages inside zephyr. Signed-off-by: Erwan Gouriou --- dts/bindings/arc/arc,dccm.yaml | 2 +- dts/bindings/arc/arc,iccm.yaml | 2 +- dts/bindings/arm/atmel,sam0-sercom.yaml | 2 +- dts/bindings/arm/nxp,kinetis-sim.yaml | 2 +- dts/bindings/arm/nxp,lpc-mailbox.yaml | 2 +- dts/bindings/arm/st,stm32-ccm.yaml | 2 +- dts/bindings/arm/ti,cc2650-prcm.yaml | 1 + dts/bindings/audio/ti,tlv320dac.yaml | 1 - dts/bindings/bluetooth/st,spbtle-rf.yaml | 1 - dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml | 2 +- dts/bindings/can/st,stm32-can.yaml | 1 - dts/bindings/clock/nxp,imx-ccm.yaml | 2 +- dts/bindings/clock/st,stm32-rcc.yaml | 2 +- dts/bindings/device_node.yaml.template | 1 + dts/bindings/flash_controller/atmel,sam0-nvmctrl.yaml | 1 - dts/bindings/flash_controller/flash-controller.yaml | 2 +- .../flash_controller/nordic,nrf51-flash-controller.yaml | 1 - .../flash_controller/nordic,nrf52-flash-controller.yaml | 1 - dts/bindings/flash_controller/nxp,kinetis-ftfa.yaml | 1 - dts/bindings/flash_controller/nxp,kinetis-ftfe.yaml | 1 - dts/bindings/flash_controller/nxp,kinetis-ftfl.yaml | 1 - dts/bindings/flash_controller/st,stm32f0-flash-controller.yaml | 1 - dts/bindings/flash_controller/st,stm32f3-flash-controller.yaml | 1 - dts/bindings/flash_controller/st,stm32f4-flash-controller.yaml | 1 - dts/bindings/flash_controller/st,stm32l4-flash-controller.yaml | 1 - dts/bindings/gpio/arm,cmsdk-gpio.yaml | 2 +- dts/bindings/gpio/atmel,sam0-gpio.yaml | 2 +- dts/bindings/gpio/atmel.sam-gpio.yaml | 2 +- dts/bindings/gpio/intel,qmsi-gpio.yaml | 2 +- dts/bindings/gpio/intel,qmsi-ss-gpio.yaml | 2 +- dts/bindings/gpio/nordic,nrf-gpio.yaml | 2 +- dts/bindings/gpio/nordic,nrf-gpiote.yaml | 2 +- dts/bindings/gpio/nxp,imx-gpio.yaml | 2 +- dts/bindings/gpio/nxp,kinetis-gpio.yaml | 2 +- dts/bindings/gpio/semtech,sx1509b-gpio.yaml | 1 - dts/bindings/gpio/sifive,gpio0.yaml | 2 +- dts/bindings/gpio/snps,designware-gpio.yaml | 2 +- dts/bindings/gpio/st,stm32-gpio.yaml | 2 +- dts/bindings/gpio/ti,cc2650-gpio.yaml | 1 + dts/bindings/i2c/arm,versatile-i2c.yaml | 1 - dts/bindings/i2c/atmel,sam-i2c-twi.yaml | 1 - dts/bindings/i2c/atmel,sam-i2c-twihs.yaml | 1 - dts/bindings/i2c/fsl,imx7d-i2c.yaml | 1 - dts/bindings/i2c/intel,qmsi-i2c.yaml | 1 - dts/bindings/i2c/intel,qmsi-ss-i2c.yaml | 1 - dts/bindings/i2c/nordic,nrf-i2c.yaml | 3 +-- dts/bindings/i2c/nxp,kinetis-i2c.yaml | 1 - dts/bindings/i2c/snps,designware-i2c.yaml | 1 - dts/bindings/i2c/st,stm32-i2c-v1.yaml | 1 - dts/bindings/i2c/st,stm32-i2c-v2.yaml | 1 - dts/bindings/i2c/ti,cc32xx-i2c.yaml | 1 - dts/bindings/ieee802154/nxp,mcr20a.yaml | 1 - dts/bindings/iio/adc/atmel,sam-afec.yaml | 1 - dts/bindings/iio/adc/intel,quark-d2000-adc.yaml | 1 - dts/bindings/iio/adc/nordic,nrf-adc.yaml | 1 - dts/bindings/iio/adc/nordic,nrf-saadc.yaml | 1 - dts/bindings/iio/adc/nxp,kinetis-adc16.yaml | 1 - dts/bindings/iio/adc/snps,dw-adc.yaml | 1 - dts/bindings/interrupt-controller/arm,v6m-nvic.yaml | 2 +- dts/bindings/interrupt-controller/arm,v7m-nvic.yaml | 2 +- dts/bindings/interrupt-controller/arm,v8m-nvic.yaml | 2 +- dts/bindings/interrupt-controller/intel,cavs-intc.yaml | 1 + dts/bindings/interrupt-controller/intel,ioapic.yaml | 1 + dts/bindings/interrupt-controller/intel,mvic.yaml | 1 + dts/bindings/interrupt-controller/riscv,plic0.yaml | 2 +- dts/bindings/interrupt-controller/snps,arcv2-intc.yaml | 2 +- dts/bindings/interrupt-controller/snps,designware-intc.yaml | 1 + dts/bindings/interrupt-controller/xtensa,intc.yaml | 1 + dts/bindings/led/nxp,pca9633.yaml | 2 +- dts/bindings/led/ti,lp3943.yaml | 2 +- dts/bindings/led/ti,lp5562.yaml | 2 +- dts/bindings/led_strip/apa,apa-102.yaml | 2 +- dts/bindings/memory-controllers/nxp,imx-semc.yaml | 2 +- dts/bindings/modem/wnc,m14a2a.yaml | 2 +- dts/bindings/mtd/partition.yaml | 2 +- dts/bindings/mtd/soc-nv-flash.yaml | 2 +- dts/bindings/pinctrl/atmel,sam0-pinmux.yaml | 2 +- dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml | 2 +- dts/bindings/pinctrl/st,stm32-pinmux.yaml | 2 +- dts/bindings/pinctrl/ti,cc2650-pinmux.yaml | 1 + dts/bindings/pwm/fsl,imx7d-pwm.yaml | 1 - dts/bindings/pwm/nxp,kinetis-ftm.yaml | 1 - dts/bindings/pwm/sifive,pwm0.yaml | 1 - dts/bindings/pwm/st,stm32-pwm.yaml | 1 - dts/bindings/rtc/intel,qmsi-rtc.yaml | 1 - dts/bindings/rtc/nxp,kinetis-rtc.yaml | 1 - dts/bindings/rtc/st,stm32-rtc.yaml | 1 - dts/bindings/sensor/adi,adt7420.yaml | 2 +- dts/bindings/sensor/ams,ccs811.yaml | 2 +- dts/bindings/sensor/avago,apds9960.yaml | 2 +- dts/bindings/sensor/max,max30101.yaml | 2 +- dts/bindings/sensor/nxp,fxas21002.yaml | 2 +- dts/bindings/sensor/nxp,fxos8700.yaml | 2 +- dts/bindings/sensor/nxp,mma8451q.yaml | 2 +- dts/bindings/sensor/st,hts221.yaml | 2 +- dts/bindings/sensor/st,lis3mdl-magn.yaml | 2 +- dts/bindings/sensor/st,lps22hb-press.yaml | 2 +- dts/bindings/sensor/st,lps25hb-press.yaml | 2 +- dts/bindings/sensor/st,lsm6ds0.yaml | 2 +- dts/bindings/sensor/st,lsm6dsl-spi.yaml | 2 +- dts/bindings/sensor/st,lsm6dsl.yaml | 2 +- dts/bindings/sensor/st,vl53l0x.yaml | 2 +- dts/bindings/sensor/ti,hdc1008.yaml | 2 +- dts/bindings/serial/altera,jtag-uart.yaml | 1 - dts/bindings/serial/arm,cmsdk-uart.yaml | 1 - dts/bindings/serial/atmel,sam-uart.yaml | 1 - dts/bindings/serial/atmel,sam-usart.yaml | 1 - dts/bindings/serial/atmel,sam0-uart.yaml | 1 - dts/bindings/serial/intel,qmsi-uart.yaml | 1 - dts/bindings/serial/nordic,nrf-uart.yaml | 1 - dts/bindings/serial/nordic,nrf-uarte.yaml | 1 - dts/bindings/serial/ns16550.yaml | 1 - dts/bindings/serial/nxp,imx-uart.yaml | 1 - dts/bindings/serial/nxp,kinetis-lpsci.yaml | 1 - dts/bindings/serial/nxp,kinetis-lpuart.yaml | 1 - dts/bindings/serial/nxp,kinetis-uart.yaml | 1 - dts/bindings/serial/nxp,lpc-usart.yaml | 1 - dts/bindings/serial/riscv,qemu-uart.yaml | 1 - dts/bindings/serial/sifive,uart0.yaml | 1 - dts/bindings/serial/silabs,efm32-uart.yaml | 1 - dts/bindings/serial/silabs,efm32-usart.yaml | 1 - dts/bindings/serial/st,stm32-lpuart.yaml | 1 - dts/bindings/serial/st,stm32-uart.yaml | 1 - dts/bindings/serial/st,stm32-usart.yaml | 1 - dts/bindings/serial/ti,cc32xx-uart.yaml | 1 - dts/bindings/serial/ti,msp432p4xx-uart.yaml | 1 - dts/bindings/serial/ti,stellaris-uart.yaml | 1 - dts/bindings/spi/atmel,sam0-spi.yaml | 1 - dts/bindings/spi/nordic,nrf-spi.yaml | 1 - dts/bindings/spi/nxp,imx-flexspi.yaml | 1 - dts/bindings/spi/nxp,kinetis-dspi.yaml | 1 - dts/bindings/spi/sifive,spi0.yaml | 1 - dts/bindings/spi/snps,designware-spi.yaml | 1 - dts/bindings/spi/st,stm32-spi-fifo.yaml | 1 - dts/bindings/spi/st,stm32-spi.yaml | 1 - dts/bindings/timer/arm,cmsdk-dtimer.yaml | 2 +- dts/bindings/timer/arm,cmsdk-timer.yaml | 2 +- dts/bindings/timer/st,stm32-timers.yaml | 2 +- dts/bindings/usb/atmel,sam0-usb.yaml | 1 - dts/bindings/usb/nordic,nrf-usbd.yaml | 1 - dts/bindings/usb/nxp,kinetis-usbd.yaml | 1 - dts/bindings/usb/st,stm32-otgfs.yaml | 1 - dts/bindings/usb/st,stm32-otghs.yaml | 1 - dts/bindings/usb/st,stm32-usb.yaml | 1 - dts/bindings/watchdog/arm,cmsdk-watchdog.yaml | 2 +- dts/bindings/watchdog/atmel,sam0-watchdog.yaml | 2 +- dts/bindings/watchdog/nordic,nrf-watchdog.yaml | 2 +- dts/bindings/watchdog/nxp,kinetis-wdog.yaml | 2 +- 148 files changed, 71 insertions(+), 140 deletions(-) diff --git a/dts/bindings/arc/arc,dccm.yaml b/dts/bindings/arc/arc,dccm.yaml index f7214ee5cafd..78676b85ec33 100644 --- a/dts/bindings/arc/arc,dccm.yaml +++ b/dts/bindings/arc/arc,dccm.yaml @@ -5,7 +5,7 @@ # --- title: ARC DCCM -id: arc,dccm +id: dccm version: 0.1 description: > diff --git a/dts/bindings/arc/arc,iccm.yaml b/dts/bindings/arc/arc,iccm.yaml index f37b44992807..8f8da77c68e9 100644 --- a/dts/bindings/arc/arc,iccm.yaml +++ b/dts/bindings/arc/arc,iccm.yaml @@ -5,7 +5,7 @@ # --- title: ARC ICCM -id: arc,iccm +id: iccm version: 0.1 description: > diff --git a/dts/bindings/arm/atmel,sam0-sercom.yaml b/dts/bindings/arm/atmel,sam0-sercom.yaml index f34dc4b8020d..01ab7e3ef84d 100644 --- a/dts/bindings/arm/atmel,sam0-sercom.yaml +++ b/dts/bindings/arm/atmel,sam0-sercom.yaml @@ -1,6 +1,6 @@ --- title: Atmel SERCOM binding -id: atmel,sam0-sercom +id: sercom version: 0.1 description: > diff --git a/dts/bindings/arm/nxp,kinetis-sim.yaml b/dts/bindings/arm/nxp,kinetis-sim.yaml index 7fe3cb66b39b..ff4d28209fd7 100644 --- a/dts/bindings/arm/nxp,kinetis-sim.yaml +++ b/dts/bindings/arm/nxp,kinetis-sim.yaml @@ -5,7 +5,7 @@ # --- title: Kinetis System Integration Module (SIM) -id: nxp,kinetis-sim +id: clock-controller version: 0.1 description: > diff --git a/dts/bindings/arm/nxp,lpc-mailbox.yaml b/dts/bindings/arm/nxp,lpc-mailbox.yaml index 6294218bbfbb..68f41ca78e2b 100644 --- a/dts/bindings/arm/nxp,lpc-mailbox.yaml +++ b/dts/bindings/arm/nxp,lpc-mailbox.yaml @@ -5,7 +5,7 @@ # --- title: LPC MAILBOX -id: nxp,lpc-mailbox +id: mailbox version: 0.1 description: > diff --git a/dts/bindings/arm/st,stm32-ccm.yaml b/dts/bindings/arm/st,stm32-ccm.yaml index 1ec102986926..ea0227888896 100644 --- a/dts/bindings/arm/st,stm32-ccm.yaml +++ b/dts/bindings/arm/st,stm32-ccm.yaml @@ -1,7 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: STM32 CCM -id: st,stm32-ccm +id: ccm version: 0.1 description: > diff --git a/dts/bindings/arm/ti,cc2650-prcm.yaml b/dts/bindings/arm/ti,cc2650-prcm.yaml index 04959a06f037..4a0ebbeb142b 100644 --- a/dts/bindings/arm/ti,cc2650-prcm.yaml +++ b/dts/bindings/arm/ti,cc2650-prcm.yaml @@ -1,6 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 PRCM +id: prcm version: 0.1 description: > diff --git a/dts/bindings/audio/ti,tlv320dac.yaml b/dts/bindings/audio/ti,tlv320dac.yaml index 5e7557290620..66db20da72a3 100644 --- a/dts/bindings/audio/ti,tlv320dac.yaml +++ b/dts/bindings/audio/ti,tlv320dac.yaml @@ -5,7 +5,6 @@ # --- title: Texas Instruments TLV320DAC Audio DAC -id: ti,tlv320dac version: 0.1 description: > diff --git a/dts/bindings/bluetooth/st,spbtle-rf.yaml b/dts/bindings/bluetooth/st,spbtle-rf.yaml index 22f07a806486..1530529d56ba 100644 --- a/dts/bindings/bluetooth/st,spbtle-rf.yaml +++ b/dts/bindings/bluetooth/st,spbtle-rf.yaml @@ -5,7 +5,6 @@ # --- title: STMicroelectronics SPBTLE-RF bluetooth module -id: st,spbtle-rf version: 0.1 description: > diff --git a/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml b/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml index 11de1a95007a..3ac97e7e6a0f 100644 --- a/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml +++ b/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml @@ -5,7 +5,7 @@ # --- title: Bluetooth module based on Zephyr's Bluetooth HCI SPI driver -id: zephyr,bt-hci-spi +id: bt-hci version: 0.1 description: > diff --git a/dts/bindings/can/st,stm32-can.yaml b/dts/bindings/can/st,stm32-can.yaml index ea9cb3fd30fc..77d6ea48eb8c 100644 --- a/dts/bindings/can/st,stm32-can.yaml +++ b/dts/bindings/can/st,stm32-can.yaml @@ -1,6 +1,5 @@ --- title: STM32 CAN -id: st,stm32-can version: 0.1 description: > diff --git a/dts/bindings/clock/nxp,imx-ccm.yaml b/dts/bindings/clock/nxp,imx-ccm.yaml index e7fe2599f78f..8924e939ad85 100644 --- a/dts/bindings/clock/nxp,imx-ccm.yaml +++ b/dts/bindings/clock/nxp,imx-ccm.yaml @@ -5,7 +5,7 @@ # --- title: i.MX Clock Controller Module (CCM) -id: nxp,imx-ccm +id: clock-control version: 0.1 description: > diff --git a/dts/bindings/clock/st,stm32-rcc.yaml b/dts/bindings/clock/st,stm32-rcc.yaml index bed7f91bff48..008315c0ccda 100644 --- a/dts/bindings/clock/st,stm32-rcc.yaml +++ b/dts/bindings/clock/st,stm32-rcc.yaml @@ -1,6 +1,6 @@ --- title: STM32 RCC -id: st,stm32-rcc +id: clock-control version: 0.1 description: > diff --git a/dts/bindings/device_node.yaml.template b/dts/bindings/device_node.yaml.template index 1d0e6851b3fa..5fc0c075ba9d 100644 --- a/dts/bindings/device_node.yaml.template +++ b/dts/bindings/device_node.yaml.template @@ -1,5 +1,6 @@ --- title: +id: <zephyr generic type for the described device> version: 0.1 description: > diff --git a/dts/bindings/flash_controller/atmel,sam0-nvmctrl.yaml b/dts/bindings/flash_controller/atmel,sam0-nvmctrl.yaml index b8cefc44ea9e..8dbc13627be0 100644 --- a/dts/bindings/flash_controller/atmel,sam0-nvmctrl.yaml +++ b/dts/bindings/flash_controller/atmel,sam0-nvmctrl.yaml @@ -1,6 +1,5 @@ --- title: Atmel SAM0 Non-Volatile Memory Controller -id: atmel,sam0-nvmctrl version: 0.1 description: > diff --git a/dts/bindings/flash_controller/flash-controller.yaml b/dts/bindings/flash_controller/flash-controller.yaml index f30ed6628919..37de486a884e 100644 --- a/dts/bindings/flash_controller/flash-controller.yaml +++ b/dts/bindings/flash_controller/flash-controller.yaml @@ -1,6 +1,6 @@ --- title: flash controller Base Structure -id: soc-nv-flash-controller +id: flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/nordic,nrf51-flash-controller.yaml b/dts/bindings/flash_controller/nordic,nrf51-flash-controller.yaml index a39fc91b365b..ed6ea2887ac7 100644 --- a/dts/bindings/flash_controller/nordic,nrf51-flash-controller.yaml +++ b/dts/bindings/flash_controller/nordic,nrf51-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: Nordic NVMC -id: nordic,nrf51-flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/nordic,nrf52-flash-controller.yaml b/dts/bindings/flash_controller/nordic,nrf52-flash-controller.yaml index 1c84b23c40f1..da75a257fe83 100644 --- a/dts/bindings/flash_controller/nordic,nrf52-flash-controller.yaml +++ b/dts/bindings/flash_controller/nordic,nrf52-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: Nordic NVMC -id: nordic,nrf52-flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/nxp,kinetis-ftfa.yaml b/dts/bindings/flash_controller/nxp,kinetis-ftfa.yaml index 4257357c481a..c07bc7a2f72f 100644 --- a/dts/bindings/flash_controller/nxp,kinetis-ftfa.yaml +++ b/dts/bindings/flash_controller/nxp,kinetis-ftfa.yaml @@ -1,6 +1,5 @@ --- title: NXP Kinetis Flash Memory Module (FTFA) -id: nxp,kinetis-ftfa version: 0.1 description: > diff --git a/dts/bindings/flash_controller/nxp,kinetis-ftfe.yaml b/dts/bindings/flash_controller/nxp,kinetis-ftfe.yaml index aaac2faffa60..2ac3b2532272 100644 --- a/dts/bindings/flash_controller/nxp,kinetis-ftfe.yaml +++ b/dts/bindings/flash_controller/nxp,kinetis-ftfe.yaml @@ -1,6 +1,5 @@ --- title: NXP Kinetis Flash Memory Module (FTFE) -id: nxp,kinetis-ftfe version: 0.1 description: > diff --git a/dts/bindings/flash_controller/nxp,kinetis-ftfl.yaml b/dts/bindings/flash_controller/nxp,kinetis-ftfl.yaml index 246d24e3a712..abe691f055e9 100644 --- a/dts/bindings/flash_controller/nxp,kinetis-ftfl.yaml +++ b/dts/bindings/flash_controller/nxp,kinetis-ftfl.yaml @@ -1,6 +1,5 @@ --- title: NXP Kinetis Flash Memory Module (FTFL) -id: nxp,kinetis-ftfl version: 0.1 description: > diff --git a/dts/bindings/flash_controller/st,stm32f0-flash-controller.yaml b/dts/bindings/flash_controller/st,stm32f0-flash-controller.yaml index 3600dcf4be25..3fcee587a3d9 100644 --- a/dts/bindings/flash_controller/st,stm32f0-flash-controller.yaml +++ b/dts/bindings/flash_controller/st,stm32f0-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: STM32 F0 Flash Controller -id: st,stm32f0-flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/st,stm32f3-flash-controller.yaml b/dts/bindings/flash_controller/st,stm32f3-flash-controller.yaml index 08d37f11055a..14a44c105902 100644 --- a/dts/bindings/flash_controller/st,stm32f3-flash-controller.yaml +++ b/dts/bindings/flash_controller/st,stm32f3-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: STM32 F3 Flash Controller -id: st,stm32f3-flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/st,stm32f4-flash-controller.yaml b/dts/bindings/flash_controller/st,stm32f4-flash-controller.yaml index 33981d584e98..ef8cb9800cde 100644 --- a/dts/bindings/flash_controller/st,stm32f4-flash-controller.yaml +++ b/dts/bindings/flash_controller/st,stm32f4-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: STM32 F4 Flash Controller -id: st,stm32f4-flash-controller version: 0.1 description: > diff --git a/dts/bindings/flash_controller/st,stm32l4-flash-controller.yaml b/dts/bindings/flash_controller/st,stm32l4-flash-controller.yaml index 978ce593f267..4af50832da23 100644 --- a/dts/bindings/flash_controller/st,stm32l4-flash-controller.yaml +++ b/dts/bindings/flash_controller/st,stm32l4-flash-controller.yaml @@ -1,6 +1,5 @@ --- title: STM32 L4 Flash Controller -id: st,stm32l4-flash-controller version: 0.1 description: > diff --git a/dts/bindings/gpio/arm,cmsdk-gpio.yaml b/dts/bindings/gpio/arm,cmsdk-gpio.yaml index 46c180b0e3ed..5a69f2f79812 100644 --- a/dts/bindings/gpio/arm,cmsdk-gpio.yaml +++ b/dts/bindings/gpio/arm,cmsdk-gpio.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK GPIO -id: arm,cmsdk-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/atmel,sam0-gpio.yaml b/dts/bindings/gpio/atmel,sam0-gpio.yaml index 90235b63c713..a994750ee2ff 100644 --- a/dts/bindings/gpio/atmel,sam0-gpio.yaml +++ b/dts/bindings/gpio/atmel,sam0-gpio.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 GPIO PORT driver -id: atmel,sam0-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/atmel.sam-gpio.yaml b/dts/bindings/gpio/atmel.sam-gpio.yaml index ee433bd4d2cd..85dd8c4f200b 100644 --- a/dts/bindings/gpio/atmel.sam-gpio.yaml +++ b/dts/bindings/gpio/atmel.sam-gpio.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM GPIO PORT driver -id: atmel,sam-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/intel,qmsi-gpio.yaml b/dts/bindings/gpio/intel,qmsi-gpio.yaml index e03101b3816a..4a256fc6bca8 100644 --- a/dts/bindings/gpio/intel,qmsi-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Intel QMSI GPIO -id: intel,qmsi-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml index c2c518385592..60355ee6d209 100644 --- a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Intel QMSI SS GPIO -id: intel,qmsi-ss-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nordic,nrf-gpio.yaml b/dts/bindings/gpio/nordic,nrf-gpio.yaml index e8145910b653..295bb36bd261 100644 --- a/dts/bindings/gpio/nordic,nrf-gpio.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpio.yaml @@ -5,7 +5,7 @@ # --- title: NRF5 GPIO -id: nordic,nrf-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nordic,nrf-gpiote.yaml b/dts/bindings/gpio/nordic,nrf-gpiote.yaml index 223674d9c215..6fb7853218dd 100644 --- a/dts/bindings/gpio/nordic,nrf-gpiote.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpiote.yaml @@ -5,7 +5,7 @@ # --- title: NRF5 GPIOTE -id: nordic,nrf-gpiote +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nxp,imx-gpio.yaml b/dts/bindings/gpio/nxp,imx-gpio.yaml index 517cb859679a..30978bf23804 100644 --- a/dts/bindings/gpio/nxp,imx-gpio.yaml +++ b/dts/bindings/gpio/nxp,imx-gpio.yaml @@ -5,7 +5,7 @@ # --- title: i.MX GPIO -id: nxp,imx-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nxp,kinetis-gpio.yaml b/dts/bindings/gpio/nxp,kinetis-gpio.yaml index a4057a4d1c7c..764d1dfc9e74 100644 --- a/dts/bindings/gpio/nxp,kinetis-gpio.yaml +++ b/dts/bindings/gpio/nxp,kinetis-gpio.yaml @@ -1,6 +1,6 @@ --- title: Kinetis GPIO -id: nxp,kinetis-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/semtech,sx1509b-gpio.yaml b/dts/bindings/gpio/semtech,sx1509b-gpio.yaml index b0cfca0b6334..6922a8ab021d 100644 --- a/dts/bindings/gpio/semtech,sx1509b-gpio.yaml +++ b/dts/bindings/gpio/semtech,sx1509b-gpio.yaml @@ -5,7 +5,6 @@ # --- title: Semtech SX1509B I2C GPIO -id: semtech,sx1509b version: 0.1 description: > diff --git a/dts/bindings/gpio/sifive,gpio0.yaml b/dts/bindings/gpio/sifive,gpio0.yaml index 3296d40481a3..cc5394a25953 100644 --- a/dts/bindings/gpio/sifive,gpio0.yaml +++ b/dts/bindings/gpio/sifive,gpio0.yaml @@ -5,7 +5,7 @@ # --- title: SiFive GPIO -id: sifive,gpio0 +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/snps,designware-gpio.yaml b/dts/bindings/gpio/snps,designware-gpio.yaml index 4fe11d98100e..a881ffe55e0a 100644 --- a/dts/bindings/gpio/snps,designware-gpio.yaml +++ b/dts/bindings/gpio/snps,designware-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Synopsys Designware GPIO controller -id: snps,designware-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/st,stm32-gpio.yaml b/dts/bindings/gpio/st,stm32-gpio.yaml index 3cffa44f307c..d9a2281cfaa7 100644 --- a/dts/bindings/gpio/st,stm32-gpio.yaml +++ b/dts/bindings/gpio/st,stm32-gpio.yaml @@ -5,7 +5,7 @@ # --- title: STM32 GPIO -id: st,stm32-gpio +id: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/ti,cc2650-gpio.yaml b/dts/bindings/gpio/ti,cc2650-gpio.yaml index cf3519fb4fff..f41ec0776e2d 100644 --- a/dts/bindings/gpio/ti,cc2650-gpio.yaml +++ b/dts/bindings/gpio/ti,cc2650-gpio.yaml @@ -1,6 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 GPIO +id: gpio version: 0.1 description: > diff --git a/dts/bindings/i2c/arm,versatile-i2c.yaml b/dts/bindings/i2c/arm,versatile-i2c.yaml index 250738bc45e5..ef5747cc6905 100644 --- a/dts/bindings/i2c/arm,versatile-i2c.yaml +++ b/dts/bindings/i2c/arm,versatile-i2c.yaml @@ -5,7 +5,6 @@ # --- title: ARM SBCon two-wire serial bus interface -id: arm,versatile-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/atmel,sam-i2c-twi.yaml b/dts/bindings/i2c/atmel,sam-i2c-twi.yaml index 7e42eb5b5fac..a1f6d42560a9 100644 --- a/dts/bindings/i2c/atmel,sam-i2c-twi.yaml +++ b/dts/bindings/i2c/atmel,sam-i2c-twi.yaml @@ -5,7 +5,6 @@ # --- title: Atmel SAM Family I2C (TWI) node -id: atmel,sam-i2c-twi version: 0.1 description: > diff --git a/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml b/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml index 646d857ee857..6afc1c101e43 100644 --- a/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml +++ b/dts/bindings/i2c/atmel,sam-i2c-twihs.yaml @@ -5,7 +5,6 @@ # --- title: Atmel SAM Family I2C (TWIHS) node -id: atmel,sam-i2c-twihs version: 0.1 description: > diff --git a/dts/bindings/i2c/fsl,imx7d-i2c.yaml b/dts/bindings/i2c/fsl,imx7d-i2c.yaml index d46ed989b9de..0c3542f6f04c 100644 --- a/dts/bindings/i2c/fsl,imx7d-i2c.yaml +++ b/dts/bindings/i2c/fsl,imx7d-i2c.yaml @@ -5,7 +5,6 @@ # --- title: i.MX I2C Controller -id: fsl,imx7d-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/intel,qmsi-i2c.yaml b/dts/bindings/i2c/intel,qmsi-i2c.yaml index f46888fe50df..1736c34140d5 100644 --- a/dts/bindings/i2c/intel,qmsi-i2c.yaml +++ b/dts/bindings/i2c/intel,qmsi-i2c.yaml @@ -5,7 +5,6 @@ # --- title: Intel QMSI i2c -id: intel,qmsi-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml b/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml index 1531397d8910..4f27c5fde2ef 100644 --- a/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml +++ b/dts/bindings/i2c/intel,qmsi-ss-i2c.yaml @@ -5,7 +5,6 @@ # --- title: Intel QMSI SS i2c -id: intel,qmsi-ss-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/nordic,nrf-i2c.yaml b/dts/bindings/i2c/nordic,nrf-i2c.yaml index c6d1e73532c6..a47a7dd24517 100644 --- a/dts/bindings/i2c/nordic,nrf-i2c.yaml +++ b/dts/bindings/i2c/nordic,nrf-i2c.yaml @@ -5,8 +5,7 @@ # SPDX-License-Identifier: Apache-2.0 # --- -title: Nordic nRF Family I2C Master node -id: nordic,nrf-i2c +title: Nordic nRF5 Family I2C Master node version: 0.1 description: > diff --git a/dts/bindings/i2c/nxp,kinetis-i2c.yaml b/dts/bindings/i2c/nxp,kinetis-i2c.yaml index 17f6c47c07cf..394df1351dd4 100644 --- a/dts/bindings/i2c/nxp,kinetis-i2c.yaml +++ b/dts/bindings/i2c/nxp,kinetis-i2c.yaml @@ -5,7 +5,6 @@ # --- title: Kinetis I2C Controller -id: nxp,kinetis-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/snps,designware-i2c.yaml b/dts/bindings/i2c/snps,designware-i2c.yaml index 71b95b5d6b9e..85ffbd5551f7 100644 --- a/dts/bindings/i2c/snps,designware-i2c.yaml +++ b/dts/bindings/i2c/snps,designware-i2c.yaml @@ -5,7 +5,6 @@ # --- title: Synopys DesignWare I2C controller -id: snps,designware-i2c version: 0.1 description: > diff --git a/dts/bindings/i2c/st,stm32-i2c-v1.yaml b/dts/bindings/i2c/st,stm32-i2c-v1.yaml index 4404731f4def..5115fad7c3ae 100644 --- a/dts/bindings/i2c/st,stm32-i2c-v1.yaml +++ b/dts/bindings/i2c/st,stm32-i2c-v1.yaml @@ -5,7 +5,6 @@ # --- title: STM32 I2C V1 -id: st,stm32-i2c-v1 version: 0.1 description: > diff --git a/dts/bindings/i2c/st,stm32-i2c-v2.yaml b/dts/bindings/i2c/st,stm32-i2c-v2.yaml index 632213e673ce..204b8c3ca961 100644 --- a/dts/bindings/i2c/st,stm32-i2c-v2.yaml +++ b/dts/bindings/i2c/st,stm32-i2c-v2.yaml @@ -5,7 +5,6 @@ # --- title: STM32 I2C V2 -id: st,stm32-i2c-v2 version: 0.1 description: > diff --git a/dts/bindings/i2c/ti,cc32xx-i2c.yaml b/dts/bindings/i2c/ti,cc32xx-i2c.yaml index c740e6033a77..c07067178a1f 100644 --- a/dts/bindings/i2c/ti,cc32xx-i2c.yaml +++ b/dts/bindings/i2c/ti,cc32xx-i2c.yaml @@ -1,6 +1,5 @@ --- title: CC32XX I2C -id: ti,cc32xx-i2c description: > This binding gives a base representation of the TI CC32XX I2C controller diff --git a/dts/bindings/ieee802154/nxp,mcr20a.yaml b/dts/bindings/ieee802154/nxp,mcr20a.yaml index 951a615bc0ba..094fd517b5f3 100644 --- a/dts/bindings/ieee802154/nxp,mcr20a.yaml +++ b/dts/bindings/ieee802154/nxp,mcr20a.yaml @@ -5,7 +5,6 @@ # --- title: NXP MCR20A 802.15.4 Wireless Transceiver -id: nxp,mcr20a version: 0.1 description: > diff --git a/dts/bindings/iio/adc/atmel,sam-afec.yaml b/dts/bindings/iio/adc/atmel,sam-afec.yaml index e652dd0aa8bf..98f966a4afa7 100644 --- a/dts/bindings/iio/adc/atmel,sam-afec.yaml +++ b/dts/bindings/iio/adc/atmel,sam-afec.yaml @@ -1,6 +1,5 @@ --- title: Atmel SAM Family AFEC -id: atmel,sam-afec version: 0.1 description: > diff --git a/dts/bindings/iio/adc/intel,quark-d2000-adc.yaml b/dts/bindings/iio/adc/intel,quark-d2000-adc.yaml index dbb8bdf946d5..f65787059fb4 100644 --- a/dts/bindings/iio/adc/intel,quark-d2000-adc.yaml +++ b/dts/bindings/iio/adc/intel,quark-d2000-adc.yaml @@ -5,7 +5,6 @@ # --- title: Intel Quark D2000 ADC -id: intel,quark-d2000-adc version: 0.1 description: > diff --git a/dts/bindings/iio/adc/nordic,nrf-adc.yaml b/dts/bindings/iio/adc/nordic,nrf-adc.yaml index 2617c22a1a97..4e52a6d1b39d 100644 --- a/dts/bindings/iio/adc/nordic,nrf-adc.yaml +++ b/dts/bindings/iio/adc/nordic,nrf-adc.yaml @@ -5,7 +5,6 @@ # --- title: Nordic Semiconductor nRF Family ADC -id: nordic,nrf-adc version: 0.1 description: > diff --git a/dts/bindings/iio/adc/nordic,nrf-saadc.yaml b/dts/bindings/iio/adc/nordic,nrf-saadc.yaml index 0c988d3717c6..71e78326decd 100644 --- a/dts/bindings/iio/adc/nordic,nrf-saadc.yaml +++ b/dts/bindings/iio/adc/nordic,nrf-saadc.yaml @@ -5,7 +5,6 @@ # --- title: Nordic Semiconductor nRF Family SAADC -id: nordic,nrf-saadc version: 0.1 description: > diff --git a/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml b/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml index 9cfff796fbca..cb003b1cd374 100644 --- a/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml +++ b/dts/bindings/iio/adc/nxp,kinetis-adc16.yaml @@ -5,7 +5,6 @@ # --- title: Kinetis ADC16 -id: nxp,kinetis-adc16 version: 0.1 description: > diff --git a/dts/bindings/iio/adc/snps,dw-adc.yaml b/dts/bindings/iio/adc/snps,dw-adc.yaml index ea34c5eeb6a0..9590d7eaa0dc 100644 --- a/dts/bindings/iio/adc/snps,dw-adc.yaml +++ b/dts/bindings/iio/adc/snps,dw-adc.yaml @@ -5,7 +5,6 @@ # --- title: DesignWare ADC -id: snps,dw-adc version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml index c3cc7b8eb241..0c7d287cd374 100644 --- a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv6-M NVIC Interrupt Controller -id: arm,v6m-nvic +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml index 19b347d26157..40b8cd01d68b 100644 --- a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv7-M NVIC Interrupt Controller -id: arm,v7m-nvic +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml index 9b514fa16036..d6cc13d225d2 100644 --- a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv8-M NVIC Interrupt Controller -id: arm,v8m-nvic +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml index b2c7838bc795..4ac3b1d97859 100644 --- a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml +++ b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml @@ -1,5 +1,6 @@ --- title: CAVS Interrupt Controller +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,ioapic.yaml b/dts/bindings/interrupt-controller/intel,ioapic.yaml index f6524595e11b..6395675480c3 100644 --- a/dts/bindings/interrupt-controller/intel,ioapic.yaml +++ b/dts/bindings/interrupt-controller/intel,ioapic.yaml @@ -1,5 +1,6 @@ --- title: Intel I/O Advanced Programmable Interrupt Controller +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,mvic.yaml b/dts/bindings/interrupt-controller/intel,mvic.yaml index c88ae1a43a85..296d9fd3c0fb 100644 --- a/dts/bindings/interrupt-controller/intel,mvic.yaml +++ b/dts/bindings/interrupt-controller/intel,mvic.yaml @@ -1,5 +1,6 @@ --- title: Intel Quark D2000 Interrupt Controller +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/riscv,plic0.yaml b/dts/bindings/interrupt-controller/riscv,plic0.yaml index 1af86c1da298..b0e9b32053e5 100644 --- a/dts/bindings/interrupt-controller/riscv,plic0.yaml +++ b/dts/bindings/interrupt-controller/riscv,plic0.yaml @@ -5,7 +5,7 @@ # --- title: RISC-V PLIC -id: riscv,plic0 +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml index e6783d0fecae..f64652c05f00 100644 --- a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml @@ -5,7 +5,7 @@ # --- title: ARCV2 Interrupt Controller -id: snps,arcv2-intc +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/snps,designware-intc.yaml b/dts/bindings/interrupt-controller/snps,designware-intc.yaml index 9efa81d28fa4..522ea165217e 100644 --- a/dts/bindings/interrupt-controller/snps,designware-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,designware-intc.yaml @@ -1,5 +1,6 @@ --- title: DesignWare Interrupt Controller +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/xtensa,intc.yaml b/dts/bindings/interrupt-controller/xtensa,intc.yaml index 2c841affacd3..a441bb40860e 100644 --- a/dts/bindings/interrupt-controller/xtensa,intc.yaml +++ b/dts/bindings/interrupt-controller/xtensa,intc.yaml @@ -1,5 +1,6 @@ --- title: Xtensa Core Interrupt Controller +id: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/led/nxp,pca9633.yaml b/dts/bindings/led/nxp,pca9633.yaml index 18d0cd711b32..a0d738a8fdf2 100644 --- a/dts/bindings/led/nxp,pca9633.yaml +++ b/dts/bindings/led/nxp,pca9633.yaml @@ -1,6 +1,6 @@ --- title: NXP PCA9633 LED Driver -id: nxp,pca9633 +id: led version: 0.1 description: NXP PCA9633 LED binding diff --git a/dts/bindings/led/ti,lp3943.yaml b/dts/bindings/led/ti,lp3943.yaml index 37d78531da6a..87eed0cc3de5 100644 --- a/dts/bindings/led/ti,lp3943.yaml +++ b/dts/bindings/led/ti,lp3943.yaml @@ -1,6 +1,6 @@ --- title: TI LP3943 LED Driver -id: ti,lp3943 +id: led version: 0.1 description: TI LP3943 LED binding diff --git a/dts/bindings/led/ti,lp5562.yaml b/dts/bindings/led/ti,lp5562.yaml index b161f1d08b7d..063b6c724e8f 100644 --- a/dts/bindings/led/ti,lp5562.yaml +++ b/dts/bindings/led/ti,lp5562.yaml @@ -1,6 +1,6 @@ --- title: TI LP5562 LED Driver -id: ti,lp5562 +id: led version: 0.1 description: TI LP5562 LED binding diff --git a/dts/bindings/led_strip/apa,apa-102.yaml b/dts/bindings/led_strip/apa,apa-102.yaml index 5dea38cac7bc..4b192bf495ff 100644 --- a/dts/bindings/led_strip/apa,apa-102.yaml +++ b/dts/bindings/led_strip/apa,apa-102.yaml @@ -1,6 +1,6 @@ --- title: APA102 SPI LED strip -id: apa,apa102 +id: led-strip version: 0.1 description: APA102 SPI LED strip binding diff --git a/dts/bindings/memory-controllers/nxp,imx-semc.yaml b/dts/bindings/memory-controllers/nxp,imx-semc.yaml index b192e857e56c..5e317abda6f0 100644 --- a/dts/bindings/memory-controllers/nxp,imx-semc.yaml +++ b/dts/bindings/memory-controllers/nxp,imx-semc.yaml @@ -5,7 +5,7 @@ # --- title: NXP SEMC -id: nxp,imx-semc +id: memory-controllers version: 0.1 description: > diff --git a/dts/bindings/modem/wnc,m14a2a.yaml b/dts/bindings/modem/wnc,m14a2a.yaml index 6310306b6781..a1d4a24d6c3b 100644 --- a/dts/bindings/modem/wnc,m14a2a.yaml +++ b/dts/bindings/modem/wnc,m14a2a.yaml @@ -5,7 +5,7 @@ # --- title: WNC-M14A2A LTE-M Modem -id: wnc,m14a2a +id: modem version: 0.1 description: > diff --git a/dts/bindings/mtd/partition.yaml b/dts/bindings/mtd/partition.yaml index d34278cd9dd2..72e2797384e7 100644 --- a/dts/bindings/mtd/partition.yaml +++ b/dts/bindings/mtd/partition.yaml @@ -1,6 +1,6 @@ --- title: Flash Partitions -id: fixed-partition +id: mtd version: 0.1 description: > diff --git a/dts/bindings/mtd/soc-nv-flash.yaml b/dts/bindings/mtd/soc-nv-flash.yaml index 02b762e2a5e4..21ff2aa3b2db 100644 --- a/dts/bindings/mtd/soc-nv-flash.yaml +++ b/dts/bindings/mtd/soc-nv-flash.yaml @@ -1,6 +1,6 @@ --- title: Flash base node description -id: soc-nv-flash +id: mtd version: 0.1 description: > diff --git a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml index 5bd1d690e21f..92628377a431 100644 --- a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml +++ b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 PINMUX -id: atmel,sam0-pinmux +id: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml index 70deb3fa98e3..7094102a73cf 100644 --- a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml +++ b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml @@ -1,6 +1,6 @@ --- title: Kinetis Pinmux -id: nxp,kinetis-pinmux +id: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/st,stm32-pinmux.yaml b/dts/bindings/pinctrl/st,stm32-pinmux.yaml index 030606340c04..d786fc9bc5cb 100644 --- a/dts/bindings/pinctrl/st,stm32-pinmux.yaml +++ b/dts/bindings/pinctrl/st,stm32-pinmux.yaml @@ -1,6 +1,6 @@ --- title: STM32 PINMUX -id: st,stm32-pinmux +id: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml index 24a926cc2951..802af1e096f3 100644 --- a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml +++ b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml @@ -1,6 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 Pinmux +id: pinmux version: 0.1 description: > diff --git a/dts/bindings/pwm/fsl,imx7d-pwm.yaml b/dts/bindings/pwm/fsl,imx7d-pwm.yaml index 96908df14325..583d3e3d4edf 100644 --- a/dts/bindings/pwm/fsl,imx7d-pwm.yaml +++ b/dts/bindings/pwm/fsl,imx7d-pwm.yaml @@ -5,7 +5,6 @@ # --- title: i.MX7D PWM -id: fsl,imx7d-pwm version: 0.1 description: > diff --git a/dts/bindings/pwm/nxp,kinetis-ftm.yaml b/dts/bindings/pwm/nxp,kinetis-ftm.yaml index 04cc3a83caf7..1c5253752023 100644 --- a/dts/bindings/pwm/nxp,kinetis-ftm.yaml +++ b/dts/bindings/pwm/nxp,kinetis-ftm.yaml @@ -5,7 +5,6 @@ # --- title: Kinetis FTM -id: nxp,kinetis-ftm version: 0.1 description: > diff --git a/dts/bindings/pwm/sifive,pwm0.yaml b/dts/bindings/pwm/sifive,pwm0.yaml index aa42da305bfb..9cba4ed68ea0 100644 --- a/dts/bindings/pwm/sifive,pwm0.yaml +++ b/dts/bindings/pwm/sifive,pwm0.yaml @@ -5,7 +5,6 @@ # --- title: SiFive PWM -id: sifive,pwm0 version: 0.1 description: > diff --git a/dts/bindings/pwm/st,stm32-pwm.yaml b/dts/bindings/pwm/st,stm32-pwm.yaml index f177f06d96f6..4c8c058f7db2 100644 --- a/dts/bindings/pwm/st,stm32-pwm.yaml +++ b/dts/bindings/pwm/st,stm32-pwm.yaml @@ -1,6 +1,5 @@ --- title: STM32 PWM -id: st,stm32-pwm version: 0.1 description: > diff --git a/dts/bindings/rtc/intel,qmsi-rtc.yaml b/dts/bindings/rtc/intel,qmsi-rtc.yaml index 3419b6bbef37..9e2ffc8b1c89 100644 --- a/dts/bindings/rtc/intel,qmsi-rtc.yaml +++ b/dts/bindings/rtc/intel,qmsi-rtc.yaml @@ -5,7 +5,6 @@ # --- title: Intel QMSI RTC -id: intel,qmsi-rtc version: 0.1 description: > diff --git a/dts/bindings/rtc/nxp,kinetis-rtc.yaml b/dts/bindings/rtc/nxp,kinetis-rtc.yaml index e5e5d388969e..c19c18831ee6 100644 --- a/dts/bindings/rtc/nxp,kinetis-rtc.yaml +++ b/dts/bindings/rtc/nxp,kinetis-rtc.yaml @@ -5,7 +5,6 @@ # --- title: Kinetis RTC -id: nxp,kinetis-rtc version: 0.1 description: > diff --git a/dts/bindings/rtc/st,stm32-rtc.yaml b/dts/bindings/rtc/st,stm32-rtc.yaml index 81b6b7e5eb1b..49890a07538f 100644 --- a/dts/bindings/rtc/st,stm32-rtc.yaml +++ b/dts/bindings/rtc/st,stm32-rtc.yaml @@ -5,7 +5,6 @@ # --- title: STM32 RTC -id: st,stm32-rtc version: 0.1 description: > diff --git a/dts/bindings/sensor/adi,adt7420.yaml b/dts/bindings/sensor/adi,adt7420.yaml index f9702f1b6fff..c5e670d12bb7 100644 --- a/dts/bindings/sensor/adi,adt7420.yaml +++ b/dts/bindings/sensor/adi,adt7420.yaml @@ -5,7 +5,7 @@ # --- title: ADT7420 16-Bit Digital I2C Temperature Sensor -id: adi,adt7420 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/ams,ccs811.yaml b/dts/bindings/sensor/ams,ccs811.yaml index 14a4fe87f259..436befe63eff 100644 --- a/dts/bindings/sensor/ams,ccs811.yaml +++ b/dts/bindings/sensor/ams,ccs811.yaml @@ -5,7 +5,7 @@ # --- title: AMS (Austria Mikro Systeme) Digital Air Quality Sensor CCS811 -id: ams,ccs811 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/avago,apds9960.yaml b/dts/bindings/sensor/avago,apds9960.yaml index 953a74984778..aaf07f7dfaf8 100644 --- a/dts/bindings/sensor/avago,apds9960.yaml +++ b/dts/bindings/sensor/avago,apds9960.yaml @@ -5,7 +5,7 @@ # --- title: APDS9960 Digital Proximity, Ambient Light, RGB and Gesture Sensor -id: avago,apds9960 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/max,max30101.yaml b/dts/bindings/sensor/max,max30101.yaml index 244e1bc054ec..6c2045ed3f77 100644 --- a/dts/bindings/sensor/max,max30101.yaml +++ b/dts/bindings/sensor/max,max30101.yaml @@ -5,7 +5,7 @@ # --- title: MAX30101 heart rate sensor -id: nxp,max30101 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,fxas21002.yaml b/dts/bindings/sensor/nxp,fxas21002.yaml index 715637566202..338472c3e35e 100644 --- a/dts/bindings/sensor/nxp,fxas21002.yaml +++ b/dts/bindings/sensor/nxp,fxas21002.yaml @@ -5,7 +5,7 @@ # --- title: FXAS21002 3-axis gyroscope -id: nxp,fxas21002 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,fxos8700.yaml b/dts/bindings/sensor/nxp,fxos8700.yaml index d475bd27cc3d..98f65f460b7a 100644 --- a/dts/bindings/sensor/nxp,fxos8700.yaml +++ b/dts/bindings/sensor/nxp,fxos8700.yaml @@ -5,7 +5,7 @@ # --- title: FXOS8700 6-axis accelerometer/magnetometer -id: nxp,fxos8700 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,mma8451q.yaml b/dts/bindings/sensor/nxp,mma8451q.yaml index fc91be430120..010eebb7d797 100644 --- a/dts/bindings/sensor/nxp,mma8451q.yaml +++ b/dts/bindings/sensor/nxp,mma8451q.yaml @@ -5,7 +5,7 @@ # --- title: MMA8451Q 3-axis Accelerometer -id: nxp,mma8451q +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,hts221.yaml b/dts/bindings/sensor/st,hts221.yaml index 1d930b73bfd7..436b3ed286af 100644 --- a/dts/bindings/sensor/st,hts221.yaml +++ b/dts/bindings/sensor/st,hts221.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors HTS221 -id: st,hts221 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lis3mdl-magn.yaml b/dts/bindings/sensor/st,lis3mdl-magn.yaml index 066c29331901..835521946b5e 100644 --- a/dts/bindings/sensor/st,lis3mdl-magn.yaml +++ b/dts/bindings/sensor/st,lis3mdl-magn.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LIS3MDL -id: st,lis3mdl-magn +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lps22hb-press.yaml b/dts/bindings/sensor/st,lps22hb-press.yaml index 919d8ebb313b..e1c17cdf93a2 100644 --- a/dts/bindings/sensor/st,lps22hb-press.yaml +++ b/dts/bindings/sensor/st,lps22hb-press.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LPS22HB -id: st,lps22hb-press +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lps25hb-press.yaml b/dts/bindings/sensor/st,lps25hb-press.yaml index 74224a966f3e..c31588572d93 100644 --- a/dts/bindings/sensor/st,lps25hb-press.yaml +++ b/dts/bindings/sensor/st,lps25hb-press.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LPS25HB -id: st,lps25hb-press +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6ds0.yaml b/dts/bindings/sensor/st,lsm6ds0.yaml index b821f22f9ab3..5dd98aca097b 100644 --- a/dts/bindings/sensor/st,lsm6ds0.yaml +++ b/dts/bindings/sensor/st,lsm6ds0.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DS0 -id: st,lsm6ds0 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6dsl-spi.yaml b/dts/bindings/sensor/st,lsm6dsl-spi.yaml index e76322ddb4ab..65dd35e97ae6 100644 --- a/dts/bindings/sensor/st,lsm6dsl-spi.yaml +++ b/dts/bindings/sensor/st,lsm6dsl-spi.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DSL SPI -id: st,lsm6dsl-spi +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6dsl.yaml b/dts/bindings/sensor/st,lsm6dsl.yaml index 729c6eb59667..c7688def4d8d 100644 --- a/dts/bindings/sensor/st,lsm6dsl.yaml +++ b/dts/bindings/sensor/st,lsm6dsl.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DSL -id: st,lsm6dsl +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,vl53l0x.yaml b/dts/bindings/sensor/st,vl53l0x.yaml index f38f80db2f93..66ffca5b26ed 100644 --- a/dts/bindings/sensor/st,vl53l0x.yaml +++ b/dts/bindings/sensor/st,vl53l0x.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors VL53L0X -id: st,vl53l0x +id: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/ti,hdc1008.yaml b/dts/bindings/sensor/ti,hdc1008.yaml index d08869a8e1e3..f007bfb6fd17 100644 --- a/dts/bindings/sensor/ti,hdc1008.yaml +++ b/dts/bindings/sensor/ti,hdc1008.yaml @@ -5,7 +5,7 @@ # --- title: HDC1008 Temperature and Humidity Sensor -id: ti,hdc1008 +id: sensor version: 0.1 description: > diff --git a/dts/bindings/serial/altera,jtag-uart.yaml b/dts/bindings/serial/altera,jtag-uart.yaml index ebf505f64562..103b8e54065c 100644 --- a/dts/bindings/serial/altera,jtag-uart.yaml +++ b/dts/bindings/serial/altera,jtag-uart.yaml @@ -1,6 +1,5 @@ --- title: Altera JTAG UART -id: altera,jtag-uart version: 0.1 description: > diff --git a/dts/bindings/serial/arm,cmsdk-uart.yaml b/dts/bindings/serial/arm,cmsdk-uart.yaml index e48374cc92c9..b96a28b039f2 100644 --- a/dts/bindings/serial/arm,cmsdk-uart.yaml +++ b/dts/bindings/serial/arm,cmsdk-uart.yaml @@ -1,6 +1,5 @@ --- title: ARM CMSDK UART -id: arm,cmsdk-uart version: 0.1 description: > diff --git a/dts/bindings/serial/atmel,sam-uart.yaml b/dts/bindings/serial/atmel,sam-uart.yaml index fefad5ba4f40..dbe1293d24e8 100644 --- a/dts/bindings/serial/atmel,sam-uart.yaml +++ b/dts/bindings/serial/atmel,sam-uart.yaml @@ -1,6 +1,5 @@ --- title: SAM Family UART -id: atmel,sam-uart version: 0.1 description: > diff --git a/dts/bindings/serial/atmel,sam-usart.yaml b/dts/bindings/serial/atmel,sam-usart.yaml index 1fadacd677fb..8b6b356d5444 100644 --- a/dts/bindings/serial/atmel,sam-usart.yaml +++ b/dts/bindings/serial/atmel,sam-usart.yaml @@ -1,6 +1,5 @@ --- title: Atmel SAM Family USART -id: atmel,sam-usart version: 0.1 description: > diff --git a/dts/bindings/serial/atmel,sam0-uart.yaml b/dts/bindings/serial/atmel,sam0-uart.yaml index 0cd6dd76d02a..13b5c5e91d8c 100644 --- a/dts/bindings/serial/atmel,sam0-uart.yaml +++ b/dts/bindings/serial/atmel,sam0-uart.yaml @@ -1,6 +1,5 @@ --- title: Atmel SAM0 SERCOM UART driver -id: atmel,sam0-uart version: 0.1 description: > diff --git a/dts/bindings/serial/intel,qmsi-uart.yaml b/dts/bindings/serial/intel,qmsi-uart.yaml index 4c66d90cfc3a..3f37f6b0ad8c 100644 --- a/dts/bindings/serial/intel,qmsi-uart.yaml +++ b/dts/bindings/serial/intel,qmsi-uart.yaml @@ -5,7 +5,6 @@ # --- title: Intel QMSI Uart -id: intel,qmsi-uart version: 0.1 description: > diff --git a/dts/bindings/serial/nordic,nrf-uart.yaml b/dts/bindings/serial/nordic,nrf-uart.yaml index 383167678b52..af7072f83141 100644 --- a/dts/bindings/serial/nordic,nrf-uart.yaml +++ b/dts/bindings/serial/nordic,nrf-uart.yaml @@ -1,6 +1,5 @@ --- title: Nordic UART -id: nordic,nrf-uart version: 0.1 description: > diff --git a/dts/bindings/serial/nordic,nrf-uarte.yaml b/dts/bindings/serial/nordic,nrf-uarte.yaml index 260dd1509205..3796a4dd8c41 100644 --- a/dts/bindings/serial/nordic,nrf-uarte.yaml +++ b/dts/bindings/serial/nordic,nrf-uarte.yaml @@ -1,6 +1,5 @@ --- title: Nordic UARTE -id: nordic,nrf-uarte version: 0.1 description: > diff --git a/dts/bindings/serial/ns16550.yaml b/dts/bindings/serial/ns16550.yaml index a35b6c338557..cce1bd331848 100644 --- a/dts/bindings/serial/ns16550.yaml +++ b/dts/bindings/serial/ns16550.yaml @@ -1,6 +1,5 @@ --- title: ns16550 -id: ns16550 version: 0.1 description: > diff --git a/dts/bindings/serial/nxp,imx-uart.yaml b/dts/bindings/serial/nxp,imx-uart.yaml index b10b20d38c50..a667bd43c17f 100644 --- a/dts/bindings/serial/nxp,imx-uart.yaml +++ b/dts/bindings/serial/nxp,imx-uart.yaml @@ -5,7 +5,6 @@ # --- title: iMX Uart -id: nxp,imx-uart version: 0.1 description: > diff --git a/dts/bindings/serial/nxp,kinetis-lpsci.yaml b/dts/bindings/serial/nxp,kinetis-lpsci.yaml index 4b8b21d2898f..3d0a2065e31c 100644 --- a/dts/bindings/serial/nxp,kinetis-lpsci.yaml +++ b/dts/bindings/serial/nxp,kinetis-lpsci.yaml @@ -1,6 +1,5 @@ --- title: Kinetis LPSCI UART -id: nxp,kinetis-lpsci version: 0.1 description: > diff --git a/dts/bindings/serial/nxp,kinetis-lpuart.yaml b/dts/bindings/serial/nxp,kinetis-lpuart.yaml index 58700f130a0d..00fe7c0ff4e8 100644 --- a/dts/bindings/serial/nxp,kinetis-lpuart.yaml +++ b/dts/bindings/serial/nxp,kinetis-lpuart.yaml @@ -1,6 +1,5 @@ --- title: Kinetis LPUART -id: nxp,kinetis-lpuart version: 0.1 description: > diff --git a/dts/bindings/serial/nxp,kinetis-uart.yaml b/dts/bindings/serial/nxp,kinetis-uart.yaml index 9dc8309ce2f4..ac31c162f3e6 100644 --- a/dts/bindings/serial/nxp,kinetis-uart.yaml +++ b/dts/bindings/serial/nxp,kinetis-uart.yaml @@ -1,6 +1,5 @@ --- title: Kinetis UART -id: nxp,kinetis-uart version: 0.1 description: > diff --git a/dts/bindings/serial/nxp,lpc-usart.yaml b/dts/bindings/serial/nxp,lpc-usart.yaml index c2f45c34168e..dd3a792ce6af 100644 --- a/dts/bindings/serial/nxp,lpc-usart.yaml +++ b/dts/bindings/serial/nxp,lpc-usart.yaml @@ -5,7 +5,6 @@ # --- title: LPC USART -id: nxp,lpc-usart version: 0.1 description: > diff --git a/dts/bindings/serial/riscv,qemu-uart.yaml b/dts/bindings/serial/riscv,qemu-uart.yaml index 09b45bb20ab4..bdf8d11b5bfc 100644 --- a/dts/bindings/serial/riscv,qemu-uart.yaml +++ b/dts/bindings/serial/riscv,qemu-uart.yaml @@ -1,6 +1,5 @@ --- title: RISCV QEMU UART -id: riscv,qemu-uart version: 0.1 description: > diff --git a/dts/bindings/serial/sifive,uart0.yaml b/dts/bindings/serial/sifive,uart0.yaml index 44cc22dac0ee..88caf4c521fc 100644 --- a/dts/bindings/serial/sifive,uart0.yaml +++ b/dts/bindings/serial/sifive,uart0.yaml @@ -5,7 +5,6 @@ # --- title: SIFIVE UART -id: sifive,uart0 version: 0.1 description: > diff --git a/dts/bindings/serial/silabs,efm32-uart.yaml b/dts/bindings/serial/silabs,efm32-uart.yaml index 545dbdc96433..901e26c73eaa 100644 --- a/dts/bindings/serial/silabs,efm32-uart.yaml +++ b/dts/bindings/serial/silabs,efm32-uart.yaml @@ -1,6 +1,5 @@ --- title: EFM32 UART -id: silabs,efm32-uart version: 0.1 description: > diff --git a/dts/bindings/serial/silabs,efm32-usart.yaml b/dts/bindings/serial/silabs,efm32-usart.yaml index 5b32aea2ed84..40d58da913de 100644 --- a/dts/bindings/serial/silabs,efm32-usart.yaml +++ b/dts/bindings/serial/silabs,efm32-usart.yaml @@ -1,6 +1,5 @@ --- title: EFM32 USART -id: silabs,efm32-usart version: 0.1 description: > diff --git a/dts/bindings/serial/st,stm32-lpuart.yaml b/dts/bindings/serial/st,stm32-lpuart.yaml index 191765347f87..93e072399e73 100644 --- a/dts/bindings/serial/st,stm32-lpuart.yaml +++ b/dts/bindings/serial/st,stm32-lpuart.yaml @@ -1,6 +1,5 @@ --- title: STM32 LPUART -id: st,stm32-lpuart version: 0.1 description: > diff --git a/dts/bindings/serial/st,stm32-uart.yaml b/dts/bindings/serial/st,stm32-uart.yaml index efe7343bdd26..10965c376869 100644 --- a/dts/bindings/serial/st,stm32-uart.yaml +++ b/dts/bindings/serial/st,stm32-uart.yaml @@ -1,6 +1,5 @@ --- title: STM32 UART -id: st,stm32-uart version: 0.1 description: > diff --git a/dts/bindings/serial/st,stm32-usart.yaml b/dts/bindings/serial/st,stm32-usart.yaml index c92b638d01af..44bee5ecc5c9 100644 --- a/dts/bindings/serial/st,stm32-usart.yaml +++ b/dts/bindings/serial/st,stm32-usart.yaml @@ -1,6 +1,5 @@ --- title: STM32 USART -id: st,stm32-usart version: 0.1 description: > diff --git a/dts/bindings/serial/ti,cc32xx-uart.yaml b/dts/bindings/serial/ti,cc32xx-uart.yaml index 94b5d2606042..a97f04218996 100644 --- a/dts/bindings/serial/ti,cc32xx-uart.yaml +++ b/dts/bindings/serial/ti,cc32xx-uart.yaml @@ -1,6 +1,5 @@ --- title: TI CC32XX Uart -id: ti,cc32xx-uart version: 0.1 description: > diff --git a/dts/bindings/serial/ti,msp432p4xx-uart.yaml b/dts/bindings/serial/ti,msp432p4xx-uart.yaml index 590ab433c2b2..949e775386b4 100644 --- a/dts/bindings/serial/ti,msp432p4xx-uart.yaml +++ b/dts/bindings/serial/ti,msp432p4xx-uart.yaml @@ -1,6 +1,5 @@ --- title: TI MSP432P4XX UART -id: ti,msp432p4xx-uart version: 0.1 description: > diff --git a/dts/bindings/serial/ti,stellaris-uart.yaml b/dts/bindings/serial/ti,stellaris-uart.yaml index 64f8c01dec92..42eaa833b87f 100644 --- a/dts/bindings/serial/ti,stellaris-uart.yaml +++ b/dts/bindings/serial/ti,stellaris-uart.yaml @@ -1,6 +1,5 @@ --- title: TI Stellaris UART -id: ti,stellaris-uart version: 0.1 description: > diff --git a/dts/bindings/spi/atmel,sam0-spi.yaml b/dts/bindings/spi/atmel,sam0-spi.yaml index d6fc09a65e4d..a8881bc49b86 100644 --- a/dts/bindings/spi/atmel,sam0-spi.yaml +++ b/dts/bindings/spi/atmel,sam0-spi.yaml @@ -5,7 +5,6 @@ # --- title: Atmel SAM0 SERCOM SPI driver -id: atmel,sam0-spi version: 0.1 description: > diff --git a/dts/bindings/spi/nordic,nrf-spi.yaml b/dts/bindings/spi/nordic,nrf-spi.yaml index c1b564ab5fba..92d8fa78a279 100644 --- a/dts/bindings/spi/nordic,nrf-spi.yaml +++ b/dts/bindings/spi/nordic,nrf-spi.yaml @@ -5,7 +5,6 @@ # --- title: Nordic nRF Family SPI Master node -id: nordic,nrf-spi version: 0.1 description: > diff --git a/dts/bindings/spi/nxp,imx-flexspi.yaml b/dts/bindings/spi/nxp,imx-flexspi.yaml index 9f12a3ed1b97..dfefda25144c 100644 --- a/dts/bindings/spi/nxp,imx-flexspi.yaml +++ b/dts/bindings/spi/nxp,imx-flexspi.yaml @@ -5,7 +5,6 @@ # --- title: NXP FlexSPI -id: nxp,imx-flexspi version: 0.1 description: > diff --git a/dts/bindings/spi/nxp,kinetis-dspi.yaml b/dts/bindings/spi/nxp,kinetis-dspi.yaml index f9f570088dc3..5bf114608971 100644 --- a/dts/bindings/spi/nxp,kinetis-dspi.yaml +++ b/dts/bindings/spi/nxp,kinetis-dspi.yaml @@ -5,7 +5,6 @@ # --- title: NXP DSPI -id: nxp,kinetis-dspi version: 0.1 description: > diff --git a/dts/bindings/spi/sifive,spi0.yaml b/dts/bindings/spi/sifive,spi0.yaml index 30722c87454b..897f86f65531 100644 --- a/dts/bindings/spi/sifive,spi0.yaml +++ b/dts/bindings/spi/sifive,spi0.yaml @@ -5,7 +5,6 @@ # --- title: Sifive SPI driver -id: sifive,spi0 version: 0.1 description: > diff --git a/dts/bindings/spi/snps,designware-spi.yaml b/dts/bindings/spi/snps,designware-spi.yaml index efd3772b4cd3..a86e9cb66289 100644 --- a/dts/bindings/spi/snps,designware-spi.yaml +++ b/dts/bindings/spi/snps,designware-spi.yaml @@ -5,7 +5,6 @@ # --- title: Synopsys Designware SPI Controller -id: snps,designware-spi version: 0.1 description: > diff --git a/dts/bindings/spi/st,stm32-spi-fifo.yaml b/dts/bindings/spi/st,stm32-spi-fifo.yaml index f95d882d42a7..aa9ae3042d89 100644 --- a/dts/bindings/spi/st,stm32-spi-fifo.yaml +++ b/dts/bindings/spi/st,stm32-spi-fifo.yaml @@ -5,7 +5,6 @@ # --- title: STM32 SPI FIFO -id: st,stm32-spi-fifo version: 0.1 description: > diff --git a/dts/bindings/spi/st,stm32-spi.yaml b/dts/bindings/spi/st,stm32-spi.yaml index 32db69c0ec0b..fa17741d192e 100644 --- a/dts/bindings/spi/st,stm32-spi.yaml +++ b/dts/bindings/spi/st,stm32-spi.yaml @@ -5,7 +5,6 @@ # --- title: STM32 SPI -id: st,stm32-spi version: 0.1 description: > diff --git a/dts/bindings/timer/arm,cmsdk-dtimer.yaml b/dts/bindings/timer/arm,cmsdk-dtimer.yaml index ce690c84ec96..6776ff99cbec 100644 --- a/dts/bindings/timer/arm,cmsdk-dtimer.yaml +++ b/dts/bindings/timer/arm,cmsdk-dtimer.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK DUALTIMER -id: arm,cmsdk-dtimer +id: timer version: 0.1 description: > diff --git a/dts/bindings/timer/arm,cmsdk-timer.yaml b/dts/bindings/timer/arm,cmsdk-timer.yaml index 029617f73e59..9ebc729b700f 100644 --- a/dts/bindings/timer/arm,cmsdk-timer.yaml +++ b/dts/bindings/timer/arm,cmsdk-timer.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK TIMER -id: arm,cmsdk-timer +id: timer version: 0.1 description: > diff --git a/dts/bindings/timer/st,stm32-timers.yaml b/dts/bindings/timer/st,stm32-timers.yaml index 4b5a440dd450..714efa689cb9 100644 --- a/dts/bindings/timer/st,stm32-timers.yaml +++ b/dts/bindings/timer/st,stm32-timers.yaml @@ -1,6 +1,6 @@ --- title: STM32 TIMERS -id: st,stm32-timers +id: timer version: 0.1 description: > diff --git a/dts/bindings/usb/atmel,sam0-usb.yaml b/dts/bindings/usb/atmel,sam0-usb.yaml index 09fb157b9e29..beac93ee23bf 100644 --- a/dts/bindings/usb/atmel,sam0-usb.yaml +++ b/dts/bindings/usb/atmel,sam0-usb.yaml @@ -1,6 +1,5 @@ --- title: Atmel SAM0 USB device -id: atmel,sam0-usb version: 0.1 description: > diff --git a/dts/bindings/usb/nordic,nrf-usbd.yaml b/dts/bindings/usb/nordic,nrf-usbd.yaml index 41b0ec4704d9..fe903070aa16 100644 --- a/dts/bindings/usb/nordic,nrf-usbd.yaml +++ b/dts/bindings/usb/nordic,nrf-usbd.yaml @@ -5,7 +5,6 @@ # --- title: Nordic nRF52 USBD -id: nordic,nrf-usbd version: 0.1 description: > diff --git a/dts/bindings/usb/nxp,kinetis-usbd.yaml b/dts/bindings/usb/nxp,kinetis-usbd.yaml index 761040a65c7f..fcfb78d445b5 100644 --- a/dts/bindings/usb/nxp,kinetis-usbd.yaml +++ b/dts/bindings/usb/nxp,kinetis-usbd.yaml @@ -5,7 +5,6 @@ # --- title: NXP Kinetis USBD -id: nxp,kinetis-usbd version: 0.1 description: > diff --git a/dts/bindings/usb/st,stm32-otgfs.yaml b/dts/bindings/usb/st,stm32-otgfs.yaml index 2da75eed9f58..70d79fc7dd8f 100644 --- a/dts/bindings/usb/st,stm32-otgfs.yaml +++ b/dts/bindings/usb/st,stm32-otgfs.yaml @@ -5,7 +5,6 @@ # --- title: STM32 OTGFS -id: st,stm32-otgfs version: 0.1 description: > diff --git a/dts/bindings/usb/st,stm32-otghs.yaml b/dts/bindings/usb/st,stm32-otghs.yaml index 31f4af9c4d5e..98c567753445 100644 --- a/dts/bindings/usb/st,stm32-otghs.yaml +++ b/dts/bindings/usb/st,stm32-otghs.yaml @@ -5,7 +5,6 @@ # --- title: STM32 OTGHS -id: st,stm32-otghs version: 0.1 description: > diff --git a/dts/bindings/usb/st,stm32-usb.yaml b/dts/bindings/usb/st,stm32-usb.yaml index 1d321693b5fc..cba616ce557a 100644 --- a/dts/bindings/usb/st,stm32-usb.yaml +++ b/dts/bindings/usb/st,stm32-usb.yaml @@ -5,7 +5,6 @@ # --- title: STM32 USB -id: st,stm32-usb version: 0.1 description: > diff --git a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml index 29e9865bd22b..acf6b33c5419 100644 --- a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml +++ b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK WATCHDOG -id: arm,cmsdk-watchdog +id: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml index 21903fd79ff4..63576fb8c12a 100644 --- a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml +++ b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 watchdog driver -id: atmel,sam0-watchdog +id: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml index c069e32aebf7..074368811f14 100644 --- a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml +++ b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml @@ -5,7 +5,7 @@ # --- title: Nordic Semiconductor NRF watchdog driver -id: nordic,nrf-watchdog +id: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml index 9d7f6449a44a..05bfa0e8445f 100644 --- a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml +++ b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml @@ -5,7 +5,7 @@ # --- title: NXP Kinetis watchdog driver -id: nxp,kinetis-wdog +id: watchdog version: 0.1 description: > From 066200575c93aab0119891568a97fbf163664b43 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou <erwan.gouriou@linaro.org> Date: Tue, 11 Sep 2018 10:01:55 +0200 Subject: [PATCH 14/20] scripts: extract_dts_includes: simplify extraction of 'id' yaml prop dts yaml binding property 'id' was converted in 'node_type' when inherited from ancestor binding. Aim of this operation was to introduce new type of information while leaving untouched 'id' field. This operation was adding complexity in extraction operation while it had no benefit because 'id' field was not used. Remove 'node_type' and use directly 'id' instead. Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org> --- scripts/dts/extract/heuristics.py | 5 ++--- scripts/dts/extract_dts_includes.py | 31 ++++++++++++----------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/scripts/dts/extract/heuristics.py b/scripts/dts/extract/heuristics.py index f6d00f954cab..1059fa570878 100644 --- a/scripts/dts/extract/heuristics.py +++ b/scripts/dts/extract/heuristics.py @@ -7,7 +7,6 @@ from extract.globals import * from extract.edts import * from extract.directive import DTDirective - from extract.default import default ## @@ -42,7 +41,7 @@ def extract(self, node_address, yaml, prop, def_label): # Check for <device>-device that is connected to a bus for compat in compatible: - for device_type in yaml[compat].get('node_type', []): + for device_type in yaml[compat].get('id', []): if not device_type.endswith('-device'): continue @@ -57,7 +56,7 @@ def extract(self, node_address, yaml, prop, def_label): parent_yaml = yaml[reduced[parent_node_address] \ ['props']['compatible']] - if bus_master_device_type not in parent_yaml['node_type']: + if bus_master_device_type not in parent_yaml['id']: continue # generate EDTS diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 53083db4b79f..302ea980e409 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -406,7 +406,6 @@ def yaml_traverse_inherited(node): """ Recursive overload procedure inside ``node`` ``inherits`` section is searched for and used as node base when found. Base values are then overloaded by node values - Additionally, 'id' key of 'inherited' dict is converted to 'node_type' and some consistency checks are done. :param node: :return: node @@ -418,15 +417,12 @@ def yaml_traverse_inherited(node): # If 'title' is missing, make fault finding more easy. # Give a hint what node we are looking at. print("extract_dts_includes.py: node without 'title' -", node) - for prop in ('title', 'id', 'version', 'description'): + for prop in ('title', 'version', 'description'): if prop not in node: node[prop] = "<unknown {}>".format(prop) print("extract_dts_includes.py: '{}' property missing".format(prop), "in '{}' binding. Using '{}'.".format(node['title'], node[prop])) - if 'node_type' not in node: - node['node_type'] = [node['id'],] - if 'inherits' in node: if isinstance(node['inherits'], list): inherits_list = node['inherits'] @@ -436,21 +432,20 @@ def yaml_traverse_inherited(node): for inherits in inherits_list: if 'inherits' in inherits: inherits = yaml_traverse_inherited(inherits) - if 'node_type' in inherits: - node['node_type'].extend(inherits['node_type']) - else: - if 'id' not in inherits: - inherits['id'] = "<unknown id>" - title = inherits.get('title', "<unknown title>") - print("extract_dts_includes.py: 'id' property missing in", - "'{}' binding. Using '{}'.".format(title, - inherits['id'])) - node['node_type'].append(inherits['id']) - # id, node_type, title, description, version of inherited node + if 'id' in inherits: + if 'id' not in node: + node['id'] = [] + if not isinstance(node['id'], list): + node['id'] = [node['id'],] + if isinstance(inherits['id'], list): + node['id'].extend(inherits['id']) + else: + node['id'].append(inherits['id']) + + # type, title, description, version of inherited node # are overwritten by intention. Remove to prevent dct_merge to # complain about duplicates. - inherits.pop('id') - inherits.pop('node_type', None) + inherits.pop('id', None) inherits.pop('title', None) inherits.pop('version', None) inherits.pop('description', None) From 2a5103a114d561246d490ffc46589a85007fe4a0 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou <erwan.gouriou@linaro.org> Date: Tue, 11 Sep 2018 10:06:16 +0200 Subject: [PATCH 15/20] dts/bindings: Rename 'id' yaml property into 'type' dts yaml binding 'id' is now used to convey zephyr generic device type information. Make this change clear and rename 'id' to 'type'. Yaml bindings and scripts updated. Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org> --- dts/bindings/arc/arc,dccm.yaml | 2 +- dts/bindings/arc/arc,iccm.yaml | 2 +- dts/bindings/arm/atmel,sam0-sercom.yaml | 2 +- dts/bindings/arm/nxp,kinetis-sim.yaml | 2 +- dts/bindings/arm/nxp,lpc-mailbox.yaml | 2 +- dts/bindings/arm/st,stm32-ccm.yaml | 2 +- dts/bindings/arm/ti,cc2650-prcm.yaml | 2 +- dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml | 2 +- dts/bindings/can/can-device.yaml | 2 +- dts/bindings/can/can.yaml | 2 +- dts/bindings/clock/nxp,imx-ccm.yaml | 2 +- dts/bindings/clock/st,stm32-rcc.yaml | 2 +- dts/bindings/device_node.yaml.template | 2 +- .../flash_controller/flash-controller.yaml | 2 +- dts/bindings/gpio/arm,cmsdk-gpio.yaml | 2 +- dts/bindings/gpio/atmel,sam0-gpio.yaml | 2 +- dts/bindings/gpio/atmel.sam-gpio.yaml | 2 +- dts/bindings/gpio/gpio-keys.yaml | 2 +- dts/bindings/gpio/gpio-leds.yaml | 2 +- dts/bindings/gpio/intel,qmsi-gpio.yaml | 2 +- dts/bindings/gpio/intel,qmsi-ss-gpio.yaml | 2 +- dts/bindings/gpio/nordic,nrf-gpio.yaml | 2 +- dts/bindings/gpio/nordic,nrf-gpiote.yaml | 2 +- dts/bindings/gpio/nxp,imx-gpio.yaml | 2 +- dts/bindings/gpio/nxp,kinetis-gpio.yaml | 2 +- dts/bindings/gpio/sifive,gpio0.yaml | 2 +- dts/bindings/gpio/snps,designware-gpio.yaml | 2 +- dts/bindings/gpio/st,stm32-gpio.yaml | 2 +- dts/bindings/gpio/ti,cc2650-gpio.yaml | 2 +- dts/bindings/i2c/i2c-device.yaml | 2 +- dts/bindings/i2c/i2c.yaml | 2 +- dts/bindings/iio/adc/adc.yaml | 2 +- .../interrupt-controller/arm,v6m-nvic.yaml | 2 +- .../interrupt-controller/arm,v7m-nvic.yaml | 2 +- .../interrupt-controller/arm,v8m-nvic.yaml | 2 +- .../interrupt-controller/intel,cavs-intc.yaml | 2 +- .../interrupt-controller/intel,ioapic.yaml | 2 +- .../interrupt-controller/intel,mvic.yaml | 2 +- .../interrupt-controller/riscv,plic0.yaml | 2 +- .../interrupt-controller/snps,arcv2-intc.yaml | 2 +- .../snps,designware-intc.yaml | 2 +- .../interrupt-controller/xtensa,intc.yaml | 2 +- dts/bindings/led/nxp,pca9633.yaml | 2 +- dts/bindings/led/ti,lp3943.yaml | 2 +- dts/bindings/led/ti,lp5562.yaml | 2 +- dts/bindings/led_strip/apa,apa-102.yaml | 2 +- .../memory-controllers/nxp,imx-semc.yaml | 2 +- dts/bindings/modem/wnc,m14a2a.yaml | 2 +- dts/bindings/mtd/partition.yaml | 2 +- dts/bindings/mtd/soc-nv-flash.yaml | 2 +- dts/bindings/pinctrl/atmel,sam0-pinmux.yaml | 2 +- dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml | 2 +- dts/bindings/pinctrl/st,stm32-pinmux.yaml | 2 +- dts/bindings/pinctrl/ti,cc2650-pinmux.yaml | 2 +- dts/bindings/pwm/pwm.yaml | 2 +- dts/bindings/rtc/rtc.yaml | 2 +- dts/bindings/sensor/adi,adt7420.yaml | 2 +- dts/bindings/sensor/ams,ccs811.yaml | 2 +- dts/bindings/sensor/avago,apds9960.yaml | 2 +- dts/bindings/sensor/max,max30101.yaml | 2 +- dts/bindings/sensor/nxp,fxas21002.yaml | 2 +- dts/bindings/sensor/nxp,fxos8700.yaml | 2 +- dts/bindings/sensor/nxp,mma8451q.yaml | 2 +- dts/bindings/sensor/st,hts221.yaml | 2 +- dts/bindings/sensor/st,lis3mdl-magn.yaml | 2 +- dts/bindings/sensor/st,lps22hb-press.yaml | 2 +- dts/bindings/sensor/st,lps25hb-press.yaml | 2 +- dts/bindings/sensor/st,lsm6ds0.yaml | 2 +- dts/bindings/sensor/st,lsm6dsl-spi.yaml | 2 +- dts/bindings/sensor/st,lsm6dsl.yaml | 2 +- dts/bindings/sensor/st,vl53l0x.yaml | 2 +- dts/bindings/sensor/ti,hdc1008.yaml | 2 +- dts/bindings/serial/uart-device.yaml | 2 +- dts/bindings/serial/uart.yaml | 2 +- dts/bindings/spi/spi-device.yaml | 2 +- dts/bindings/spi/spi.yaml | 2 +- dts/bindings/timer/arm,cmsdk-dtimer.yaml | 2 +- dts/bindings/timer/arm,cmsdk-timer.yaml | 2 +- dts/bindings/timer/st,stm32-timers.yaml | 2 +- dts/bindings/usb/usb-ep.yaml | 2 +- dts/bindings/usb/usb.yaml | 2 +- dts/bindings/watchdog/arm,cmsdk-watchdog.yaml | 2 +- dts/bindings/watchdog/atmel,sam0-watchdog.yaml | 2 +- dts/bindings/watchdog/nordic,nrf-watchdog.yaml | 2 +- dts/bindings/watchdog/nxp,kinetis-wdog.yaml | 2 +- scripts/dts/extract/heuristics.py | 4 ++-- scripts/dts/extract_dts_includes.py | 18 +++++++++--------- 87 files changed, 96 insertions(+), 96 deletions(-) diff --git a/dts/bindings/arc/arc,dccm.yaml b/dts/bindings/arc/arc,dccm.yaml index 78676b85ec33..414d9f19c684 100644 --- a/dts/bindings/arc/arc,dccm.yaml +++ b/dts/bindings/arc/arc,dccm.yaml @@ -5,7 +5,7 @@ # --- title: ARC DCCM -id: dccm +type: dccm version: 0.1 description: > diff --git a/dts/bindings/arc/arc,iccm.yaml b/dts/bindings/arc/arc,iccm.yaml index 8f8da77c68e9..4d87c1bbc774 100644 --- a/dts/bindings/arc/arc,iccm.yaml +++ b/dts/bindings/arc/arc,iccm.yaml @@ -5,7 +5,7 @@ # --- title: ARC ICCM -id: iccm +type: iccm version: 0.1 description: > diff --git a/dts/bindings/arm/atmel,sam0-sercom.yaml b/dts/bindings/arm/atmel,sam0-sercom.yaml index 01ab7e3ef84d..bc98a4df4886 100644 --- a/dts/bindings/arm/atmel,sam0-sercom.yaml +++ b/dts/bindings/arm/atmel,sam0-sercom.yaml @@ -1,6 +1,6 @@ --- title: Atmel SERCOM binding -id: sercom +type: sercom version: 0.1 description: > diff --git a/dts/bindings/arm/nxp,kinetis-sim.yaml b/dts/bindings/arm/nxp,kinetis-sim.yaml index ff4d28209fd7..b001370fd0c1 100644 --- a/dts/bindings/arm/nxp,kinetis-sim.yaml +++ b/dts/bindings/arm/nxp,kinetis-sim.yaml @@ -5,7 +5,7 @@ # --- title: Kinetis System Integration Module (SIM) -id: clock-controller +type: clock-controller version: 0.1 description: > diff --git a/dts/bindings/arm/nxp,lpc-mailbox.yaml b/dts/bindings/arm/nxp,lpc-mailbox.yaml index 68f41ca78e2b..c4e40e520681 100644 --- a/dts/bindings/arm/nxp,lpc-mailbox.yaml +++ b/dts/bindings/arm/nxp,lpc-mailbox.yaml @@ -5,7 +5,7 @@ # --- title: LPC MAILBOX -id: mailbox +type: mailbox version: 0.1 description: > diff --git a/dts/bindings/arm/st,stm32-ccm.yaml b/dts/bindings/arm/st,stm32-ccm.yaml index ea0227888896..f94f9f10e3e7 100644 --- a/dts/bindings/arm/st,stm32-ccm.yaml +++ b/dts/bindings/arm/st,stm32-ccm.yaml @@ -1,7 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: STM32 CCM -id: ccm +type: ccm version: 0.1 description: > diff --git a/dts/bindings/arm/ti,cc2650-prcm.yaml b/dts/bindings/arm/ti,cc2650-prcm.yaml index 4a0ebbeb142b..27f687b90435 100644 --- a/dts/bindings/arm/ti,cc2650-prcm.yaml +++ b/dts/bindings/arm/ti,cc2650-prcm.yaml @@ -1,7 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 PRCM -id: prcm +type: prcm version: 0.1 description: > diff --git a/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml b/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml index 3ac97e7e6a0f..e660588df740 100644 --- a/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml +++ b/dts/bindings/bluetooth/zephyr,bt-hci-spi.yaml @@ -5,7 +5,7 @@ # --- title: Bluetooth module based on Zephyr's Bluetooth HCI SPI driver -id: bt-hci +type: bt-hci version: 0.1 description: > diff --git a/dts/bindings/can/can-device.yaml b/dts/bindings/can/can-device.yaml index 851d7f915f8a..1da1010538b4 100644 --- a/dts/bindings/can/can-device.yaml +++ b/dts/bindings/can/can-device.yaml @@ -5,7 +5,7 @@ # --- title: CAN Device Base Structure -id: can-device +type: can-device version: 0.1 description: > diff --git a/dts/bindings/can/can.yaml b/dts/bindings/can/can.yaml index abf7e2f83772..839349d8e8c7 100644 --- a/dts/bindings/can/can.yaml +++ b/dts/bindings/can/can.yaml @@ -1,6 +1,6 @@ --- title: CAN Base Structure -id: can +type: can version: 0.1 description: > diff --git a/dts/bindings/clock/nxp,imx-ccm.yaml b/dts/bindings/clock/nxp,imx-ccm.yaml index 8924e939ad85..a9bb053d3cd9 100644 --- a/dts/bindings/clock/nxp,imx-ccm.yaml +++ b/dts/bindings/clock/nxp,imx-ccm.yaml @@ -5,7 +5,7 @@ # --- title: i.MX Clock Controller Module (CCM) -id: clock-control +type: clock-control version: 0.1 description: > diff --git a/dts/bindings/clock/st,stm32-rcc.yaml b/dts/bindings/clock/st,stm32-rcc.yaml index 008315c0ccda..e05bb2649f0b 100644 --- a/dts/bindings/clock/st,stm32-rcc.yaml +++ b/dts/bindings/clock/st,stm32-rcc.yaml @@ -1,6 +1,6 @@ --- title: STM32 RCC -id: clock-control +type: clock-control version: 0.1 description: > diff --git a/dts/bindings/device_node.yaml.template b/dts/bindings/device_node.yaml.template index 5fc0c075ba9d..aaca503ba886 100644 --- a/dts/bindings/device_node.yaml.template +++ b/dts/bindings/device_node.yaml.template @@ -1,6 +1,6 @@ --- title: <Title should describe what node you are describing> -id: <zephyr generic type for the described device> +type: <zephyr generic type for the described device> version: 0.1 description: > diff --git a/dts/bindings/flash_controller/flash-controller.yaml b/dts/bindings/flash_controller/flash-controller.yaml index 37de486a884e..b68e2ed431c7 100644 --- a/dts/bindings/flash_controller/flash-controller.yaml +++ b/dts/bindings/flash_controller/flash-controller.yaml @@ -1,6 +1,6 @@ --- title: flash controller Base Structure -id: flash-controller +type: flash-controller version: 0.1 description: > diff --git a/dts/bindings/gpio/arm,cmsdk-gpio.yaml b/dts/bindings/gpio/arm,cmsdk-gpio.yaml index 5a69f2f79812..b53852d3a9db 100644 --- a/dts/bindings/gpio/arm,cmsdk-gpio.yaml +++ b/dts/bindings/gpio/arm,cmsdk-gpio.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/atmel,sam0-gpio.yaml b/dts/bindings/gpio/atmel,sam0-gpio.yaml index a994750ee2ff..b1ad2aa8d953 100644 --- a/dts/bindings/gpio/atmel,sam0-gpio.yaml +++ b/dts/bindings/gpio/atmel,sam0-gpio.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 GPIO PORT driver -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/atmel.sam-gpio.yaml b/dts/bindings/gpio/atmel.sam-gpio.yaml index 85dd8c4f200b..1879206c1de8 100644 --- a/dts/bindings/gpio/atmel.sam-gpio.yaml +++ b/dts/bindings/gpio/atmel.sam-gpio.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM GPIO PORT driver -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/gpio-keys.yaml b/dts/bindings/gpio/gpio-keys.yaml index f11559b3e985..798f6b247c52 100644 --- a/dts/bindings/gpio/gpio-keys.yaml +++ b/dts/bindings/gpio/gpio-keys.yaml @@ -5,7 +5,7 @@ # --- title: GPIO KEYS -id: gpio-keys +type: gpio-keys version: 0.1 description: > diff --git a/dts/bindings/gpio/gpio-leds.yaml b/dts/bindings/gpio/gpio-leds.yaml index 306deffeed5f..db47926873b6 100644 --- a/dts/bindings/gpio/gpio-leds.yaml +++ b/dts/bindings/gpio/gpio-leds.yaml @@ -5,7 +5,7 @@ # --- title: GPIO LED -id: gpio-leds +type: gpio-leds version: 0.1 description: > diff --git a/dts/bindings/gpio/intel,qmsi-gpio.yaml b/dts/bindings/gpio/intel,qmsi-gpio.yaml index 4a256fc6bca8..d3a6bef37d8e 100644 --- a/dts/bindings/gpio/intel,qmsi-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Intel QMSI GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml index 60355ee6d209..df66c8edc244 100644 --- a/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml +++ b/dts/bindings/gpio/intel,qmsi-ss-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Intel QMSI SS GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nordic,nrf-gpio.yaml b/dts/bindings/gpio/nordic,nrf-gpio.yaml index 295bb36bd261..91e7de8a4d24 100644 --- a/dts/bindings/gpio/nordic,nrf-gpio.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpio.yaml @@ -5,7 +5,7 @@ # --- title: NRF5 GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nordic,nrf-gpiote.yaml b/dts/bindings/gpio/nordic,nrf-gpiote.yaml index 6fb7853218dd..afb878de65da 100644 --- a/dts/bindings/gpio/nordic,nrf-gpiote.yaml +++ b/dts/bindings/gpio/nordic,nrf-gpiote.yaml @@ -5,7 +5,7 @@ # --- title: NRF5 GPIOTE -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nxp,imx-gpio.yaml b/dts/bindings/gpio/nxp,imx-gpio.yaml index 30978bf23804..c9f49a556b04 100644 --- a/dts/bindings/gpio/nxp,imx-gpio.yaml +++ b/dts/bindings/gpio/nxp,imx-gpio.yaml @@ -5,7 +5,7 @@ # --- title: i.MX GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/nxp,kinetis-gpio.yaml b/dts/bindings/gpio/nxp,kinetis-gpio.yaml index 764d1dfc9e74..5b4723a5a1a0 100644 --- a/dts/bindings/gpio/nxp,kinetis-gpio.yaml +++ b/dts/bindings/gpio/nxp,kinetis-gpio.yaml @@ -1,6 +1,6 @@ --- title: Kinetis GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/sifive,gpio0.yaml b/dts/bindings/gpio/sifive,gpio0.yaml index cc5394a25953..9928d313c6e0 100644 --- a/dts/bindings/gpio/sifive,gpio0.yaml +++ b/dts/bindings/gpio/sifive,gpio0.yaml @@ -5,7 +5,7 @@ # --- title: SiFive GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/snps,designware-gpio.yaml b/dts/bindings/gpio/snps,designware-gpio.yaml index a881ffe55e0a..e2356d880f77 100644 --- a/dts/bindings/gpio/snps,designware-gpio.yaml +++ b/dts/bindings/gpio/snps,designware-gpio.yaml @@ -5,7 +5,7 @@ # --- title: Synopsys Designware GPIO controller -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/st,stm32-gpio.yaml b/dts/bindings/gpio/st,stm32-gpio.yaml index d9a2281cfaa7..5bd597386a52 100644 --- a/dts/bindings/gpio/st,stm32-gpio.yaml +++ b/dts/bindings/gpio/st,stm32-gpio.yaml @@ -5,7 +5,7 @@ # --- title: STM32 GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/gpio/ti,cc2650-gpio.yaml b/dts/bindings/gpio/ti,cc2650-gpio.yaml index f41ec0776e2d..6a441b26c1f6 100644 --- a/dts/bindings/gpio/ti,cc2650-gpio.yaml +++ b/dts/bindings/gpio/ti,cc2650-gpio.yaml @@ -1,7 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 GPIO -id: gpio +type: gpio version: 0.1 description: > diff --git a/dts/bindings/i2c/i2c-device.yaml b/dts/bindings/i2c/i2c-device.yaml index 6de235b63c73..10c95e259679 100644 --- a/dts/bindings/i2c/i2c-device.yaml +++ b/dts/bindings/i2c/i2c-device.yaml @@ -5,7 +5,7 @@ # --- title: I2C Device Base Structure -id: i2c-device +type: i2c-device version: 0.1 description: > diff --git a/dts/bindings/i2c/i2c.yaml b/dts/bindings/i2c/i2c.yaml index d43af5ad7b90..2de5dc518f19 100644 --- a/dts/bindings/i2c/i2c.yaml +++ b/dts/bindings/i2c/i2c.yaml @@ -5,7 +5,7 @@ # --- title: I2C Base Structure -id: i2c +type: i2c version: 0.1 description: > diff --git a/dts/bindings/iio/adc/adc.yaml b/dts/bindings/iio/adc/adc.yaml index 517363f41391..7cfcb0531961 100644 --- a/dts/bindings/iio/adc/adc.yaml +++ b/dts/bindings/iio/adc/adc.yaml @@ -5,7 +5,7 @@ # --- title: ADC Base Structure -id: adc +type: adc version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml index 0c7d287cd374..80233288e712 100644 --- a/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v6m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv6-M NVIC Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml index 40b8cd01d68b..002f83813718 100644 --- a/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v7m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv7-M NVIC Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml index d6cc13d225d2..bde1f954833a 100644 --- a/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml +++ b/dts/bindings/interrupt-controller/arm,v8m-nvic.yaml @@ -1,6 +1,6 @@ --- title: ARMv8-M NVIC Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml index 4ac3b1d97859..07c5510c38d9 100644 --- a/dts/bindings/interrupt-controller/intel,cavs-intc.yaml +++ b/dts/bindings/interrupt-controller/intel,cavs-intc.yaml @@ -1,6 +1,6 @@ --- title: CAVS Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,ioapic.yaml b/dts/bindings/interrupt-controller/intel,ioapic.yaml index 6395675480c3..9ad38ff7b83a 100644 --- a/dts/bindings/interrupt-controller/intel,ioapic.yaml +++ b/dts/bindings/interrupt-controller/intel,ioapic.yaml @@ -1,6 +1,6 @@ --- title: Intel I/O Advanced Programmable Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/intel,mvic.yaml b/dts/bindings/interrupt-controller/intel,mvic.yaml index 296d9fd3c0fb..d536b085e093 100644 --- a/dts/bindings/interrupt-controller/intel,mvic.yaml +++ b/dts/bindings/interrupt-controller/intel,mvic.yaml @@ -1,6 +1,6 @@ --- title: Intel Quark D2000 Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/riscv,plic0.yaml b/dts/bindings/interrupt-controller/riscv,plic0.yaml index b0e9b32053e5..dca580b01c97 100644 --- a/dts/bindings/interrupt-controller/riscv,plic0.yaml +++ b/dts/bindings/interrupt-controller/riscv,plic0.yaml @@ -5,7 +5,7 @@ # --- title: RISC-V PLIC -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml index f64652c05f00..999cbfc9d208 100644 --- a/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,arcv2-intc.yaml @@ -5,7 +5,7 @@ # --- title: ARCV2 Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/snps,designware-intc.yaml b/dts/bindings/interrupt-controller/snps,designware-intc.yaml index 522ea165217e..c01da3138534 100644 --- a/dts/bindings/interrupt-controller/snps,designware-intc.yaml +++ b/dts/bindings/interrupt-controller/snps,designware-intc.yaml @@ -1,6 +1,6 @@ --- title: DesignWare Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/interrupt-controller/xtensa,intc.yaml b/dts/bindings/interrupt-controller/xtensa,intc.yaml index a441bb40860e..48328033fe29 100644 --- a/dts/bindings/interrupt-controller/xtensa,intc.yaml +++ b/dts/bindings/interrupt-controller/xtensa,intc.yaml @@ -1,6 +1,6 @@ --- title: Xtensa Core Interrupt Controller -id: interrupt-controller +type: interrupt-controller version: 0.1 description: > diff --git a/dts/bindings/led/nxp,pca9633.yaml b/dts/bindings/led/nxp,pca9633.yaml index a0d738a8fdf2..221d7ce5765c 100644 --- a/dts/bindings/led/nxp,pca9633.yaml +++ b/dts/bindings/led/nxp,pca9633.yaml @@ -1,6 +1,6 @@ --- title: NXP PCA9633 LED Driver -id: led +type: led version: 0.1 description: NXP PCA9633 LED binding diff --git a/dts/bindings/led/ti,lp3943.yaml b/dts/bindings/led/ti,lp3943.yaml index 87eed0cc3de5..379235b20e90 100644 --- a/dts/bindings/led/ti,lp3943.yaml +++ b/dts/bindings/led/ti,lp3943.yaml @@ -1,6 +1,6 @@ --- title: TI LP3943 LED Driver -id: led +type: led version: 0.1 description: TI LP3943 LED binding diff --git a/dts/bindings/led/ti,lp5562.yaml b/dts/bindings/led/ti,lp5562.yaml index 063b6c724e8f..700a98ad85db 100644 --- a/dts/bindings/led/ti,lp5562.yaml +++ b/dts/bindings/led/ti,lp5562.yaml @@ -1,6 +1,6 @@ --- title: TI LP5562 LED Driver -id: led +type: led version: 0.1 description: TI LP5562 LED binding diff --git a/dts/bindings/led_strip/apa,apa-102.yaml b/dts/bindings/led_strip/apa,apa-102.yaml index 4b192bf495ff..d1efb553f539 100644 --- a/dts/bindings/led_strip/apa,apa-102.yaml +++ b/dts/bindings/led_strip/apa,apa-102.yaml @@ -1,6 +1,6 @@ --- title: APA102 SPI LED strip -id: led-strip +type: led-strip version: 0.1 description: APA102 SPI LED strip binding diff --git a/dts/bindings/memory-controllers/nxp,imx-semc.yaml b/dts/bindings/memory-controllers/nxp,imx-semc.yaml index 5e317abda6f0..8b5f7d99e2af 100644 --- a/dts/bindings/memory-controllers/nxp,imx-semc.yaml +++ b/dts/bindings/memory-controllers/nxp,imx-semc.yaml @@ -5,7 +5,7 @@ # --- title: NXP SEMC -id: memory-controllers +type: memory-controllers version: 0.1 description: > diff --git a/dts/bindings/modem/wnc,m14a2a.yaml b/dts/bindings/modem/wnc,m14a2a.yaml index a1d4a24d6c3b..5182bdc4160c 100644 --- a/dts/bindings/modem/wnc,m14a2a.yaml +++ b/dts/bindings/modem/wnc,m14a2a.yaml @@ -5,7 +5,7 @@ # --- title: WNC-M14A2A LTE-M Modem -id: modem +type: modem version: 0.1 description: > diff --git a/dts/bindings/mtd/partition.yaml b/dts/bindings/mtd/partition.yaml index 72e2797384e7..13f05bd08948 100644 --- a/dts/bindings/mtd/partition.yaml +++ b/dts/bindings/mtd/partition.yaml @@ -1,6 +1,6 @@ --- title: Flash Partitions -id: mtd +type: mtd version: 0.1 description: > diff --git a/dts/bindings/mtd/soc-nv-flash.yaml b/dts/bindings/mtd/soc-nv-flash.yaml index 21ff2aa3b2db..38a9660e9488 100644 --- a/dts/bindings/mtd/soc-nv-flash.yaml +++ b/dts/bindings/mtd/soc-nv-flash.yaml @@ -1,6 +1,6 @@ --- title: Flash base node description -id: mtd +type: mtd version: 0.1 description: > diff --git a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml index 92628377a431..ce34487b20d7 100644 --- a/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml +++ b/dts/bindings/pinctrl/atmel,sam0-pinmux.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 PINMUX -id: pinmux +type: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml index 7094102a73cf..c0772fc2aa25 100644 --- a/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml +++ b/dts/bindings/pinctrl/nxp,kinetis-pinmux.yaml @@ -1,6 +1,6 @@ --- title: Kinetis Pinmux -id: pinmux +type: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/st,stm32-pinmux.yaml b/dts/bindings/pinctrl/st,stm32-pinmux.yaml index d786fc9bc5cb..cd4ceabd3312 100644 --- a/dts/bindings/pinctrl/st,stm32-pinmux.yaml +++ b/dts/bindings/pinctrl/st,stm32-pinmux.yaml @@ -1,6 +1,6 @@ --- title: STM32 PINMUX -id: pinmux +type: pinmux version: 0.1 description: > diff --git a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml index 802af1e096f3..9809fded75b5 100644 --- a/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml +++ b/dts/bindings/pinctrl/ti,cc2650-pinmux.yaml @@ -1,7 +1,7 @@ --- # SPDX-License-Identifier: Apache-2.0 title: TI CC2650 Pinmux -id: pinmux +type: pinmux version: 0.1 description: > diff --git a/dts/bindings/pwm/pwm.yaml b/dts/bindings/pwm/pwm.yaml index 31016697c5c9..40b37b385cf8 100644 --- a/dts/bindings/pwm/pwm.yaml +++ b/dts/bindings/pwm/pwm.yaml @@ -5,7 +5,7 @@ # --- title: PWM Base Structure -id: pwm +type: pwm version: 0.1 description: > diff --git a/dts/bindings/rtc/rtc.yaml b/dts/bindings/rtc/rtc.yaml index 3aee501d1873..f232df60bcd7 100644 --- a/dts/bindings/rtc/rtc.yaml +++ b/dts/bindings/rtc/rtc.yaml @@ -5,7 +5,7 @@ # --- title: RTC Base Structure -id: rtc +type: rtc version: 0.1 description: > diff --git a/dts/bindings/sensor/adi,adt7420.yaml b/dts/bindings/sensor/adi,adt7420.yaml index c5e670d12bb7..368d2ec78bec 100644 --- a/dts/bindings/sensor/adi,adt7420.yaml +++ b/dts/bindings/sensor/adi,adt7420.yaml @@ -5,7 +5,7 @@ # --- title: ADT7420 16-Bit Digital I2C Temperature Sensor -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/ams,ccs811.yaml b/dts/bindings/sensor/ams,ccs811.yaml index 436befe63eff..2f70916c8858 100644 --- a/dts/bindings/sensor/ams,ccs811.yaml +++ b/dts/bindings/sensor/ams,ccs811.yaml @@ -5,7 +5,7 @@ # --- title: AMS (Austria Mikro Systeme) Digital Air Quality Sensor CCS811 -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/avago,apds9960.yaml b/dts/bindings/sensor/avago,apds9960.yaml index aaf07f7dfaf8..d3ca9fee3ec4 100644 --- a/dts/bindings/sensor/avago,apds9960.yaml +++ b/dts/bindings/sensor/avago,apds9960.yaml @@ -5,7 +5,7 @@ # --- title: APDS9960 Digital Proximity, Ambient Light, RGB and Gesture Sensor -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/max,max30101.yaml b/dts/bindings/sensor/max,max30101.yaml index 6c2045ed3f77..e89c89669706 100644 --- a/dts/bindings/sensor/max,max30101.yaml +++ b/dts/bindings/sensor/max,max30101.yaml @@ -5,7 +5,7 @@ # --- title: MAX30101 heart rate sensor -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,fxas21002.yaml b/dts/bindings/sensor/nxp,fxas21002.yaml index 338472c3e35e..e92254d33b3d 100644 --- a/dts/bindings/sensor/nxp,fxas21002.yaml +++ b/dts/bindings/sensor/nxp,fxas21002.yaml @@ -5,7 +5,7 @@ # --- title: FXAS21002 3-axis gyroscope -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,fxos8700.yaml b/dts/bindings/sensor/nxp,fxos8700.yaml index 98f65f460b7a..7b3d13f9ca5a 100644 --- a/dts/bindings/sensor/nxp,fxos8700.yaml +++ b/dts/bindings/sensor/nxp,fxos8700.yaml @@ -5,7 +5,7 @@ # --- title: FXOS8700 6-axis accelerometer/magnetometer -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/nxp,mma8451q.yaml b/dts/bindings/sensor/nxp,mma8451q.yaml index 010eebb7d797..64bdb458ac9d 100644 --- a/dts/bindings/sensor/nxp,mma8451q.yaml +++ b/dts/bindings/sensor/nxp,mma8451q.yaml @@ -5,7 +5,7 @@ # --- title: MMA8451Q 3-axis Accelerometer -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,hts221.yaml b/dts/bindings/sensor/st,hts221.yaml index 436b3ed286af..777ff1f542af 100644 --- a/dts/bindings/sensor/st,hts221.yaml +++ b/dts/bindings/sensor/st,hts221.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors HTS221 -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lis3mdl-magn.yaml b/dts/bindings/sensor/st,lis3mdl-magn.yaml index 835521946b5e..2175e9618eb5 100644 --- a/dts/bindings/sensor/st,lis3mdl-magn.yaml +++ b/dts/bindings/sensor/st,lis3mdl-magn.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LIS3MDL -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lps22hb-press.yaml b/dts/bindings/sensor/st,lps22hb-press.yaml index e1c17cdf93a2..d90a87de58e1 100644 --- a/dts/bindings/sensor/st,lps22hb-press.yaml +++ b/dts/bindings/sensor/st,lps22hb-press.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LPS22HB -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lps25hb-press.yaml b/dts/bindings/sensor/st,lps25hb-press.yaml index c31588572d93..90f696a3f3b0 100644 --- a/dts/bindings/sensor/st,lps25hb-press.yaml +++ b/dts/bindings/sensor/st,lps25hb-press.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LPS25HB -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6ds0.yaml b/dts/bindings/sensor/st,lsm6ds0.yaml index 5dd98aca097b..0cf0c1340f52 100644 --- a/dts/bindings/sensor/st,lsm6ds0.yaml +++ b/dts/bindings/sensor/st,lsm6ds0.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DS0 -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6dsl-spi.yaml b/dts/bindings/sensor/st,lsm6dsl-spi.yaml index 65dd35e97ae6..bc33286c2d73 100644 --- a/dts/bindings/sensor/st,lsm6dsl-spi.yaml +++ b/dts/bindings/sensor/st,lsm6dsl-spi.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DSL SPI -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,lsm6dsl.yaml b/dts/bindings/sensor/st,lsm6dsl.yaml index c7688def4d8d..59b481cca2b7 100644 --- a/dts/bindings/sensor/st,lsm6dsl.yaml +++ b/dts/bindings/sensor/st,lsm6dsl.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors LSM6DSL -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/st,vl53l0x.yaml b/dts/bindings/sensor/st,vl53l0x.yaml index 66ffca5b26ed..d01a789928a3 100644 --- a/dts/bindings/sensor/st,vl53l0x.yaml +++ b/dts/bindings/sensor/st,vl53l0x.yaml @@ -5,7 +5,7 @@ # --- title: STMicroelectronics MEMS sensors VL53L0X -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/sensor/ti,hdc1008.yaml b/dts/bindings/sensor/ti,hdc1008.yaml index f007bfb6fd17..7375b06cae6b 100644 --- a/dts/bindings/sensor/ti,hdc1008.yaml +++ b/dts/bindings/sensor/ti,hdc1008.yaml @@ -5,7 +5,7 @@ # --- title: HDC1008 Temperature and Humidity Sensor -id: sensor +type: sensor version: 0.1 description: > diff --git a/dts/bindings/serial/uart-device.yaml b/dts/bindings/serial/uart-device.yaml index e6899374650c..9c27ecb73870 100644 --- a/dts/bindings/serial/uart-device.yaml +++ b/dts/bindings/serial/uart-device.yaml @@ -5,7 +5,7 @@ # --- title: UART Device Base Structure -id: uart-device +type: uart-device version: 0.1 description: > diff --git a/dts/bindings/serial/uart.yaml b/dts/bindings/serial/uart.yaml index 8bb152132e5c..8f353d2e399b 100644 --- a/dts/bindings/serial/uart.yaml +++ b/dts/bindings/serial/uart.yaml @@ -1,6 +1,6 @@ --- title: Uart Base Structure -id: uart +type: uart version: 0.1 description: > diff --git a/dts/bindings/spi/spi-device.yaml b/dts/bindings/spi/spi-device.yaml index 5c567330b628..ce82e049c022 100644 --- a/dts/bindings/spi/spi-device.yaml +++ b/dts/bindings/spi/spi-device.yaml @@ -5,7 +5,7 @@ # --- title: SPI Device Base Structure -id: spi-device +type: spi-device version: 0.1 description: > diff --git a/dts/bindings/spi/spi.yaml b/dts/bindings/spi/spi.yaml index 3c7a12894669..656532100047 100644 --- a/dts/bindings/spi/spi.yaml +++ b/dts/bindings/spi/spi.yaml @@ -5,7 +5,7 @@ # --- title: SPI Base Structure -id: spi +type: spi version: 0.1 description: > diff --git a/dts/bindings/timer/arm,cmsdk-dtimer.yaml b/dts/bindings/timer/arm,cmsdk-dtimer.yaml index 6776ff99cbec..49ab9bdd9317 100644 --- a/dts/bindings/timer/arm,cmsdk-dtimer.yaml +++ b/dts/bindings/timer/arm,cmsdk-dtimer.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK DUALTIMER -id: timer +type: timer version: 0.1 description: > diff --git a/dts/bindings/timer/arm,cmsdk-timer.yaml b/dts/bindings/timer/arm,cmsdk-timer.yaml index 9ebc729b700f..c2361049db3d 100644 --- a/dts/bindings/timer/arm,cmsdk-timer.yaml +++ b/dts/bindings/timer/arm,cmsdk-timer.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK TIMER -id: timer +type: timer version: 0.1 description: > diff --git a/dts/bindings/timer/st,stm32-timers.yaml b/dts/bindings/timer/st,stm32-timers.yaml index 714efa689cb9..7a12ed3db68b 100644 --- a/dts/bindings/timer/st,stm32-timers.yaml +++ b/dts/bindings/timer/st,stm32-timers.yaml @@ -1,6 +1,6 @@ --- title: STM32 TIMERS -id: timer +type: timer version: 0.1 description: > diff --git a/dts/bindings/usb/usb-ep.yaml b/dts/bindings/usb/usb-ep.yaml index 12d7108fdda9..432e24a1f100 100644 --- a/dts/bindings/usb/usb-ep.yaml +++ b/dts/bindings/usb/usb-ep.yaml @@ -5,7 +5,7 @@ # --- title: USB Endpoints' properties -id: USB-EP +type: USB-EP version: 0.1 description: > diff --git a/dts/bindings/usb/usb.yaml b/dts/bindings/usb/usb.yaml index de4ea84df573..3f8e97dd86f9 100644 --- a/dts/bindings/usb/usb.yaml +++ b/dts/bindings/usb/usb.yaml @@ -5,7 +5,7 @@ # --- title: USB Base Structure -id: USB +type: USB version: 0.1 description: > diff --git a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml index acf6b33c5419..d1debac39247 100644 --- a/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml +++ b/dts/bindings/watchdog/arm,cmsdk-watchdog.yaml @@ -1,6 +1,6 @@ --- title: ARM CMSDK WATCHDOG -id: watchdog +type: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml index 63576fb8c12a..1eda6821cfec 100644 --- a/dts/bindings/watchdog/atmel,sam0-watchdog.yaml +++ b/dts/bindings/watchdog/atmel,sam0-watchdog.yaml @@ -1,6 +1,6 @@ --- title: Atmel SAM0 watchdog driver -id: watchdog +type: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml index 074368811f14..8c9490f80db4 100644 --- a/dts/bindings/watchdog/nordic,nrf-watchdog.yaml +++ b/dts/bindings/watchdog/nordic,nrf-watchdog.yaml @@ -5,7 +5,7 @@ # --- title: Nordic Semiconductor NRF watchdog driver -id: watchdog +type: watchdog version: 0.1 description: > diff --git a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml index 05bfa0e8445f..3cc39e9fab5f 100644 --- a/dts/bindings/watchdog/nxp,kinetis-wdog.yaml +++ b/dts/bindings/watchdog/nxp,kinetis-wdog.yaml @@ -5,7 +5,7 @@ # --- title: NXP Kinetis watchdog driver -id: watchdog +type: nxp,kinetis-wdog version: 0.1 description: > diff --git a/scripts/dts/extract/heuristics.py b/scripts/dts/extract/heuristics.py index 1059fa570878..d7f1b753e5e6 100644 --- a/scripts/dts/extract/heuristics.py +++ b/scripts/dts/extract/heuristics.py @@ -41,7 +41,7 @@ def extract(self, node_address, yaml, prop, def_label): # Check for <device>-device that is connected to a bus for compat in compatible: - for device_type in yaml[compat].get('id', []): + for device_type in yaml[compat].get('type', []): if not device_type.endswith('-device'): continue @@ -56,7 +56,7 @@ def extract(self, node_address, yaml, prop, def_label): parent_yaml = yaml[reduced[parent_node_address] \ ['props']['compatible']] - if bus_master_device_type not in parent_yaml['id']: + if bus_master_device_type not in parent_yaml['type']: continue # generate EDTS diff --git a/scripts/dts/extract_dts_includes.py b/scripts/dts/extract_dts_includes.py index 302ea980e409..e5d3cad36e3a 100755 --- a/scripts/dts/extract_dts_includes.py +++ b/scripts/dts/extract_dts_includes.py @@ -432,20 +432,20 @@ def yaml_traverse_inherited(node): for inherits in inherits_list: if 'inherits' in inherits: inherits = yaml_traverse_inherited(inherits) - if 'id' in inherits: - if 'id' not in node: - node['id'] = [] - if not isinstance(node['id'], list): - node['id'] = [node['id'],] - if isinstance(inherits['id'], list): - node['id'].extend(inherits['id']) + if 'type' in inherits: + if 'type' not in node: + node['type'] = [] + if not isinstance(node['type'], list): + node['type'] = [node['type'],] + if isinstance(inherits['type'], list): + node['type'].extend(inherits['type']) else: - node['id'].append(inherits['id']) + node['type'].append(inherits['type']) # type, title, description, version of inherited node # are overwritten by intention. Remove to prevent dct_merge to # complain about duplicates. - inherits.pop('id', None) + inherits.pop('type', None) inherits.pop('title', None) inherits.pop('version', None) inherits.pop('description', None) From 8cd8ea7e004feae4a4df37f503e917f4102c40d5 Mon Sep 17 00:00:00 2001 From: Erwan Gouriou <erwan.gouriou@linaro.org> Date: Thu, 13 Sep 2018 11:18:19 +0200 Subject: [PATCH 16/20] scripts/edts: inject device-type in edts database. Extract and inject zephyr generic device-type in edts database. This information is extracted from dts yaml bindings 'type' field. Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org> --- scripts/dts/edtsdatabase.py | 28 ++++++++++++++++++++++++++-- scripts/dts/extract/edts.py | 3 +++ scripts/dts/extract/heuristics.py | 18 +++++++++++++++++- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/scripts/dts/edtsdatabase.py b/scripts/dts/edtsdatabase.py index 44368aca7209..7c09494db346 100644 --- a/scripts/dts/edtsdatabase.py +++ b/scripts/dts/edtsdatabase.py @@ -17,7 +17,15 @@ class EDTSConsumerMixin(object): ## - # @brief Generate a compatible devices dict, using "device_id" as key + # @brief Get all supported device types + # + # @param none + # @return list of supported device types + def get_device_types(self): + return list(self._edts['device-types']) + + ## + # @brief Get all activated compatible devices. # # @param compatible # @return dict of compatible devices @@ -130,6 +138,21 @@ def _update_device_compatible(self, device_id, compatible): self._edts['compatibles'][compatible].append(device_id) self._edts['compatibles'][compatible].sort() + def _update_device_type(self, device_id, device_type): + if device_type not in self._edts['device-types']: + self._edts['device-types'][device_type] = list() + if device_id not in self._edts['device-types'][device_type]: + self._edts['device-types'][device_type].append(device_id) + self._edts['device-types'][device_type].sort() + + def insert_device_type(self, compatible, device_type): + if device_type not in self._edts['device-types']: + self._edts['device-types'][device_type] = list() + if compatible not in self._edts['device-types'][device_type]: + self._edts['device-types'][device_type].append(compatible) + self._edts['device-types'][device_type].sort() + + ## # @brief Insert property value for the device of the given device id. # @@ -185,6 +208,7 @@ def save(self, file_path): # _edts dict( # 'devices': dict(device-id : device-struct), # 'compatibles': dict(compatible : sorted list(device-id)), +# 'device-types': dict(device-type : sorted list(compatible)), # ... # ) # @@ -206,7 +230,7 @@ class EDTSDatabase(EDTSConsumerMixin, EDTSProviderMixin, Mapping): def __init__(self, *args, **kw): self._edts = dict(*args, **kw) # setup basic database schema - for edts_key in ('devices', 'compatibles'): + for edts_key in ('devices', 'compatibles', 'device-types'): if not edts_key in self._edts: self._edts[edts_key] = dict() diff --git a/scripts/dts/extract/edts.py b/scripts/dts/extract/edts.py index 02268c869af6..6c9d3cc1dec5 100644 --- a/scripts/dts/extract/edts.py +++ b/scripts/dts/extract/edts.py @@ -23,6 +23,9 @@ def edts_insert_device_property(node_address, property_path, property_value): device_id = edts_device_id(node_address) edts.insert_device_property(device_id, property_path, property_value) +def edts_insert_device_type(compatible, device_type): + edts.insert_device_type(compatible, device_type) + ## # @brief Insert device parent-device property into EDTS # diff --git a/scripts/dts/extract/heuristics.py b/scripts/dts/extract/heuristics.py index d7f1b753e5e6..208678d5b2a9 100644 --- a/scripts/dts/extract/heuristics.py +++ b/scripts/dts/extract/heuristics.py @@ -41,7 +41,23 @@ def extract(self, node_address, yaml, prop, def_label): # Check for <device>-device that is connected to a bus for compat in compatible: - for device_type in yaml[compat].get('type', []): + + # get device type list + try: + device_types = yaml[compat]['type'] + except KeyError: + raise Exception("Device Node: {} has no 'type'".format(node_address)) + + if not isinstance(device_types, list): + device_types = [device_types, ] + + # inject device type in database + for j, device_type in enumerate(device_types): + edts_insert_device_type(compat, device_type) + edts_insert_device_property(node_address, 'device-type/{}'.format(j), + device_type) + + # Perform device type specific treatment if not device_type.endswith('-device'): continue From aa01d40a8f3269d54e1dc0bc49a36110346dc530 Mon Sep 17 00:00:00 2001 From: Bobby Noelte <b0661n0e17e@gmail.com> Date: Wed, 28 Feb 2018 10:37:23 +0100 Subject: [PATCH 17/20] scripts: codegen: add inline code generation Codegen is a file generation tool. It uses pieces of Python code in the source file as generators to generate whatever text is needed. If a source file is added by zephyr_sources_codegen(..) or zephyr_sources_codegen_ifdef(..) codegen will be executed and the generated file stored to the build directory. Compilation will run on the generated file only. Codegen is based on Cog. All files taken from Cog are modified. The files are marked by the Cog author's copyright: Copyright 2004-2016, Ned Batchelder. http://nedbatchelder.com/code/cog SPDX-License-Identifier: MIT Origin: https://pypi.python.org/pypi/cogapp Status: 2.5.1 Description: A code generator for executing Python snippets in source files. Dependencies: python URL: https://pypi.python.org/pypi/cogapp commit: 2.5.1 Maintained-by: External License: MIT License Link: URL: https://pypi.python.org/pypi/cogapp Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> --- CMakeLists.txt | 7 + cmake/extensions.cmake | 147 +++++++- scripts/codegen/cmake.py | 191 ++++++++++ scripts/codegen/codegen.py | 630 ++++++++++++++++++++++++++++++++ scripts/codegen/config.py | 56 +++ scripts/codegen/edts.py | 31 ++ scripts/codegen/error.py | 68 ++++ scripts/codegen/filereader.py | 20 + scripts/codegen/generic.py | 51 +++ scripts/codegen/guard.py | 16 + scripts/codegen/importmodule.py | 37 ++ scripts/codegen/include.py | 67 ++++ scripts/codegen/log.py | 41 +++ scripts/codegen/options.py | 139 +++++++ scripts/codegen/output.py | 19 + scripts/codegen/redirectable.py | 31 ++ scripts/codegen/whiteutils.py | 72 ++++ scripts/codegen/zephyr.py | 12 + scripts/gen_code.py | 13 + 19 files changed, 1637 insertions(+), 11 deletions(-) create mode 100644 scripts/codegen/cmake.py create mode 100644 scripts/codegen/codegen.py create mode 100644 scripts/codegen/config.py create mode 100644 scripts/codegen/edts.py create mode 100644 scripts/codegen/error.py create mode 100644 scripts/codegen/filereader.py create mode 100644 scripts/codegen/generic.py create mode 100644 scripts/codegen/guard.py create mode 100644 scripts/codegen/importmodule.py create mode 100644 scripts/codegen/include.py create mode 100644 scripts/codegen/log.py create mode 100644 scripts/codegen/options.py create mode 100644 scripts/codegen/output.py create mode 100644 scripts/codegen/redirectable.py create mode 100644 scripts/codegen/whiteutils.py create mode 100644 scripts/codegen/zephyr.py create mode 100755 scripts/gen_code.py diff --git a/CMakeLists.txt b/CMakeLists.txt index b55df69f0064..7e5fee294703 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -348,6 +348,13 @@ add_subdirectory(subsys) add_subdirectory(drivers) add_subdirectory(tests) +# Add all generated zephyr sources in the same context as the zephyr library +# is created. Assure all sub directories that might invoke code generation +# are processed before. +get_property(zephyr_generated_sources GLOBAL PROPERTY zephyr_generated_sources_property) +set_source_files_properties(${zephyr_generated_sources} PROPERTIES GENERATED 1) +target_sources(zephyr PRIVATE ${zephyr_generated_sources}) + set(syscall_macros_h ${ZEPHYR_BINARY_DIR}/include/generated/syscall_macros.h) add_custom_target(syscall_macros_h_target DEPENDS ${syscall_macros_h}) diff --git a/cmake/extensions.cmake b/cmake/extensions.cmake index 9a9979e70ac6..763ec91ce00f 100644 --- a/cmake/extensions.cmake +++ b/cmake/extensions.cmake @@ -344,6 +344,17 @@ function(generate_inc_file_for_gen_target add_dependencies(${target} ${gen_target}) endfunction() +function(get_unique_generated_target_name + generated_file # The generated file + generated_target_name # the unique name + ) + string(RANDOM LENGTH 8 random_chars) + get_filename_component(basename ${generated_file} NAME) + string(REPLACE "." "_" basename ${basename}) + string(REPLACE "@" "_" basename ${basename}) + set(generated_target_name "gen_${basename}_${random_chars}" PARENT_SCOPE) +endfunction() + function(generate_inc_file_for_target target # The cmake target that depends on the generated file source_file # The source file to be converted to hex @@ -353,22 +364,129 @@ function(generate_inc_file_for_target # Ensure 'generated_file' is generated before 'target' by creating a # 'custom_target' for it and setting up a dependency between the two # targets + get_unique_generated_target_name(${generated_file} generated_target_name) + add_custom_target(${generated_target_name} DEPENDS ${generated_file}) + generate_inc_file_for_gen_target(${target} ${source_file} ${generated_file} + ${generated_target_name} ${ARGN}) +endfunction() - # But first create a unique name for the custom target - string( - RANDOM - LENGTH 8 - random_chars +function(target_sources_codegen + target # The cmake target that depends on the generated file ) + set(options) + set(oneValueArgs) + set(multiValueArgs CODEGEN_DEFINES DEPENDS) + cmake_parse_arguments(CODEGEN "${options}" "${oneValueArgs}" + "${multiValueArgs}" ${ARGN}) + # prepend -D to all defines + string(REGEX REPLACE "([^;]+)" "-D;\\1" + CODEGEN_CODEGEN_DEFINES "${CODEGEN_CODEGEN_DEFINES}") + # Get all the files that make up codegen for dependency + file(GLOB CODEGEN_SOURCES + ${ZEPHYR_BASE}/scripts/dts/edtsdatabase.py + ${ZEPHYR_BASE}/scripts/codegen/*.py + ${ZEPHYR_BASE}/scripts/gen_code.py) + + message(STATUS "Will generate for target ${target}") + # Generated file must be generated to the current binary directory. + # Otherwise this would trigger CMake issue #14633: + # https://gitlab.kitware.com/cmake/cmake/issues/14633 + foreach(arg ${CODEGEN_UNPARSED_ARGUMENTS}) + if(IS_ABSOLUTE ${arg}) + set(template_file ${arg}) + get_filename_component(generated_file_name ${arg} NAME) + set(generated_file ${CMAKE_CURRENT_BINARY_DIR}/${generated_file_name}) + else() + set(template_file ${CMAKE_CURRENT_SOURCE_DIR}/${arg}) + set(generated_file ${CMAKE_CURRENT_BINARY_DIR}/${arg}) + endif() + get_filename_component(template_dir ${template_file} DIRECTORY) - get_filename_component(basename ${generated_file} NAME) - string(REPLACE "." "_" basename ${basename}) - string(REPLACE "@" "_" basename ${basename}) + if(IS_DIRECTORY ${template_file}) + message(FATAL_ERROR "target_sources_codegen() was called on a directory") + endif() - set(generated_target_name "gen_${basename}_${random_chars}") + # Generate file from template + message(STATUS " from '${template_file}'") + message(STATUS " to '${generated_file}'") + add_custom_command( + COMMENT "CodeGen ${generated_file}" + OUTPUT ${generated_file} + MAIN_DEPENDENCY ${template_file} + DEPENDS + ${CODEGEN_DEPENDS} + ${CODEGEN_SOURCES} + COMMAND + ${PYTHON_EXECUTABLE} + ${ZEPHYR_BASE}/scripts/gen_code.py + ${CODEGEN_CODEGEN_DEFINES} + -D "PROJECT_NAME=${PROJECT_NAME}" + -D "PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}" + -D "PROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}" + -D "CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}" + -D "CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}" + -D "CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}" + -D "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}" + -D "CMAKE_CURRENT_LIST_DIR=${CMAKE_CURRENT_LIST_DIR}" + -D "CMAKE_FILES_DIRECTORY=${CMAKE_FILES_DIRECTORY}" + -D "CMAKE_PROJECT_NAME=${CMAKE_PROJECT_NAME}" + -D "CMAKE_SYSTEM=${CMAKE_SYSTEM}" + -D "CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}" + -D "CMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}" + -D "CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}" + -D "CMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + -D "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + -D "CMAKE_COMPILER_IS_GNUCC=${CMAKE_COMPILER_IS_GNUCC}" + -D "CMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX}" + -D "GENERATED_DTS_BOARD_H=${GENERATED_DTS_BOARD_H}" + -D "GENERATED_DTS_BOARD_CONF=${GENERATED_DTS_BOARD_CONF}" + -D "GENERATED_DTS_BOARD_EDTS=${GENERATED_DTS_BOARD_EDTS}" + --input "${template_file}" + --output "${generated_file}" + --log "${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CodeGen.log" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + if("${target}" STREQUAL "zephyr") + # zephyr is special + get_unique_generated_target_name(${generated_file} generated_target_name) + add_custom_target(${generated_target_name} DEPENDS ${generated_file}) + add_dependencies(zephyr ${generated_target_name}) + # Remember all the files that are generated for zephyr. + # target_sources(zephyr PRIVATE ${zephyr_generated_sources}) + # is executed in the top level CMakeFile.txt context. + get_property(zephyr_generated_sources GLOBAL PROPERTY zephyr_generated_sources_property) + list(APPEND zephyr_generated_sources ${generated_file}) + set_property(GLOBAL PROPERTY zephyr_generated_sources_property "${zephyr_generated_sources}") + # Add template directory to include path to allow includes with + # relative path in generated file to work + zephyr_include_directories(${template_dir}) + else() + target_sources(${target} PRIVATE ${generated_file}) + # Add template directory to include path to allow includes with + # relative path in generated file to work + target_include_directories(${target} PRIVATE ${template_dir}) + endif() + endforeach() +endfunction() - add_custom_target(${generated_target_name} DEPENDS ${generated_file}) - generate_inc_file_for_gen_target(${target} ${source_file} ${generated_file} ${generated_target_name} ${ARGN}) +function(zephyr_sources_codegen) + target_sources_codegen(zephyr ${ARGN}) +endfunction() + +function(zephyr_sources_codegen_ifdef feature_toggle) + if(${${feature_toggle}}) + zephyr_sources_codegen(${ARGN}) + endif() +endfunction() + +function(zephyr_library_sources_codegen) + target_sources_codegen(${ZEPHYR_CURRENT_LIBRARY} ${ARGN}) +endfunction() + +function(zephyr_library_sources_codegen_ifdef feature_toggle) + if(${${feature_toggle}}) + zephyr_library_sources_codegen(${ARGN}) + endif() endfunction() # 1.2 zephyr_library_* @@ -424,6 +542,13 @@ macro(zephyr_library_named name) # This is a macro because we need add_library() to be executed # within the scope of the caller. set(ZEPHYR_CURRENT_LIBRARY ${name}) + + if("${name}" STREQUAL "zephyr") + # We have to mark all the generated files "GENERATED" in this context + get_property(zephyr_generated_files GLOBAL PROPERTY zephyr_generated_files_property) + set_source_files_properties(${zephyr_generated_files} PROPERTIES GENERATED 1) + endif() + add_library(${name} STATIC "") zephyr_append_cmake_library(${name}) diff --git a/scripts/codegen/cmake.py b/scripts/codegen/cmake.py new file mode 100644 index 000000000000..eedc0be56c07 --- /dev/null +++ b/scripts/codegen/cmake.py @@ -0,0 +1,191 @@ +# Copyright (c) 2018 Open Source Foundries Limited. +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 +# +# CMakeCacheEntry and CMakeCache are taken from scripts/zephyr_run.py. +# + +import os +import sys +import re +from collections import OrderedDict +from pathlib import Path + + +class CMakeCacheEntry: + '''Represents a CMake cache entry. + This class understands the type system in a CMakeCache.txt, and + converts the following cache types to Python types: + Cache Type Python type + ---------- ------------------------------------------- + FILEPATH str + PATH str + STRING str OR list of str (if ';' is in the value) + BOOL bool + INTERNAL str OR list of str (if ';' is in the value) + ---------- ------------------------------------------- + ''' + + # Regular expression for a cache entry. + # + # CMake variable names can include escape characters, allowing a + # wider set of names than is easy to match with a regular + # expression. To be permissive here, use a non-greedy match up to + # the first colon (':'). This breaks if the variable name has a + # colon inside, but it's good enough. + CACHE_ENTRY = re.compile( + r'''(?P<name>.*?) # name + :(?P<type>FILEPATH|PATH|STRING|BOOL|INTERNAL) # type + =(?P<value>.*) # value + ''', re.X) + + @classmethod + def _to_bool(cls, val): + # Convert a CMake BOOL string into a Python bool. + # + # "True if the constant is 1, ON, YES, TRUE, Y, or a + # non-zero number. False if the constant is 0, OFF, NO, + # FALSE, N, IGNORE, NOTFOUND, the empty string, or ends in + # the suffix -NOTFOUND. Named boolean constants are + # case-insensitive. If the argument is not one of these + # constants, it is treated as a variable." + # + # https://cmake.org/cmake/help/v3.0/command/if.html + val = val.upper() + if val in ('ON', 'YES', 'TRUE', 'Y'): + return True + elif val in ('OFF', 'NO', 'FALSE', 'N', 'IGNORE', 'NOTFOUND', ''): + return False + elif val.endswith('-NOTFOUND'): + return False + else: + try: + v = int(val) + return v != 0 + except ValueError as exc: + raise ValueError('invalid bool {}'.format(val)) from exc + + @classmethod + def from_line(cls, line, line_no): + # Comments can only occur at the beginning of a line. + # (The value of an entry could contain a comment character). + if line.startswith('//') or line.startswith('#'): + return None + + # Whitespace-only lines do not contain cache entries. + if not line.strip(): + return None + + m = cls.CACHE_ENTRY.match(line) + if not m: + return None + + name, type_, value = (m.group(g) for g in ('name', 'type', 'value')) + if type_ == 'BOOL': + try: + value = cls._to_bool(value) + except ValueError as exc: + args = exc.args + ('on line {}: {}'.format(line_no, line),) + raise ValueError(args) from exc + elif type_ == 'STRING' or type_ == 'INTERNAL': + # If the value is a CMake list (i.e. is a string which + # contains a ';'), convert to a Python list. + if ';' in value: + value = value.split(';') + + return CMakeCacheEntry(name, value) + + def __init__(self, name, value): + self.name = name + self.value = value + + def __str__(self): + fmt = 'CMakeCacheEntry(name={}, value={})' + return fmt.format(self.name, self.value) + + +class CMakeCache: + '''Parses and represents a CMake cache file.''' + + def __init__(self, cache_file): + self.load(cache_file) + + def load(self, cache_file): + entries = [] + with open(str(cache_file), 'r') as cache: + for line_no, line in enumerate(cache): + entry = CMakeCacheEntry.from_line(line, line_no) + if entry: + entries.append(entry) + self._entries = OrderedDict((e.name, e) for e in entries) + + def get(self, name, default=None): + entry = self._entries.get(name) + if entry is not None: + return entry.value + else: + return default + + def get_list(self, name, default=None): + if default is None: + default = [] + entry = self._entries.get(name) + if entry is not None: + value = entry.value + if isinstance(value, list): + return value + elif isinstance(value, str): + return [value] + else: + msg = 'invalid value {} type {}' + raise RuntimeError(msg.format(value, type(value))) + else: + return default + + def __getitem__(self, name): + return self._entries[name].value + + def __setitem__(self, name, entry): + if not isinstance(entry, CMakeCacheEntry): + msg = 'improper type {} for value {}, expecting CMakeCacheEntry' + raise TypeError(msg.format(type(entry), entry)) + self._entries[name] = entry + + def __delitem__(self, name): + del self._entries[name] + + def __iter__(self): + return iter(self._entries.values()) + + +class CMakeMixin(object): + __slots__ = [] + + _cmake_cache = None + + def cmake_variable(self, variable_name, default="<unset>"): + variable_value = self.options.defines.get(variable_name, default) + if variable_value == "<unset>": + raise self._get_error_exception( + "CMake variable '{}' not defined.".format(variable_name), 1) + return variable_value + + def cmake_cache_variable(self, variable_name, default="<unset>"): + if self._cmake_cache is None: + cache_file = self.cmake_variable("CMAKE_BINARY_DIR") + cache_file = Path(cache_file).joinpath("CMakeCache.txt") + if not cache_file.is_file(): + raise self._get_error_exception( + "CMake cache file '{}' does not exist or is no file.". + format(cache_file), 1) + self._cmake_cache = CMakeCache(cache_file) + try: + return self._cmake_cache.get(variable_name) + except: + if default == "<unset>": + raise self._get_error_exception( + "CMake variable '{}' not defined in cache file.". + format(variable_name), 1) + return default + diff --git a/scripts/codegen/codegen.py b/scripts/codegen/codegen.py new file mode 100644 index 000000000000..296ae8101d66 --- /dev/null +++ b/scripts/codegen/codegen.py @@ -0,0 +1,630 @@ +# Copyright 2004-2016, Ned Batchelder. +# http://nedbatchelder.com/code/cog +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: MIT + +import sys +import os +import imp +import inspect +import re +from traceback import TracebackException + +from .whiteutils import * +from .filereader import NumberedFileReader +from .options import Options, OptionsMixin +from .generic import GenericMixin +from .guard import GuardMixin +from .config import ConfigMixin +from .cmake import CMakeMixin +from .zephyr import ZephyrMixin +from .edts import EDTSMixin +from .include import IncludeMixin +from .log import LogMixin +from .error import ErrorMixin, Error +from .output import OutputMixin +from .importmodule import ImportMixin +from .redirectable import Redirectable, RedirectableMixin + +class CodeGenerator(OptionsMixin, GenericMixin, ConfigMixin, + CMakeMixin, ZephyrMixin, EDTSMixin, GuardMixin, + IncludeMixin, LogMixin, ErrorMixin, OutputMixin, + ImportMixin, RedirectableMixin): + + code_start_marker = b'@code{.codegen}' + code_end_marker = b'@endcode{.codegen}' + code_insert_marker = b'@code{.codeins}@endcode' + + def __init__(self, processor, globals={}, + output_file=None, snippet_file = None): + self._stdout = sys.stdout + self._stderr = sys.stderr + self._outstring = '' + # code snippet markers and lines + self._start_marker = self.code_start_marker.decode('utf-8') + self._end_marker = self.code_end_marker.decode('utf-8') + self._insert_marker = self.code_insert_marker.decode('utf-8') + self.markers = [] + self.lines = [] + # The processor that is using this generator + self.processor = processor + self.options = processor.options + # All generators of a file usually work on the same global namespace + self.generator_globals = globals + self._output_file = output_file + # The file that contains the snippet + self._snippet_file = snippet_file + # The snippet this generator works on + self._snippet = None + # the snippet start offset in original file + self._snippet_offset = None + # the tab size in the snippet + self._snippet_tabsize = 8 + # the current evaluation start offset in the original file + # may be different to snippet offset during evaluation + self._eval_offset = None + # the previous output + self._previous = '' + + def line_is_start_marker(self, s): + return self._start_marker in s + + def line_is_end_marker(self, s): + return self._end_marker in s and not self.line_is_insert_marker(s) + + def line_is_insert_marker(self, s): + return self._insert_marker in s + + def parse_start_marker(self, l, snippet_offset): + self._snippet_offset = snippet_offset + self._eval_offset = snippet_offset + self.markers.append(l.expandtabs(self._snippet_tabsize)) + + def parse_end_marker(self, l): + self.markers.append(l.expandtabs(self._snippet_tabsize)) + + def parse_line(self, l, single_line_snippet=False): + l = l.expandtabs(self._snippet_tabsize).strip('\n') + if single_line_snippet: + # single line snippets contain the markers - remove them + beg = l.find(self._start_marker) + end = l.find(self._end_marker) + if beg > end: + self.lines.append(l) + self.error("Codegen code markers inverted", + frame_index = -2) + else: + l = l[beg+len(self._start_marker):end].strip() + self.lines.append(l) + + def _out(self, output='', dedent=False, trimblanklines=False): + if trimblanklines and ('\n' in output): + lines = output.split('\n') + if lines[0].strip() == '': + del lines[0] + if lines and lines[-1].strip() == '': + del lines[-1] + output = '\n'.join(lines)+'\n' + if dedent: + output = reindentBlock(output) + self._outstring += output + + ## + # @brief Re-indent a code block. + # + # Take a block of text as a string or list of lines. + # Remove any common prefix and whitespace indentation. + # Re-indent using new_indent + # + # @param lines + # @param common_prefix + # @param new_indent + # @return indented code block as a single string. + def _reindent_code(self, lines, common_prefix = '', new_indent=''): + if not isinstance(lines, list): + lines = lines.split('\n') + # remove common prefix + code_lines = [] # all code lines + code_no_white_lines = [] # code lines excluding white space lines + for line in lines: + line = line.expandtabs() + if common_prefix: + line = line.replace(common_prefix, '', 1) + code_lines.append(line) + if line and not line.isspace(): + code_no_white_lines.append(line) + # remove common white space and re-indent + out_lines = [] + common_white = os.path.commonprefix(code_no_white_lines) + common_white = re.search(r'\s*', common_white).group(0) + for line in code_lines: + if common_white: + line = line.replace(common_white, '', 1) + if line and new_indent: + line = new_indent + line + out_lines.append(line) + return '\n'.join(out_lines) + + ## + # @brief Extract the executable Python code from the generator. + # + def _get_code(self, fname, snippet_offset): + # If the markers and lines all have the same prefix + # (end-of-line comment chars, for example), + # then remove it from all the lines. + common_prefix = os.path.commonprefix(self.markers + self.lines) + if not common_prefix: + # there may be a prefix error + # just do some heuristics + if fname.endswith( + ('.h', '.hxx', '.c', '.cpp', '.cxx')): + # assume C/C++ comments + for line in (self.markers + self.lines): + if line.strip().startswith('*'): + common_prefix = '*' + break + elif line.strip().startswith('//'): + common_prefix = '//' + break + if common_prefix: + # there should be a common prefix -> error + lines = list() # lines with correct prefix + for lineno, line in enumerate(self.lines): + if not line.strip().startswith(common_prefix): + print("Codegen: Comment prefix may miss in codegen snippet (+{}) in '{}'.".format( + snippet_offset, fname)) + line_start = lineno - 5 + if line_start < 0: + line_start = 0 + line_end = lineno + 5 + if line_end > len(self.lines): + line_end = len(self.lines) + for i in range(line_start, line_end): + snippet_lineno = i + 2 + input_lineno = snippet_offset + snippet_lineno + print("#{} (+{}, line {}): {}".format( + input_lineno, snippet_offset, snippet_lineno, self.lines[i])) + else: + lines.append(line) + if len(lines) >= int(len(self.lines) / 2): + common_prefix = os.path.commonprefix(lines) + print("Codegen: Assuming comment prefix '{}' for codegen snippet (+{}) in '{}'.".format( + common_prefix, snippet_offset, fname)) + else: + common_prefix = '' + if common_prefix: + self.markers = [ line.replace(common_prefix, '', 1) for line in self.markers ] + code = self._reindent_code(self.lines, common_prefix) + return code + + # Make sure the "codegen" (alias cog) module has our state. + def _set_module_state(self): + restore_state = {} + module_states = self.processor.module_states + module = self.processor.cogmodule + # General module values + restore_state['inFile'] = getattr(module, 'inFile', None) + module.inFile = self._snippet_file + restore_state['outFile'] = getattr(module, 'outFile', None) + module.outFile = self._output_file + restore_state['firstLineNum'] = getattr(module, 'firstLineNum', None) + module.firstLineNum = self._snippet_offset + restore_state['previous'] = getattr(module, 'previous', None) + module.previous = self._previous + # CodeGenerator access + restore_state['options'] = getattr(module, 'options', None) + module.options = self.options + restore_state['Error'] = getattr(module, 'Error', None) + module.Error = self._get_error_exception + # Look for the Mixin classes + for base_cls in inspect.getmro(CodeGenerator): + if "Mixin" in base_cls.__name__: + for member_name, member_value in inspect.getmembers(base_cls): + if member_name.startswith('_'): + continue + if inspect.isroutine(member_value): + restore_state[member_name] = \ + getattr(module, member_name, None) + setattr(module, member_name, + getattr(self, member_name)) + module_states.append(restore_state) + + def _restore_module_state(self): + module_states = self.processor.module_states + module = self.processor.cogmodule + restore_state = module_states.pop() + # General module values + module.inFile = restore_state['inFile'] + module.outFile = restore_state['outFile'] + module.firstLineNum = restore_state['firstLineNum'] + module.previous = restore_state['previous'] + # CodeGenerator access + module.options = restore_state['options'] + module.Error = restore_state['Error'] + # Look for the Mixin classes + for base_cls in inspect.getmro(CodeGenerator): + if "Mixin" in base_cls.__name__: + for member_name, member_value in inspect.getmembers(base_cls): + if member_name.startswith('_'): + continue + if inspect.isroutine(member_value): + setattr(module, member_name, restore_state[member_name]) + + ## + # @brief snippet id to be used in logging and error reporting + # + # Accounts for extra lines added during evaluation + # + def _get_snippet_id(self): + return "+{}".format(self._eval_offset) + + ## + # @brief get snippet line number from evaluation line number + # + # Accounts for extra lines added during evaluation + # + # @param eval_lineno line number as reported from python code eval + def _get_snippet_lineno(self, eval_lineno): + return int(eval_lineno) + self._eval_offset - self._snippet_offset + + def _list_snippet(self): + if not self._snippet: + return None + listing = "" + for i, line in enumerate(self._snippet.splitlines()): + eval_lineno = i + 2 + input_lineno = self._eval_offset + eval_lineno + if i > 0: + listing += "\n" + listing += "#{} ({}, line {}): {}".format( + input_lineno, self._get_snippet_id(), eval_lineno, line) + return listing + + def _list_lines(self): + if len(self.lines) == 0: + return None + listing = "" + for i, line in enumerate(self.lines): + eval_lineno = i + 2 + input_lineno = self._eval_offset + eval_lineno + if i > 0: + listing += "\n" + listing += "#{} ({}, line {}): {}".format( + input_lineno, self._get_snippet_id(), eval_lineno, line) + return listing + + ## + # @brief evaluate + # + def evaluate(self): + self._snippet = self._get_code(self._snippet_file, self._snippet_offset) + if not self._snippet: + return '' + + # we add an extra line 'import codegen' + # to snippet so account for that + self._eval_offset = self._snippet_offset - 1 + + # In Python 2.2, the last line has to end in a newline. + eval_code = "import codegen\n" + self._snippet + "\n" + eval_fname = "{} {}".format(self._snippet_file, self._get_snippet_id()) + + try: + code = compile(eval_code, eval_fname, 'exec') + except: + exc_type, exc_value, exc_tb = sys.exc_info() + exc_traceback = TracebackException(exc_type, exc_value, exc_tb) + self.error( + "compile exception '{}' within snippet in {}".format( + exc_value, self._snippet_file), + frame_index = -2, + snippet_lineno = exc_traceback.lineno) + + # Make sure the "codegen" (alias cog) module has our state. + self._set_module_state() + + self._outstring = '' + try: + eval(code, self.generator_globals) + except: + exc_type, exc_value, exc_tb = sys.exc_info() + if exc_type is Error: + # Exception raise by CodeGen means + raise + # Not raised by Codegen means - add some info + print("Codegen: eval exception within codegen snippet ({}) in {}".format( + self._get_snippet_id(), self._snippet_file)) + for i, line in enumerate(self._snippet.splitlines()): + eval_lineno = i + 2 + input_lineno = self._eval_offset + eval_lineno + print("#{} ({}, line {}): {}".format(input_lineno, self._get_snippet_id(), eval_lineno, line)) + raise + finally: + self._restore_module_state() + + # We need to make sure that the last line in the output + # ends with a newline, or it will be joined to the + # end-output line, ruining cog's idempotency. + if self._outstring and self._outstring[-1] != '\n': + self._outstring += '\n' + + # end of evaluation - no extra offset anymore + self._eval_offset = self._snippet_offset + + # figure out the right whitespace prefix for the output + prefOut = whitePrefix(self.markers) + self._previous = reindentBlock(self._outstring, prefOut) + return self._previous + +## +# @brief The code generation processor +# +class CodeGen(Redirectable): + + def __init__(self): + Redirectable.__init__(self) + # Stack of module states + self.module_states = [] + self.options = Options() + # assure codegen module is installed + self._install_codegen_module() + + ## + # @brief Is this a trailing line after an end spec marker. + # + # @todo Make trailing end spec line detection dependent on + # type of text or file type. + # + # @param s line + # + def _is_end_spec_trailer(self, s): + return '*/' in s + + def _install_codegen_module(self): + """ Magic mumbo-jumbo so that imported Python modules + can say "import codegen" and get our state. + + Make us the module, and not our parent cog. + """ + self.cogmodule = imp.new_module('codegen') + self.cogmodule.path = [] + sys.modules['codegen'] = self.cogmodule + + def openOutputFile(self, fname): + """ Open an output file, taking all the details into account. + """ + opts = {} + mode = "w" + opts['encoding'] = self.options.sEncoding + if self.options.bNewlines: + opts['newline'] = "\n" + fdir = os.path.dirname(fname) + if os.path.dirname(fdir) and not os.path.exists(fdir): + os.makedirs(fdir) + return open(fname, mode, **opts) + + def openInputFile(self, fname): + """ Open an input file. """ + if fname == "-": + return sys.stdin + else: + opts = {} + opts['encoding'] = self.options.sEncoding + return open(fname, "r", **opts) + + ## + # @brief Process an input file object to an output file object. + # + # May be called recursively + # + # @param fIn input file object, or file name + # @param fOut output file object, or file name + # @param fname [optional] + # @param globals [optional] + # + def process_file(self, fIn, fOut, fname=None, globals=None): + + fInToClose = fOutToClose = None + # Convert filenames to files. + if isinstance(fIn, (str, bytes)): + # Open the input file. + sFileIn = fIn + fIn = fInToClose = self.openInputFile(fIn) + elif hasattr(fIn, 'name'): + sFileIn = fIn.name + else: + sFileIn = fname or '' + if isinstance(fOut, (str, bytes)): + # Open the output file. + sFileOut = fOut + fOut = fOutToClose = self.openOutputFile(fOut) + elif hasattr(fOut, 'name'): + sFileOut = fOut.name + else: + sFileOut = fname or '' + + try: + fIn = NumberedFileReader(fIn) + + bSawCog = False + + # The globals dict we will use for this file. + if globals is None: + globals = {} + # list of include files that are guarded against inclusion + globals['_guard_include'] = [] + + # If there are any global defines, put them in the globals. + globals.update(self.options.defines) + + # global flag for code generation + globals['_generate_code'] = True + + # loop over generator chunks + l = fIn.readline() + gen = None + while l and globals['_generate_code']: + + if gen is None: + # have a generator ready + # for marker check and error reporting + gen = CodeGenerator(self, globals, sFileOut, str(sFileIn)) + gen.setOutput(stdout=self._stdout) + + # Find the next spec begin + while l and not gen.line_is_start_marker(l): + if gen.line_is_end_marker(l): + gen._snippet_offset = fIn.linenumber() + gen.error("Unexpected '%s'" % gen._end_marker, + frame_index=-1, snippet_lineno=0) + if gen.line_is_insert_marker(l): + gen._snippet_offset = fIn.linenumber() + gen.error("Unexpected '%s'" % gen._insert_marker, + frame_index=-1, snippet_lineno=0) + fOut.write(l) + l = fIn.readline() + if not l: + break + if not self.options.bDeleteCode: + fOut.write(l) + + # l is the begin spec + firstLineNum = fIn.linenumber() + # Start parsing the inline code spec + # Assure a new generator is in use + gen = CodeGenerator(self, globals, sFileOut, str(sFileIn)) + gen.setOutput(stdout=self._stdout) + gen.parse_start_marker(l, firstLineNum) + + gen.log('s{}: process {} #{}'.format(len(self.module_states), sFileIn, firstLineNum)) + # If the spec begin is also a spec end, then process the single + # line of code inside. + if gen.line_is_end_marker(l): + gen.parse_line(l, True) + # next line + l = fIn.readline() + else: + # Deal with an ordinary code block. + l = fIn.readline() + + # Get all the lines in the spec + while l and not gen.line_is_end_marker(l): + gen.parse_line(l) + if gen.line_is_start_marker(l): + gen.error("Code followed by unexpected '%s'" % gen._start_marker, + frame_index = -2, + snippet_lineno = fIn.linenumber() - firstLineNum) + if gen.line_is_insert_marker(l): + gen.error("Code followed by unexpected '%s'" % gen._insert_marker, + frame_index = -2, + snippet_lineno = fIn.linenumber() - firstLineNum) + if not self.options.bDeleteCode: + fOut.write(l) + l = fIn.readline() + if not l: + gen.error("Codegen block begun but never ended.", + frame_index = -2, snippet_lineno = 0) + # write out end spec line + if not self.options.bDeleteCode: + fOut.write(l) + gen.parse_end_marker(l) + # next line - may be trailing end spec line + l = fIn.readline() + if self._is_end_spec_trailer(l) and not gen.line_is_insert_marker(l): + fOut.write(l) + l = fIn.readline() + + # Eat all the lines in the output section. + while l and not gen.line_is_insert_marker(l): + if gen.line_is_start_marker(l): + gen.error("Unexpected '%s'" % gen._start_marker, + frame_index = -2, + snippet_lineno = fIn.linenumber() - firstLineNum) + if gen.line_is_end_marker(l): + gen.error("Unexpected '%s'" % gen._end_marker, + frame_index = -2, + snippet_lineno = fIn.linenumber() - firstLineNum) + l = fIn.readline() + + if not l: + # We reached end of file before we found the end output line. + gen.error("Missing '%s' before end of file." % gen._insert_marker, + frame_index = -2, + snippet_lineno = fIn.linenumber() - firstLineNum) + + # Write the output of the spec to be the new output if we're + # supposed to generate code. + if not self.options.bNoGenerate: + sGen = gen.evaluate() + fOut.write(sGen) + if not globals['_generate_code']: + # generator code snippet stopped code generation + break + + bSawCog = True + + if not self.options.bDeleteCode: + fOut.write(l) + l = fIn.readline() + + if not bSawCog and self.options.bWarnEmpty: + self.warning("no codegen code found in %s" % sFileIn) + finally: + if fInToClose: + fInToClose.close() + if fOutToClose: + fOutToClose.close() + + def saveIncludePath(self): + self.savedInclude = self.options.includePath[:] + self.savedSysPath = sys.path[:] + + def restoreIncludePath(self): + self.options.includePath = self.savedInclude + self.cogmodule.path = self.options.includePath + sys.path = self.savedSysPath + + def addToIncludePath(self, includePath): + self.cogmodule.path.extend(includePath) + sys.path.extend(includePath) + + ## + # @brief process one file through CodeGen + # + # @param sFile file name + # + def _process_one_file(self, sFile): + """ Process one filename through cog. + """ + + self.saveIncludePath() + bNeedNewline = False + + try: + self.addToIncludePath(self.options.includePath) + # Since we know where the input file came from, + # push its directory onto the include path. + self.addToIncludePath([os.path.dirname(sFile)]) + + # How we process the file depends on where the output is going. + if self.options.sOutputName: + self.process_file(sFile, self.options.sOutputName, sFile) + else: + self.process_file(sFile, self.stdout, sFile) + finally: + self.restoreIncludePath() + + def callableMain(self, argv): + """ All of command-line codegen, but in a callable form. + This is used by main. + argv is the equivalent of sys.argv. + """ + argv = argv[1:] + + self.options.parse_args(argv) + + if self.options.input_file is None: + raise FileNotFoundError("No files to process") + + self._process_one_file(self.options.input_file) diff --git a/scripts/codegen/config.py b/scripts/codegen/config.py new file mode 100644 index 000000000000..02c45f7a68ca --- /dev/null +++ b/scripts/codegen/config.py @@ -0,0 +1,56 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +import os +import sys +import shlex +from pathlib import Path + +class ConfigMixin(object): + __slots__ = [] + + _autoconf = None + _autoconf_filename = None + + def _autoconf_assure(self): + if self._autoconf is None: + autoconf_file = self.cmake_variable("PROJECT_BINARY_DIR", None) + if autoconf_file is None: + raise self._get_error_exception( + "CMake variable PROJECT_BINARY_DIR not defined to codegen.", 2) + autoconf_file = Path(autoconf_file).joinpath('include/generated/autoconf.h') + if not autoconf_file.is_file(): + raise self._get_error_exception( + "Generated configuration {} not found/ no access.". + format(autoconf_file), 2) + autoconf = {} + with open(str(autoconf_file)) as autoconf_fd: + for line in autoconf_fd: + if not line.startswith('#'): + continue + if " " not in line: + continue + key, value = shlex.split(line)[1:] + autoconf[key] = value + self._autoconf = autoconf + self._autoconf_filename = str(autoconf_file) + + def config_property(self, property_name, default="<unset>"): + self._autoconf_assure() + property_value = self._autoconf.get(property_name, default) + if property_value == "<unset>": + raise self._get_error_exception( + "Config property '{}' not defined.".format(property_name), 1) + return property_value + + ## + # @brief Get all config properties. + # + # The property names are the ones autoconf.conf. + # + # @return A dictionary of config properties. + # + def config_properties(self): + self._autoconf_assure() + return self._autoconf diff --git a/scripts/codegen/edts.py b/scripts/codegen/edts.py new file mode 100644 index 000000000000..a89b4205b413 --- /dev/null +++ b/scripts/codegen/edts.py @@ -0,0 +1,31 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +from pathlib import Path +from dts.edtsdatabase import EDTSDatabase + +class EDTSMixin(object): + __slots__ = [] + + _edts = None + + def _edts_assure(self): + if self._edts is None: + edts_file = self.cmake_variable("GENERATED_DTS_BOARD_EDTS") + edts_file = Path(edts_file) + if not edts_file.is_file(): + raise self._get_error_exception( + "Generated extended device tree database file '{}' not found/ no access.". + format(edts_file), 2) + self._edts = EDTSDatabase() + self._edts.load(str(edts_file)) + + ## + # @brief Get the extended device tree database. + # + # @return Extended device tree database. + # + def edts(self): + self._edts_assure() + return self._edts diff --git a/scripts/codegen/error.py b/scripts/codegen/error.py new file mode 100644 index 000000000000..56cf4ddb2a6b --- /dev/null +++ b/scripts/codegen/error.py @@ -0,0 +1,68 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +import inspect +from pathlib import Path + +class Error(Exception): + pass + +class ErrorMixin(object): + __slots__ = [] + + ## + # @brief Get code generation error exception + # + # @note only for 'raise codegen.Error(msg)' in snippet + # + # @param msg exception message + # @param frame_index [optional] call frame index + # @param snippet_lineno [optional] line number within snippet + # @return code generation exception object + # + def _get_error_exception(self, msg, frame_index = 0, + snippet_lineno = 0): + if frame_index >= 0: + # There are frames to get data from + frame_index += 1 + frame = inspect.currentframe() + try: + while frame_index > 0: + frame = frame.f_back + frame_index -= 1 + (filename, snippet_lineno, function, code_context, index) = \ + inspect.getframeinfo(frame) + except: + pass + finally: + del frame + input_lineno = self._snippet_offset + self._get_snippet_lineno(snippet_lineno) + error_msg = "{} #{} ({}, line {}): {}".format( + Path(self._snippet_file).name, + input_lineno, self._get_snippet_id(), + snippet_lineno, msg) + listing = self._list_snippet() + if listing: + error_msg = listing + '\n' + error_msg + else: + listing = self._list_lines() + if listing: + error_msg= listing + '\n' + error_msg + return Error(error_msg) + + ## + # @brief Raise Error exception. + # + # Extra information is added that maps the python snippet + # line seen by the Python interpreter to the line of the file + # that inlines the python snippet. + # + # @param msg [optional] exception message + # @param frame_index [optional] call frame index + # @param snippet_lineno [optional] line number within snippet + # + def error(self, msg = 'Error raised by codegen generator.', + frame_index = 0, snippet_lineno = 0): + frame_index += 1 + raise self._get_error_exception(msg, frame_index, snippet_lineno) diff --git a/scripts/codegen/filereader.py b/scripts/codegen/filereader.py new file mode 100644 index 000000000000..c567a5ca24df --- /dev/null +++ b/scripts/codegen/filereader.py @@ -0,0 +1,20 @@ +# Copyright 2004-2016, Ned Batchelder. +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: MIT + +class NumberedFileReader: + """ A decorator for files that counts the readline()'s called. + """ + def __init__(self, f): + self.f = f + self.n = 0 + + def readline(self): + l = self.f.readline() + if l: + self.n += 1 + return l + + def linenumber(self): + return self.n diff --git a/scripts/codegen/generic.py b/scripts/codegen/generic.py new file mode 100644 index 000000000000..07e89bcaeed5 --- /dev/null +++ b/scripts/codegen/generic.py @@ -0,0 +1,51 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +from pathlib import Path + +class GenericMixin(object): + __slots__ = [] + + @staticmethod + def path_walk(top, topdown = False, followlinks = False): + """ + See Python docs for os.walk, exact same behavior but it yields Path() + instances instead + + Form: http://ominian.com/2016/03/29/os-walk-for-pathlib-path/ + """ + names = list(top.iterdir()) + + dirs = (node for node in names if node.is_dir() is True) + nondirs = (node for node in names if node.is_dir() is False) + + if topdown: + yield top, dirs, nondirs + + for name in dirs: + if followlinks or name.is_symlink() is False: + for x in path_walk(name, topdown, followlinks): + yield x + + if topdown is not True: + yield top, dirs, nondirs + + # + # @param marker Marker as b'my-marker' + # + @staticmethod + def template_files(top, marker, suffix='.c'): + sources = [] + for path, directory_names, file_names in CodeGen.path_walk(top): + sources.extend([x for x in file_names if x.suffix == suffix]) + + templates = [] + for source_file in sources: + if os.stat(source_file).st_size == 0: + continue + with open(source_file, 'rb', 0) as source_file_fd: + s = mmap.mmap(source_file_fd.fileno(), 0, access=mmap.ACCESS_READ) + if s.find(marker) != -1: + templates.append(source_file) + return templates diff --git a/scripts/codegen/guard.py b/scripts/codegen/guard.py new file mode 100644 index 000000000000..0cf8a11a22eb --- /dev/null +++ b/scripts/codegen/guard.py @@ -0,0 +1,16 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +class GuardMixin(object): + __slots__ = [] + + + def outl_guard_config(self, property_name): + is_config = self.config_property(property_name, 0) + self.outl("#if {} // Guard({}) {}".format( + is_config, is_config, property_name)) + + def outl_unguard_config(self, property_name): + is_config = self.config_property(property_name, 0) + self.outl("#endif // Guard({}) {}".format(is_config, property_name)) diff --git a/scripts/codegen/importmodule.py b/scripts/codegen/importmodule.py new file mode 100644 index 000000000000..3f4e632059d9 --- /dev/null +++ b/scripts/codegen/importmodule.py @@ -0,0 +1,37 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +import sys +import os +import importlib +from pathlib import Path + +class ImportMixin(object): + __slots__ = [] + + ## + # @brief Import a CodeGen module. + # + # Import a module from the codegen/modules package. + # + # @param name Module to import. Specified without any path. + # + def import_module(self, name): + try: + module_file = self.zephyr_path().joinpath( + "scripts/codegen/modules/{}.py".format(name)).resolve() + except FileNotFoundError: + # Python 3.4/3.5 will throw this exception + # Python >= 3.6 will not throw this exception + module_file = self.zephyr_path().joinpath( + "scripts/codegen/modules/{}.py".format(name)) + if not module_file.is_file(): + raise self._get_error_exception( + "Module file '{}' of module '{}' does not exist or is no file.". + format(module_file, name), 1) + sys.path.append(os.path.dirname(str(module_file))) + module = importlib.import_module(name) + sys.path.pop() + self.generator_globals[name] = module + diff --git a/scripts/codegen/include.py b/scripts/codegen/include.py new file mode 100644 index 000000000000..54ea51d48eba --- /dev/null +++ b/scripts/codegen/include.py @@ -0,0 +1,67 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +from pathlib import Path +import io + +from .error import Error + +class IncludeMixin(object): + __slots__ = [] + + def out_include(self, include_file): + try: + input_file = Path(include_file).resolve() + except FileNotFoundError: + # Python 3.4/3.5 will throw this exception + # Python >= 3.6 will not throw this exception + input_file = Path(include_file) + if not input_file.is_file(): + # don't resolve upfront + input_file = Path(include_file) + # try to find the file in the templates directory + expanded_file_path = self.zephyr_path().joinpath( + "scripts/codegen/templates") + if 'templates' in input_file.parts: + templates_seen = False + else: + # assume the path starts after templates + templates_seen = True + # append the remaining part behind templates + for part in input_file.parts: + if templates_seen: + expanded_file_path = expanded_file_path.joinpath(part) + elif part is 'templates': + templates_seen = True + if expanded_file_path.is_file(): + input_file = expanded_file_path + if not input_file.is_file(): + raise self._get_error_exception( + "Include file '{}' does not exist or is no file.". + format(input_file), 1) + if str(input_file) in self.generator_globals['_guard_include']: + self.log('------- include guarded {} - multiple inclusion of include file.'. + format(str(input_file))) + else: + output_fd = io.StringIO() + # delete inline code in included files + delete_code = self.processor.options.bDeleteCode + self.processor.options.bDeleteCode = True + self.log('------- include start {}'.format(input_file)) + self.processor.process_file(str(input_file), output_fd, + globals=self.generator_globals) + self.log(output_fd.getvalue()) + self.log('------- include end {}'.format(input_file)) + self.processor.options.bDeleteCode = delete_code + self.out(output_fd.getvalue()) + + def guard_include(self): + if self._snippet_file in self.generator_globals['_guard_include']: + # This should never happen + raise self._get_error_exception( + "Multiple inclusion of guarded include file '{}'.". + format(self._snippet_file), 1) + self.log('------- include guard {}'.format(self._snippet_file)) + self.generator_globals['_guard_include'].append(self._snippet_file) + diff --git a/scripts/codegen/log.py b/scripts/codegen/log.py new file mode 100644 index 000000000000..7ee81bad6ac6 --- /dev/null +++ b/scripts/codegen/log.py @@ -0,0 +1,41 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +from pathlib import Path + +class LogMixin(object): + __slots__ = [] + + _log_fd = None + + def log(self, message, message_type=None, end="\n", logonly=True): + if self._log_fd is None: + if self.options.log_file is not None: + log_file = Path(self.options.log_file) + if not log_file.is_file(): + # log file will be created + # add preamble + preamble = "My preamble\n{}".format(message) + self._log_fd = open(str(log_file), 'a') + if message_type is None: + message_type = '' + else: + message_type = message_type+': ' + if self._log_fd is not None: + for line in message.splitlines(): + self._log_fd.write("{}{}{}".format(message_type, line, end)) + if not logonly: + print(message_type+message, file=self._stderr, end=end) + + def msg(self, s): + self.log(s, message_type='message', logonly=False) + + def warning(self, s): + self.log(s, message_type='warning', logonly=False) + + def prout(self, s, end="\n"): + self.log(s, message_type=None, end=end, logonly=False) + + def prerr(self, s, end="\n"): + self.log(s, message_type='error', end=end, logonly=False) diff --git a/scripts/codegen/options.py b/scripts/codegen/options.py new file mode 100644 index 000000000000..312509353852 --- /dev/null +++ b/scripts/codegen/options.py @@ -0,0 +1,139 @@ +# Copyright 2004-2016, Ned Batchelder. +# http://nedbatchelder.com/code/cog +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: MIT + +import os +import argparse + +class Options(object): + + @staticmethod + def is_valid_directory(parser, arg): + if not os.path.isdir(arg): + parser.error('The directory {} does not exist!'.format(arg)) + else: + # File directory so return the directory + return arg + + @staticmethod + def is_valid_file(parser, arg): + if not os.path.isfile(arg): + parser.error('The file {} does not exist!'.format(arg)) + else: + # File exists so return the file + return arg + + def __init__(self): + # Defaults for argument values. + self.args = [] + self.includePath = [] + self.defines = {} + self.bNoGenerate = False + self.sOutputName = None + self.bWarnEmpty = False + self.bDeleteCode = False + self.bNewlines = False + self.sEncoding = "utf-8" + self.verbosity = 2 + + self._parser = argparse.ArgumentParser( + description='Generate code with inlined Python code.') + self._parser.add_argument('-d', '--delete-code', + dest='bDeleteCode', action='store_true', + help='Delete the generator code from the output file.') + self._parser.add_argument('-D', '--define', nargs=1, metavar='DEFINE', + dest='defines', action='append', + help='Define a global string available to your generator code.') + self._parser.add_argument('-e', '--warn-empty', + dest='bWarnEmpty', action='store_true', + help='Warn if a file has no generator code in it.') + self._parser.add_argument('-U', '--unix-newlines', + dest='bNewlines', action='store_true', + help='Write the output with Unix newlines (only LF line-endings).') + self._parser.add_argument('-I', '--include', nargs=1, metavar='DIR', + dest='includePath', action='append', + type=lambda x: self.is_valid_directory(self._parser, x), + help='Add DIR to the list of directories for data files and modules.') + self._parser.add_argument('-n', '--encoding', nargs=1, + dest='sEncoding', action='store', metavar='ENCODING', + type=lambda x: self.is_valid_file(self._parser, x), + help='Use ENCODING when reading and writing files.') + self._parser.add_argument('-i', '--input', nargs=1, metavar='FILE', + dest='input_file', action='store', + type=lambda x: self.is_valid_file(self._parser, x), + help='Get the input from FILE.') + self._parser.add_argument('-o', '--output', nargs=1, metavar='FILE', + dest='sOutputName', action='store', + help='Write the output to FILE.') + self._parser.add_argument('-l', '--log', nargs=1, metavar='FILE', + dest='log_file', action='store', + help='Log to FILE.') + + def __str__(self): + sb = [] + for key in self.__dict__: + sb.append("{key}='{value}'".format(key=key, value=self.__dict__[key])) + return ', '.join(sb) + + def __repr__(self): + return self.__str__() + + + def __eq__(self, other): + """ Comparison operator for tests to use. + """ + return self.__dict__ == other.__dict__ + + def clone(self): + """ Make a clone of these options, for further refinement. + """ + return copy.deepcopy(self) + + def parse_args(self, argv): + args = self._parser.parse_args(argv) + # set options + self.bDeleteCode = args.bDeleteCode + self.bWarnEmpty = args.bWarnEmpty + self.bNewlines = args.bNewlines + if args.includePath is None: + self.includePath = [] + else: + self.includePath = args.includePath + self.sEncoding = args.sEncoding + if args.input_file is None: + self.input_file = None + else: + self.input_file = args.input_file[0] + if args.sOutputName is None: + self.sOutputName = None + else: + self.sOutputName = args.sOutputName[0] + if args.log_file is None: + self.log_file = None + else: + self.log_file = args.log_file[0] + self.defines = {} + if args.defines is not None: + for define in args.defines: + d = define[0].split('=') + if len(d) > 1: + value = d[1] + else: + value = None + self.defines[d[0]] = value + + def addToIncludePath(self, dirs): + """ Add directories to the include path. + """ + dirs = dirs.split(os.pathsep) + self.includePath.extend(dirs) + + + +class OptionsMixin(object): + __slots__ = [] + + def option(self, option_name): + return getattr(self.options, option_name) diff --git a/scripts/codegen/output.py b/scripts/codegen/output.py new file mode 100644 index 000000000000..647002b3ed53 --- /dev/null +++ b/scripts/codegen/output.py @@ -0,0 +1,19 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + + +class OutputMixin(object): + __slots__ = [] + + def msg(self, s): + self.prout("Message: "+s) + + def out(self, sOut='', dedent=False, trimblanklines=False): + self._out(sOut, dedent, trimblanklines) + + def outl(self, sOut='', **kw): + """ The cog.outl function. + """ + self._out(sOut, **kw) + self._out('\n') diff --git a/scripts/codegen/redirectable.py b/scripts/codegen/redirectable.py new file mode 100644 index 000000000000..3cdc49b25e5f --- /dev/null +++ b/scripts/codegen/redirectable.py @@ -0,0 +1,31 @@ +# Copyright 2004-2016, Ned Batchelder. +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: MIT + +import sys + +class RedirectableMixin(object): + __slots__ = [] + + def setOutput(self, stdout=None, stderr=None): + """ Assign new files for standard out and/or standard error. + """ + if stdout: + self._stdout = stdout + if stderr: + self._stderr = stderr + + def prout(self, s, end="\n"): + print(s, file=self._stdout, end=end) + + def prerr(self, s, end="\n"): + print(s, file=self._stderr, end=end) + + +class Redirectable(RedirectableMixin): + """ An object with its own stdout and stderr files. + """ + def __init__(self): + self._stdout = sys.stdout + self._stderr = sys.stderr diff --git a/scripts/codegen/whiteutils.py b/scripts/codegen/whiteutils.py new file mode 100644 index 000000000000..2a128e4ab88f --- /dev/null +++ b/scripts/codegen/whiteutils.py @@ -0,0 +1,72 @@ +# Copyright 2004-2016, Ned Batchelder. +# http://nedbatchelder.com/code/cog +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: MIT + +import re + +def b(s): + return s.encode("latin-1") + +def whitePrefix(strings): + """ Determine the whitespace prefix common to all non-blank lines + in the argument list. + """ + # Remove all blank lines from the list + strings = [s for s in strings if s.strip() != ''] + + if not strings: return '' + + # Find initial whitespace chunk in the first line. + # This is the best prefix we can hope for. + pat = r'\s*' + if isinstance(strings[0], (bytes, )): + pat = pat.encode("utf8") + prefix = re.match(pat, strings[0]).group(0) + + # Loop over the other strings, keeping only as much of + # the prefix as matches each string. + for s in strings: + for i in range(len(prefix)): + if prefix[i] != s[i]: + prefix = prefix[:i] + break + return prefix + +def reindentBlock(lines, newIndent=''): + """ Take a block of text as a string or list of lines. + Remove any common whitespace indentation. + Re-indent using newIndent, and return it as a single string. + """ + sep, nothing = '\n', '' + if isinstance(lines, (bytes, )): + sep, nothing = b('\n'), b('') + if isinstance(lines, (str, bytes)): + lines = lines.split(sep) + oldIndent = whitePrefix(lines) + outLines = [] + for l in lines: + if oldIndent: + l = l.replace(oldIndent, nothing, 1) + if l and newIndent: + l = newIndent + l + outLines.append(l) + return sep.join(outLines) + +def commonPrefix(strings): + """ Find the longest string that is a prefix of all the strings. + """ + if not strings: + return '' + prefix = strings[0] + for s in strings: + if len(s) < len(prefix): + prefix = prefix[:len(s)] + if not prefix: + return '' + for i in range(len(prefix)): + if prefix[i] != s[i]: + prefix = prefix[:i] + break + return prefix diff --git a/scripts/codegen/zephyr.py b/scripts/codegen/zephyr.py new file mode 100644 index 000000000000..3366b2643ba8 --- /dev/null +++ b/scripts/codegen/zephyr.py @@ -0,0 +1,12 @@ +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +from pathlib import Path + +class ZephyrMixin(object): + __slots__ = [] + + @staticmethod + def zephyr_path(): + return Path(__file__).resolve().parents[2] diff --git a/scripts/gen_code.py b/scripts/gen_code.py new file mode 100755 index 000000000000..36719134ef74 --- /dev/null +++ b/scripts/gen_code.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2018 Bobby Noelte. +# +# SPDX-License-Identifier: Apache-2.0 + +import sys + +from codegen.codegen import CodeGen + +if __name__ == '__main__': + ret = CodeGen().callableMain(sys.argv) + sys.exit(ret) From ee916cf209de0e061f688de0e0c3a88aa5865ede Mon Sep 17 00:00:00 2001 From: Bobby Noelte <b0661n0e17e@gmail.com> Date: Sat, 10 Mar 2018 15:45:54 +0100 Subject: [PATCH 18/20] doc: codegen: add inline code generation documentation Document the inline code generation tool codegen and its integration in the CMake build process. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> --- doc/contribute/contribute_guidelines.rst | 24 +- doc/subsystems/codegen/build.rst | 29 +++ doc/subsystems/codegen/codegen.rst | 90 ++++++++ doc/subsystems/codegen/codegen_principle.png | Bin 0 -> 39747 bytes .../codegen/codegen_principle_access.png | Bin 0 -> 58311 bytes .../codegen/codegen_principle_import.png | Bin 0 -> 113795 bytes .../codegen/codegen_principle_include.png | Bin 0 -> 113376 bytes doc/subsystems/codegen/functions.rst | 216 ++++++++++++++++++ doc/subsystems/codegen/index.rst | 27 +++ doc/subsystems/codegen/principle.rst | 48 ++++ doc/subsystems/subsystems.rst | 1 + 11 files changed, 434 insertions(+), 1 deletion(-) create mode 100644 doc/subsystems/codegen/build.rst create mode 100644 doc/subsystems/codegen/codegen.rst create mode 100644 doc/subsystems/codegen/codegen_principle.png create mode 100644 doc/subsystems/codegen/codegen_principle_access.png create mode 100644 doc/subsystems/codegen/codegen_principle_import.png create mode 100644 doc/subsystems/codegen/codegen_principle_include.png create mode 100644 doc/subsystems/codegen/functions.rst create mode 100644 doc/subsystems/codegen/index.rst create mode 100644 doc/subsystems/codegen/principle.rst diff --git a/doc/contribute/contribute_guidelines.rst b/doc/contribute/contribute_guidelines.rst index c362bb3a05d0..d044cc556059 100644 --- a/doc/contribute/contribute_guidelines.rst +++ b/doc/contribute/contribute_guidelines.rst @@ -326,8 +326,11 @@ On Linux systems, you can install uncrustify with For Windows installation instructions see the `sourceforge listing for uncrustify <https://sourceforge.net/projects/uncrustify>`_. +Best coding practises +********************* + Coding Style -************ +============ Use these coding guidelines to ensure that your development complies with the project's style and naming conventions. @@ -363,6 +366,25 @@ it to contain: set -e exec exec git diff --cached | ${ZEPHYR_BASE}/scripts/checkpatch.pl - +Keep the code simple +==================== + +Keep the code as simple as possible. + +Code-generation preprocessing tools provide a convenient way to +simplify some repetitive or parameterized coding tasks. While Zephyr +development allows use of such tools, we recommend keeping this +use to a minimum and when it provides an appropriate and simple +coding solution that follows these rules: + +* Use code generation - by preprocessor, :ref:`codegen`, or other - only for + problems that cannot be solved in the source language. +* Limit code generation to declarative data. Avoid generating control logic + whenever possible. +* Use the preprocessor for code generation as the primary tool. +* Use :ref:`codegen` only if the preprocessor can not provide a simple solution. +* Use CMake only if :ref:`codegen` can not be used. + .. _Contribution workflow: Contribution Workflow diff --git a/doc/subsystems/codegen/build.rst b/doc/subsystems/codegen/build.rst new file mode 100644 index 000000000000..4ecc1ccf359b --- /dev/null +++ b/doc/subsystems/codegen/build.rst @@ -0,0 +1,29 @@ +.. + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_build: + +Code Generation in the Build Process +#################################### + +Code generation has to be invoked as part of the build process. Zephyr uses +`CMake <https://cmake.org/>`_ as the tool to manage building the project. + +A file that contains inline code generation has to be added to the project +by one of the following commands in a :file:`CMakeList.txt` file. + +.. function:: zephyr_sources_codegen(codegen_file.c [CODEGEN_DEFINES defines..] [DEPENDS target.. file..]) + +.. function:: zephyr_sources_codegen_ifdef(ifguard codegen_file.c [CODEGEN_DEFINES defines..] [DEPENDS target.. file..]) + +.. function:: zephyr_library_sources_codegen(codegen_file.c [CODEGEN_DEFINES defines..] [DEPENDS target.. file..]) + +.. function:: zephyr_library_sources_codegen_ifdef(ifguard codegen_file.c [CODEGEN_DEFINES defines..] [DEPENDS target.. file..]) + +The arguments given by the ``CODEGEN_DEFINES`` keyword have to be of the form +``define_name=define_value``. The arguments become globals in the python +snippets and can be accessed by ``define_name``. + +Dependencies given by the ``DEPENDS`` key word are added to the dependencies +of the generated file. diff --git a/doc/subsystems/codegen/codegen.rst b/doc/subsystems/codegen/codegen.rst new file mode 100644 index 000000000000..cc7b1bb3eed3 --- /dev/null +++ b/doc/subsystems/codegen/codegen.rst @@ -0,0 +1,90 @@ +.. + Copyright (c) 2004-2015 Ned Batchelder + SPDX-License-Identifier: MIT + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_intro: + +Introduction +############ + +Python snippets that are inlined in a source file are used as code generators. +The tool to scan the source file for the Python snippets and process them is +Codegen. Codegen and part of this documentation is based on +`Cog <https://nedbatchelder.com/code/cog/index.html>`_ from Ned Batchelder. + +The processing of source files is controlled by the CMake extension functions: +zephyr_sources_codegen(..) or zephyr_library_sources_codegen(..). The generated +source files are added to the Zephyr sources. During build the source files are +processed by Codegen and the generated source files are written to the CMake +binary directory. + +The inlined Python snippets can contain any Python code, they are regular +Python scripts. All Python snippets in a source file and all Python snippets of +included template files are treated as a python script with a common set of +global Python variables. Global data created in one snippet can be used in +another snippet that is processed later on. This feature could be used, for +example, to customize included template files. + +An inlined Python snippet can always access the codegen module. The codegen +module encapsulates and provides all the functions to retrieve information +(options, device tree properties, CMake variables, config properties) and to +output the generated code. + +Codegen transforms files in a very simple way: it finds chunks of Python code +embedded in them, executes the Python code, and places its output combined with +the original file into the generated file. The original file can contain +whatever text you like around the Python code. It will usually be source code. + +For example, if you run this file through Codegen: + +:: + + /* This is my C file. */ + ... + /** + * @code{.codegen} + * fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing'] + * for fn in fnames: + * codegen.outl("void %s();" % fn) + * @endcode{.codegen} + */ + /** @code{.codeins}@endcode */ + ... + +it will come out like this: + +:: + + /* This is my C file. */ + ... + /** + * @code{.codegen} + * fnames = ['DoSomething', 'DoAnotherThing', 'DoLastThing'] + * for fn in fnames: + * codegen.outl("void %s();" % fn) + * @endcode{.codegen} + */ + void DoSomething(); + void DoAnotherThing(); + void DoLastThing(); + /** @code{.codeins}@endcode */ + ... + +Lines with ``@code{.codegen}`` or ``@code{.codeins}@endcode`` are marker lines. +The lines between ``@code{.codegen}`` and ``@endcode{.codegen}`` are the +generator Python code. The lines between ``@endcode{.codegen}`` and +``@code{.codeins}@endcode`` are the output from the generator. + +When Codegen runs, it discards the last generated Python output, executes the +generator Python code, and writes its generated output into the file. All text +lines outside of the special markers are passed through unchanged. + +The Codegen marker lines can contain any text in addition to the marker tokens. +This makes it possible to hide the generator Python code from the source file. + +In the sample above, the entire chunk of Python code is a C comment, so the +Python code can be left in place while the file is treated as C code. + + diff --git a/doc/subsystems/codegen/codegen_principle.png b/doc/subsystems/codegen/codegen_principle.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f340731f3ac5359ca3172bef4418819f341c3c GIT binary patch literal 39747 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 literal 0 HcmV?d00001 diff --git a/doc/subsystems/codegen/codegen_principle_access.png b/doc/subsystems/codegen/codegen_principle_access.png new file mode 100644 index 0000000000000000000000000000000000000000..e0319d463cd8a072c11d36cdbc6ce26e46a00b9a GIT binary patch literal 58311 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­S(zu8l|~{ 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 literal 0 HcmV?d00001 diff --git a/doc/subsystems/codegen/codegen_principle_import.png b/doc/subsystems/codegen/codegen_principle_import.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c681833a0b989682641b38837b0eabd18503ee GIT binary patch literal 113795 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 literal 0 HcmV?d00001 diff --git a/doc/subsystems/codegen/codegen_principle_include.png b/doc/subsystems/codegen/codegen_principle_include.png new file mode 100644 index 0000000000000000000000000000000000000000..1b58b41dd0098937282effbbbdad593cbb90cb10 GIT binary patch literal 113376 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%0Au^XI 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%0AmtB0Jqj`dcm$cgLUcJEihqmQcSw#8UWLeRD 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 W+gab&uK2Lvo#zcq^z%+Tg#9l`RerDl literal 0 HcmV?d00001 diff --git a/doc/subsystems/codegen/functions.rst b/doc/subsystems/codegen/functions.rst new file mode 100644 index 000000000000..45b56c1ab39e --- /dev/null +++ b/doc/subsystems/codegen/functions.rst @@ -0,0 +1,216 @@ +.. + Copyright (c) 2004-2015 Ned Batchelder + SPDX-License-Identifier: MIT + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_functions: + +Code Generation Functions +######################### + +A module called ``codegen`` provides the core functions for inline +code generation. It encapsulates all the functions to retrieve information +(options, device tree properties, CMake variables, config properties) and +to output the generated code. + +.. contents:: + :depth: 2 + :local: + :backlinks: top + +The ``codegen`` module is automatically imported by all code snippets. No +explicit import is necessary. + +Output +------ + +.. function:: codegen.out(sOut=’’ [, dedent=False][, trimblanklines=False]) + + Writes text to the output. + + :param sOut: The string to write to the output. + :param dedent: If dedent is True, then common initial white space is + removed from the lines in sOut before adding them to the + output. + :param trimblanklines: If trimblanklines is True, + then an initial and trailing blank line are removed + from sOut before adding them to the output. + + ``dedent`` and ``trimblanklines`` make it easier to use + multi-line strings, and they are only are useful for multi-line strings: + + :: + + codegen.out(""" + These are lines I + want to write into my source file. + """, dedent=True, trimblanklines=True) + +.. function:: codegen.outl + + Same as codegen.out, but adds a trailing newline. + +.. attribute:: codegen.inFile + + An attribute, the path of the input file. + +.. attribute:: codegen.outFile + + An attribute, the path of the output file. + +.. attribute:: codegen.firstLineNum + + An attribute, the line number of the first line of Python code in the + generator. This can be used to distinguish between two generators in the + same input file, if needed. + +.. attribute:: codegen.previous + + An attribute, the text output of the previous run of this generator. This + can be used for whatever purpose you like, including outputting again with + codegen.out() + +The codegen module also provides a set of convenience functions: + + +Code generation module import +----------------------------- + +.. function:: codegen.module_import(module_name) + + Import a module from the codegen/modules package. + + After import the module's functions and variables can be accessed by + module_name.func() and module_name.var. + + :param module_name: Module to import. Specified without any path. + + See :ref:`codegen_modules` for the available modules. + +Template file inclusion +----------------------- + +.. function:: codegen.out_include(include_file) + + Write the text from include_file to the output. The :file:`include_file` + is processed by Codegen. Inline code generation in ``include_file`` + can access the globals defined in the ``including source file`` before + inclusion. The ``including source file`` can access the globals defined in + the ``include_file`` (after inclusion). + + :param include_file: path of include file, either absolute path or relative + to current directory or relative to templates directory + (e.g. 'templates/drivers/simple_tmpl.c') + + See :ref:`codegen_templates` for the templates in the Codegen templates + folders. + +.. function:: codegen.guard_include() + + Prevent the current file to be included by ``codegen.out_include()`` + when called the next time. + +Configuration property access +----------------------------- + +.. function:: codegen.config_property(property_name [, default="<unset>"]) + + Get the value of a configuration property from :file:`autoconf.h`. If + ``property_name`` is not given in :file:`autoconf.h` the default value is + returned. + +CMake variable access +--------------------- + +.. function:: codegen.cmake_variable(variable_name [, default="<unset>"]) + + Get the value of a CMake variable. If variable_name is not provided to + Codegen by CMake the default value is returned. The following variables + are provided to Codegen: + + - "PROJECT_NAME" + - "PROJECT_SOURCE_DIR" + - "PROJECT_BINARY_DIR" + - "CMAKE_SOURCE_DIR" + - "CMAKE_BINARY_DIR" + - "CMAKE_CURRENT_SOURCE_DIR" + - "CMAKE_CURRENT_BINARY_DIR" + - "CMAKE_CURRENT_LIST_DIR" + - "CMAKE_FILES_DIRECTORY" + - "CMAKE_PROJECT_NAME" + - "CMAKE_SYSTEM" + - "CMAKE_SYSTEM_NAME" + - "CMAKE_SYSTEM_VERSION" + - "CMAKE_SYSTEM_PROCESSOR" + - "CMAKE_C_COMPILER" + - "CMAKE_CXX_COMPILER" + - "CMAKE_COMPILER_IS_GNUCC" + - "CMAKE_COMPILER_IS_GNUCXX" + - "GENERATED_DTS_BOARD_H" + - "GENERATED_DTS_BOARD_CONF" + +.. function:: codegen.cmake_cache_variable(variable_name [, default="<unset>"]) + + Get the value of a CMake variable from CMakeCache.txt. If variable_name + is not given in CMakeCache.txt the default value is returned. + +Extended device tree database access +------------------------------------ + +.. function:: codegen.edts() + + Get the extended device tree database. + + :return: extended device tree database + +Guarding chunks of source code +------------------------------ + +.. function:: codegen.outl_guard_config(property_name) + + Write a guard (#if [guard]) C preprocessor directive to output. + + If there is a configuration property of the given name the property value + is used as guard value, otherwise it is set to 0. + + :param property_name: Name of the configuration property. + +.. function:: codegen.outl_unguard_config(property_name) + + Write an unguard (#endif) C preprocessor directive to output. + + This is the closing command for codegen.outl_guard_config(). + + :param property_name: Name of the configuration property. + +Error handling +-------------- + +.. function:: codegen.error(msg='Error raised by codegen.' [, frame_index=0] [, snippet_lineno=0]) + + Raise a codegen.Error exception. + + Instead of raising standard python errors, codegen generators can use + this function. Extra information is added that maps the python snippet + line seen by the Python interpreter to the line of the file that inlines + the python snippet. + + :param msg: Exception message. + :param frame_index: Call frame index. The call frame offset of the function + calling codegen.error(). Zero if directly called in a + snippet. Add one for every level of function call. + :param snippet_lineno: Line number within snippet. + +Logging +------- + +.. function:: codegen.log(message [, message_type=None] [, end="\n"] [, logonly=True]) + +.. function:: codegen.msg(msg) + + Prints msg to stdout with a “Message: ” prefix. + +.. function:: codegen.prout(s [, end="\n"]) + +.. function:: codegen.prerr(s [, end="\n"]) diff --git a/doc/subsystems/codegen/index.rst b/doc/subsystems/codegen/index.rst new file mode 100644 index 000000000000..7432af384c4c --- /dev/null +++ b/doc/subsystems/codegen/index.rst @@ -0,0 +1,27 @@ +.. + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen: + +Inline Code Generation +###################### + +For some repetitive or parameterized coding tasks, it's convenient to +use a code generating tool to build C code fragments, instead of writing +(or editing) that source code by hand. Such a tool can also access CMake build +parameters and device tree information to generate source code automatically +tailored and tuned to a specific project configuration. + +The Zephyr project supports a code generating tool that processes embedded +Python "snippets" inlined in your source files. It can be used, for example, +to generate source code that creates and fills data structures, adapts +programming logic, creates configuration-specific code fragments, and more. + +.. toctree:: + :maxdepth: 1 + + codegen + functions + build + principle diff --git a/doc/subsystems/codegen/principle.rst b/doc/subsystems/codegen/principle.rst new file mode 100644 index 000000000000..4fa4a0b3d270 --- /dev/null +++ b/doc/subsystems/codegen/principle.rst @@ -0,0 +1,48 @@ +.. + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_principle: + +Code Generation Principle +######################### + +How code generation works in Zephyr. + +.. contents:: + :depth: 2 + :local: + :backlinks: top + +Principle +--------- + +.. image:: codegen_principle.png + :width: 500px + :align: center + :alt: Principle + +Inclusion of other inline code +------------------------------ + +.. image:: codegen_principle_include.png + :width: 500px + :align: center + :alt: Include other inline code + +Access to Zephyr data +--------------------- + +.. image:: codegen_principle_access.png + :width: 500px + :align: center + :alt: Access Zephyr data + +Import of Python modules +------------------------ + +.. image:: codegen_principle_import.png + :width: 500px + :align: center + :alt: Import Python modules + diff --git a/doc/subsystems/subsystems.rst b/doc/subsystems/subsystems.rst index 372fdeec9839..337a6ed17b5e 100644 --- a/doc/subsystems/subsystems.rst +++ b/doc/subsystems/subsystems.rst @@ -11,6 +11,7 @@ to applications. bluetooth/bluetooth.rst c_library + codegen/index dfu logging/index tracing/index From a94415b73ae28c6899883233512877707dc4e34a Mon Sep 17 00:00:00 2001 From: Bobby Noelte <b0661n0e17e@gmail.com> Date: Fri, 1 Jun 2018 07:56:23 +0200 Subject: [PATCH 19/20] scripts: codegen: add generic module modules/devicedeclare.py: Device declaration functions. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> --- cmake/extensions.cmake | 2 + scripts/codegen/modules/__init__.py | 1 + scripts/codegen/modules/devicedeclare.py | 389 +++++++++++++++++++++++ 3 files changed, 392 insertions(+) create mode 100644 scripts/codegen/modules/__init__.py create mode 100644 scripts/codegen/modules/devicedeclare.py diff --git a/cmake/extensions.cmake b/cmake/extensions.cmake index 763ec91ce00f..8346c9e8f968 100644 --- a/cmake/extensions.cmake +++ b/cmake/extensions.cmake @@ -384,6 +384,8 @@ function(target_sources_codegen # Get all the files that make up codegen for dependency file(GLOB CODEGEN_SOURCES ${ZEPHYR_BASE}/scripts/dts/edtsdatabase.py + ${ZEPHYR_BASE}/scripts/codegen/modules/*.py + ${ZEPHYR_BASE}/scripts/codegen/templates/drivers/*.py ${ZEPHYR_BASE}/scripts/codegen/*.py ${ZEPHYR_BASE}/scripts/gen_code.py) diff --git a/scripts/codegen/modules/__init__.py b/scripts/codegen/modules/__init__.py new file mode 100644 index 000000000000..270dcebaa5f4 --- /dev/null +++ b/scripts/codegen/modules/__init__.py @@ -0,0 +1 @@ +from .modules import * diff --git a/scripts/codegen/modules/devicedeclare.py b/scripts/codegen/modules/devicedeclare.py new file mode 100644 index 000000000000..35563f02ff49 --- /dev/null +++ b/scripts/codegen/modules/devicedeclare.py @@ -0,0 +1,389 @@ +# Copyright (c) 2018 Linaro Limited +# Copyright (c) 2018 Bobby Noelte +# +# SPDX-License-Identifier: Apache-2.0 + +import pprint +import re +import codegen + +from string import Template + +_device_and_api_init_tmpl = \ + 'DEVICE_AND_API_INIT( \\\n' + \ + '\t${device-name}, \\\n' + \ + '\t"${driver-name}", \\\n' + \ + '\t${device-init}, \\\n' + \ + '\t&${device-data}, \\\n' + \ + '\t&${device-config-info}, \\\n' + \ + '\t${device-level}, \\\n' + \ + '\t${device-prio}, \\\n' + \ + '\t&${device-api});' + +## +# Aliases for EDTS property paths. +_property_path_aliases = [ + ('reg/0/address/0', 'reg/address'), + ('reg/0/size/0', 'reg/size'), +] + +## +# @brief Get device name +# +# Device name is generated from +# - device compatible +# - bus master address if the device is connected to a bus master +# - device address +# - parent device address if the device does not have a device address +def _device_name(device_id): + device_name = codegen.edts().device_property(device_id, 'compatible/0', None) + if device_name is None: + codegen.error("No compatible property for device id '{}'." + .format(device_id)) + + bus_master_device_id = codegen.edts().device_property(device_id, 'bus/master', None) + if bus_master_device_id is not None: + reg = codegen.edts().device_property(bus_master_device_id, 'reg') + try: + # use always the first key to get first address inserted into dict + # because reg_index may be number or name + # reg/<reg_index>/address/<address_index> : address + for reg_index in reg: + for address_index in reg[reg_index]['address']: + bus = reg[reg_index]['address'][address_index] + device_name += '_' + hex(bus)[2:].zfill(8) + break + break + except: + # this device is missing the register directive + codegen.error("No bus master register address property for device id '{}'." + .format(bus_master_device_id)) + + reg = codegen.edts().device_property(device_id, 'reg', None) + if reg is None: + # no reg property - take the reg property of the parent device + parent_device_id = codegen.edts().device_property( + device_id, 'parent-device', None) + if parent_device_id: + reg = codegen.edts().device_property(parent_device_id, 'reg', None) + device_address = None + if reg is not None: + try: + # use always the first key to get first address inserted into dict + # because reg_index may be number or name + # reg/<reg_index>/address/<address_index> : address + for reg_index in reg: + for address_index in reg[reg_index]['address']: + address = reg[reg_index]['address'][address_index] + device_address = hex(address)[2:].zfill(8) + break + break + except: + # this device is missing the register directive + pass + if device_address is None: + # use label instead of address + device_address = codegen.edts().device_property(device_id, 'label', + '<unknown>') + # Warn about missing reg property + codegen.log("No register address property for device id '{}'." + .format(device_id), "warning", "\n") + device_name += '_' + device_address + + device_name = device_name.replace("-", "_"). \ + replace(",", "_"). \ + replace(";", "_"). \ + replace("@", "_"). \ + replace("#", "_"). \ + replace("&", "_"). \ + replace("/", "_"). \ + lower() + return device_name + +class _DeviceLocalTemplate(Template): + # pattern is ${<property_path>} + # never starts with / + # extend default pattern by '-' '/' ',' + idpattern = r'[_a-z][_a-z0-9\-/,]*' + + +class _DeviceGlobalTemplate(Template): + # pattern is ${<device-id>:<property_path>} + # device ID is the same as node address + # always starts with / + # extend default pattern by '-', '@', '/', ':' + idpattern = r'/[_a-z0-9\-/,@:]*' + +## +# @brief Substitude values in device template +# +def _device_template_substitute(template, device_id, preset={}): + # substitute device local placeholders ${<property_path>}, config, ... + mapping = {} + # add preset mapping + mapping.update(preset) + # add device properties from device tree + mapping.update(codegen.edts().device_properties_flattened(device_id)) + # add specific device declaration vars/ constants + mapping['device-name'] = mapping.get('device-name', + _device_name(device_id)) + mapping['driver-name'] = mapping.get('driver-name', + codegen.edts().device_property(device_id, 'label').strip('"')) + mapping['device-data'] = mapping.get('device-data', + "{}_data".format(mapping['device-name']).lower()) + mapping['device-config-info'] = mapping.get('device-config-info', + "{}_config".format(mapping['device-name']).lower()) + mapping['device-config-irq'] = mapping.get('device-config-irq', + "{}_config_irq".format(mapping['device-name']).lower()) + substituted = _DeviceLocalTemplate(template).safe_substitute(mapping) + + # substitute device global placeholders ${<device-id>:<property_path>} + # + # we need a second substitude to allow for device indirections + # ${${<property_path for device id>}:<property_path>} + mapping = {} + for device_id in codegen.edts()['devices']: + path_prefix = device_id + ':' + mapping.update(codegen.edts().device_properties_flattened(device_id, + path_prefix)) + # add specific device declaration vars/ constants + try: + mapping[path_prefix + 'device-name'] = _device_name(device_id) + mapping[path_prefix + 'driver-name'] = \ + codegen.edts().device_property(device_id, 'label').strip('"') + except: + # will be obvious if any of this is needed, just skip here + pass + + # add aliases to mapping + aliases_mapping = {} + for property_path, property_value in mapping.items(): + for alias_property_path, alias in _property_path_aliases: + if property_path.endswith(alias_property_path): + property_path = property_path[:-len(alias_property_path)] \ + + alias + aliases_mapping[property_path] = property_value + mapping.update(aliases_mapping) + + substituted = _DeviceGlobalTemplate(substituted).safe_substitute(mapping) + + return substituted + + +# +# @return True if device is declared, False otherwise +def device_declare_single(device_config, + driver_name, + device_init, + device_level, + device_prio, + device_api, + device_info, + device_defaults = {}): + device_configured = codegen.config_property(device_config, '<not-set>') + if device_configured == '<not-set>' or device_configured[-1] == '0': + # Not configured - do not generate + # + # The generation decision must be taken by codegen here + # (vs. #define CONFIG_xxx) to cope with the following situation: + # + # If config is not set the device may also be not activated in the + # device tree. No device tree info is available in this case. + # An attempt to generate code without the DTS info + # will lead to an exception for a valid situation. + codegen.outl("/* !!! '{}' not configured !!! */".format(driver_name)) + return False + + device_id = codegen.edts().device_id_by_label(driver_name) + if device_id is None: + # this should not happen + raise codegen.Error("Did not find driver name '{}'.".format(driver_name)) + + # Presets for mapping this device data to template + preset = device_defaults + preset['device-init'] = device_init + preset['device-level'] = device_level + preset['device-prio'] = device_prio + preset['device-api'] = device_api + preset['device-config'] = device_config + preset['driver-name'] = driver_name.strip('"') + + # + # device info + if device_info: + device_info = _device_template_substitute(device_info, device_id, + preset) + codegen.outl(device_info) + # + # device init + codegen.outl(_device_template_substitute(_device_and_api_init_tmpl, + device_id, preset)) + return True + +## +# @param device_configs +# A list of configuration variables for device instantiation. +# (e.g. ['CONFIG_SPI_0', 'CONFIG_SPI_1']) +# @param driver_names +# A list of driver names for device instantiation. The list shall be ordered +# as the list of device configs. +# (e.g. ['SPI_0', 'SPI_1']) +# @param device_inits +# A list of device initialisation functions or a one single function. The +# list shall be ordered as the list of device configs. +# (e.g. 'spi_stm32_init') +# @param device_levels +# A list of driver initialisation levels or one single level definition. The +# list shall be ordered as the list of device configs. +# (e.g. 'PRE_KERNEL_1') +# @param device_prios +# A list of driver initialisation priorities or one single priority +# definition. The list shall be ordered as the list of device configs. +# (e.g. 32) +# @param device_api +# Identifier of the device api. +# (e.g. 'spi_stm32_driver_api') +# @param device_info +# Device info template for device driver config, data and interrupt +# initialisation. +# @param device_defaults +# Device default property values. `device_defaults` is a dictionary of +# property path : property value. +# +def device_declare_multi(device_configs, + driver_names, + device_inits, + device_levels, + device_prios, + device_api, + device_info, + device_defaults = {}): + devices_declared = [] + for i, device_config in enumerate(device_configs): + driver_name = driver_names[i] + if isinstance(device_inits, str): + device_init = device_inits + else: + try: + device_init = device_inits[i] + except: + device_init = device_inits + if isinstance(device_levels, str): + device_level = device_levels + else: + try: + device_level = device_levels[i] + except: + device_level = device_levels + if isinstance(device_prios, str): + device_prio = device_prios + else: + try: + device_prio = device_prios[i] + except: + device_prio = device_prios + + device_declared = device_declare_single(device_config, + driver_name, + device_init, + device_level, + device_prio, + device_api, + device_info, + device_defaults) + devices_declared.append(str(device_declared)) + + if 'True' not in devices_declared: + err = "No active device found for {} = {} and {}.".format( + ', '.join(device_configs), ', '.join(devices_declared), + ', '.join(driver_names)) + codegen.log(err) + raise codegen.Error(err) + + +def _device_generate_struct(type_of_struct, _struct): + if _struct is None and type_of_struct == 'config': + return 'static const int ${device-config-info}[] = {};\n' + elif _struct is None and type_of_struct == 'data': + return 'static int ${device-data}[] = {};\n' + + struct = "" + # convert _struct into a list. Struct might have only one element + if type(_struct) is str: + _struct = [_struct] + else: + _struct = list(_struct) + + if type_of_struct == 'config': + struct += 'static const struct {} ${{device-config-info}} = {{\n'.format(_struct[0]) + elif type_of_struct == 'data': + struct += 'static struct {} ${{device-data}} = {{\n'.format(_struct[0]) + else: + msg("Not expected") + + if len(_struct) > 1: + struct += _struct[1] + + struct += '};\n\n' + return struct + + +def _device_generate_irq_bootstrap(irq_names, irq_flag, irq_func): + irq_bootstrap_info = \ + '#ifdef {}\n'.format(irq_flag) + \ + 'DEVICE_DECLARE(${device-name});\n' + \ + 'static void ${device-config-irq}(struct device *dev)\n' + \ + '{\n' + for irq_name in irq_names: + irq_num = '${{interrupts/{}/irq}}'.format(irq_name) + irq_prio = '${{interrupts/{}/priority}}'.format(irq_name) + irq_bootstrap_info += \ + '\tIRQ_CONNECT({},\n'.format(irq_num) + \ + '\t\t{},\n'.format(irq_prio) + if len(irq_names) == 1 and irq_name == '0': + # Only one irq and no name associated. Keep it simple name + irq_bootstrap_info += '\t\t{},\n'.format(irq_func) + else: + irq_bootstrap_info += '\t\t{}_{},\n'.format(irq_func, irq_name) + irq_bootstrap_info += \ + '\t\tDEVICE_GET(${device-name}),\n' + \ + '\t\t0);\n' + \ + '\tirq_enable({});\n\n'.format(irq_num) + irq_bootstrap_info += \ + '}\n' + \ + '#endif /* {} */\n\n'.format(irq_flag) + return irq_bootstrap_info + + +def device_declare(compatibles, init_prio_flag, kernel_level, irq_func, + init_func, api, data_struct, config_struct): + + config_struct = _device_generate_struct('config', config_struct) + data_struct = _device_generate_struct('data', data_struct) + if api is None: + api = "(*(const int *)0)" + + for device_id in codegen.edts().device_ids_by_compatible(compatibles): + driver_name = codegen.edts().device_property(device_id, 'label') + device_config = "CONFIG_{}".format(driver_name.strip('"')) + interrupts = codegen.edts().device_property( + device_id, 'interrupts', None) + if interrupts is not None: + irq_names = list(interrupts.keys()) + else: + irq_names = None + + device_info = "" + if irq_func is not None: + device_info += _device_generate_irq_bootstrap( + irq_names, irq_func['irq_flag'], irq_func['irq_func']) + device_info += config_struct + device_info += data_struct + + device_declare_single(device_config, + driver_name, + init_func, + kernel_level, + init_prio_flag, + api, + device_info) From 96e5ff5ca1ed46b33ad683243d106fa99776ed6c Mon Sep 17 00:00:00 2001 From: Bobby Noelte <b0661n0e17e@gmail.com> Date: Fri, 1 Jun 2018 18:44:03 +0200 Subject: [PATCH 20/20] doc: codegen: add modules and templates doc Document the modules that can be imported and the templates that can be included by inline code generation. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com> --- doc/subsystems/codegen/index.rst | 2 + doc/subsystems/codegen/modules.rst | 322 +++++++++++++++++++++++++++ doc/subsystems/codegen/templates.rst | 37 +++ 3 files changed, 361 insertions(+) create mode 100644 doc/subsystems/codegen/modules.rst create mode 100644 doc/subsystems/codegen/templates.rst diff --git a/doc/subsystems/codegen/index.rst b/doc/subsystems/codegen/index.rst index 7432af384c4c..129749e02530 100644 --- a/doc/subsystems/codegen/index.rst +++ b/doc/subsystems/codegen/index.rst @@ -23,5 +23,7 @@ programming logic, creates configuration-specific code fragments, and more. codegen functions + modules + templates build principle diff --git a/doc/subsystems/codegen/modules.rst b/doc/subsystems/codegen/modules.rst new file mode 100644 index 000000000000..3a53d5d8ad5e --- /dev/null +++ b/doc/subsystems/codegen/modules.rst @@ -0,0 +1,322 @@ +.. + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_modules: + +Code Generation Modules +####################### + +Code generation modules provide supporting functions for code generation. + +.. contents:: + :depth: 2 + :local: + :backlinks: top + +Modules have to be imported to gain access to the module's functions +and variables. + + :: + + /* This file uses modules. */ + ... + /** + * @code{.codegen} + * codegen.import_module('my_special_module') + * my_special_module.do_everything(): + * @endcode{.codegen} + */ + /** @code{.codeins}@endcode */ + ... + +Device declare module +********************* + +:: + + codegen.import_module('devicedeclare') + +The devicedeclare module provides functions to generate driver device +instantiations. + +Driver info templates +--------------------- + +The device declaration functions work on templates that feature placeholder +substitution. + +Device instance property placeholders: + +- ${device-name}: device instance name. + Name is generated by the declaration function. +- ${driver-name}: device instance driver name. + Name is taken from the device tree node property 'label'. +- ${device-data}: device instance data structure name. + Name is generated by the declaration function. +- ${device-config-info}: device instance configuration structure name. + Name is generated by the declaration function. +- ${device-config-irq}: device instance interrupt configuration function name. + Name is generated by the declaration function. + +Device instance device tree property placeholders: + +* ${[path to DTS property]}: device instance device tree node property. + The property path supports every node property that is documented in the + node yaml bindings. It also supports yaml heuristics, like 'bus-master' and + will use documented '"#cells"'. + +Device tree property placeholders: + +- ${[device id]:[path to DTS property]}: device node property value. + The device node property is defined by the property path of the device + given by the device id. + The device id is usually also taken from a DTS property e.g. + ${${clocks/0/provider}:device-name}. + +KConfig configuration parameter placeholders: + +- ${CONFIG_[configuration parameter]}: KConfig configuration parameter value. + +Declaration of device instances +------------------------------- + +.. function:: devicedeclare.device_declare(compatibles, init_prio_flag, kernel_level, irq_func, init_func, api, data_struct, config_struct) + + Generate device instances code for all devices activated ('status' = 'ok') + in the board device tree file matching the provided compatibles. + + Most of the parameters aim at filling the DEVICE_AND_API_INIT macro. + Other parameters are there to help code generation to fit driver specifics. + + Instance code will only be generated if the Kconfig variable is set. The + variable name is build with the device node label name (e.g: CONFIG_I2C_1). + + :param compatibles: List of compatibles supported by the driver + (e.g. ['st,stm32-spi-fifo', 'st,stm32-spi']) + :param init_prio_flag: Flag for driver activation priority + (e.g. CONFIG_KERNEL_INIT_PRIORITY_DEVICE) + :param kernel_level: Flag for driver activation priority (e.g. POST_KERNEL) + :param irq_func: Two elements python dict providing driver isr function + prefix (e.g. 'irq_func' \: 'stm32_i2c_isr') and flag to be + used for driver IRQ code control + (e.g. 'irq_flag' \: 'CONFIG_I2C_STM32_INTERRUPT'). + If irq_func is 'None', no IRQ code is generated. + 'device_declare' will generate as much IRQ code as + declared by device node. + If the 'interrupts-names' property is provided in the node, + isr names will be generated using matching values as + function postfixes. + :param init_func: Name of the driver init function (e.g. 'i2c_stm32_init'). + :param api: Name of the driver api structure (e.g. 'api_funcs'). + :param data_struct: Two elements python list providing elements for driver + '_data' structure generation. + :param config_struct: Two elements python list providing elements for driver + '_config' structure generation. + +'data_struct' and 'config_struct' will be processed the same way: + +* First element (e.g. 'i2c_stm32_config') should be the structure name. +* Second element is a 'c' template code between triple double quotes (""" """). + It should provide the expected code to be generated for the structure. + For instance: + +.. code-block:: python + + """ + .i2c = (I2C_TypeDef *)${reg/0/address/0}, + .pclken = { + .enr = ${clocks/0/bits}, + .bus = ${clocks/0/bus}, + }, + #ifdef CONFIG_I2C_STM32_INTERRUPT + .irq_config_func = st_stm32_i2c_v1_${node_index}_config_irq, + #endif + .bitrate = ${clock-frequency}, + """ + +If the second element of 'data_struct' or 'config_struct' list is not provided, +an empty structure is generated. + +Finally, for the above depicted example, 'device_declare' will generate, +for device instance 'I2C1': + +.. code-block:: c + + #ifdef CONFIG_I2C_STM32_INTERRUPT + DEVICE_DECLARE(st_stm32_i2c_v1_i2c_1); + static void st_stm32_i2c_v1_i2c_1_config_irq(struct device *dev) + { + IRQ_CONNECT(31, + 0, + stm32_i2c_isr_event, + DEVICE_GET(st_stm32_i2c_v1_i2c_1), + 0); + irq_enable(31); + IRQ_CONNECT(32, + 0, + stm32_i2c_isr_error, + DEVICE_GET(st_stm32_i2c_v1_i2c_1), + 0); + irq_enable(32); + } + #endif /* CONFIG_I2C_STM32_INTERRUPT */ + + static const struct i2c_stm32_config st_stm32_i2c_v1_i2c_1_config = { + .i2c = (I2C_TypeDef *)0x40005400, + .pclken = { + .enr = 131072, + .bus = 2, + }, + #ifdef CONFIG_I2C_STM32_INTERRUPT + .irq_config_func = st_stm32_i2c_v1_i2c_1_config_irq, + #endif + .bitrate = 400000, + }; + + static struct i2c_stm32_data st_stm32_i2c_v1_i2c_1_data = {}; + + DEVICE_AND_API_INIT(st_stm32_i2c_v1_i2c_1, + "I2C_1", + i2c_stm32_init, + &st_stm32_i2c_v1_i2c_1_data, + &st_stm32_i2c_v1_i2c_1_config, + POST_KERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE, + &api_funcs); + +Raw declaration of a single device instance +------------------------------------------- + +.. function:: devicedeclare.device_declare_single(device_config, driver_name, device_init, device_levels device_prio, device_api, device_info) + + Generate device instances code for a device instance that: + + - matches the driver name and that + - is activated ('status' = 'ok') in the board device tree file and that is + - configured by Kconfig. + + The ``device_declare_single`` function enables a detailed control of the + device info definition. It's primary use is for complex device instance + initialisation that can not be accomplished by ``device_declare``. + + :param device_config: + Configuration variables for device instantiation. + (e.g. 'CONFIG_SPI_0') + :param driver_name: + Driver name for device instantiation. + (e.g. 'SPI_0') + :param device_init: + Device initialisation function. + (e.g. 'spi_stm32_init') + :param device_level: + Driver initialisation level. + (e.g. 'PRE_KERNEL_1') + :param device_prios: + Driver initialisation priority definition. + (e.g. 32) + :param device_api: + Identifier of the device api. + (e.g. 'spi_stm32_driver_api') + :param device_info: + Device info template for device driver config, data and interrupt + initialisation. + :param device_defaults: + Default property values. + (e.g. { 'label' : 'My default label' }) + +Raw declaration of multiple device instances +-------------------------------------------- + +.. function:: devicedeclare.device_declare_multi(device_configs, driver_names, device_inits, device_levels, device_prios, device_api, device_info) + + Generate device instances code for all device instances that: + + - match the driver names and that + - are activated ('status' = 'ok') in the board device tree file and that are + - configured by Kconfig. + + The ``device_declare_multi`` function enables a detailed control of the + device info definition. It's primary use is for complex device instance + initialisation that can not be accomplished by ``device_declare``. + + :param device_configs: + A list of configuration variables for device instantiation. + (e.g. ['CONFIG_SPI_0', 'CONFIG_SPI_1']) + :param driver_names: + A list of driver names for device instantiation. The list shall be + ordered the same way as the list of device configs. + (e.g. ['SPI_0', 'SPI_1']) + :param device_inits: + A list of device initialisation functions or a one single function. + The list shall be ordered as the list of device configs. + (e.g. 'spi_stm32_init') + :param device_levels: + A list of driver initialisation levels or one single level definition. + The list shall be ordered as the list of device configs. + (e.g. 'PRE_KERNEL_1') + :param device_prios: + A list of driver initialisation priorities or one single priority + definition. The list shall be ordered as the list of device configs. + (e.g. 32) + :param device_api: + Identifier of the device api. + (e.g. 'spi_stm32_driver_api') + :param device_info: + Device info template for device driver config, data and interrupt + initialisation. + :param device_defaults: + Default property values. + (e.g. { 'label' : 'My default label' }) + +Example: + +.. code-block:: C + + /** + * @code{.codegen} + * codegen.import_module('devicedeclare') + * + * device_configs = ['CONFIG_SPI_{}'.format(x) for x in range(1, 4)] + * driver_names = ['SPI_{}'.format(x) for x in range(1, 4)] + * device_inits = 'spi_stm32_init' + * device_levels = 'POST_KERNEL' + * device_prios = 'CONFIG_SPI_INIT_PRIORITY' + * device_api = 'spi_stm32_driver_api' + * device_info = \ + * """ + * #if CONFIG_SPI_STM32_INTERRUPT + * DEVICE_DECLARE(${device-name}); + * static void ${device-config-irq}(struct device *dev) + * { + * IRQ_CONNECT(${interrupts/0/irq}, ${interrupts/0/priority}, \\ + * spi_stm32_isr, \\ + * DEVICE_GET(${device-name}), 0); + * irq_enable(${interrupts/0/irq}); + * } + * #endif + * static const struct spi_stm32_config ${device-config-info} = { + * .spi = (SPI_TypeDef *)${reg/0/address/0}, + * .pclken.bus = ${clocks/0/bus}, + * .pclken.enr = ${clocks/0/bits}, + * #if CONFIG_SPI_STM32_INTERRUPT + * .config_irq = ${device-config-irq}, + * #endif + * }; + * static struct spi_stm32_data ${device-data} = { + * SPI_CONTEXT_INIT_LOCK(${device-data}, ctx), + * SPI_CONTEXT_INIT_SYNC(${device-data}, ctx), + * }; + * """ + * + * devicedeclare.device_declare_multi( \ + * device_configs, + * driver_names, + * device_inits, + * device_levels, + * device_prios, + * device_api, + * device_info) + * @endcode{.codegen} + */ + /** @code{.codeins}@endcode */ diff --git a/doc/subsystems/codegen/templates.rst b/doc/subsystems/codegen/templates.rst new file mode 100644 index 000000000000..da9f3a5ad12b --- /dev/null +++ b/doc/subsystems/codegen/templates.rst @@ -0,0 +1,37 @@ +.. + Copyright (c) 2018 Bobby Noelte + SPDX-License-Identifier: Apache-2.0 + +.. _codegen_templates: + +Code Generation Templates +######################### + +Code generation templates provide sopisticated code generation functions. + +.. contents:: + :depth: 2 + :local: + :backlinks: top + +Templates have to be included to gain access to the template's functions +and variables. + + :: + + /* This file uses templates. */ + ... + /** + * @code{.codegen} + * template_in_var = 1 + * codegen.out_include('templates/template_tmpl.c') + * if template_out_var not None: + * codegen.outl("int x = %s;" % template_out_var) + * @endcode{.codegen} + */ + /** @code{.codeins}@endcode */ + ... + + + +