diff --git a/.gitattributes b/.gitattributes index 1b488e8a11c..75cc9cc2181 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16,14 +16,14 @@ # will never be auto-merged into from main. If the file doesn't exist here, then # any upstream changes will override ours. .gitattributes merge=ours -.github/ISSUE_TEMPLATE/001_bug_report.md -.github/ISSUE_TEMPLATE/002_enhancement.md -.github/ISSUE_TEMPLATE/003_rfc-proposal.md -.github/ISSUE_TEMPLATE/004_feature_request.md -.github/ISSUE_TEMPLATE/005_hardware_support.md -.github/ISSUE_TEMPLATE/006_nomination.md -.github/ISSUE_TEMPLATE/007_ext-source.md -.github/ISSUE_TEMPLATE/008_bin-blobs.md +.github/ISSUE_TEMPLATE/001_bug_report.md merge=ours +.github/ISSUE_TEMPLATE/002_enhancement.md merge=ours +.github/ISSUE_TEMPLATE/003_rfc-proposal.md merge=ours +.github/ISSUE_TEMPLATE/004_feature_request.md merge=ours +.github/ISSUE_TEMPLATE/005_hardware_support.md merge=ours +.github/ISSUE_TEMPLATE/006_nomination.md merge=ours +.github/ISSUE_TEMPLATE/007_ext-source.md merge=ours +.github/ISSUE_TEMPLATE/008_bin-blobs.md merge=ours .github/workflows/assigner.yml merge=ours .github/workflows/backport.yml merge=ours .github/workflows/backport_issue_check.yml merge=ours diff --git a/.github/workflows/twister.yaml b/.github/workflows/twister.yaml index 0ef09373bf6..4b414a7c9b4 100644 --- a/.github/workflows/twister.yaml +++ b/.github/workflows/twister.yaml @@ -1,7 +1,6 @@ name: Run tests with twister on: - workflow_call: push: branches: - main diff --git a/boards/arm/efm32pg_stk3402a/Kconfig.defconfig b/boards/arm/efm32pg_stk3402a/Kconfig.defconfig index cba97cddefd..5f298e584c3 100644 --- a/boards/arm/efm32pg_stk3402a/Kconfig.defconfig +++ b/boards/arm/efm32pg_stk3402a/Kconfig.defconfig @@ -2,8 +2,6 @@ # Copyright (c) 2018, Christian Taedcke # Copyright (c) 2019 Lemonbeat GmbH -# Copyright (c) 2022 T-Mobile USA, Inc. - # SPDX-License-Identifier: Apache-2.0 if BOARD_EFM32PG_STK3402A || BOARD_EFM32PG_STK3402A_JG @@ -18,9 +16,4 @@ config CMU_HFXO_FREQ config CMU_LFXO_FREQ default 32768 -config COUNTER_GECKO_RTCC - bool - default y - depends on COUNTER - endif # BOARD_EFM32PG_STK3402A || BOARD_EFM32PG_STK3402A_JG diff --git a/boards/arm/efm32pg_stk3402a/doc/index.rst b/boards/arm/efm32pg_stk3402a/doc/index.rst index 6344bb6fb30..ca7ffe8471e 100644 --- a/boards/arm/efm32pg_stk3402a/doc/index.rst +++ b/boards/arm/efm32pg_stk3402a/doc/index.rst @@ -6,9 +6,9 @@ EFM32 Pearl Gecko Starter Kit Overview ******** -The EFM32 Pearl Gecko Starter Kit EFM32PG-STK3402A contains an MCU from -the EFM32PG family built on an ARM® Cortex®-M4F processor with excellent -low power capabilities. +The EFM32 Pearl Gecko Starter Kit EFM32PG-STK3402A contains an MCU from the +EFM32PG family built on an ARM® Cortex®-M4F processor with excellent low +power capabilities. .. figure:: efm32pg_stk3402a.jpg :align: center @@ -19,8 +19,8 @@ low power capabilities. Hardware ******** -- Advanced Energy Monitoring provides real-time information about the - energy consumption of an application or prototype design. +- Advanced Energy Monitoring provides real-time information about the energy + consumption of an application or prototype design. - Ultra low power 128x128 pixel Memory-LCD - 2 user buttons, 2 LEDs and a touch slider - Humidity, temperature, and inductive-capacitive metal sensor @@ -38,8 +38,7 @@ For more information about the EFM32PG SoC and EFM32PG-STK3402A board: Supported Features ================== -The efm32pg_stk3402a board configuration supports the following -hardware features: +The efm32pg_stk3402a board configuration supports the following hardware features: +-----------+------------+-------------------------------------+ | Interface | Controller | Driver/Component | @@ -70,8 +69,8 @@ The default configuration can be found in the defconfig file: ``boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig`` -The default configuration when building for this EFM32JG12B SoC can be -found in another defconfig file: +The default configuration when building for this EFM32JG12B SoC can be found in +another defconfig file: ``boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig_jg`` @@ -80,64 +79,60 @@ Other hardware features are currently not supported by the port. EFM32 Jade Gecko SoC -------------------- -The EFM32 Pearl Gecko Starter Kit EFM32PG-STK3402A can also be used to -evaluate the EFM32 Jade Gecko SoC (EFM32JG12B). The only difference -between the Pearl Gecko and the Jade Gecko is their core. The Pearl -Gecko contains an ARM® Cortex®-M4F core, and the Jade Gecko an ARM® -Cortex®-M3 core. Other features such as memory and peripherals are the -same. +The EFM32 Pearl Gecko Starter Kit EFM32PG-STK3402A can also be used to evaluate +the EFM32 Jade Gecko SoC (EFM32JG12B). The only difference between the Pearl +Gecko and the Jade Gecko is their core. The Pearl Gecko contains an ARM® +Cortex®-M4F core, and the Jade Gecko an ARM® Cortex®-M3 core. Other features +such as memory and peripherals are the same. -Code that is built for the Jade Gecko also runs on an equivalent Pearl -Gecko. +Code that is built for the Jade Gecko also runs on an equivalent Pearl Gecko. -To build firmware for the Jade Gecko and run it on the EFM32 Pearl Gecko -Starter Kit, use the board ``efm32pg_stk3402a_jg`` instead of -``efm32pg_stk3402a``. +To build firmware for the Jade Gecko and run it on the EFM32 Pearl Gecko Starter +Kit, use the board ``efm32pg_stk3402a_jg`` instead of ``efm32pg_stk3402a``. Connections and IOs =================== -The EFM32PG12 SoC has twelve GPIO controllers (PORTA to PORTL), but only -four are currently enabled (PORTA, PORTB, PORTD and PORTF) for the -EFM32PG-STK3402A board. - -In the following table, the column **Name** contains pin names. For -example, PE2 means pin number 2 on PORTE, as used in the board's -datasheets and manuals. - -+-------+-----+-------------+-------------------------------------+ -| Name | LOC | Function | Usage | -+=======+=====+=============+=====================================+ -| PF4 | | GPIO | LED0 | -+-------+-----+-------------+-------------------------------------+ -| PF5 | | GPIO | LED1 | -+-------+-----+-------------+-------------------------------------+ -| PF6 | | GPIO | Push Button PB0 | -+-------+-----+-------------+-------------------------------------+ -| PF7 | | GPIO | Push Button PB1 | -+-------+-----+-------------+-------------------------------------+ -| PA5 | | GPIO | Board Controller Enable | -| | | | EFM_BC_EN / VCOM_ENABLE | -+-------+-----+-------------+-------------------------------------+ -| PA0 | 0 | UART_TX | UART TX Console VCOM_TX US0_TX | -+-------+-----+-------------+-------------------------------------+ -| PA1 | 0 | UART_RX | UART RX Console VCOM_RX US0_RX | -+-------+-----+-------------+-------------------------------------+ -| PD10 | 18 | UART_TX | EXP12_UART_TX LEU0_TX | -+-------+-----+-------------+-------------------------------------+ -| PD11 | 18 | UART_RX | EXP14_UART_RX LEU0_RX | -+-------+-----+-------------+-------------------------------------+ -| PC10 | 15 | I2C_SDA | ENV_I2C_SDA I2C0_SDA | -+-------+-----+-------------+-------------------------------------+ -| PC11 | 15 | I2C_SCL | ENV_I2C_SCL I2C0_SCL | -+-------+-----+-------------+-------------------------------------+ +The EFM32PG12 SoC has twelve GPIO controllers (PORTA to PORTL), but only four +are currently enabled (PORTA, PORTB, PORTD and PORTF) for the EFM32PG-STK3402A +board. + +In the following table, the column **Name** contains pin names. For example, PE2 +means pin number 2 on PORTE, as used in the board's datasheets and manuals. + ++-------+-------------+-------------------------------------+ +| Name | Function | Usage | ++=======+=============+=====================================+ +| PF4 | GPIO | LED0 | ++-------+-------------+-------------------------------------+ +| PF5 | GPIO | LED1 | ++-------+-------------+-------------------------------------+ +| PF6 | GPIO | Push Button PB0 | ++-------+-------------+-------------------------------------+ +| PF7 | GPIO | Push Button PB1 | ++-------+-------------+-------------------------------------+ +| PA5 | GPIO | Board Controller Enable | +| | | EFM_BC_EN | ++-------+-------------+-------------------------------------+ +| PA0 | UART_TX | UART TX Console VCOM_TX US0_TX #0 | ++-------+-------------+-------------------------------------+ +| PA1 | UART_RX | UART RX Console VCOM_RX US0_RX #0 | ++-------+-------------+-------------------------------------+ +| PD10 | UART_TX | EXP12_UART_TX LEU0_TX #18 | ++-------+-------------+-------------------------------------+ +| PD11 | UART_RX | EXP14_UART_RX LEU0_RX #18 | ++-------+-------------+-------------------------------------+ +| PC10 | I2C_SDA | ENV_I2C_SDA I2C0_SDA #15 | ++-------+-------------+-------------------------------------+ +| PC11 | I2C_SCL | ENV_I2C_SCL I2C0_SCL #15 | ++-------+-------------+-------------------------------------+ System Clock ============ -The EFM32PG SoC is configured to use the 40 MHz external oscillator on -the board. +The EFM32PG SoC is configured to use the 40 MHz external oscillator on the +board. Serial Port =========== @@ -148,27 +143,25 @@ Programming and Debugging ************************* .. note:: - Before using the kit the first time, you should update the J-Link - firmware from `J-Link-Downloads`_ + Before using the kit the first time, you should update the J-Link firmware + from `J-Link-Downloads`_ Flashing ======== -The EFM32PG-STK3402A includes an `J-Link`_ serial and -debug adaptor built into the board. The adaptor provides: +The EFM32PG-STK3402A includes an `J-Link`_ serial and debug adaptor built into the +board. The adaptor provides: -- A USB connection to the host computer, which exposes a mass storage - device and a USB serial port. -- A serial flash device, which implements the USB flash disk file - storage. -- A physical UART connection which is relayed over interface USB serial - port. +- A USB connection to the host computer, which exposes a mass storage device and a + USB serial port. +- A serial flash device, which implements the USB flash disk file storage. +- A physical UART connection which is relayed over interface USB serial port. Flashing an application to EFM32PG-STK3402A ------------------------------------------- -The sample application :ref:`hello_world` is used for this example. Build the -Zephyr kernel and application: +The sample application :ref:`hello_world` is used for this example. +Build the Zephyr kernel and application: .. zephyr-app-commands:: :zephyr-app: samples/hello_world @@ -179,97 +172,23 @@ Connect the EFM32PG-STK3402A to your host computer using the USB port and you should see a USB connection which exposes a mass storage device(STK3402A). Copy the generated zephyr.bin to the STK3402A drive. -Use a USB-to-UART converter such as an FT232/CP2102 to connect to the -UART on the expansion header. +Use a USB-to-UART converter such as an FT232/CP2102 to connect to the UART on the +expansion header. -Open a serial terminal (minicom, putty, etc.) with the following -settings: +Open a serial terminal (minicom, putty, etc.) with the following settings: - Speed: 115200 - Data: 8 bits - Parity: None - Stop bits: 1 -Reset the board and you'll see the following message on the -corresponding serial port terminal session: +Reset the board and you'll see the following message on the corresponding serial port +terminal session: .. code-block:: console Hello World! arm -Twister Testing on EFM32PG-STK3402A -=================================== - -A very simple test on the GPIO functionality can be found at: - - ``tests/drivers/gpio/gpio_basic_api`` - -The Twister tests can be run from the boards folder as follows: - -.. code-block:: console - - ../../../../zephyr/scripts/twister --device-testing \ - --hardware-map efm32pg_stk3402a-map.yml \ - --load-tests efm32pg_stk3402a-testplan.json - -Documenting the EFM32PG-STK3402A -******************************** - -The Zephyr documentation is based upon -`reStructuredText `__, -and `Sphinx `__, which are text based tools -that have limited facilities for `WYSIWYG (pronounced wiz-ee-wig) what you see is what you get: -`__. - -However, there are work arounds that can help you convert from -various other tools to **rst** files. While this is not Pearl Gecko -specific, it is included here, along with the changes above, as a -convenience, until we push upstream. Then a more appropriate location -can be found. - -I have a preference for -`rich text editors `__\ ” -and a promoter of -`Literate Programming `__, -but I’m using Microsoft’s Word to edit this text. I started from the -original **rst** file and used `Pandoc `__ -to convert to **docx**. - -.. code-block:: console - - pandoc -f rst -t docx \ - "//wsl.localhost/Ubuntu-20.04//zephyrproject/zephyr/boards/arm/efm32pg_stk3402a/doc/index.rst" \ - -o gp_stk.docx** - -Note that your paths may vary but mine show the variability of the -systems that can be used. The **wsl** indicates that I’m using -`WSL2 `__ on -`WIN11 `__ to build the -`**html** `__ -documentation. That is the version where board documentation is -generated, rather than the -`**pdf** `__ -version. - -There may be a need to post the generated documentation internally, or -integrate some pages into something like -`Confluence `__, which we -do and why I chose this path. Word provides that path but you don't need -to save a **doc** version, rather than a **docx**. Simply create a page -and **Publish** it. Then hit the **…** to the right of the Edit button and -choose **Import Word Document**. There will likely be some minor edits you -need to make, but the content should be close. - -If you already have a **Confluence** page, then in that same **…** menu you -can use the **Export to Word** menu item. That will create a **doc** file -that Word can convert to a **docx** file before using **Pandoc** to convert -it to **rst** format by reversing the names used above. Again, you will need -to make edits to comply with the Zephyr specific macros, but the content -(other than images) should mostly be there. If the **rst** file was constructed -by hand, then **Pandoc** may make other choices for line and column widths. -For small edits, doing it directly in the **rst** file is most efficient, but -if you have a lot of content, this method may be useful. - .. _EFM32PG-STK3402A Website: https://www.silabs.com/products/development-tools/mcu/32-bit/efm32-pearl-gecko-pg12-starter-kit diff --git a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a-pinctrl.dtsi b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a-pinctrl.dtsi deleted file mode 100644 index 3409dc40c94..00000000000 --- a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a-pinctrl.dtsi +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2022 Silicon Labs - * Copyright (c) 2023 T-Mobile USA, Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -&pinctrl { - /* configuration for usart0 device, default state - operating as UART */ - usart0_default: usart0_default { - group1 { - psels = , - , - , - ; - }; - }; - - /* configuration for leuart0 device */ - leuart0_default: leuart0_default { - group1 { - psels = , - , - , - ; - }; - }; -}; diff --git a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a.yaml b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a.yaml index 69035ca4455..707e1b02169 100644 --- a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a.yaml +++ b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a.yaml @@ -1,7 +1,3 @@ -# Copyright (c) 2022 T-Mobile USA, Inc. -# -# SPDX-License-Identifier: Apache-2.0 - identifier: efm32pg_stk3402a name: EFM32PG-STK3402A type: mcu @@ -17,7 +13,6 @@ supported: - gpio - nvs - watchdog - - counter testing: ignore_tags: - net diff --git a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_common.dtsi b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_common.dtsi index d32f49928fe..d862a0da5b7 100644 --- a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_common.dtsi +++ b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_common.dtsi @@ -1,13 +1,10 @@ /* * Copyright (c) 2017 Christian Taedcke * Copyright (c) 2019 Lemonbeat GmbH - * Copyright (c) 2023 T-Mobile USA, Inc. * * SPDX-License-Identifier: Apache-2.0 */ -#include "efm32pg_stk3402a-pinctrl.dtsi" - / { model = "Silicon Labs EFM32PG STK3402A board"; @@ -70,15 +67,15 @@ &usart0 { current-speed = <115200>; - pinctrl-0 = <&usart0_default>; - pinctrl-names = "default"; + location-rx = ; + location-tx = ; status = "okay"; }; &leuart0 { current-speed = <9600>; - pinctrl-0 = <&leuart0_default>; - pinctrl-names = "default"; + location-rx = ; + location-tx = ; status = "okay"; }; @@ -89,7 +86,7 @@ }; &rtcc0 { - prescaler = <32768>; + prescaler = <1>; status = "okay"; }; @@ -110,6 +107,12 @@ &gpioa { status = "okay"; + + board-controller-enable { + gpio-hog; + gpios = <5 GPIO_ACTIVE_HIGH>; + output-high; + }; }; &gpiob { diff --git a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig index 46a313627d5..d3805477749 100644 --- a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig +++ b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_defconfig @@ -1,18 +1,11 @@ -# Copyright (c) 2023 T-Mobile USA, Inc. -# # SPDX-License-Identifier: Apache-2.0 CONFIG_SOC_SERIES_EFM32PG12B=y CONFIG_BOARD_EFM32PG_STK3402A=y -CONFIG_PINCTRL=y CONFIG_ARM_MPU=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_SERIAL=y CONFIG_GPIO=y -CONFIG_COUNTER=y -CONFIG_POSIX_CLOCK=y CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=40000000 CONFIG_CMU_HFCLK_HFXO=y -CONFIG_PERSISTENT_GECKO_RTCC=y -CONFIG_NOTIFY=y diff --git a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_jg_defconfig b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_jg_defconfig index ba043b2abb8..36c92f45d2e 100644 --- a/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_jg_defconfig +++ b/boards/arm/efm32pg_stk3402a/efm32pg_stk3402a_jg_defconfig @@ -2,7 +2,6 @@ CONFIG_SOC_SERIES_EFM32JG12B=y CONFIG_BOARD_EFM32PG_STK3402A_JG=y -CONFIG_PINCTRL=y CONFIG_ARM_MPU=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y diff --git a/boards/arm/efm32pg_stk3402a/pre_dt_board.cmake b/boards/arm/efm32pg_stk3402a/pre_dt_board.cmake deleted file mode 100644 index beb76b85552..00000000000 --- a/boards/arm/efm32pg_stk3402a/pre_dt_board.cmake +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2021 Linaro Limited -# SPDX-License-Identifier: Apache-2.0 - -# SPI is implemented via usart so node name isn't spi@... -list(APPEND EXTRA_DTC_FLAGS "-Wno-spi_bus_bridge") diff --git a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a-pinctrl.dtsi b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a-pinctrl.dtsi deleted file mode 100644 index a876b4d6261..00000000000 --- a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a-pinctrl.dtsi +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2022 Silicon Labs - * Copyright (c) 2023 T-Mobile USA, Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -&pinctrl { - /* configuration for usart0 device, default state - operating as UART */ - usart0_default: usart0_default { - group1 { - psels = , - , - , - ; - }; - }; - - usart2_default: usart2_default { - group1 { - psels = , - , - , - , - , - ; - }; - }; - - /* configuration for leuart0 device */ - leuart0_default: leuart0_default { - group1 { - psels = , - , - , - ; - }; - }; -}; diff --git a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a.dts b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a.dts index ca1d15c4027..84723ba6cd5 100644 --- a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a.dts +++ b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a.dts @@ -6,7 +6,6 @@ /dts-v1/; #include -#include "efr32mg_sltb004a-pinctrl.dtsi" / { model = "Silabs EFR32MG SLTB004A board (aka Thunderboard Sense 2)"; @@ -72,22 +71,24 @@ &usart0 { current-speed = <115200>; - pinctrl-0 = <&usart0_default>; - pinctrl-names = "default"; + location-rx = ; + location-tx = ; status = "okay"; }; &usart2 { compatible = "silabs,gecko-spi-usart"; - cs-gpios = <&gpiok 1 GPIO_ACTIVE_LOW>; - pinctrl-0 = <&usart2_default>; - pinctrl-names = "default"; - status = "okay"; #address-cells = <1>; #size-cells = <0>; + location-rx = ; + location-tx = ; + location-clk = ; + cs-gpios = <&gpiok 1 GPIO_ACTIVE_LOW>; + + status = "okay"; mx25r80: mx25r8035f@0 { compatible = "jedec,spi-nor"; @@ -106,8 +107,8 @@ &leuart0 { current-speed = <9600>; - pinctrl-0 = <&leuart0_default>; - pinctrl-names = "default"; + location-rx = ; + location-tx = ; status = "okay"; }; diff --git a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig index cef2eb90c14..4182a0df8e4 100644 --- a/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig +++ b/boards/arm/efr32mg_sltb004a/efr32mg_sltb004a_defconfig @@ -3,7 +3,6 @@ CONFIG_ARM_MPU=y CONFIG_SOC_SERIES_EFR32MG12P=y CONFIG_BOARD_EFR32MG_SLTB004A=y -CONFIG_PINCTRL=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_SERIAL=y diff --git a/drivers/sensor/cxd5605/CMakeLists.txt b/drivers/sensor/cxd5605/CMakeLists.txt index 230e3cc5db5..156f73da994 100644 --- a/drivers/sensor/cxd5605/CMakeLists.txt +++ b/drivers/sensor/cxd5605/CMakeLists.txt @@ -3,3 +3,4 @@ zephyr_library() zephyr_library_sources(cxd5605.c) +zephyr_library_sources(cxd5605_lib_exports.c) diff --git a/drivers/sensor/cxd5605/Kconfig b/drivers/sensor/cxd5605/Kconfig index 91a46f7cdc7..28ada8e70c3 100644 --- a/drivers/sensor/cxd5605/Kconfig +++ b/drivers/sensor/cxd5605/Kconfig @@ -8,7 +8,7 @@ menuconfig CXD5605 bool "CXD5605R GNSS/GPS" depends on I2C - select CXD5605_LIB + imply CXD5605_LIB help Enable I2C based driver for the CXD5605 based GNSS/GPS @@ -20,4 +20,16 @@ config CXD5605_ALERT_INTERRUPTS This will set up interrupts to service the 1 pulse per second and allow the application to get a callback one time per second. +config CXD5605_INIT_SUSPENDED + bool "Allow the GNSS chip to come up in a suspended state" + help + This will initialize the CXD5605 into the sleep 2 state rather than + having it on. + +config CXD5605_OWN_THREAD + bool "Have the GNSS driver use its own thread" + help + If this option is selected, the CXD5605 driver will use its own thread, + otherwise it will use the kernel work queue. + endif # CXD5605 diff --git a/drivers/sensor/cxd5605/cxd5605.c b/drivers/sensor/cxd5605/cxd5605.c index 768e3bfcf91..c2b71b09693 100644 --- a/drivers/sensor/cxd5605/cxd5605.c +++ b/drivers/sensor/cxd5605/cxd5605.c @@ -34,7 +34,7 @@ #include "cxd5605.h" #include "cxd5605_lib.h" -extern char *strtok_r(char *str, const char *sep, char **state); +extern char *strtok_r(char *str, const char *sep, char **state); LOG_MODULE_REGISTER(CXD5605, CONFIG_SENSOR_LOG_LEVEL); @@ -43,97 +43,209 @@ LOG_MODULE_REGISTER(CXD5605, CONFIG_SENSOR_LOG_LEVEL); #define CXD5605_ADDRESS DT_N_S_soc_S_i2c_4000c400_S_sonycxd5605_24_REG_IDX_0_VAL_ADDRESS #define CXD5605_LLE_XFER_SIZE 2048 -#define MAXFIELDS 32 +#define MAXFIELDS 32 -#define COMMAND_STR_LENGTH 12 +#define COMMAND_STR_LENGTH 12 +#define NMEA_SENTENCE_ID_IDX 0 -struct cxd5605_config { - const struct i2c_dt_spec i2c_spec; - const struct gpio_dt_spec alert_gpio; - const struct gpio_dt_spec int_gpio; - const struct gpio_dt_spec pwr_gpio; - const struct gpio_dt_spec rst_gpio; - const struct gpio_dt_spec boot_rec_gpio; -}; - -struct drv_data { - struct gpio_callback gpio_cb; - gpio_flags_t mode; - int index; - int aux; -}; +K_SEM_DEFINE(cxd5605_data_sem, 0, 1); -static void driver_cxd5605_nmea_cb(struct gnss_global_data *pvt) -{ -#ifdef DEBUG - memcpy(&drv_data->pvt, pvt, sizeof(struct gnss_global_data)); - - printf("[Driver] %s:%d - gnss time: %d:%d:%d:%d\n", __func, __LINE__, - drv_data->pvt.time.gnss_hour, - drv_data->pvt.time.gnss_minute, - drv_data->pvt.time.gnss_second, - drv_data->pvt.time.gnss_nanosecond); - - printf("[Driver] %s:%d - position: lat %d, long %d, alt %d\n", - __func, __LINE__, - drv_data->pvt.position.latitude, - drv_data->pvt.position.longitude, - drv_data->pvt.position.altitude); - printf("[Driver] %s:%d - alt (MSL) %d\ntype %d, SIV %d, HAccuracy %d\n", - __func, __LINE__, - drv_data->pvt.position.altitude_MSL, - drv_data->pvt.position.fix_type, - drv_data->pvt.position.SIV, - drv_data->pvt.position.horizontal_accuracy); -#endif -} - -/** @brief response call back routine +/** @brief Local implementation of atof since atof and strod are not in + * minimal libc * - * This routine is called by the cxd5605 library when there is a response - * to a command. Right now there aren't many responses that need attention. - * We just have the version command that has a response to it. - * - * @param dev The pointer to the device structure for this driver - * @param the cxd5605_cmd_data struct for response - * @param the command we are working on - * @param and the ret value from that command - * - * @return nothing + * @param str Pointer to string representing float, [+/-][][.] * + * @return Converted double value */ -static void driver_cxd5605_resp_cb(struct cxd5605_data *drv_data, - struct cxd5605_cmd_data *cxd5605_cmd_data, - int cmd, int ret) +static double cxd_atod(const char *str) { -#ifdef DEBUG - printf("[driver] command %d err %d\n", cmd, ret); - printf("[driver] drv_data = 0x%0X", drv_data); -#endif + double ret = 0.0; + bool neg = false; - if (ret) { - return; + // remove leading space + while (isspace((int)*str)) str++; + + // get sign if present + if (*str && (*str == '-' || *str == '+')) { + if (*str == '-') { + neg = true; + } + str++; } - drv_data->got_data = true; - switch (cmd) { - /* All commands that returns data will be handled here */ - case CMD_VERSION: - memcpy(&drv_data->cxd5605_cmd_data.ver, - &cxd5605_cmd_data->ver, - sizeof(struct cxd5605_version)); -#ifdef DEBUG - printf("[driver] maj %d, minor %d patch %d\n", - drv_data->cxd5605_cmd_data.ver.major, - drv_data->cxd5605_cmd_data.ver.minor, - drv_data->cxd5605_cmd_data.ver.patch); -#endif - break; - default: - break; + // get decimal part + while (*str && isdigit((int)*str)) { + ret = ret * 10 + (*str - '0'); + str++; } + + // get fractional part + if (*str && *str == '.') { + double frac = 0.0; + double div = 1.0; + str++; + while (*str && isdigit((int)*str)) { + frac = frac * 10 + (*str - '0'); + str++; + div *= 10.0; + } + ret = ret + frac / div; + } + return neg ? (ret * -1.0) : ret; } +#define cxd_atoi(x) strtol(x, NULL, 10) + + +static void driver_cxd5605_nmea_cb(struct cxd5605_dev *cxd_dev, const char *nmea_sentence) +{ + struct cxd5605_data *drv_data = CONTAINER_OF(cxd_dev, struct cxd5605_data, cdev); + + /* Parse Raw NMEA Sentence*/ + LOG_DBG("%s", nmea_sentence); + + /* Count commas/fields */ + int field_count = 1; + const char *fields[32]; + + char *comma = strchr(nmea_sentence, ','); + fields[0] = nmea_sentence; + + while (comma && field_count < ARRAY_SIZE(fields)) { + fields[field_count] = comma + 1; + field_count++; + comma = strchr(comma + 1, ','); + } + + if (!strncmp("GGA", &fields[NMEA_SENTENCE_ID_IDX][3], 3)) { + if (field_count >= 11 && cxd_atoi(fields[GGA_QUALITY_INDICATOR_IDX]) == 1) { + uint32_t time = cxd_atod(fields[GGA_UTC_OF_POSITION_IDX]) * 100; + + drv_data->data.time.gnss_hour = (time / 1000000); + drv_data->data.time.gnss_minute = (time % 1000000) / 10000; + drv_data->data.time.gnss_second = (time % 10000) / 100; + drv_data->data.time.gnss_nanosecond = (time % 100) * 10000000; + drv_data->data.position.latitude = + cxd_atod(fields[GGA_LATITUDE_IDX]) * 100000; + if (fields[GGA_LATITUDE_DIR_IDX][0] == 'S') { + drv_data->data.position.latitude *= -1; + } + drv_data->data.position.longitude = + cxd_atod(fields[GGA_LONGITUDE_IDX]) * 100000; + if (fields[GGA_LONGITUDE_DIR_IDX][0] == 'W') { + drv_data->data.position.longitude *= -1; + } + drv_data->data.position.fix_type = + cxd_atoi(fields[GGA_QUALITY_INDICATOR_IDX]); + drv_data->data.position.SIV = cxd_atoi(fields[GGA_NUM_SATELLITE_IDX]); + drv_data->data.position.hDOP = + cxd_atod(fields[GGA_HDOP_IDX]) * 10; + drv_data->data.position.altitude_MSL = cxd_atod(fields[GGA_ALTITUDE_IDX]); + /* Subtract geoidal separation value from + * altitude (MSL) to arrive at the altitude + * (height above Ellipsoid) + */ + drv_data->data.position.altitude = + drv_data->data.position.altitude_MSL - + cxd_atod(fields[GGA_GEOIDAL_SEPARATION_IDX]); + } else { + drv_data->data.time.gnss_hour = 0; + drv_data->data.time.gnss_minute = 0; + drv_data->data.time.gnss_second = 0; + drv_data->data.time.gnss_nanosecond = 0; + drv_data->data.position.latitude = 0.0; + drv_data->data.position.longitude = 0.0; + drv_data->data.position.fix_type = 0; + drv_data->data.position.SIV = 0; + drv_data->data.position.hDOP = 0.0; + drv_data->data.position.altitude_MSL = 0.0; + drv_data->data.position.altitude = 0.0; + } + + } else if (!strncmp("GNS", &fields[NMEA_SENTENCE_ID_IDX][3], 3)) { + if (field_count < 11) { + LOG_WRN("$--GNS - field < 11 (%d)", field_count); + } + uint32_t t = cxd_atod(fields[GGA_UTC_OF_POSITION_IDX]) * 100; + + drv_data->data.time.gnss_hour = (t / 1000000); + drv_data->data.time.gnss_minute = (t % 1000000) / 10000; + drv_data->data.time.gnss_second = (t % 10000) / 100; + drv_data->data.time.gnss_nanosecond = (t % 100) * 10000000; + + drv_data->data.position.latitude = cxd_atod(fields[GNS_LATITUDE_IDX]) * 100000; + if (fields[GNS_LATITUDE_DIR_IDX][0] == 'S') { + drv_data->data.position.latitude *= -1; + } + drv_data->data.position.longitude = cxd_atod(fields[GNS_LONGITUDE_IDX]) * 100000; + if (fields[GNS_LONGITUDE_DIR_IDX][0] == 'W') { + drv_data->data.position.longitude *= -1; + } + + drv_data->data.position.SIV = cxd_atoi(fields[GNS_NUM_SATELLITE_IDX]); + drv_data->data.position.hDOP = cxd_atod(fields[GNS_HDOP_IDX]) * 10; + drv_data->data.position.altitude_MSL = cxd_atod(fields[GNS_ALTITUDE_IDX]); + /* Subtract geoidal separation value from altitude + * (MSL) to arrive at the altitude (height above + * Ellipsoid) + */ + drv_data->data.position.altitude = drv_data->data.position.altitude_MSL - + cxd_atod(fields[GNS_GEOIDAL_SEPARATION_IDX]); + } else if (!strncmp("GLL", &fields[NMEA_SENTENCE_ID_IDX][3], 3)) { + if (field_count < 6) { + LOG_WRN("$--GLL field < 6 (%d)", field_count); + } + uint32_t t = cxd_atod(fields[GLL_UTC_OF_POSITION_IDX]) * 100; + + drv_data->data.time.gnss_hour = (t / 1000000); + drv_data->data.time.gnss_minute = (t % 1000000) / 10000; + drv_data->data.time.gnss_second = (t % 10000) / 100; + drv_data->data.time.gnss_nanosecond = (t % 100) * 10000000; + + drv_data->data.position.latitude = cxd_atod(fields[GLL_LATITUDE_IDX]) * 100000; + if (fields[GLL_LATITUDE_DIR_IDX][0] == 'S') { + drv_data->data.position.latitude *= -1; + } + drv_data->data.position.longitude = cxd_atod(fields[GLL_LONGITUDE_IDX]) * 100000; + if (fields[GLL_LONGITUDE_DIR_IDX][0] == 'W') { + drv_data->data.position.longitude *= -1; + } + } else if (!strncmp("ZDA", &fields[NMEA_SENTENCE_ID_IDX][3], 3)) { + if (field_count < 7) { + LOG_WRN("$--ZDA field < 7 (%d)", field_count); + } + uint32_t t = cxd_atod(fields[ZDA_UTC_IDX]) * 100; + + drv_data->data.time.gnss_hour = (t / 1000000); + drv_data->data.time.gnss_minute = (t % 1000000) / 10000; + drv_data->data.time.gnss_second = (t % 10000) / 100; + drv_data->data.time.gnss_nanosecond = (t % 100) * 10000000; + + drv_data->data.time.gnss_day = cxd_atoi(fields[ZDA_DAY_IDX]); + drv_data->data.time.gnss_month = cxd_atoi(fields[ZDA_MONTH_IDX]); + drv_data->data.time.gnss_year = cxd_atoi(fields[ZDA_YEAR_IDX]); + } +} + +#if defined(CONFIG_CXD5605_OWN_THREAD) +static void cxd5605_thread(struct cxd5605_data *drv_data, void *b, void *c) +{ + while (1) { + k_sem_take(&drv_data->gpio_sem, K_FOREVER); + cxd5605_lib_process(&drv_data->cdev); + } +} +#else +static void data_interrupt_work(struct k_work *work) +{ + struct cxd5605_data *drv_data = CONTAINER_OF(work, struct cxd5605_data, work); + + cxd5605_lib_process(&drv_data->cdev); +} +#endif /* defined(CONFIG_CXD5605_OWN_THREAD) */ + +static int chip_init(const struct device *dev); + /** @brief Initial routine to call to get things running * * This routine does the usual things in that it sets some variables @@ -152,13 +264,10 @@ static int init(const struct device *dev) struct cxd5605_data *drv_data = dev->data; int result = 0; - drv_data->pvt.position.latitude = 0.0; - drv_data->pvt.position.longitude = 0.0; - drv_data->pvt.position.altitude_MSL = 0.0; - drv_data->pvt.position.altitude = 0.0; - - drv_data->cxd5605_cmd = -1; - drv_data->num_msg = 0; + drv_data->data.position.latitude = 0.0; + drv_data->data.position.longitude = 0.0; + drv_data->data.position.altitude_MSL = 0.0; + drv_data->data.position.altitude = 0.0; if (!device_is_ready(cfg->i2c_spec.bus)) { LOG_ERR("I2C dev %s not ready", cfg->i2c_spec.bus->name); @@ -168,13 +277,54 @@ static int init(const struct device *dev) /* save this driver instance for passing to other functions */ drv_data->cxd5605_dev = dev; +#if defined(CONFIG_CXD5605_OWN_THREAD) + k_thread_create(&drv_data->thread, drv_data->thread_stack, + 2048, + (k_thread_entry_t)cxd5605_thread, drv_data, + NULL, NULL, K_PRIO_COOP(CONFIG_CXD5605_THREAD_PRIORITY), + 0, K_NO_WAIT); +#else + k_work_init(&drv_data->work, data_interrupt_work); +#endif /* CONFIG_CXD5605_OWN_THREAD */ + +#if CONFIG_PM_DEVICE + if (pm_device_on_power_domain(dev) && !pm_device_is_powered(dev)) { + pm_device_init_off(dev); + } else { + chip_init(dev); +#if defined(CONFIG_CXD5605_INIT_SUSPENDED) + cxd5605_sleep(&drv_data->cdev, 2); + pm_device_init_suspended(dev) +#endif + } +#else + chip_init(dev); +#endif + return result; +} + +/** + * @brief Perform procedure to initialize the chip from poweroff + * + * @param dev The pointer to the device structure for this driver + * @return int + */ +static int chip_init(const struct device *dev) +{ + const struct cxd5605_config *cfg = dev->config; + struct cxd5605_data *drv_data = dev->data; + int result = 0; + + drv_data->data.position.latitude = 0.0; + drv_data->data.position.longitude = 0.0; + drv_data->data.position.altitude_MSL = 0.0; + drv_data->data.position.altitude = 0.0; + result = gpio_pin_configure_dt(&cfg->rst_gpio, GPIO_OUTPUT_HIGH); cxd5605_setup_interrupts(dev); /* setup shim callbacks */ - cxd5605_lib_init(dev); - cxd5605_register_resp_callback(dev, driver_cxd5605_resp_cb); - cxd5605_register_nmea_callback(dev, driver_cxd5605_nmea_cb); + cxd5605_init_handshake(&drv_data->cdev); return result; } @@ -208,45 +358,11 @@ int csv_split(char *string, char separator, char *fields[]) separates[2] = '\r'; separates[3] = 0; - while ((fields[field++] = (char *)strtok_r(string, separates, &string)) - && (field < MAXFIELDS)) { + while ((fields[field++] = (char *)strtok_r(string, separates, &string)) && + (field < MAXFIELDS)) { } - return (field-1); -} - -/** @brief wait for command response from the CXD5605 - * - * @param requires a struct device - * - * @return status 0 good -1 timeout - */ -static int cxd5605_wait_fetch(const struct device *dev) -{ - int ret = 0; - int data_timeout = 0; - - struct cxd5605_data *drv_data = dev->data; - -#ifdef CONFIG_PM_DEVICE - enum pm_device_state state; - (void)pm_device_state_get(dev, &state); - /* Do not allow sample fetching from suspended state */ - if (state == PM_DEVICE_STATE_SUSPENDED) { - return -EIO; - } -#endif - - drv_data->got_data = false; - while (drv_data->got_data != true) { - k_msleep(100); - data_timeout++; - if (data_timeout > 13) { - return -1; - } - } - - return ret; + return (field - 1); } /** @brief Callback routine for 1PPS interrupt. It will be called every second @@ -259,13 +375,33 @@ static int cxd5605_wait_fetch(const struct device *dev) * @return None * */ -static void callback_1pps(const struct device *dev, - struct gpio_callback *gpio_cb, uint32_t pins) +static void callback_1pps(const struct device *dev, struct gpio_callback *gpio_cb, uint32_t pins) { struct cxd5605_data *drv_data = CONTAINER_OF(gpio_cb, struct cxd5605_data, one_pps_gpio_cb); - if (drv_data->pps_cb) + if (drv_data->pps_cb) { (drv_data->pps_cb)(); + } +} + +/** + * @brief Callback routine for the data ready interrupt + * + * @param dev Pointer to device structure for the driver instance. + * @param gpio_cb Pointer to gpio callback structure + * @param pins Mask of pins that triggers the callback handler + */ +static void callback_drdy(const struct device *dev, struct gpio_callback *gpio_cb, uint32_t pins) +{ + struct cxd5605_data *drv_data = CONTAINER_OF(gpio_cb, struct cxd5605_data, data_ready_gpio_cb); + +/*If thread, else work*/ +#if defined(CONFIG_CXD5605_OWN_THREAD) + k_sem_give(&drv_data->gpio_sem); +#else + k_work_submit(&drv_data->work); +#endif /* CONFIG_CXD5605_OWN_THREAD */ + } /** @brief Get a reading from CXD5605. @@ -277,37 +413,81 @@ static void callback_1pps(const struct device *dev, * @return Return a useful value for a particular channel, from the driver’s internal data * */ -static int cxd5605_channel_get(const struct device *dev, - enum sensor_channel chan, - struct sensor_value *val) +static int cxd5605_channel_get(const struct device *dev, enum sensor_channel chan, + struct sensor_value *val) { int32_t integral; int32_t frac; struct cxd5605_data *drv_data = dev->data; - switch (chan) { - case SENSOR_CHAN_POS_DX: - integral = (int)(drv_data->pvt.position.latitude)/10000000.0; - frac = drv_data->pvt.position.latitude - (integral*10000000); - frac = (frac / 60.0) * 100.0; + switch ((uint16_t)chan) { + case SENSOR_CHAN_GNSS_POSITION: + integral = drv_data->data.position.longitude / 10000000; + frac = drv_data->data.position.longitude - (integral * 10000000); + frac = (frac * 10) / 60; + val[1].val1 = integral; + val[1].val2 = frac; + case SENSOR_CHAN_GNSS_POSITION_LAT: + integral = drv_data->data.position.latitude / 10000000; + frac = drv_data->data.position.latitude - (integral * 10000000); + frac = (frac * 10) / 60; frac = (frac < 0) ? (frac * -1) : frac; val->val1 = integral; - val->val2 = frac / 10; + val->val2 = frac; break; - case SENSOR_CHAN_POS_DY: - integral = (int)(drv_data->pvt.position.longitude)/10000000.0; - frac = drv_data->pvt.position.longitude - (integral*10000000); - frac = (frac / 60.0) * 100.0; + case SENSOR_CHAN_GNSS_POSITION_LNG: + integral = drv_data->data.position.longitude / 10000000; + frac = drv_data->data.position.longitude - (integral * 10000000); + frac = (frac * 10) / 60; val->val1 = integral; - val->val2 = frac / 10; + val->val2 = frac; break; case SENSOR_CHAN_ALTITUDE: - val->val1 = (drv_data->pvt.position.altitude_MSL); + val->val1 = (drv_data->data.position.altitude_MSL); val->val2 = 0; break; + case SENSOR_CHAN_GNSS_TIME: + int days = drv_data->data.time.gnss_day - 1; + + /* GNSS time is since 1980*/ + days += (drv_data->data.time.gnss_year - 1980) * 365 + + (drv_data->data.time.gnss_year - 1980) / 4 + - (drv_data->data.time.gnss_year - 1900) / 100; + switch (drv_data->data.time.gnss_month) { + case 12: /* December */ + days += 30; + case 11: /* November */ + days += 31; + case 10: /* October */ + days += 30; + case 9: /* September */ + days += 31; + case 8: /* August */ + days += 31; + case 7: /* July */ + days += 30; + case 6: /* June */ + days += 31; + case 5: /* May */ + days += 30; + case 4: /* April */ + days += 31; + case 3: /* March */ + days += (!(drv_data->data.time.gnss_year % 4) + && (drv_data->data.time.gnss_year % 100) )? 29 : 28; + case 2: /* February */ + days += 31; + } + + val->val1 = days * 86400; + val->val1 += drv_data->data.time.gnss_hour * 3600; + val->val1 += drv_data->data.time.gnss_minute * 60; + val->val1 += drv_data->data.time.gnss_second; + val->val2 = drv_data->data.time.gnss_nanosecond / 1000; + default: return -ENOTSUP; } @@ -326,86 +506,95 @@ static int cxd5605_channel_get(const struct device *dev, * @return 0 if successful, negative errno code if failure. * */ -static int cxd5605_attr_get(const struct device *dev, - enum sensor_channel chan, - enum sensor_attribute attr, - struct sensor_value *val) +static int cxd5605_attr_get(const struct device *dev, enum sensor_channel chan, + enum sensor_attribute attr, struct sensor_value *val) { struct cxd5605_data *drv_data = dev->data; - if (chan == (enum sensor_channel)GNSS_CHANNEL_TIME) { - val->val1 = (int)((drv_data->pvt.time.gnss_hour * 10000) + - (drv_data->pvt.time.gnss_minute * 100) + - (drv_data->pvt.time.gnss_second)); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_SECOND) { + val->val1 = drv_data->data.time.gnss_second; + val->val2 = 0; + } + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_MINUTE) { + val->val1 = drv_data->data.time.gnss_minute; val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_TIME && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_DAY) { - val->val1 = (int)drv_data->pvt.time.gnss_day; + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_HOUR) { + val->val1 = drv_data->data.time.gnss_hour; val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_TIME && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_MONTH) { - val->val1 = (int)drv_data->pvt.time.gnss_month; + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_DAY) { + val->val1 = drv_data->data.time.gnss_day; val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_TIME && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_YEAR) { - val->val1 = (int)drv_data->pvt.time.gnss_year; + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_MONTH) { + val->val1 = drv_data->data.time.gnss_month; + val->val2 = 0; + } + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_TIME && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_YEAR) { + val->val1 = drv_data->data.time.gnss_year; val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_LATITUDE) { - val->val1 = (int)(drv_data->pvt.position.latitude); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_LATITUDE) { + val->val1 = (int)(drv_data->data.position.latitude); val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_LONGITUDE) { - val->val1 = (int)(drv_data->pvt.position.longitude); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_LONGITUDE) { + val->val1 = (int)(drv_data->data.position.longitude); val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_ALTITUDE_MSL) { - val->val1 = (int)(drv_data->pvt.position.altitude_MSL); - val->val2 = (int)((drv_data->pvt.position.altitude_MSL-val->val1) * 100); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_ALTITUDE_MSL) { + sensor_value_from_double(val, drv_data->data.position.altitude_MSL); + val->val1 = drv_data->data.position.altitude_MSL; + val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_ALTITUDE_HAE) { - val->val1 = (int)(drv_data->pvt.position.altitude); - val->val2 = (int)((drv_data->pvt.position.altitude-val->val1) * 100); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_ALTITUDE_HAE) { + val->val1 = drv_data->data.position.altitude; + val->val2 = 0; + } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_HDOP) { - val->val1 = (int)(drv_data->pvt.position.horizontal_accuracy / 10); - val->val2 = (int)(drv_data->pvt.position.horizontal_accuracy%10); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_HDOP) { + val->val1 = drv_data->data.position.hDOP / 10; + val->val2 = (drv_data->data.position.hDOP % 10) * 100000; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_SIV) { - val->val1 = (int)(drv_data->pvt.position.SIV); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_SIV) { + val->val1 = (int)(drv_data->data.position.SIV); val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_FIXTYPE) { - cxd5605_wait_fetch(dev); - val->val1 = (int)(drv_data->pvt.position.fix_type); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_FIXTYPE) { + val->val1 = (int)(drv_data->data.position.fix_type); val->val2 = 0; } - if (chan == (enum sensor_channel)GNSS_CHANNEL_VELOCITY && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_PDOP) { - val->val1 = (int)(drv_data->pvt.velocity.pDOP); - val->val2 = (int)((drv_data->pvt.velocity.pDOP-val->val1) * 100); + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_VELOCITY && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_PDOP) { + val->val1 = (int)(drv_data->data.velocity.pDOP); + val->val2 = (int)((drv_data->data.velocity.pDOP - val->val1) * 100); } - if (chan == (enum sensor_channel)GNSS_CHANNEL_POSITION && - attr == (enum sensor_attribute)GNSS_ATTRIBUTE_VER) { - if (val->val1 == 0) - val->val2 = (int)drv_data->cxd5605_cmd_data.ver.major; - else if (val->val1 == 1) - val->val2 = (int)drv_data->cxd5605_cmd_data.ver.minor; - else - val->val2 = (int)drv_data->cxd5605_cmd_data.ver.patch; + if (chan == (enum sensor_channel)SENSOR_CHAN_GNSS_POSITION && + attr == (enum sensor_attribute)SENSOR_ATTR_GNSS_VER) { + if (val->val1 == 0) { + val->val2 = (int)drv_data->ver.major; + } else if (val->val1 == 1) { + val->val2 = (int)drv_data->ver.minor; + } else { + val->val2 = (int)drv_data->ver.patch; + } } return 0; } @@ -420,10 +609,8 @@ static int cxd5605_attr_get(const struct device *dev, * @return 0 if successful, negative errno code if failure * */ -static int cxd5605_attr_set(const struct device *dev, - enum sensor_channel chan, - enum sensor_attribute attr, - const struct sensor_value *val) +static int cxd5605_attr_set(const struct device *dev, enum sensor_channel chan, + enum sensor_attribute attr, const struct sensor_value *val) { struct cxd5605_data *drv_data = dev->data; int result = 0; @@ -439,25 +626,20 @@ static int cxd5605_attr_set(const struct device *dev, return -ENOTSUP; } - drv_data->cxd5605_cmd = (int)attr; - LOG_DBG("[cxd5605:tx] - cmd (%d)\r\n", drv_data->cxd5605_cmd); - - switch (drv_data->cxd5605_cmd) { - + switch ((uint16_t)attr) { case SENSOR_ATTR_CXD5605_ASSIST_GEN_FUNCTION_CONTROL: - result = cxd5605_assist_gen_function_control(dev, val->val1); + result = cxd5605_assist_gen_function_control(&drv_data->cdev, val->val1); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_assist_gen_function_control error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_OPERATING_MODE: - result = cxd5605_operating_mode(dev, val[0].val1, val[0].val2, val[1].val1); + result = cxd5605_operating_mode(&drv_data->cdev, val[0].val1, val[0].val2, + val[1].val1); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_operating_mode error %d", result); return result; } drv_data->op_mode = val[0].val1; @@ -467,10 +649,9 @@ static int cxd5605_attr_set(const struct device *dev, case SENSOR_ATTR_CXD5605_PULSE: if (val->val1 > 0) { - result = cxd5605_pulse(dev, 1); + result = cxd5605_pulse(&drv_data->cdev, 1); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_pulse error %d", result); return result; } if (val->val2) { @@ -478,75 +659,67 @@ static int cxd5605_attr_set(const struct device *dev, drv_data->pps_cb = ((void (*)(void))val->val2); } } else { - result = cxd5605_pulse(dev, 0); + result = cxd5605_pulse(&drv_data->cdev, 0); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_pulse error %d", result); return result; } } break; case SENSOR_ATTR_CXD5605_COLD_START: - result = cxd5605_cold_start(dev); + result = cxd5605_cold_start(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_cold_start error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_WAKE_UP: - result = cxd5605_wake_up(dev); + result = cxd5605_wake_up(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_wake_up error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_SENTENCE_SELECT: - result = cxd5605_sentence_select(dev, val->val1); + result = cxd5605_sentence_select(&drv_data->cdev, val->val1); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_sentence_select error %d", result); return result; } drv_data->selected_sentences = val->val1; break; case SENSOR_ATTR_CXD5605_HOT_START: - result = cxd5605_hot_start(dev); + result = cxd5605_hot_start(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_hot_start error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_HOT_START_TTFF: - result = cxd5605_hot_start_ttff(dev); + result = cxd5605_hot_start_ttff(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_hot_start_ttff error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_STOP: - result = cxd5605_stop(dev); + result = cxd5605_stop(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_stop error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_WARM_START: - result = cxd5605_warm_start(dev); + result = cxd5605_warm_start(&drv_data->cdev); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_warm_start error %d", result); return result; } break; @@ -559,28 +732,25 @@ static int cxd5605_attr_set(const struct device *dev, min = val[2].val1; sec = val[2].val2; - result = cxd5605_time_set(dev, year, month, day, hour, min, sec); + result = cxd5605_time_set(&drv_data->cdev, year, month, day, hour, min, sec); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_time_set error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_SLEEP: - result = cxd5605_sleep(dev, val->val1); + result = cxd5605_sleep(&drv_data->cdev, val->val1); if (result > SEND_BUF_SIZE || result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("cxd5605_sleep error %d", result); return result; } break; case SENSOR_ATTR_CXD5605_VERSION: - result = cxd5605_version(dev); + result = cxd5605_version(&drv_data->cdev, &drv_data->ver); if (result < 0) { - LOG_ERR("[%s:%d] to_send buffer error %d", - __FILE__, __LINE__, result); + LOG_ERR("[cxd5605_version error %d", result); return result; } break; @@ -589,7 +759,12 @@ static int cxd5605_attr_set(const struct device *dev, return -ENOTSUP; } + return 0; +} +static int cxd5605_sample_fetch(const struct device *dev, enum sensor_channel chan) +{ + /* Does nothing */ return 0; } @@ -599,6 +774,7 @@ static const struct sensor_driver_api cxd5605_driver_api = { .attr_set = cxd5605_attr_set, .attr_get = cxd5605_attr_get, .channel_get = cxd5605_channel_get, + .sample_fetch = cxd5605_sample_fetch, }; /** @brief Setup 1PPS and Alert interrupt @@ -614,8 +790,9 @@ int cxd5605_setup_interrupts(const struct device *dev) struct cxd5605_data *drv_data = dev->data; const struct cxd5605_config *config = dev->config; const struct gpio_dt_spec *int_gpio = &config->int_gpio; + const struct gpio_dt_spec *alert_gpio = &config->alert_gpio; - if (config->alert_gpio.port) { + if (int_gpio->port) { /* setup 1pps interrupt */ result = gpio_pin_configure_dt(int_gpio, GPIO_INPUT); @@ -623,29 +800,47 @@ int cxd5605_setup_interrupts(const struct device *dev) return result; } - gpio_init_callback(&drv_data->one_pps_gpio_cb, - callback_1pps, - BIT(int_gpio->pin)); + gpio_init_callback(&drv_data->one_pps_gpio_cb, callback_1pps, BIT(int_gpio->pin)); + + result = gpio_add_callback(int_gpio->port, &drv_data->one_pps_gpio_cb); + + if (result < 0) { + return result; + } + + result = gpio_pin_interrupt_configure_dt(int_gpio, GPIO_INT_EDGE_RISING); + + if (result < 0) { + return result; + } + } + if (alert_gpio->port) { + /* setup drdy interrupt */ + result = gpio_pin_configure_dt(alert_gpio, GPIO_INPUT); + + if (result < 0) { + return result; + } + + gpio_init_callback(&drv_data->data_ready_gpio_cb, callback_drdy, BIT(alert_gpio->pin)); - result = gpio_add_callback(int_gpio->port, - &drv_data->one_pps_gpio_cb); + result = gpio_add_callback(alert_gpio->port, &drv_data->data_ready_gpio_cb); if (result < 0) { return result; } - result = gpio_pin_interrupt_configure_dt(int_gpio, - GPIO_INT_EDGE_RISING); + result = gpio_pin_interrupt_configure_dt(alert_gpio, GPIO_INT_EDGE_RISING); if (result < 0) { return result; } } + cxd5605_register_nmea_callback(&drv_data->cdev, driver_cxd5605_nmea_cb); return 0; } - /** @brief power mode action routine * * @param dev device structure @@ -655,8 +850,7 @@ int cxd5605_setup_interrupts(const struct device *dev) * */ #ifdef CONFIG_PM_DEVICE -static int cxd5605_driver_pm_action(const struct device *dev, - enum pm_device_action action) +static int cxd5605_driver_pm_action(const struct device *dev, enum pm_device_action action) { const struct cxd5605_config *config = dev->config; const struct gpio_dt_spec *rst_gpio = &config->rst_gpio; @@ -671,30 +865,30 @@ static int cxd5605_driver_pm_action(const struct device *dev, * domain this device belongs is resumed. */ result = gpio_pin_configure_dt(rst_gpio, GPIO_OUTPUT_HIGH); - k_msleep(3000); /* wait for GNSS chip to boot */ - result = init(dev); + k_msleep(3000); /* wait for GNSS chip to boot */ + result = chip_init(dev); if (result < 0) { printk("ERROR: I2C interface not working (CXD5605 driver)\n"); } if (drv_data->pps_cb) { - cxd5605_pulse(dev, 1); + cxd5605_pulse(&drv_data->cdev, 1); } - cxd5605_operating_mode(dev, drv_data->op_mode, drv_data->pos_cycle, \ + cxd5605_operating_mode(&drv_data->cdev, drv_data->op_mode, drv_data->pos_cycle, drv_data->sleep_time); - cxd5605_sentence_select(dev, drv_data->selected_sentences); + cxd5605_sentence_select(&drv_data->cdev, drv_data->selected_sentences); case PM_DEVICE_ACTION_SUSPEND: - cxd5605_sleep(dev, 0); + cxd5605_sleep(&drv_data->cdev, 0); break; case PM_DEVICE_ACTION_RESUME: - cxd5605_wake_up(dev); + cxd5605_wake_up(&drv_data->cdev); break; case PM_DEVICE_ACTION_TURN_OFF: /* * power off the device, used when the power * domain this device belongs is suspended. */ - cxd5605_sleep(dev, 2); + cxd5605_sleep(&drv_data->cdev, 2); gpio_pin_interrupt_configure_dt(&config->int_gpio, GPIO_INT_DISABLE); result = gpio_pin_configure_dt(rst_gpio, GPIO_OUTPUT_LOW); break; @@ -706,31 +900,23 @@ static int cxd5605_driver_pm_action(const struct device *dev, } #endif /* CONFIG_PM_DEVICE */ -#define CXD5605_DEFINE(inst) \ - static struct cxd5605_data cxd5605_prv_data_##inst; \ - static struct cxd5605_config cxd5605_config_##inst = { \ - .i2c_spec = I2C_DT_SPEC_INST_GET(inst), \ - .alert_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, \ - alert_gpios, { 0 }), \ - .int_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, \ - int_gpios, { 0 }), \ - .pwr_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, \ - pwr_gpios, { 0 }), \ - .rst_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, \ - rst_gpios, { 0 }), \ - .boot_rec_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, \ - boot_rec_gpios, { 0 }) \ - }; \ - \ - PM_DEVICE_DT_INST_DEFINE(inst, cxd5605_driver_pm_action); \ - \ - DEVICE_DT_INST_DEFINE(inst, \ - &init, \ - PM_DEVICE_DT_INST_GET(inst), \ - &cxd5605_prv_data_##inst, \ - &cxd5605_config_##inst, \ - POST_KERNEL, \ - CONFIG_SENSOR_INIT_PRIORITY, \ +#define CXD5605_DEFINE(inst) \ + static struct cxd5605_config cxd5605_config_##inst = { \ + .i2c_spec = I2C_DT_SPEC_INST_GET(inst), \ + .alert_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, alert_gpios, {0}), \ + .int_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, int_gpios, {0}), \ + .rst_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, rst_gpios, {0}), \ + .boot_rec_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, boot_rec_gpios, {0})}; \ + K_SEM_DEFINE(cxd5605_resp_sem_##inst, 0, 1); \ + static struct cxd5605_data cxd5605_prv_data_##inst = { \ + .cdev = CXD5605_DEV_DEFINE(&cxd5605_resp_sem_##inst, &cxd5605_config_##inst), \ + }; \ + \ + PM_DEVICE_DT_INST_DEFINE(inst, cxd5605_driver_pm_action); \ + \ + DEVICE_DT_INST_DEFINE(inst, &init, PM_DEVICE_DT_INST_GET(inst), &cxd5605_prv_data_##inst, \ + &cxd5605_config_##inst, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, \ &cxd5605_driver_api); -DT_INST_FOREACH_STATUS_OKAY(CXD5605_DEFINE) +/* Current lib version only supports one instance */ +DT_INST_FOREACH_STATUS_OKAY(CXD5605_DEFINE); diff --git a/drivers/sensor/cxd5605/cxd5605.h b/drivers/sensor/cxd5605/cxd5605.h index 5670c7b936e..5a4b8723501 100644 --- a/drivers/sensor/cxd5605/cxd5605.h +++ b/drivers/sensor/cxd5605/cxd5605.h @@ -12,7 +12,44 @@ #include #include +#include +#include int cxd5605_setup_interrupts(const struct device *dev); + +struct cxd5605_data { + const struct device *cxd5605_dev; + struct cxd5605_dev cdev; + + struct gpio_callback data_ready_gpio_cb; + struct gpio_callback one_pps_gpio_cb; + + pps_func pps_cb; + struct gnss_global_data data; + struct cxd5605_version ver; + char version[32]; + + uint32_t op_mode; + uint32_t pos_cycle; + uint32_t sleep_time; + uint32_t selected_sentences; + +#if defined(CONFIG_CXD5605_OWN_THREAD) + K_KERNEL_STACK_MEMBER(thread_stack, 2048); + struct k_thread thread; + struct k_sem gpio_sem; +#else + struct k_work work; +#endif +}; + +struct cxd5605_config { + const struct i2c_dt_spec i2c_spec; + const struct gpio_dt_spec alert_gpio; + const struct gpio_dt_spec int_gpio; + const struct gpio_dt_spec rst_gpio; + const struct gpio_dt_spec boot_rec_gpio; +}; + #endif /* ZEPHYR_DRIVERS_SENSOR_CXD5605_CXD5605_H_ */ diff --git a/drivers/sensor/cxd5605/cxd5605_lib_exports.c b/drivers/sensor/cxd5605/cxd5605_lib_exports.c new file mode 100644 index 00000000000..cb05fdfb61b --- /dev/null +++ b/drivers/sensor/cxd5605/cxd5605_lib_exports.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2023 T-Mobile USA, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ +#define DT_DRV_COMPAT sony_cxd5605 +#include +#include +#include +#include "cxd5605.h" +#include + + +void cxd5605_pin_set(struct cxd5605_dev *cxd_dev, enum cxd_pin pin, int value) +{ + const struct cxd5605_config *cfg = cxd_dev->user_data; + + switch (pin) { + case cxd_rst_gpio: + gpio_pin_set_dt(&cfg->rst_gpio, value); + break; + case cxd_boot_rec_gpio: + gpio_pin_set_dt(&cfg->boot_rec_gpio, value); + break; + case cxd_alert_gpio: + gpio_pin_set_dt(&cfg->alert_gpio, value); + break; + default: + break; + } +} + +void cxd5605_pin_conf(struct cxd5605_dev *cxd_dev, enum cxd_pin pin, enum cxd_pin_dir inout) +{ + const struct cxd5605_config *cfg = cxd_dev->user_data; + + gpio_flags_t pincfg = inout ? GPIO_INPUT : GPIO_OUTPUT; + + switch (pin) { + case cxd_rst_gpio: + gpio_pin_configure_dt(&cfg->rst_gpio, pincfg); + break; + case cxd_boot_rec_gpio: + gpio_pin_configure_dt(&cfg->boot_rec_gpio, pincfg); + break; + case cxd_alert_gpio: + gpio_pin_configure_dt(&cfg->alert_gpio, pincfg); + break; + default: + break; + } +} + +void cxd5605_sem_give(cxd5605_sem sem) +{ + struct k_sem *ksem = sem; + + k_sem_give(ksem); +} + +int cxd5605_sem_take(cxd5605_sem sem, int timeout_ms) +{ + struct k_sem *ksem = sem; + + return k_sem_take(ksem, K_MSEC(timeout_ms)); +} + +int cxd5605_i2c_read(struct cxd5605_dev *cxd_dev, uint8_t *data, uint8_t num_bytes) +{ + const struct cxd5605_config *cfg = cxd_dev->user_data; + + return i2c_read_dt(&cfg->i2c_spec, data, num_bytes); +} + +int cxd5605_i2c_write(struct cxd5605_dev *cxd_dev, uint8_t *data, uint8_t num_bytes) +{ + const struct cxd5605_config *cfg = cxd_dev->user_data; + + return i2c_write_dt(&cfg->i2c_spec, data, num_bytes); +} + +void cxd5605_usleep(int us) +{ + k_usleep(us); +} diff --git a/dts/arm/silabs/efr32bg22-pinctrl.dtsi b/dts/arm/silabs/efr32bg22-pinctrl.dtsi deleted file mode 100644 index 388423e10d0..00000000000 --- a/dts/arm/silabs/efr32bg22-pinctrl.dtsi +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2022 Silicon Labs - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -&pinctrl { - /* configuration for usart0 device, operating as SPI */ - usart0_default: usart0_default { - group1 { - psels = , - , - ; - }; - }; - - /* configuration for usart1 device, default state - operating as UART */ - usart1_default: usart1_default { - group1 { - /* configure PA.6 as UART_RX and PA.5 as UART_TX */ - psels = , - , - ; - }; - }; -}; diff --git a/dts/arm/silabs/efr32bg22c224f512im40.dtsi b/dts/arm/silabs/efr32bg22c224f512im40.dtsi deleted file mode 100644 index b9d15de4734..00000000000 --- a/dts/arm/silabs/efr32bg22c224f512im40.dtsi +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 Sateesh Kotapati - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include - -/ { - soc { - compatible = "silabs,efr32bg22c224f512im40", "silabs,efr32bg22", - "silabs,efr32", "simple-bus"; - }; -}; - -&sram0 { - reg = <0x20000000 DT_SIZE_K(32)>; -}; - -&flash0 { - reg = <0 DT_SIZE_K(512)>; -}; diff --git a/dts/arm/silabs/efr32mg.dtsi b/dts/arm/silabs/efr32mg.dtsi index 4403ec45bad..65611091edf 100644 --- a/dts/arm/silabs/efr32mg.dtsi +++ b/dts/arm/silabs/efr32mg.dtsi @@ -235,16 +235,6 @@ }; }; -/ { - pinctrl: pin-controller { - /* Pin controller is a "virtual" device since SiLabs SoCs do pin - * control in a distributed way (GPIO registers and PSEL - * registers on each peripheral). - */ - compatible = "silabs,gecko-pinctrl"; - }; -}; - &nvic { arm,num-irq-priority-bits = <3>; }; diff --git a/include/zephyr/drivers/fuel_gauge.h b/include/zephyr/drivers/fuel_gauge.h index 89d4b9a66d6..b30bf37df7b 100644 --- a/include/zephyr/drivers/fuel_gauge.h +++ b/include/zephyr/drivers/fuel_gauge.h @@ -112,6 +112,23 @@ enum fuel_gauge_property { FUEL_GAUGE_PROP_MAX = UINT16_MAX, }; +/* + * Values retrieved from SBS v1.1 Spec (http://sbs-forum.org/specs/sbdat110.pdf) + * Section 5.1.21 + */ + +#define FUEL_GAUGE_STATUS_FLAGS_OVER_CHARGED_ALARM 0x8000 +#define FUEL_GAUGE_STATUS_FLAGS_TERMINATE_CHARGE_ALARM 0x4000 +#define FUEL_GAUGE_STATUS_FLAGS_OVER_TEMP_ALARM 0x1000 +#define FUEL_GAUGE_STATUS_FLAGS_TERMINATE_DISCHARGE_ALARM 0x0800 +#define FUEL_GAUGE_STATUS_FLAGS_REMAINING_CAPACITY_ALARM 0x0200 +#define FUEL_GAUGE_STATUS_FLAGS_REMAINING_TIME_ALARM 0x0100 + +#define FUEL_GAUGE_STATUS_FLAGS_INITIALIZED 0x0080 +#define FUEL_GAUGE_STATUS_FLAGS_DISCHARGING 0x0040 +#define FUEL_GAUGE_STATUS_FLAGS_FULLY_CHARGED 0x0020 +#define FUEL_GAUGE_STATUS_FLAGS_FULLY_DISCHARGED 0x0010 + typedef uint16_t fuel_gauge_prop_t; struct fuel_gauge_get_property { diff --git a/include/zephyr/drivers/sensor/cxd5605.h b/include/zephyr/drivers/sensor/cxd5605.h index 7ac6c9d7248..a98892c2b5f 100644 --- a/include/zephyr/drivers/sensor/cxd5605.h +++ b/include/zephyr/drivers/sensor/cxd5605.h @@ -15,13 +15,6 @@ extern "C" { #include #include -#define READ_BYTES_SIZE 128 -#define CXD5605_PACKET_SIZE 74 -#define CXD5605_PACKET_DATA_SIZE 70 - -#define NMEA_SENTENCE_ID_IDX 0 -#define NMEA_SENTENCE_ID_LEN 6 - enum power_mode_t { GNSS_NORMAL_PWR_MODE, GNSS_LOW_PWR_MODE @@ -98,10 +91,11 @@ enum gll_nmea_fieldpos { GLL_MODE_INDICATOR_IDX }; -struct cxd5605_version { - uint32_t major; - uint32_t minor; - uint32_t patch; +enum zda_nmea_fieldpos { + ZDA_UTC_IDX = 1, + ZDA_DAY_IDX, + ZDA_MONTH_IDX, + ZDA_YEAR_IDX }; struct cxd5605_gtr { @@ -116,63 +110,8 @@ struct cxd5605_assisted { uint32_t qzss_available; }; -struct cxd5605_cmd_data { - struct cxd5605_version ver; -}; - -struct cxd5605_packet { - uint8_t preamble; - uint8_t packet_type; - uint8_t data_size; - uint8_t data[CXD5605_PACKET_DATA_SIZE]; - uint8_t checksum; -}; - -struct cxd5605_binary_data { - uint8_t preamble; - uint8_t control_type; - uint8_t data_length_upper; - uint8_t data_length_lower; - uint8_t data[CXD5605_PACKET_DATA_SIZE]; - uint8_t checksum_upper; - uint8_t checksum_lower; - uint8_t fixed_value1; - uint8_t fixed_value2; -}; - typedef void (*pps_func)(void); -struct cxd5605_data { - const struct device *cxd5605_dev; - - struct gpio_callback data_ready_gpio_cb; - struct gpio_callback one_pps_gpio_cb; - struct gpio_callback gpio_cb; - - pps_func pps_cb; - struct gnss_global_data pvt; - struct cxd5605_cmd_data cxd5605_cmd_data; - char version[32]; - uint16_t bin_data_ptr; - uint16_t bin_data_len; - uint16_t bytes_remaining; - uint16_t copy_length; - - int cxd5605_cmd; - int num_msg; - - uint32_t i2c_error_count; - - bool got_data; - bool lib_got_data; - int command; - - uint32_t op_mode; - uint32_t pos_cycle; - uint32_t sleep_time; - uint32_t selected_sentences; -}; - /** a mask for the under temp alert bit in the status word*/ #ifdef __cplusplus diff --git a/include/zephyr/drivers/sensor/gnss.h b/include/zephyr/drivers/sensor/gnss.h index 3d04b9be286..db294daca8e 100644 --- a/include/zephyr/drivers/sensor/gnss.h +++ b/include/zephyr/drivers/sensor/gnss.h @@ -6,6 +6,7 @@ #ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_GNSS_H_ #define ZEPHYR_INCLUDE_DRIVERS_SENSOR_GNSS_H_ +#include struct gnss_global_time { uint32_t time_of_week; /* ms */ @@ -40,8 +41,8 @@ struct gnss_global_position { int32_t latitude; /*Degrees * 10^-7 (more accurate than floats)*/ int32_t altitude; int32_t altitude_MSL; - uint32_t horizontal_accuracy; /* mm * 10^-1 (i.e. 0.1mm) */ - uint32_t vertical_accuracy; /* mm * 10^-1 (i.e. 0.1mm) */ + uint32_t hDOP; + uint32_t vDOP; } __packed; struct gnss_global_velocity { @@ -70,99 +71,105 @@ struct gnss_global_data { /* driver sensor channels */ enum gnss_channel { - GNSS_CHANNEL_NONE, - GNSS_CHANNEL_TIME, - GNSS_CHANNEL_POSITION, - GNSS_CHANNEL_VELOCITY, - - /** All channels. */ - GNSS_CHANNEL_ALL, + /* GNSS Time */ + SENSOR_CHAN_GNSS_TIME = SENSOR_CHAN_PRIV_START, + /* GNSS Latitude */ + SENSOR_CHAN_GNSS_POSITION_LAT, + /* GNSS Longitude */ + SENSOR_CHAN_GNSS_POSITION_LNG, + /* GNSS Position (Lat,Lng) */ + SENSOR_CHAN_GNSS_POSITION, + /* GNSS Velocity */ + SENSOR_CHAN_GNSS_VELOCITY, /** * Number of all common sensor channels. */ - GNSS_CHANNEL_COMMON_COUNT, + SENSOR_CHAN_GNSS_COMMON_COUNT, /** * This and higher values are sensor specific. * Refer to the sensor header file. */ - GNSS_CHANNEL_PRIV_START = GNSS_CHANNEL_COMMON_COUNT, + SENSOR_CHAN_GNSS_PRIV_START = SENSOR_CHAN_GNSS_COMMON_COUNT, /** * Maximum value describing a sensor channel type. */ - GNSS_CHANNEL_MAX = INT16_MAX, + SENSOR_CHAN_GNSS_MAX = INT16_MAX, }; /* driver sensor attributes */ enum gnss_attribute { - GNSS_ATTRIBUTE_UPDATE_PERIOD, - GNSS_ATTRIBUTE_SEARCH_PERIOD, - GNSS_ATTRIBUTE_SLEEP_DURATION, + SENSOR_ATTR_GNSS_UPDATE_PERIOD = SENSOR_ATTR_PRIV_START, + SENSOR_ATTR_GNSS_SEARCH_PERIOD, + SENSOR_ATTR_GNSS_SLEEP_DURATION, - GNSS_ATTRIBUTE_NAV_MEASUREMENT_RATE, - GNSS_ATTRIBUTE_NAV_SOLUTION_RATE, - GNSS_ATTRIBUTE_NAV_TIMEREF, + SENSOR_ATTR_GNSS_NAV_MEASUREMENT_RATE, + SENSOR_ATTR_GNSS_NAV_SOLUTION_RATE, + SENSOR_ATTR_GNSS_NAV_TIMEREF, GNSS_ATTRIBUTE_NAV_SETTINGS, - GNSS_ATTRIBUTE_NAV_MSG_PVT_RATE, - GNSS_ATTRIBUTE_NAV_MSG_SOL_RATE, - GNSS_ATTRIBUTE_NAV_MSG_STATUS_RATE, + SENSOR_ATTR_GNSS_NAV_MSG_PVT_RATE, + SENSOR_ATTR_GNSS_NAV_MSG_SOL_RATE, + SENSOR_ATTR_GNSS_NAV_MSG_STATUS_RATE, - GNSS_ATTRIBUTE_INFO_ID, - GNSS_ATTRIBUTE_INFO_HW_STATUS, - GNSS_ATTRIBUTE_INFO_HW2_STATUS, - GNSS_ATTRIBUTE_INFO_IO_STATUS, - GNSS_ATTRIBUTE_INFO_GNSS_STATUS, + SENSOR_ATTR_GNSS_INFO_ID, + SENSOR_ATTR_GNSS_INFO_HW_STATUS, + SENSOR_ATTR_GNSS_INFO_HW2_STATUS, + SENSOR_ATTR_GNSS_INFO_IO_STATUS, + SENSOR_ATTR_GNSS_INFO_GNSS_STATUS, - GNSS_ATTRIBUTE_INFO_VERSION_HW, - GNSS_ATTRIBUTE_INFO_VERSION_SW, - GNSS_ATTRIBUTE_INFO_VERSION_PROTO, + SENSOR_ATTR_GNSS_INFO_VERSION_HW, + SENSOR_ATTR_GNSS_INFO_VERSION_SW, + SENSOR_ATTR_GNSS_INFO_VERSION_PROTO, - GNSS_ATTRIBUTE_PORT_UART, - GNSS_ATTRIBUTE_PORT_I2C, - GNSS_ATTRIBUTE_PORT_USB, + SENSOR_ATTR_GNSS_PORT_UART, + SENSOR_ATTR_GNSS_PORT_I2C, + SENSOR_ATTR_GNSS_PORT_USB, - GNSS_ATTRIBUTE_NAV_STATUS, + SENSOR_ATTR_GNSS_NAV_STATUS, - GNSS_ATTRIBUTE_PM_STATUS, - GNSS_ATTRIBUTE_PM_MODE, - GNSS_ATTRIBUTE_PM_SLEEP, + SENSOR_ATTR_GNSS_PM_STATUS, + SENSOR_ATTR_GNSS_PM_MODE, + SENSOR_ATTR_GNSS_PM_SLEEP, - GNSS_ATTRIBUTE_TIMEPULSE_STATUS, + SENSOR_ATTR_GNSS_TIMEPULSE_STATUS, - GNSS_ATTRIBUTE_SAVE, + SENSOR_ATTR_GNSS_SAVE, - GNSS_ATTRIBUTE_LATITUDE, - GNSS_ATTRIBUTE_LONGITUDE, - GNSS_ATTRIBUTE_ALTITUDE_MSL, - GNSS_ATTRIBUTE_ALTITUDE_HAE, - GNSS_ATTRIBUTE_HDOP, - GNSS_ATTRIBUTE_FIXTYPE, - GNSS_ATTRIBUTE_SIV, + SENSOR_ATTR_GNSS_LATITUDE, + SENSOR_ATTR_GNSS_LONGITUDE, + SENSOR_ATTR_GNSS_ALTITUDE_MSL, + SENSOR_ATTR_GNSS_ALTITUDE_HAE, + SENSOR_ATTR_GNSS_HDOP, + SENSOR_ATTR_GNSS_FIXTYPE, + SENSOR_ATTR_GNSS_SIV, - GNSS_ATTRIBUTE_DAY, - GNSS_ATTRIBUTE_MONTH, - GNSS_ATTRIBUTE_YEAR, + SENSOR_ATTR_GNSS_DAY, + SENSOR_ATTR_GNSS_MONTH, + SENSOR_ATTR_GNSS_YEAR, + SENSOR_ATTR_GNSS_HOUR, + SENSOR_ATTR_GNSS_MINUTE, + SENSOR_ATTR_GNSS_SECOND, - GNSS_ATTRIBUTE_PDOP, - GNSS_ATTRIBUTE_VER, + SENSOR_ATTR_GNSS_PDOP, + SENSOR_ATTR_GNSS_VER, /** * Number of all common sensor attributes. */ - GNSS_ATTRIBUTE_COMMON_COUNT, + SENSOR_ATTR_GNSS_COMMON_COUNT, /** * This and higher values are sensor specific. * Refer to the sensor header file. */ - GNSS_ATTRIBUTE_PRIV_START = GNSS_ATTRIBUTE_COMMON_COUNT, + SENSOR_ATTR_GNSS_PRIV_START = SENSOR_ATTR_GNSS_COMMON_COUNT, /** * Maximum value describing a sensor attribute type. */ - GNSS_ATTRIBUTE_MAX = INT16_MAX, + SENSOR_ATTR_GNSS_MAX = INT16_MAX, }; #endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_GNSS_H_ */ diff --git a/samples/modules/nanopb/sample.yaml b/samples/modules/nanopb/sample.yaml index 255998ff223..2ea497b0f10 100644 --- a/samples/modules/nanopb/sample.yaml +++ b/samples/modules/nanopb/sample.yaml @@ -17,4 +17,3 @@ tests: integration_platforms: - native_posix - native_posix_64 - platform_exclude: tmo_dev_edge \ No newline at end of file diff --git a/samples/net/mqtt_publisher/overlay-1sc.conf b/samples/net/mqtt_publisher/overlay-1sc.conf new file mode 100644 index 00000000000..cbba0a780fa --- /dev/null +++ b/samples/net/mqtt_publisher/overlay-1sc.conf @@ -0,0 +1,5 @@ +CONFIG_NET_OFFLOAD=y +CONFIG_NET_SOCKETS_OFFLOAD=y +CONFIG_NET_NATIVE=n +CONFIG_MODEM=y +CONFIG_MODEM_MURATA_1SC=y diff --git a/samples/sensor/cxd5605_hot/src/main.c b/samples/sensor/cxd5605_hot/src/main.c index e149c2d7c65..3ac0e2f56a6 100644 --- a/samples/sensor/cxd5605_hot/src/main.c +++ b/samples/sensor/cxd5605_hot/src/main.c @@ -123,8 +123,8 @@ int main(void) case ST_WAIT_FOR_FIX: k_msleep(1000); sensor_attr_get(cxd5605, - GNSS_CHANNEL_POSITION, - GNSS_ATTRIBUTE_FIXTYPE, + SENSOR_CHAN_GNSS_POSITION, + SENSOR_ATTR_GNSS_FIXTYPE, &temp_flags); if (temp_flags.val1 >= 1) { temp_flags.val1 = 0; diff --git a/samples/sensor/sx9328/CMakeLists.txt b/samples/sensor/sx9328/CMakeLists.txt new file mode 100644 index 00000000000..c84d95d6d2c --- /dev/null +++ b/samples/sensor/sx9328/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(sx9328) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/samples/sensor/sx9328/README.rst b/samples/sensor/sx9328/README.rst new file mode 100644 index 00000000000..175f6e4f687 --- /dev/null +++ b/samples/sensor/sx9328/README.rst @@ -0,0 +1,31 @@ +.. _sx9328_sample: + +SX9328 SAR proximity sensor. +############################ + +Overview +******** + +This sample reads the proximity flags from the SX9328 proximity sensor and +displays the results. + +The SX9328 is a capacitive SAR sensor capable of +human sensing, as well as capacitive sensing of object. By default the sensor +has three sensing classes: "table", "body", and "proximity". Proximity simply +indicates whether any object is detected close to the sensor, "table" +indicates proximity to a low permitivity object, and "body" indicates proximity +to a high permitivity objects. + +By default, this sample prints flags on triggers. To poll, simply disable +CONFIG_SX9328_TRIGGER. + +Note: this sample does not use the Smart SAR mode. + +Sample Output +============= + +.. code-block:: console + + prox is 1 + bdy_prox is 0 + tbl_prox is 1 diff --git a/samples/sensor/sx9328/README.txt b/samples/sensor/sx9328/README.txt new file mode 100644 index 00000000000..aa62bbebecc --- /dev/null +++ b/samples/sensor/sx9328/README.txt @@ -0,0 +1,5 @@ +Title: SX9328 + +Description: + +A simple example using the SX9328 SAR proximity sensor. diff --git a/samples/sensor/sx9328/prj.conf b/samples/sensor/sx9328/prj.conf new file mode 100644 index 00000000000..a4c01bf4db1 --- /dev/null +++ b/samples/sensor/sx9328/prj.conf @@ -0,0 +1,3 @@ +CONFIG_I2C=y +CONFIG_GPIO=y +CONFIG_SENSOR=y diff --git a/samples/sensor/sx9328/sample.yaml b/samples/sensor/sx9328/sample.yaml new file mode 100644 index 00000000000..3fd8f69ab50 --- /dev/null +++ b/samples/sensor/sx9328/sample.yaml @@ -0,0 +1,8 @@ +sample: + name: SX9328 Sensor Sample +tests: + sample.sensor.sx9328: + harness: sensor + tags: sensors + depends_on: i2c gpio + filter: dt_compat_enabled("semtech,sx9328") diff --git a/samples/sensor/sx9328/src/main.c b/samples/sensor/sx9328/src/main.c new file mode 100644 index 00000000000..7b7a8b7cc62 --- /dev/null +++ b/samples/sensor/sx9328/src/main.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2023 T-Mobile USA, Inc. + * Copyright (c) 2016 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_SX9328_TRIGGER + +static void sensor_trigger_handler(const struct device *dev, + const struct sensor_trigger *trig) +{ + struct sensor_value prox_value; + int ret; + + ret = sensor_sample_fetch(dev); + if (ret) { + printk("sensor_sample_fetch failed ret %d\n", ret); + return; + } + + sensor_channel_get(dev, SENSOR_CHAN_PROX, &prox_value); + printk("prox is %d\n", prox_value.val1); + sensor_channel_get(dev, SENSOR_CHAN_SX9328_BDY_PRX, &prox_value); + printk("bdy_prox is %d\n", prox_value.val1); + sensor_channel_get(dev, SENSOR_CHAN_SX9328_TBL_PRX, &prox_value); + printk("tbl_prox is %d\n", prox_value.val1); +} + +static void setup_trigger(const struct device *dev) +{ + int ret; + struct sensor_trigger trig = { + .type = SENSOR_TRIG_NEAR_FAR, + }; + + ret = sensor_trigger_set(dev, &trig, sensor_trigger_handler); + if (ret) { + printk("sensor_trigger_set err %d\n", ret); + } + + struct sensor_trigger trig2 = { + .type = SENSOR_TRIG_SX9328_NEAR_FAR_TBL_BDY, + }; + + ret = sensor_trigger_set(dev, &trig2, sensor_trigger_handler); + if (ret) { + printk("sensor_trigger_set err %d\n", ret); + } +} + +void do_main(const struct device *dev) +{ + setup_trigger(dev); + + while (1) { + k_sleep(K_MSEC(1000)); + } +} + +#else /* CONFIG_SX9328_TRIGGER */ + +static void do_main(const struct device *dev) +{ + int ret; + struct sensor_value prox_value; + + while (1) { + ret = sensor_sample_fetch(dev); + if (ret) { + printk("sensor_sample_fetch failed ret %d\n", ret); + return; + } + + ret = sensor_channel_get(dev, SENSOR_CHAN_PROX, &prox_value); + printk("prox is %d\n", prox_value.val1); + sensor_channel_get(dev, SENSOR_CHAN_SX9328_BDY_PRX, &prox_value); + printk("bdy_prox is %d\n", prox_value.val1); + sensor_channel_get(dev, SENSOR_CHAN_SX9328_TBL_PRX, &prox_value); + printk("tbl_prox is %d\n", prox_value.val1); + + k_sleep(K_MSEC(1000)); + } +} + +#endif /* CONFIG_SX9328_TRIGGER */ + +void main(void) +{ + const struct device *const dev = DEVICE_DT_GET_ONE(semtech_sx9328); + + if (!device_is_ready(dev)) { + printk("sensor: device not ready.\n"); + return; + } + + printk("device is %p, name is %s\n", dev, dev->name); + + do_main(dev); +} diff --git a/samples/subsys/nvs/sample.yaml b/samples/subsys/nvs/sample.yaml index b1f237c6ef2..e2249e9f3eb 100644 --- a/samples/subsys/nvs/sample.yaml +++ b/samples/subsys/nvs/sample.yaml @@ -5,7 +5,7 @@ tests: sample.nvs.basic: tags: nvs depends_on: nvs - platform_exclude: qemu_x86 tmo_dev_edge + platform_exclude: qemu_x86 integration_platforms: - nrf52dk_nrf52832 harness: console diff --git a/samples/subsys/shell/shell_module/boards/efm32pg_stk3402a.conf b/samples/subsys/shell/shell_module/boards/efm32pg_stk3402a.conf deleted file mode 100644 index 08247ce7b94..00000000000 --- a/samples/subsys/shell/shell_module/boards/efm32pg_stk3402a.conf +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2022 T-Mobile USA, Inc. -# -# SPDX-License-Identifier: Apache-2.0 - -CONFIG_SHELL=y -CONFIG_GPIO_SHELL=y -CONFIG_DEVICE_SHELL=y -CONFIG_I2C=y -CONFIG_REBOOT=y -CONFIG_LED=y -CONFIG_LED_PWM=y -CONFIG_LED_SHELL=y -CONFIG_PWM=y -CONFIG_PWM_SHELL=y -CONFIG_PWM_GECKO=y diff --git a/samples/subsys/task_wdt/sample.yaml b/samples/subsys/task_wdt/sample.yaml index be1a0f6b732..c3ebffebf42 100644 --- a/samples/subsys/task_wdt/sample.yaml +++ b/samples/subsys/task_wdt/sample.yaml @@ -21,4 +21,3 @@ tests: platform_exclude: - s32z270dc2_rtu0_r52 - s32z270dc2_rtu1_r52 - - tmo_dev_edge \ No newline at end of file diff --git a/tests/benchmarks/sched/testcase.yaml b/tests/benchmarks/sched/testcase.yaml index bb02493074c..6ec2987d335 100644 --- a/tests/benchmarks/sched/testcase.yaml +++ b/tests/benchmarks/sched/testcase.yaml @@ -13,4 +13,3 @@ tests: regex: - "unpend\\s+\\d* ready\\s+\\d* switch\\s+\\d* pend\\s+\\d* tot\\s+\\d* \\(avg\\s+\\d*\\)" - "fin" - platform_exclude: tmo_dev_edge diff --git a/tests/drivers/counter/counter_basic_api/testcase.yaml b/tests/drivers/counter/counter_basic_api/testcase.yaml index 7f508029300..f31fa8f3af9 100644 --- a/tests/drivers/counter/counter_basic_api/testcase.yaml +++ b/tests/drivers/counter/counter_basic_api/testcase.yaml @@ -5,7 +5,7 @@ tests: - counter depends_on: counter min_ram: 16 - platform_exclude: nucleo_f302r8 tmo_dev_edge + platform_exclude: nucleo_f302r8 timeout: 600 drivers.counter.basic_api.nrf_zli: tags: diff --git a/tests/drivers/flash/common/testcase.yaml b/tests/drivers/flash/common/testcase.yaml index 7624b59538e..942589ec3ec 100644 --- a/tests/drivers/flash/common/testcase.yaml +++ b/tests/drivers/flash/common/testcase.yaml @@ -34,7 +34,6 @@ tests: and dt_label_with_parent_compat_enabled("storage_partition", "fixed-partitions")) integration_platforms: - qemu_x86 - platform_exclude: tmo_dev_edge drivers.flash.common.tfm_ns: build_only: true filter: (CONFIG_FLASH_HAS_DRIVER_ENABLED and CONFIG_TRUSTED_EXECUTION_NONSECURE diff --git a/tests/drivers/gpio/gpio_basic_api/boards/efm32pg_stk3402a.overlay b/tests/drivers/gpio/gpio_basic_api/boards/efm32pg_stk3402a.overlay deleted file mode 100644 index fd96377e639..00000000000 --- a/tests/drivers/gpio/gpio_basic_api/boards/efm32pg_stk3402a.overlay +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2022 T-Mobile USA, Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/ { - resources { - compatible = "test-gpio-basic-api"; - out-gpios = <&gpioa 3 0>; - in-gpios = <&gpioa 4 0>; - }; -}; diff --git a/tests/drivers/regulator/fixed/boards/efm32pg_stk3402a.overlay b/tests/drivers/regulator/fixed/boards/efm32pg_stk3402a.overlay deleted file mode 100644 index 9d90707bc01..00000000000 --- a/tests/drivers/regulator/fixed/boards/efm32pg_stk3402a.overlay +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) 2022 T-Mobile USA, Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include "test_common.dtsi" - -/ { - regulator { - enable-gpios = <&gpioa 3 GPIO_ACTIVE_HIGH>; - }; - resources { - check-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; - }; -}; diff --git a/tests/kernel/mem_slab/mslab/testcase.yaml b/tests/kernel/mem_slab/mslab/testcase.yaml index 4b7f30b8c24..c941019277e 100644 --- a/tests/kernel/mem_slab/mslab/testcase.yaml +++ b/tests/kernel/mem_slab/mslab/testcase.yaml @@ -3,4 +3,3 @@ tests: tags: - kernel - memory_slabs - platform_exclude: tmo_dev_edge diff --git a/tests/kernel/usage/thread_runtime_stats/testcase.yaml b/tests/kernel/usage/thread_runtime_stats/testcase.yaml index 4ed4dc85a8f..30d67c3741c 100644 --- a/tests/kernel/usage/thread_runtime_stats/testcase.yaml +++ b/tests/kernel/usage/thread_runtime_stats/testcase.yaml @@ -16,4 +16,3 @@ tests: integration_platforms: - qemu_x86 - mps2_an385 - platform_exclude: tmo_dev_edge \ No newline at end of file diff --git a/tests/kernel/workq/work_queue/testcase.yaml b/tests/kernel/workq/work_queue/testcase.yaml index b24f59d7df9..a75e33ad0cc 100644 --- a/tests/kernel/workq/work_queue/testcase.yaml +++ b/tests/kernel/workq/work_queue/testcase.yaml @@ -4,4 +4,3 @@ tests: tags: - kernel - workqueue - platform_exclude: tmo_dev_edge \ No newline at end of file diff --git a/tests/lib/cmsis_dsp/filtering/testcase.yaml b/tests/lib/cmsis_dsp/filtering/testcase.yaml index 6280662a46c..80705309a45 100644 --- a/tests/lib/cmsis_dsp/filtering/testcase.yaml +++ b/tests/lib/cmsis_dsp/filtering/testcase.yaml @@ -108,7 +108,6 @@ tests: extra_args: CONF_FILE=prj_base.conf extra_configs: - CONFIG_CMSIS_DSP_TEST_FILTERING_MISC=y - platform_exclude: tmo_dev_edge libraries.cmsis_dsp.filtering.misc.fpu: filter: ((CONFIG_CPU_AARCH32_CORTEX_R or CONFIG_CPU_CORTEX_M) and CONFIG_CPU_HAS_FPU and TOOLCHAIN_HAS_NEWLIB == 1) or CONFIG_ARCH_POSIX @@ -124,4 +123,3 @@ tests: extra_configs: - CONFIG_CMSIS_DSP_TEST_FILTERING_MISC=y - CONFIG_FPU=y - platform_exclude: tmo_dev_edge diff --git a/tests/subsys/dsp/basicmath/testcase.yaml b/tests/subsys/dsp/basicmath/testcase.yaml index 8e097decc74..e99c6d09a0c 100644 --- a/tests/subsys/dsp/basicmath/testcase.yaml +++ b/tests/subsys/dsp/basicmath/testcase.yaml @@ -9,7 +9,6 @@ tests: tags: zdsp min_flash: 128 min_ram: 64 - platform_exclude: tmo_dev_edge zdsp.basicmath.fpu: filter: (CONFIG_CPU_HAS_FPU and TOOLCHAIN_HAS_NEWLIB == 1) or CONFIG_ARCH_POSIX integration_platforms: @@ -22,7 +21,6 @@ tests: - CONFIG_FPU=y min_flash: 128 min_ram: 64 - platform_exclude: tmo_dev_edge zdsp.basicmath.arcmwdt: filter: CONFIG_ISA_ARCV2 toolchain_allow: arcmwdt diff --git a/tests/subsys/jwt/testcase.yaml b/tests/subsys/jwt/testcase.yaml index 113672f9411..a09a34a898c 100644 --- a/tests/subsys/jwt/testcase.yaml +++ b/tests/subsys/jwt/testcase.yaml @@ -9,4 +9,3 @@ tests: filter: CONFIG_ENTROPY_HAS_DRIVER integration_platforms: - frdm_k64f - platform_exclude: tmo_dev_edge diff --git a/tests/subsys/logging/log_backend_init/testcase.yaml b/tests/subsys/logging/log_backend_init/testcase.yaml index a6abe3cb1a3..a8f9144f7ec 100644 --- a/tests/subsys/logging/log_backend_init/testcase.yaml +++ b/tests/subsys/logging/log_backend_init/testcase.yaml @@ -6,4 +6,3 @@ tests: - log_core - logging filter: not CONFIG_LOG_MODE_IMMEDIATE - platform_exclude: tmo_dev_edge diff --git a/tests/subsys/logging/log_core_additional/testcase.yaml b/tests/subsys/logging/log_core_additional/testcase.yaml index ac256200019..a4919fc8ad6 100644 --- a/tests/subsys/logging/log_core_additional/testcase.yaml +++ b/tests/subsys/logging/log_core_additional/testcase.yaml @@ -4,7 +4,6 @@ tests: extra_args: CONF_FILE=prj.conf integration_platforms: - native_posix - platform_exclude: tmo_dev_edge logging.add.sync: tags: logging extra_args: CONF_FILE=log_sync.conf diff --git a/tests/subsys/logging/log_timestamp/testcase.yaml b/tests/subsys/logging/log_timestamp/testcase.yaml index b6f100ca22d..973bb04eb47 100644 --- a/tests/subsys/logging/log_timestamp/testcase.yaml +++ b/tests/subsys/logging/log_timestamp/testcase.yaml @@ -15,4 +15,3 @@ tests: - timestamp extra_configs: - CONFIG_LOG_OUTPUT_FORMAT_CUSTOM_TIMESTAMP=y - platform_exclude: tmo_dev_edge \ No newline at end of file diff --git a/tests/subsys/portability/cmsis_rtos_v2/testcase.yaml b/tests/subsys/portability/cmsis_rtos_v2/testcase.yaml index 1a4e7d13ec0..0b198c71297 100644 --- a/tests/subsys/portability/cmsis_rtos_v2/testcase.yaml +++ b/tests/subsys/portability/cmsis_rtos_v2/testcase.yaml @@ -1,6 +1,6 @@ tests: portability.cmsis_rtos_v2: - platform_exclude: m2gl025_miv tmo_dev_edge + platform_exclude: m2gl025_miv tags: cmsis_rtos min_ram: 32 min_flash: 34 diff --git a/tests/subsys/rtio/rtio_api/testcase.yaml b/tests/subsys/rtio/rtio_api/testcase.yaml index 1fd63f722e7..7f9f7b9028f 100644 --- a/tests/subsys/rtio/rtio_api/testcase.yaml +++ b/tests/subsys/rtio/rtio_api/testcase.yaml @@ -25,7 +25,6 @@ tests: - userspace integration_platforms: - qemu_x86 - platform_exclude: tmo_dev_edge rtio.api.userspace.submit_sem: filter: CONFIG_ARCH_HAS_USERSPACE extra_configs: @@ -36,4 +35,3 @@ tests: - userspace integration_platforms: - qemu_x86 - platform_exclude: tmo_dev_edge \ No newline at end of file diff --git a/west.yml b/west.yml index ba7d6715d2e..f7c45b5e11a 100644 --- a/west.yml +++ b/west.yml @@ -126,7 +126,7 @@ manifest: - name: cxd5605_lib path: modules/hal/sony/cxd5605 url: https://github.com/tmobile/DevEdge-IoTDevKit-Sony-cxd5605.git - revision: fd99bda2a06a9f7659b19a11534c5e1f83ffb6f1 + revision: aa915e3d29acdfc554dd9ffa53284fa11064d16a groups: - hal - name: edtt