From a0a8cb422cec48d767a5961957ccacdba4e2b3e9 Mon Sep 17 00:00:00 2001 From: Daniel Nemeth <97036561+silabs-DanielN@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:08:10 +0200 Subject: [PATCH] Third Party Hardware Drivers Extension v2.0.2 --- README.md | 5 +- .../example/mikroe_uwb2_dwm3000/README.md | 104 + .../image/create_example.png | Bin 0 -> 70765 bytes .../image/custom_linker.png | Bin 0 -> 29818 bytes .../image/hardware_connection.png | Bin 0 -> 297368 bytes .../mikroe_uwb2_dwm3000/image/rx_log.png | Bin 0 -> 17909 bytes .../mikroe_uwb2_dwm3000/image/tx_log.png | Bin 0 -> 17291 bytes .../adafruit_neotrellis_keypad_atsamd09.slcp | 2 +- .../adafruit_rgb_led_is31fl3741.slcp | 2 +- .../adafruit_tft_lcd_hxd8357d.slcp | 2 +- .../adafruit_tft_lcd_hxd8357d_dma.slcp | 2 +- .../adafruit_tft_lcd_hxd8357d_lvgl.slcp | 2 +- .../adafruit_tft_lcd_hxd8357d_lvgl_dma.slcp | 2 +- .../adafruit_tft_lcd_ili9341.slcp | 2 +- .../adafruit_tft_lcd_ili9341_dma.slcp | 2 +- .../adafruit_tft_lcd_ili9341_lvgl.slcp | 2 +- .../adafruit_tft_lcd_ili9341_lvgl_dma.slcp | 2 +- .../adafruit_tft_lcd_st7789.slcp | 2 +- .../adafruit_tft_lcd_st7789_dma.slcp | 2 +- .../adafruit_tft_lcd_st7789_lvgl_dma.slcp | 2 +- .../adafruit_touchscreen_tsc2007.slcp | 2 +- app/example/bthome_v2_server/app.c | 4 +- .../bthome_v2_server/bthome_v2_server.slcp | 6 +- .../maxim_fuel_gauge_max17048.slcp | 2 +- .../mikroe_accel5_bma400_i2c.slcp | 2 +- .../mikroe_accel5_bma400_spi.slcp | 2 +- .../mikroe_alcohol_mq3.slcp | 2 +- .../mikroe_barcode2_em3080w.slcp | 2 +- .../mikroe_brushless16_lb11685av.slcp | 2 +- .../mikroe_buzz2_cmt_8540s_smt.slcp | 2 +- .../mikroe_captouch2_cap1166.slcp | 2 +- app/example/mikroe_co_mq7/mikroe_co_mq7.slcp | 2 +- .../mikroe_dcmotor24_l9958.slcp | 2 +- .../mikroe_dcmotor26_tb9053ftg.slcp | 2 +- .../mikroe_dcmotor3_tb6549fg.slcp | 2 +- .../mikroe_e_paper_154_inch.slcp | 2 +- app/example/mikroe_emg/mikroe_emg.slcp | 2 +- .../mikroe_environment2_sht40_sgp40.slcp | 2 +- .../mikroe_environment3_bme688_i2c.slcp | 2 +- .../mikroe_environment3_bme688_spi.slcp | 2 +- .../mikroe_eth_wiz_w5500.slcp | 2 +- .../mikroe_fingerprint2_a172mrq.slcp | 2 +- .../mikroe_force3_fsr400.slcp | 2 +- .../mikroe_gps_lea6s/mikroe_gps_lea6s.slcp | 2 +- .../mikroe_heartrate2_maxm86161.slcp | 2 +- .../mikroe_heartrate4_max30101.slcp | 2 +- .../mikroe_hvac_bundle_scd41_sps30.slcp | 2 +- .../mikroe_hvac_scd41/mikroe_hvac_scd41.slcp | 2 +- .../mikroe_irthermo3_mlx90632.slcp | 2 +- .../mikroe_lte_iot2_bg96.slcp | 2 +- app/example/mikroe_mic2/mikroe_mic2.slcp | 2 +- .../mikroe_microsd/mikroe_microsd.slcp | 2 +- .../mikroe_nfc2_pn7150.slcp | 2 +- .../pn7150_nci_t2t_read.slcp | 2 +- .../pn7150_nci_t2t_write.slcp | 2 +- .../mikroe_nfctag2_nt3h2111.slcp | 2 +- .../mikroe_obdii_stn1110.slcp | 2 +- .../mikroe_oledc_ssd1351.slcp | 2 +- .../mikroe_oledw_ssd1306.slcp | 2 +- .../mikroe_oledw_ssd1306_glib.slcp | 2 +- .../mikroe_ozone2_mq131.slcp | 2 +- .../mikroe_pir_pl_n823_01.slcp | 2 +- .../mikroe_pressure3_dps310_i2c.slcp | 2 +- .../mikroe_pressure3_dps310_spi.slcp | 2 +- .../mikroe_pwm_driver_si8711cc.slcp | 2 +- .../mikroe_radar_mm5d91_00.slcp | 2 +- .../mikroe_relay2_lca717.slcp | 2 +- .../mikroe_rf_meter_ad8318.slcp | 2 +- app/example/mikroe_rng/mikroe_rng.slcp | 2 +- .../mikroe_rtc10_ds3231m.slcp | 2 +- .../mikroe_servo_pca9685.slcp | 2 +- .../mikroe_smoke2_adpd188bi_i2c.slcp | 2 +- .../mikroe_smoke2_adpd188bi_spi.slcp | 2 +- .../mikroe_stepper2_a4988.slcp | 2 +- .../mikroe_stepper_a3967.slcp | 2 +- .../mikroe_stretch/mikroe_stretch.slcp | 2 +- .../mikroe_temphum15_sht40.slcp | 2 +- .../mikroe_temphum9_shtc3.slcp | 2 +- .../mikroe_thunder_as3935.slcp | 2 +- .../mikroe_turbidity_tsd10.slcp | 2 +- .../mikroe_utm7segr_max6969.slcp | 2 +- .../mikroe_uv_ml8511a/mikroe_uv_ml8511a.slcp | 2 +- .../SimplicityStudio/mikroe_uwb2_dwm3000.slcp | 80 + .../mikroe_uwb2_dwm3000/app_files/app.c | 273 ++ .../mikroe_uwb2_dwm3000/app_files/app.h | 31 + .../app_files/config_options.c | 951 ++++ .../app_files/config_options.h | 281 ++ .../app_files/shared_defines.h | 71 + .../app_files/shared_functions.c | 696 +++ .../app_files/shared_functions.h | 294 ++ .../linker_files/brd2703a/linkerfile.ld | 257 + .../linker_files/brd4108a/linkerfile.ld | 255 + .../linker_files/brd4314a/linkerfile.ld | 255 + app/example/mikroe_uwb2_dwm3000/main.c | 80 + .../mikroe_water_detect.slcp | 2 +- .../silabs_ir_generate.slcp | 2 +- .../slave/silabs_lin_slave1.slcp | 2 +- .../slave/silabs_lin_slave2.slcp | 2 +- .../silabs_pir_ira_s210st01.slcp | 2 +- app/example/silabs_triac/silabs_triac.slcp | 2 +- .../sparkfun_accelerometer_mma8452q.slcp | 2 +- .../sparkfun_air_quality_sgp40.slcp | 2 +- .../sparkfun_distance_vl53l1x.slcp | 2 +- .../sparkfun_dosimeter_type5.slcp | 2 +- .../sparkfun_environmental_bme280_ccs811.slcp | 2 +- .../sparkfun_hr_po_max30101_max32664.slcp | 2 +- .../sparkfun_human_presence_ak9753.slcp | 2 +- .../sparkfun_ir_array_amg88xx.slcp | 2 +- .../sparkfun_ir_array_mlx90640.slcp | 2 +- .../sparkfun_micro_oled_ssd1306.slcp | 2 +- ...n_particulate_matter_sensor_sps30_i2c.slcp | 2 +- ..._particulate_matter_sensor_sps30_uart.slcp | 2 +- .../sparkfun_proximity_vcnl4040.slcp | 2 +- .../sparkfun_qwiic_joystick.slcp | 2 +- .../sparkfun_qwiic_keypad.slcp | 2 +- .../sparkfun_rfid_id12la.slcp | 2 +- .../sparkfun_soil_moisture.slcp | 2 +- .../sparkfun_spectroscopy_as7265x.slcp | 2 +- .../sparkfun_weatherstation.slcp | 2 +- .../drivers/silabs/silabs_uwb2_dwm3000.slcc | 94 + .../public/silabs/bthome_v2/src/bthome_v2.c | 63 +- .../config/brd2703a/uwb2_dwm3000_config.h | 127 + .../config/brd4108a/uwb2_dwm3000_config.h | 159 + .../config/brd4314a/uwb2_dwm3000_config.h | 159 + .../config/other/uwb2_dwm3000_config.h | 167 + .../deca_probe/deca_probe_interface.c | 31 + .../deca_probe/deca_probe_interface.h | 19 + .../platform/deca_sleep/deca_sleep.c | 28 + .../uwb2_dwm3000/platform/deca_spi/deca_spi.c | 227 + .../uwb2_dwm3000/platform/deca_spi/deca_spi.h | 55 + .../silabs/uwb2_dwm3000/platform/port/port.h | 47 + .../uwb2_dwm3000/platform/port/port_dw3000.c | 263 + .../uwb2_dwm3000/platform/port/port_hal.h | 57 + .../decawave/uwb2_dwm3000/inc/common.h | 147 + .../decawave/uwb2_dwm3000/inc/deca_dbg.h | 126 + .../uwb2_dwm3000/inc/deca_device_api.h | 4321 +++++++++++++++++ .../uwb2_dwm3000/inc/deca_interface.h | 679 +++ .../decawave/uwb2_dwm3000/inc/deca_types.h | 90 + .../decawave/uwb2_dwm3000/inc/deca_version.h | 40 + .../decawave/uwb2_dwm3000/inc/error.h | 106 + .../uwb2_dwm3000/inc/rtls_interface.h | 415 ++ .../decawave/uwb2_dwm3000/inc/uwb_frames.h | 450 ++ .../decawave/uwb2_dwm3000/inc/version.h | 111 + .../lib/libdwt_uwb_driver-m33-hfp-6.0.7.a | Bin 0 -> 166866 bytes .../lib/libdwt_uwb_driver-m4-hfp-6.0.7.a | Bin 0 -> 166854 bytes templates.xml | 15 + third_party_hw_drivers.slce | 2 +- third_party_hw_drivers.slsdk | 4 +- 148 files changed, 11716 insertions(+), 125 deletions(-) create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/README.md create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/image/create_example.png create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/image/custom_linker.png create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/image/hardware_connection.png create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/image/rx_log.png create mode 100644 app/documentation/example/mikroe_uwb2_dwm3000/image/tx_log.png create mode 100644 app/example/mikroe_uwb2_dwm3000/SimplicityStudio/mikroe_uwb2_dwm3000.slcp create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/app.c create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/app.h create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/config_options.c create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/config_options.h create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/shared_defines.h create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.c create mode 100644 app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.h create mode 100644 app/example/mikroe_uwb2_dwm3000/linker_files/brd2703a/linkerfile.ld create mode 100644 app/example/mikroe_uwb2_dwm3000/linker_files/brd4108a/linkerfile.ld create mode 100644 app/example/mikroe_uwb2_dwm3000/linker_files/brd4314a/linkerfile.ld create mode 100644 app/example/mikroe_uwb2_dwm3000/main.c create mode 100644 driver/component/drivers/silabs/silabs_uwb2_dwm3000.slcc create mode 100644 driver/public/silabs/uwb2_dwm3000/config/brd2703a/uwb2_dwm3000_config.h create mode 100644 driver/public/silabs/uwb2_dwm3000/config/brd4108a/uwb2_dwm3000_config.h create mode 100644 driver/public/silabs/uwb2_dwm3000/config/brd4314a/uwb2_dwm3000_config.h create mode 100644 driver/public/silabs/uwb2_dwm3000/config/other/uwb2_dwm3000_config.h create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.c create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.h create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/deca_sleep/deca_sleep.c create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.c create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.h create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/port/port.h create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/port/port_dw3000.c create mode 100644 driver/public/silabs/uwb2_dwm3000/platform/port/port_hal.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/common.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_dbg.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_device_api.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_interface.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_types.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_version.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/error.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/rtls_interface.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/uwb_frames.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/inc/version.h create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m33-hfp-6.0.7.a create mode 100644 driver/thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m4-hfp-6.0.7.a diff --git a/README.md b/README.md index ce844069..8ed2d581 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Third Party Hardware Drivers # -[![Version Badge](https://img.shields.io/badge/-v2.0.1-green)](https://github.com/SiliconLabs/third_party_hw_drivers_extension/releases) +[![Version Badge](https://img.shields.io/badge/-v2.0.2-green)](https://github.com/SiliconLabs/third_party_hw_drivers_extension/releases) [![GSDK Badge](https://img.shields.io/badge/GSDK-v4.4.0-green)](https://github.com/SiliconLabs/gecko_sdk/releases) ![License badge](https://img.shields.io/badge/License-Zlib-green) @@ -98,8 +98,9 @@ A full list of all drivers in this repository is defined below: | particulate_matter_sensor_sps30 | [Click Here](./driver/public/silabs/particulate_matter_sensor_sps30) | [Click Here](./app/example/sparkfun_particulate_matter_sensor_sps30) | [Click Here](./app/documentation/example/sparkfun_particulate_matter_sensor_sps30) | | adafruit_neotrellis_keypad_atsamd09 | [Click Here](./driver/public/silabs/adafruit_neotrellis_keypad_atsamd09) | [Click Here](./app/example/adafruit_neotrellis_keypad_atsamd09) | [Click Here](./app/documentation/example/adafruit_neotrellis_keypad_atsamd09) | | hvac_bundle_scd41_sps30 | [Click Here](./driver/public/mikroe/hvac_scd41)
[Click Here](./driver/public/silabs/particulate_matter_sensor_sps30)| [Click Here](./app/example/mikroe_hvac_bundle_scd41_sps30) | [Click Here](./app/documentation/example/mikroe_hvac_bundle_scd41_sps30) | -| mikroe_uwb_dwm1000 | [Click Here](./driver/public/mikroe/uwb_dwm1000) | [Click Here](./app/example/mikroe_uwb_dwm1000) | [Click Here](./app/documentation/example/mikroe_uwb_dwm1000) | | mikroe_pir_pl_n823_01 | [Click Here](./driver/public/mikroe/pir_pl_n823_01) | [Click Here](./app/example/mikroe_pir_pl_n823_01) | [Click Here](./app/documentation/example/mikroe_pir_pl_n823_01) | +| mikroe_uwb_dwm1000 | [Click Here](./driver/public/mikroe/uwb_dwm1000) | [Click Here](./app/example/mikroe_uwb_dwm1000) | [Click Here](./app/documentation/example/mikroe_uwb_dwm1000) | +| mikroe_uwb2_dwm3000 | [Click Here](./driver/public/silabs/uwb2_dwm3000) | [Click Here](./app/example/mikroe_uwb2_dwm3000) | [Click Here](./app/documentation/example/mikroe_uwb2_dwm3000) | ## Requirements ## - Desired Silicon Labs Starter Kit diff --git a/app/documentation/example/mikroe_uwb2_dwm3000/README.md b/app/documentation/example/mikroe_uwb2_dwm3000/README.md new file mode 100644 index 00000000..ab7cc9d9 --- /dev/null +++ b/app/documentation/example/mikroe_uwb2_dwm3000/README.md @@ -0,0 +1,104 @@ +# DWM3000 - UWB 2 Click (Mikroe) # + +## Summary ## + +This example project showcases the driver integration of the Mikroe DWM3000 - UWB 2 Click board™. + +UWB 2 Click board™ is an Ultra-Wideband transceiver. It features the DWM3000, an IEEE 802.15-z UWB transceiver module from Qorvo. This module fully aligns with FiRaTM PHY, MAC, and certification development. It uses an integrated UWB antenna to establish wireless communication in UWB channels 5 (6.5GHz) and 9 (8GHz). This Click board™ is optimized for developing precision real-time positioning system (RTLS) applications using two-way ranging diagrams or Time Difference of Arrival (TDoA). It can also be applied in many other fields such as agriculture, automation & building controls, factory automation, healthcare, safety & security and warehousing & logistics. + +## Required Hardware ## + +- [EFR32xG24 Explorer Kit](https://www.silabs.com/development-tools/wireless/efr32xg24-explorer-kit?tab=overview) + +- [UWB 2 Click board™](https://www.mikroe.com/uwb-2-click) + +**NOTE:** +Tested boards for working with this example: + +| Board ID | Description | +| ---------------------- | ------ | +| BRD2703A | [xG24-EK2703A - EFR32xG24 Explorer Kit](https://www.silabs.com/development-tools/wireless/efr32xg24-explorer-kit?tab=overview) | +| BRD4314A | [BGM220-EK4314A - BGM220P Bluetooth Module Explorer Kit](https://www.silabs.com/development-tools/wireless/bluetooth/bgm220-explorer-kit?tab=overview) | +| BRD4108A | [BG22-EK4108A - EFR32BG22 Explorer Kit Board](https://www.silabs.com/development-tools/wireless/bluetooth/bg22-explorer-kit?tab=overview) | + +## Hardware Connection ## + +The DWM3000 - UWB 2 Click board™ supports MikroBus. Therefore, it can connect easily to the MikroBus header of the EFR32xG24 Explorer Kit. Be sure that the 45-degree corner of the board matches the 45-degree white line of the Explorer Kit. The hardware connection is shown in the image below: + +![board](image/hardware_connection.png) + +## Setup ## + +You can either create a project based on an example project or start with an empty example project. + +### Create a project based on an example project ### + +1. From the Launcher Home, add the BRD2703A to My Products, click on it, and click on the **EXAMPLE PROJECTS & DEMOS** tab. Find the example project filtering by "uwb 2". + +2. Click **Create** button on the **Third Party Hardware Drivers - DWM3000 - UWB 2 Click (Mikroe)** example. Example project creation dialog pops up -> click Create and Finish and Project should be generated. + +![create_example](image/create_example.png) + +3. Build and flash this example to the board. + +### Start with an empty example project ### + +1. Create an "Empty C Project" for the "EFR32xG24 Explorer Kit" using Simplicity Studio v5. Use the default project settings. + +2. Copy all of the files in the "app/example/mikroe_uwb2_dwm3000/app_files" folder into the project root folder (overwriting the existing file). + +3. Install the software components: + + - Open the *.slcp file in the project. + + - Select the SOFTWARE COMPONENTS tab. + + - Install the following components: + + - **[Services] → [IO Stream] → [IO Stream: EUSART]** → default instance name: vcom + - **[Application] → [Utility] → [Log]** + - **[Application] → [Utility] → [Assert]** + - **[Services] → [Timers] → [Sleep Timer]** + - **[Third Party Hardware Drivers] → [Wireless Connectivity] → [DWM3000 - UWB 2 Click (Mikroe)]** → use default configuration + +4. Editing the Linker File: + - From the project root folder, open "autogen/linkerfile.ld" file and copy the following section to the autogenerated linker: + ``` + .dw_drivers ALIGN(4): + { + __dw_drivers_start = . ; + KEEP(*(.dw_drivers*)) + __dw_drivers_end = . ; + } > FLASH + ``` + The final "linkerfile.ld" file after editing is shown in the image below: + + ![linker](image/custom_linker.png) + +5. Build and flash this example to the board. + +**Note:** + +- Make sure that the SDK extension has already been installed. If not, please follow [this documentation](https://github.com/SiliconLabs/third_party_hw_drivers_extension/blob/master/README.md#how-to-add-to-simplicity-studio-ide). + +- SDK Extension must be enabled for the project to install "DWM3000 - UWB 2 Click (Mikroe)" component. + +## How It Works # + +After you flash the code to the Explorer Kit and power the connected boards, the application starts running automatically. Use Putty/Tera Term (or another program) to read the values of the serial output. Note that the EFR32xG24 Explorer Kit board uses the default baud rate of 115200. + +First, the user must have two boards to run this demo example, one for the Transmitter, and one for Receiver. The user can decide whether to use the device in Transmitter (Tx) or Receiver (Rx) mode by macro "DEMO_APP_TRANSMITTER" in the "app.c" file. + +In Tx mode, the main program initializes the driver, reads some information and checks communication with the dwm3000 device. After that, it transmits a packet message periodically. There is a periodic timer in the code, which determines the transmitting intervals; the default transmitting intervals rate is 2000 ms. If you need more frequent transmitting, it is possible to change the value of the macro "TRANSMITTING_INTERVAL_MSEC" in the "app.c" file. The screenshot of the console is shown in the image below: + +![transmit](image/tx_log.png) + +In Rx mode, the main program initializes the driver, reads some information and checks communication with the dwm3000 device. After that, the device enters receiver mode, and it prints each received packet. The screenshot of the console is shown in the image below: + +![receive](image/rx_log.png) + +## Report Bugs & Get Support ## + +To report bugs in the Application Examples projects, please create a new "Issue" in the "Issues" section of [third_party_hw_drivers_extension](https://github.com/SiliconLabs/third_party_hw_drivers_extension) repo. Please reference the board, project, and source files associated with the bug, and reference line numbers. If you are proposing a fix, also include information on the proposed fix. Since these examples are provided as-is, there is no guarantee that these examples will be updated to fix these issues. + +Questions and comments related to these examples should be made by creating a new "Issue" in the "Issues" section of [third_party_hw_drivers_extension](https://github.com/SiliconLabs/third_party_hw_drivers_extension) repo. \ No newline at end of file diff --git a/app/documentation/example/mikroe_uwb2_dwm3000/image/create_example.png b/app/documentation/example/mikroe_uwb2_dwm3000/image/create_example.png new file mode 100644 index 0000000000000000000000000000000000000000..03e0c0765e9d05a7182f96447532d92677b3c10f GIT binary patch literal 70765 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

FM@=f@*8|S8c4UCk`~=I@t(i)fvN9j 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 Okdi#)ao!`d*Z&8MSV3R_ literal 0 HcmV?d00001 diff --git a/app/documentation/example/mikroe_uwb2_dwm3000/image/tx_log.png b/app/documentation/example/mikroe_uwb2_dwm3000/image/tx_log.png new file mode 100644 index 0000000000000000000000000000000000000000..6789b3384782db52fa098c8709089ae7a09638c8 GIT binary patch literal 17291 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 E0H^&TlK=n! literal 0 HcmV?d00001 diff --git a/app/example/adafruit_neotrellis_keypad_atsamd09/adafruit_neotrellis_keypad_atsamd09.slcp b/app/example/adafruit_neotrellis_keypad_atsamd09/adafruit_neotrellis_keypad_atsamd09.slcp index 5bcfef62..62fb38e3 100644 --- a/app/example/adafruit_neotrellis_keypad_atsamd09/adafruit_neotrellis_keypad_atsamd09.slcp +++ b/app/example/adafruit_neotrellis_keypad_atsamd09/adafruit_neotrellis_keypad_atsamd09.slcp @@ -39,7 +39,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_neotrellis_keypad_atsamd09/image/connection.png diff --git a/app/example/adafruit_rgb_led_is31fl3741/adafruit_rgb_led_is31fl3741.slcp b/app/example/adafruit_rgb_led_is31fl3741/adafruit_rgb_led_is31fl3741.slcp index f33f1fef..8203ae7c 100644 --- a/app/example/adafruit_rgb_led_is31fl3741/adafruit_rgb_led_is31fl3741.slcp +++ b/app/example/adafruit_rgb_led_is31fl3741/adafruit_rgb_led_is31fl3741.slcp @@ -46,7 +46,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_rgb_led_is31fl3741/image/connection.png directory: "image" diff --git a/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d.slcp b/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d.slcp index 9e6552f5..0984025f 100644 --- a/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d.slcp +++ b/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_hxd8357d/image/create_example_with_dma_mode.png diff --git a/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d_dma.slcp b/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d_dma.slcp index fd240dc1..58e0f4e6 100644 --- a/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d_dma.slcp +++ b/app/example/adafruit_tft_lcd_hxd8357d/adafruit_tft_lcd_hxd8357d_dma.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_hxd8357d/image/create_example_with_dma_mode.png diff --git a/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl.slcp b/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl.slcp index f9e66262..45e43a7c 100644 --- a/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl.slcp +++ b/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl.slcp @@ -66,7 +66,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_hxd8357d_lvgl/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl_dma.slcp b/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl_dma.slcp index c5b83ffd..f31263aa 100644 --- a/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl_dma.slcp +++ b/app/example/adafruit_tft_lcd_hxd8357d_lvgl/adafruit_tft_lcd_hxd8357d_lvgl_dma.slcp @@ -68,7 +68,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_hxd8357d_lvgl/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341.slcp b/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341.slcp index 32de5b8c..8163dc2a 100644 --- a/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341.slcp +++ b/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_ili9341/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341_dma.slcp b/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341_dma.slcp index 49d22595..2c652278 100644 --- a/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341_dma.slcp +++ b/app/example/adafruit_tft_lcd_ili9341/adafruit_tft_lcd_ili9341_dma.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_ili9341/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl.slcp b/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl.slcp index 8050882a..2043f617 100644 --- a/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl.slcp +++ b/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl.slcp @@ -88,7 +88,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 configuration: - name: LV_BUFFER_MODE diff --git a/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl_dma.slcp b/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl_dma.slcp index 8dca8837..2522d7c7 100644 --- a/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl_dma.slcp +++ b/app/example/adafruit_tft_lcd_ili9341_lvgl/adafruit_tft_lcd_ili9341_lvgl_dma.slcp @@ -60,7 +60,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 configuration: - name: LV_BUFFER_MODE diff --git a/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789.slcp b/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789.slcp index decf0a13..3987d8e4 100644 --- a/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789.slcp +++ b/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789.slcp @@ -49,7 +49,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_st7789/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789_dma.slcp b/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789_dma.slcp index bf9ff247..763718df 100644 --- a/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789_dma.slcp +++ b/app/example/adafruit_tft_lcd_st7789/adafruit_tft_lcd_st7789_dma.slcp @@ -50,7 +50,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_st7789/image/create_example.png diff --git a/app/example/adafruit_tft_lcd_st7789_lvgl_dma/adafruit_tft_lcd_st7789_lvgl_dma.slcp b/app/example/adafruit_tft_lcd_st7789_lvgl_dma/adafruit_tft_lcd_st7789_lvgl_dma.slcp index 5e2290f3..783e71f2 100644 --- a/app/example/adafruit_tft_lcd_st7789_lvgl_dma/adafruit_tft_lcd_st7789_lvgl_dma.slcp +++ b/app/example/adafruit_tft_lcd_st7789_lvgl_dma/adafruit_tft_lcd_st7789_lvgl_dma.slcp @@ -59,7 +59,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_tft_lcd_st7789_lvgl_dma/image/create_example.png diff --git a/app/example/adafruit_touchscreen_tsc2007/adafruit_touchscreen_tsc2007.slcp b/app/example/adafruit_touchscreen_tsc2007/adafruit_touchscreen_tsc2007.slcp index a885e472..7eff814a 100644 --- a/app/example/adafruit_touchscreen_tsc2007/adafruit_touchscreen_tsc2007.slcp +++ b/app/example/adafruit_touchscreen_tsc2007/adafruit_touchscreen_tsc2007.slcp @@ -45,7 +45,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/adafruit_touchscreen_tsc2007/image/calib.png diff --git a/app/example/bthome_v2_server/app.c b/app/example/bthome_v2_server/app.c index 6bbca5ba..3be6904b 100644 --- a/app/example/bthome_v2_server/app.c +++ b/app/example/bthome_v2_server/app.c @@ -84,7 +84,7 @@ void sl_bt_on_event(sl_bt_msg_t *evt) == SIGNAL_LOG_DATA) { uint8_t mac[6]; uint8_t device_count; - bthome_v2_server_sensor_data_t object[5]; + bthome_v2_server_sensor_data_t object[10]; uint8_t object_count; bool encrypted; bool key_available; @@ -113,7 +113,7 @@ void sl_bt_on_event(sl_bt_msg_t *evt) object_count = 0; bthome_v2_server_sensor_data_read(mac, object, - 5, + 10, &object_count, NULL); diff --git a/app/example/bthome_v2_server/bthome_v2_server.slcp b/app/example/bthome_v2_server/bthome_v2_server.slcp index d7ae6990..98cec0ba 100644 --- a/app/example/bthome_v2_server/bthome_v2_server.slcp +++ b/app/example/bthome_v2_server/bthome_v2_server.slcp @@ -50,6 +50,10 @@ component: - id: gatt_service_device_information - id: app_log +toolchain_settings: + - option: gcc_linker_option + value: "-u _printf_float" + config_file: - override: component: gatt_configuration @@ -62,7 +66,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/bthome_v2_server/image/connection.png diff --git a/app/example/maxim_fuel_gauge_max17048/maxim_fuel_gauge_max17048.slcp b/app/example/maxim_fuel_gauge_max17048/maxim_fuel_gauge_max17048.slcp index 4df49ced..e8dcd58b 100644 --- a/app/example/maxim_fuel_gauge_max17048/maxim_fuel_gauge_max17048.slcp +++ b/app/example/maxim_fuel_gauge_max17048/maxim_fuel_gauge_max17048.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/maxim_fuel_gauge_max17048/image/overview.png diff --git a/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_i2c.slcp b/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_i2c.slcp index dd432d03..e3680251 100644 --- a/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_i2c.slcp +++ b/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_i2c.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_accel5_bma400/image/hardware_connection.png diff --git a/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_spi.slcp b/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_spi.slcp index 622a9a22..ab469ab7 100644 --- a/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_spi.slcp +++ b/app/example/mikroe_accel5_bma400/mikroe_accel5_bma400_spi.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_accel5_bma400/image/hardware_connection.png diff --git a/app/example/mikroe_alcohol_mq3/mikroe_alcohol_mq3.slcp b/app/example/mikroe_alcohol_mq3/mikroe_alcohol_mq3.slcp index 45c0a406..8477a387 100644 --- a/app/example/mikroe_alcohol_mq3/mikroe_alcohol_mq3.slcp +++ b/app/example/mikroe_alcohol_mq3/mikroe_alcohol_mq3.slcp @@ -45,7 +45,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_alcohol_mq3/image/create_project.png diff --git a/app/example/mikroe_barcode2_em3080w/mikroe_barcode2_em3080w.slcp b/app/example/mikroe_barcode2_em3080w/mikroe_barcode2_em3080w.slcp index c03d1845..92b7b966 100644 --- a/app/example/mikroe_barcode2_em3080w/mikroe_barcode2_em3080w.slcp +++ b/app/example/mikroe_barcode2_em3080w/mikroe_barcode2_em3080w.slcp @@ -53,7 +53,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_barcode2_em3080w/image/hardware_connection.png diff --git a/app/example/mikroe_brushless16_lb11685av/mikroe_brushless16_lb11685av.slcp b/app/example/mikroe_brushless16_lb11685av/mikroe_brushless16_lb11685av.slcp index be372117..4dc270c7 100644 --- a/app/example/mikroe_brushless16_lb11685av/mikroe_brushless16_lb11685av.slcp +++ b/app/example/mikroe_brushless16_lb11685av/mikroe_brushless16_lb11685av.slcp @@ -42,7 +42,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_brushless16_lb11685av/image/create_example.png diff --git a/app/example/mikroe_buzz2_cmt_8540s_smt/mikroe_buzz2_cmt_8540s_smt.slcp b/app/example/mikroe_buzz2_cmt_8540s_smt/mikroe_buzz2_cmt_8540s_smt.slcp index e0d62e9c..c2997ab5 100644 --- a/app/example/mikroe_buzz2_cmt_8540s_smt/mikroe_buzz2_cmt_8540s_smt.slcp +++ b/app/example/mikroe_buzz2_cmt_8540s_smt/mikroe_buzz2_cmt_8540s_smt.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_buzz2_cmt_8540s_smt/image/create_example.png diff --git a/app/example/mikroe_captouch2_cap1166/mikroe_captouch2_cap1166.slcp b/app/example/mikroe_captouch2_cap1166/mikroe_captouch2_cap1166.slcp index 8c947e05..534fcb85 100644 --- a/app/example/mikroe_captouch2_cap1166/mikroe_captouch2_cap1166.slcp +++ b/app/example/mikroe_captouch2_cap1166/mikroe_captouch2_cap1166.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_captouch2_cap1166/image/hardware_connection.png diff --git a/app/example/mikroe_co_mq7/mikroe_co_mq7.slcp b/app/example/mikroe_co_mq7/mikroe_co_mq7.slcp index da9aaa10..8b1a328c 100644 --- a/app/example/mikroe_co_mq7/mikroe_co_mq7.slcp +++ b/app/example/mikroe_co_mq7/mikroe_co_mq7.slcp @@ -58,7 +58,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 ui_hints: highlight: diff --git a/app/example/mikroe_dcmotor24_l9958/mikroe_dcmotor24_l9958.slcp b/app/example/mikroe_dcmotor24_l9958/mikroe_dcmotor24_l9958.slcp index 93b17c24..8c82e245 100644 --- a/app/example/mikroe_dcmotor24_l9958/mikroe_dcmotor24_l9958.slcp +++ b/app/example/mikroe_dcmotor24_l9958/mikroe_dcmotor24_l9958.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_dcmotor24_l9958/image/create_example.png diff --git a/app/example/mikroe_dcmotor26_tb9053ftg/mikroe_dcmotor26_tb9053ftg.slcp b/app/example/mikroe_dcmotor26_tb9053ftg/mikroe_dcmotor26_tb9053ftg.slcp index d0718b5d..18543776 100644 --- a/app/example/mikroe_dcmotor26_tb9053ftg/mikroe_dcmotor26_tb9053ftg.slcp +++ b/app/example/mikroe_dcmotor26_tb9053ftg/mikroe_dcmotor26_tb9053ftg.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_dcmotor26_tb9053ftg/image/create_project.png diff --git a/app/example/mikroe_dcmotor3_tb6549fg/mikroe_dcmotor3_tb6549fg.slcp b/app/example/mikroe_dcmotor3_tb6549fg/mikroe_dcmotor3_tb6549fg.slcp index 273a2fd9..b65df54e 100644 --- a/app/example/mikroe_dcmotor3_tb6549fg/mikroe_dcmotor3_tb6549fg.slcp +++ b/app/example/mikroe_dcmotor3_tb6549fg/mikroe_dcmotor3_tb6549fg.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_dcmotor3_tb6549fg/image/create_example.png diff --git a/app/example/mikroe_e_paper_154_inch/mikroe_e_paper_154_inch.slcp b/app/example/mikroe_e_paper_154_inch/mikroe_e_paper_154_inch.slcp index e690cf8c..ccf14950 100644 --- a/app/example/mikroe_e_paper_154_inch/mikroe_e_paper_154_inch.slcp +++ b/app/example/mikroe_e_paper_154_inch/mikroe_e_paper_154_inch.slcp @@ -34,7 +34,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_e_paper_154_inch/image/hardware_connection.png directory: image diff --git a/app/example/mikroe_emg/mikroe_emg.slcp b/app/example/mikroe_emg/mikroe_emg.slcp index e86721f7..8ca4ad33 100644 --- a/app/example/mikroe_emg/mikroe_emg.slcp +++ b/app/example/mikroe_emg/mikroe_emg.slcp @@ -41,7 +41,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_emg/image/create_example.png diff --git a/app/example/mikroe_environment2_sht40_sgp40/mikroe_environment2_sht40_sgp40.slcp b/app/example/mikroe_environment2_sht40_sgp40/mikroe_environment2_sht40_sgp40.slcp index 6dea0d8e..75ed1a9d 100644 --- a/app/example/mikroe_environment2_sht40_sgp40/mikroe_environment2_sht40_sgp40.slcp +++ b/app/example/mikroe_environment2_sht40_sgp40/mikroe_environment2_sht40_sgp40.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_environment2_sht40_sgp40/image/create_example.png diff --git a/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_i2c.slcp b/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_i2c.slcp index 8e34ee2c..c25b78fa 100644 --- a/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_i2c.slcp +++ b/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_i2c.slcp @@ -48,7 +48,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_environment3_bme688/image/create_example.png diff --git a/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_spi.slcp b/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_spi.slcp index 8e03e153..a216f335 100644 --- a/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_spi.slcp +++ b/app/example/mikroe_environment3_bme688/mikroe_environment3_bme688_spi.slcp @@ -48,7 +48,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_environment3_bme688/image/create_example.png diff --git a/app/example/mikroe_eth_wiz_w5500/mikroe_eth_wiz_w5500.slcp b/app/example/mikroe_eth_wiz_w5500/mikroe_eth_wiz_w5500.slcp index 8f7c361f..d28c62ef 100644 --- a/app/example/mikroe_eth_wiz_w5500/mikroe_eth_wiz_w5500.slcp +++ b/app/example/mikroe_eth_wiz_w5500/mikroe_eth_wiz_w5500.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_eth_wiz_w5500/image/board.png diff --git a/app/example/mikroe_fingerprint2_a172mrq/mikroe_fingerprint2_a172mrq.slcp b/app/example/mikroe_fingerprint2_a172mrq/mikroe_fingerprint2_a172mrq.slcp index 099353f6..68c4b8e2 100644 --- a/app/example/mikroe_fingerprint2_a172mrq/mikroe_fingerprint2_a172mrq.slcp +++ b/app/example/mikroe_fingerprint2_a172mrq/mikroe_fingerprint2_a172mrq.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_fingerprint2_a172mrq/image/hardware_connection.png diff --git a/app/example/mikroe_force3_fsr400/mikroe_force3_fsr400.slcp b/app/example/mikroe_force3_fsr400/mikroe_force3_fsr400.slcp index 2dbd8542..b6ce3244 100644 --- a/app/example/mikroe_force3_fsr400/mikroe_force3_fsr400.slcp +++ b/app/example/mikroe_force3_fsr400/mikroe_force3_fsr400.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_force3_fsr400/image/create_example.png diff --git a/app/example/mikroe_gps_lea6s/mikroe_gps_lea6s.slcp b/app/example/mikroe_gps_lea6s/mikroe_gps_lea6s.slcp index 0f194691..5d853317 100644 --- a/app/example/mikroe_gps_lea6s/mikroe_gps_lea6s.slcp +++ b/app/example/mikroe_gps_lea6s/mikroe_gps_lea6s.slcp @@ -49,7 +49,7 @@ toolchain_settings: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_gps_lea6s/image/create_example.png diff --git a/app/example/mikroe_heartrate2_maxm86161/mikroe_heartrate2_maxm86161.slcp b/app/example/mikroe_heartrate2_maxm86161/mikroe_heartrate2_maxm86161.slcp index 25491b2d..16564d6d 100644 --- a/app/example/mikroe_heartrate2_maxm86161/mikroe_heartrate2_maxm86161.slcp +++ b/app/example/mikroe_heartrate2_maxm86161/mikroe_heartrate2_maxm86161.slcp @@ -43,7 +43,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_heartrate2_maxm86161/image/create_example.png diff --git a/app/example/mikroe_heartrate4_max30101/mikroe_heartrate4_max30101.slcp b/app/example/mikroe_heartrate4_max30101/mikroe_heartrate4_max30101.slcp index c7aabc1c..140cffa9 100644 --- a/app/example/mikroe_heartrate4_max30101/mikroe_heartrate4_max30101.slcp +++ b/app/example/mikroe_heartrate4_max30101/mikroe_heartrate4_max30101.slcp @@ -54,7 +54,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 ui_hints: highlight: diff --git a/app/example/mikroe_hvac_bundle_scd41_sps30/mikroe_hvac_bundle_scd41_sps30.slcp b/app/example/mikroe_hvac_bundle_scd41_sps30/mikroe_hvac_bundle_scd41_sps30.slcp index 023a7031..6e16a616 100644 --- a/app/example/mikroe_hvac_bundle_scd41_sps30/mikroe_hvac_bundle_scd41_sps30.slcp +++ b/app/example/mikroe_hvac_bundle_scd41_sps30/mikroe_hvac_bundle_scd41_sps30.slcp @@ -58,7 +58,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 ui_hints: highlight: diff --git a/app/example/mikroe_hvac_scd41/mikroe_hvac_scd41.slcp b/app/example/mikroe_hvac_scd41/mikroe_hvac_scd41.slcp index 8f8282a5..9c2f40b8 100644 --- a/app/example/mikroe_hvac_scd41/mikroe_hvac_scd41.slcp +++ b/app/example/mikroe_hvac_scd41/mikroe_hvac_scd41.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_hvac_scd41/image/create_example.png diff --git a/app/example/mikroe_irthermo3_mlx90632/mikroe_irthermo3_mlx90632.slcp b/app/example/mikroe_irthermo3_mlx90632/mikroe_irthermo3_mlx90632.slcp index 327989ba..fd95b55e 100644 --- a/app/example/mikroe_irthermo3_mlx90632/mikroe_irthermo3_mlx90632.slcp +++ b/app/example/mikroe_irthermo3_mlx90632/mikroe_irthermo3_mlx90632.slcp @@ -59,7 +59,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 ui_hints: highlight: diff --git a/app/example/mikroe_lte_iot2_bg96/mikroe_lte_iot2_bg96.slcp b/app/example/mikroe_lte_iot2_bg96/mikroe_lte_iot2_bg96.slcp index 9a39bd89..a0eaf84d 100644 --- a/app/example/mikroe_lte_iot2_bg96/mikroe_lte_iot2_bg96.slcp +++ b/app/example/mikroe_lte_iot2_bg96/mikroe_lte_iot2_bg96.slcp @@ -45,7 +45,7 @@ toolchain_settings: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_lte_iot2_bg96/image/create_example.png diff --git a/app/example/mikroe_mic2/mikroe_mic2.slcp b/app/example/mikroe_mic2/mikroe_mic2.slcp index 5600aae2..6f46fbde 100644 --- a/app/example/mikroe_mic2/mikroe_mic2.slcp +++ b/app/example/mikroe_mic2/mikroe_mic2.slcp @@ -45,7 +45,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_mic2/image/create_example.png diff --git a/app/example/mikroe_microsd/mikroe_microsd.slcp b/app/example/mikroe_microsd/mikroe_microsd.slcp index ff4f9f19..b0b2f853 100644 --- a/app/example/mikroe_microsd/mikroe_microsd.slcp +++ b/app/example/mikroe_microsd/mikroe_microsd.slcp @@ -38,7 +38,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_microsd/image/create_example.png directory: image diff --git a/app/example/mikroe_nfc2_pn7150/mikroe_nfc2_pn7150.slcp b/app/example/mikroe_nfc2_pn7150/mikroe_nfc2_pn7150.slcp index fcdc1c21..743442ab 100644 --- a/app/example/mikroe_nfc2_pn7150/mikroe_nfc2_pn7150.slcp +++ b/app/example/mikroe_nfc2_pn7150/mikroe_nfc2_pn7150.slcp @@ -36,7 +36,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_nfc2_pn7150/image/hardware_connection.png directory: image diff --git a/app/example/mikroe_nfc2_pn7150_nci_t2t_read/pn7150_nci_t2t_read.slcp b/app/example/mikroe_nfc2_pn7150_nci_t2t_read/pn7150_nci_t2t_read.slcp index 6893d9b7..54d11e5c 100644 --- a/app/example/mikroe_nfc2_pn7150_nci_t2t_read/pn7150_nci_t2t_read.slcp +++ b/app/example/mikroe_nfc2_pn7150_nci_t2t_read/pn7150_nci_t2t_read.slcp @@ -48,7 +48,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_nfc2_pn7150_nci_t2t_read/image/hardware_connection.png diff --git a/app/example/mikroe_nfc2_pn7150_nci_t2t_write/pn7150_nci_t2t_write.slcp b/app/example/mikroe_nfc2_pn7150_nci_t2t_write/pn7150_nci_t2t_write.slcp index 52fdb902..3684da90 100644 --- a/app/example/mikroe_nfc2_pn7150_nci_t2t_write/pn7150_nci_t2t_write.slcp +++ b/app/example/mikroe_nfc2_pn7150_nci_t2t_write/pn7150_nci_t2t_write.slcp @@ -50,7 +50,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_nfc2_pn7150_nci_t2t_write/image/hardware_connection.png diff --git a/app/example/mikroe_nfctag2_nt3h2111/mikroe_nfctag2_nt3h2111.slcp b/app/example/mikroe_nfctag2_nt3h2111/mikroe_nfctag2_nt3h2111.slcp index f442a189..6fc753f2 100644 --- a/app/example/mikroe_nfctag2_nt3h2111/mikroe_nfctag2_nt3h2111.slcp +++ b/app/example/mikroe_nfctag2_nt3h2111/mikroe_nfctag2_nt3h2111.slcp @@ -35,7 +35,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_nfctag2_nt3h2111/image/hardware_connection.png directory: image diff --git a/app/example/mikroe_obdii_stn1110/mikroe_obdii_stn1110.slcp b/app/example/mikroe_obdii_stn1110/mikroe_obdii_stn1110.slcp index f76a758b..64c3e84d 100644 --- a/app/example/mikroe_obdii_stn1110/mikroe_obdii_stn1110.slcp +++ b/app/example/mikroe_obdii_stn1110/mikroe_obdii_stn1110.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_obdii_stn1110/image/hardware_connection.png diff --git a/app/example/mikroe_oledc_ssd1351/mikroe_oledc_ssd1351.slcp b/app/example/mikroe_oledc_ssd1351/mikroe_oledc_ssd1351.slcp index 13f25f94..c30b999c 100644 --- a/app/example/mikroe_oledc_ssd1351/mikroe_oledc_ssd1351.slcp +++ b/app/example/mikroe_oledc_ssd1351/mikroe_oledc_ssd1351.slcp @@ -39,7 +39,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_oledc_ssd1351/image/hardware_connection.png directory: "image" diff --git a/app/example/mikroe_oledw_ssd1306/mikroe_oledw_ssd1306.slcp b/app/example/mikroe_oledw_ssd1306/mikroe_oledw_ssd1306.slcp index ccef27fb..733c65dd 100644 --- a/app/example/mikroe_oledw_ssd1306/mikroe_oledw_ssd1306.slcp +++ b/app/example/mikroe_oledw_ssd1306/mikroe_oledw_ssd1306.slcp @@ -43,7 +43,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_oledw_ssd1306/image/hardware_connection.png diff --git a/app/example/mikroe_oledw_ssd1306_glib/mikroe_oledw_ssd1306_glib.slcp b/app/example/mikroe_oledw_ssd1306_glib/mikroe_oledw_ssd1306_glib.slcp index 04132878..2b6ff5ef 100644 --- a/app/example/mikroe_oledw_ssd1306_glib/mikroe_oledw_ssd1306_glib.slcp +++ b/app/example/mikroe_oledw_ssd1306_glib/mikroe_oledw_ssd1306_glib.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_oledw_ssd1306_glib/image/hardware_connection.png diff --git a/app/example/mikroe_ozone2_mq131/mikroe_ozone2_mq131.slcp b/app/example/mikroe_ozone2_mq131/mikroe_ozone2_mq131.slcp index 986e21b8..709ad12d 100644 --- a/app/example/mikroe_ozone2_mq131/mikroe_ozone2_mq131.slcp +++ b/app/example/mikroe_ozone2_mq131/mikroe_ozone2_mq131.slcp @@ -43,7 +43,7 @@ configuration: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_ozone2_mq131/images/create_example.png diff --git a/app/example/mikroe_pir_pl_n823_01/mikroe_pir_pl_n823_01.slcp b/app/example/mikroe_pir_pl_n823_01/mikroe_pir_pl_n823_01.slcp index 856259c6..62c009ba 100644 --- a/app/example/mikroe_pir_pl_n823_01/mikroe_pir_pl_n823_01.slcp +++ b/app/example/mikroe_pir_pl_n823_01/mikroe_pir_pl_n823_01.slcp @@ -45,7 +45,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_pir_pl_n823_01/image/create_project.png diff --git a/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_i2c.slcp b/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_i2c.slcp index 5bbd0749..c5973536 100644 --- a/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_i2c.slcp +++ b/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_i2c.slcp @@ -41,7 +41,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_pressure3_dps310/image/create_example.png directory: "image" diff --git a/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_spi.slcp b/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_spi.slcp index aa499e81..fc27b03e 100644 --- a/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_spi.slcp +++ b/app/example/mikroe_pressure3_dps310/mikroe_pressure3_dps310_spi.slcp @@ -41,7 +41,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 configuration: - name: SL_SPIDRV_MIKROE_CS_CONTROL value: "spidrvCsControlApplication" diff --git a/app/example/mikroe_pwm_driver_si8711cc/mikroe_pwm_driver_si8711cc.slcp b/app/example/mikroe_pwm_driver_si8711cc/mikroe_pwm_driver_si8711cc.slcp index 76488dca..c1377399 100644 --- a/app/example/mikroe_pwm_driver_si8711cc/mikroe_pwm_driver_si8711cc.slcp +++ b/app/example/mikroe_pwm_driver_si8711cc/mikroe_pwm_driver_si8711cc.slcp @@ -34,7 +34,7 @@ component: from: third_party_hw_drivers sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_pwm_driver_si8711cc/image/create_example.png directory: "image" diff --git a/app/example/mikroe_radar_mm5d91_00/mikroe_radar_mm5d91_00.slcp b/app/example/mikroe_radar_mm5d91_00/mikroe_radar_mm5d91_00.slcp index e6bc11a7..b0d27397 100644 --- a/app/example/mikroe_radar_mm5d91_00/mikroe_radar_mm5d91_00.slcp +++ b/app/example/mikroe_radar_mm5d91_00/mikroe_radar_mm5d91_00.slcp @@ -48,7 +48,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_radar_mm5d91_00/image/hardware_connection.png diff --git a/app/example/mikroe_relay2_lca717/mikroe_relay2_lca717.slcp b/app/example/mikroe_relay2_lca717/mikroe_relay2_lca717.slcp index 74d8df97..ba0de9cd 100644 --- a/app/example/mikroe_relay2_lca717/mikroe_relay2_lca717.slcp +++ b/app/example/mikroe_relay2_lca717/mikroe_relay2_lca717.slcp @@ -38,7 +38,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_relay2_lca717/image/hardware_connection.png diff --git a/app/example/mikroe_rf_meter_ad8318/mikroe_rf_meter_ad8318.slcp b/app/example/mikroe_rf_meter_ad8318/mikroe_rf_meter_ad8318.slcp index 44e35b98..96caf4f8 100644 --- a/app/example/mikroe_rf_meter_ad8318/mikroe_rf_meter_ad8318.slcp +++ b/app/example/mikroe_rf_meter_ad8318/mikroe_rf_meter_ad8318.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_rf_meter_ad8318/image/create_example.png diff --git a/app/example/mikroe_rng/mikroe_rng.slcp b/app/example/mikroe_rng/mikroe_rng.slcp index ed77bc58..cb3515e3 100644 --- a/app/example/mikroe_rng/mikroe_rng.slcp +++ b/app/example/mikroe_rng/mikroe_rng.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_rng/image/create_example.png diff --git a/app/example/mikroe_rtc10_ds3231m/mikroe_rtc10_ds3231m.slcp b/app/example/mikroe_rtc10_ds3231m/mikroe_rtc10_ds3231m.slcp index be7cdf3e..0c0f2b28 100644 --- a/app/example/mikroe_rtc10_ds3231m/mikroe_rtc10_ds3231m.slcp +++ b/app/example/mikroe_rtc10_ds3231m/mikroe_rtc10_ds3231m.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_rtc10_ds3231m/image/create_project.png diff --git a/app/example/mikroe_servo_pca9685/mikroe_servo_pca9685.slcp b/app/example/mikroe_servo_pca9685/mikroe_servo_pca9685.slcp index 559b7b5f..58413851 100644 --- a/app/example/mikroe_servo_pca9685/mikroe_servo_pca9685.slcp +++ b/app/example/mikroe_servo_pca9685/mikroe_servo_pca9685.slcp @@ -43,7 +43,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_servo_pca9685/image/create_project.png diff --git a/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_i2c.slcp b/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_i2c.slcp index 11ae4b44..787e8f9f 100644 --- a/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_i2c.slcp +++ b/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_i2c.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_smoke2_adpd188bi/image/create_example.png diff --git a/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_spi.slcp b/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_spi.slcp index 908cc885..faecdb7c 100644 --- a/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_spi.slcp +++ b/app/example/mikroe_smoke2_adpd188bi/mikroe_smoke2_adpd188bi_spi.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_smoke2_adpd188bi/image/create_example.png diff --git a/app/example/mikroe_stepper2_a4988/mikroe_stepper2_a4988.slcp b/app/example/mikroe_stepper2_a4988/mikroe_stepper2_a4988.slcp index 8d2fcb8e..c7014355 100644 --- a/app/example/mikroe_stepper2_a4988/mikroe_stepper2_a4988.slcp +++ b/app/example/mikroe_stepper2_a4988/mikroe_stepper2_a4988.slcp @@ -42,7 +42,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_stepper2_a4988/image/create_example.png diff --git a/app/example/mikroe_stepper_a3967/mikroe_stepper_a3967.slcp b/app/example/mikroe_stepper_a3967/mikroe_stepper_a3967.slcp index 7aad6836..d543526a 100644 --- a/app/example/mikroe_stepper_a3967/mikroe_stepper_a3967.slcp +++ b/app/example/mikroe_stepper_a3967/mikroe_stepper_a3967.slcp @@ -40,7 +40,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_stepper_a3967/image/create_example.png diff --git a/app/example/mikroe_stretch/mikroe_stretch.slcp b/app/example/mikroe_stretch/mikroe_stretch.slcp index 77b62143..398f60bf 100644 --- a/app/example/mikroe_stretch/mikroe_stretch.slcp +++ b/app/example/mikroe_stretch/mikroe_stretch.slcp @@ -41,7 +41,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_stretch/image/console_log.png diff --git a/app/example/mikroe_temphum15_sht40/mikroe_temphum15_sht40.slcp b/app/example/mikroe_temphum15_sht40/mikroe_temphum15_sht40.slcp index 84b5737e..f298a5d9 100644 --- a/app/example/mikroe_temphum15_sht40/mikroe_temphum15_sht40.slcp +++ b/app/example/mikroe_temphum15_sht40/mikroe_temphum15_sht40.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_temphum15_sht40/image/create_example.png diff --git a/app/example/mikroe_temphum9_shtc3/mikroe_temphum9_shtc3.slcp b/app/example/mikroe_temphum9_shtc3/mikroe_temphum9_shtc3.slcp index 130a55b8..02c1f421 100644 --- a/app/example/mikroe_temphum9_shtc3/mikroe_temphum9_shtc3.slcp +++ b/app/example/mikroe_temphum9_shtc3/mikroe_temphum9_shtc3.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_temphum9_shtc3/image/create_example.png diff --git a/app/example/mikroe_thunder_as3935/mikroe_thunder_as3935.slcp b/app/example/mikroe_thunder_as3935/mikroe_thunder_as3935.slcp index ec3c61a4..bed75201 100644 --- a/app/example/mikroe_thunder_as3935/mikroe_thunder_as3935.slcp +++ b/app/example/mikroe_thunder_as3935/mikroe_thunder_as3935.slcp @@ -43,7 +43,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_thunder_as3935/image/create_example.png diff --git a/app/example/mikroe_turbidity_tsd10/mikroe_turbidity_tsd10.slcp b/app/example/mikroe_turbidity_tsd10/mikroe_turbidity_tsd10.slcp index 22263e42..2652fa57 100644 --- a/app/example/mikroe_turbidity_tsd10/mikroe_turbidity_tsd10.slcp +++ b/app/example/mikroe_turbidity_tsd10/mikroe_turbidity_tsd10.slcp @@ -47,7 +47,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_turbidity_tsd10/image/create_example.png diff --git a/app/example/mikroe_utm7segr_max6969/mikroe_utm7segr_max6969.slcp b/app/example/mikroe_utm7segr_max6969/mikroe_utm7segr_max6969.slcp index 70ce4c3a..45b55f6d 100644 --- a/app/example/mikroe_utm7segr_max6969/mikroe_utm7segr_max6969.slcp +++ b/app/example/mikroe_utm7segr_max6969/mikroe_utm7segr_max6969.slcp @@ -42,7 +42,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_utm7segr_max6969/image/create_example.png diff --git a/app/example/mikroe_uv_ml8511a/mikroe_uv_ml8511a.slcp b/app/example/mikroe_uv_ml8511a/mikroe_uv_ml8511a.slcp index 19a337ee..dae19a69 100644 --- a/app/example/mikroe_uv_ml8511a/mikroe_uv_ml8511a.slcp +++ b/app/example/mikroe_uv_ml8511a/mikroe_uv_ml8511a.slcp @@ -39,7 +39,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_uv_ml8511a/image/hardware_connection.png directory: image diff --git a/app/example/mikroe_uwb2_dwm3000/SimplicityStudio/mikroe_uwb2_dwm3000.slcp b/app/example/mikroe_uwb2_dwm3000/SimplicityStudio/mikroe_uwb2_dwm3000.slcp new file mode 100644 index 00000000..fbafb3ba --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/SimplicityStudio/mikroe_uwb2_dwm3000.slcp @@ -0,0 +1,80 @@ +project_name: mikroe_uwb2_dwm3000 +package: platform +label: Third Party Hardware Drivers - DWM3000 - UWB2 Click (Mikroe) +description: This example project shows an example for DWM3000 - UWB2 Click (Mikroe). +category: Example|Platform +quality: evaluation + +filter: +- name: Device Type + value: [SoC] +- name: MCU + value: [32-bit MCU] +- name: Project Difficulty + value: [Beginner] + +readme: +- path: ../../../documentation/example/mikroe_uwb2_dwm3000/README.md + +source: +- path: ../app_files/app.c + directory: app_files +- path: ../app_files/config_options.c + directory: app_files +- path: ../app_files/shared_functions.c + directory: app_files +- path: ../main.c + +include: +- path: ../app_files + file_list: + - path: app.h + - path: config_options.h + - path: shared_defines.h + - path: shared_functions.h + directory: app_files + +component: +- id: device_init +- id: sl_system +- id: component_catalog +- id: app_assert +- id: app_log +- instance: [vcom] + id: iostream_eusart +- id: mikroe_uwb2_dwm3000 + from: third_party_hw_drivers + +toolchain_settings: + - option: linkerfile + value: linkerfile.ld + +define: +- name: DEBUG_EFM + +sdk_extension: +- id: third_party_hw_drivers + version: 2.0.2 + +other_file: + - path: ../linker_files/brd2703a/linkerfile.ld + condition: [brd2703a] + - path: ../linker_files/brd4108a/linkerfile.ld + condition: [brd4108a] + - path: ../linker_files/brd4314a/linkerfile.ld + condition: [brd4314a] + - path: ../../../documentation/example/mikroe_uwb2_dwm3000/image/create_example.png + directory: image + - path: ../../../documentation/example/mikroe_uwb2_dwm3000/image/hardware_connection.png + directory: image + - path: ../../../documentation/example/mikroe_uwb2_dwm3000/image/custom_linker.png + directory: image + - path: ../../../documentation/example/mikroe_uwb2_dwm3000/image/tx_log.png + directory: image + - path: ../../../documentation/example/mikroe_uwb2_dwm3000/image/rx_log.png + directory: image + +ui_hints: + highlight: + - path: README.md + focus: true diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/app.c b/app/example/mikroe_uwb2_dwm3000/app_files/app.c new file mode 100644 index 00000000..91f9871d --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/app.c @@ -0,0 +1,273 @@ +/***************************************************************************//** + * @file + * @brief Top level application functions + ******************************************************************************* + * # License + * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * The licensor of this software is Silicon Laboratories Inc. Your use of this + * software is governed by the terms of Silicon Labs Master Software License + * Agreement (MSLA) available at + * www.silabs.com/about-us/legal/master-software-license-agreement. This + * software is distributed to you in Source Code format and is governed by the + * sections of the MSLA applicable to Source Code. + * + ******************************************************************************/ + +/***************************************************************************//** + * Initialize application. + ******************************************************************************/ +#include "app.h" +#include "em_gpio.h" +#include "sl_system_init.h" +#include "sl_event_handler.h" +#include "port.h" +#include "deca_probe_interface.h" +#include "app_log.h" +#include "shared_functions.h" +#include "shared_defines.h" +#include "string.h" +#include "config_options.h" +#include "sl_sleeptimer.h" + +// Comment out the line below in order to switch the application mode to +// receiver +#define DEMO_APP_TRANSMITTER + +/* Default communication configuration. We use default non-STS DW mode. */ +static dwt_config_t config = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 1, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (129 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_OFF, /* No STS mode enabled (STS Mode 0). */ + DWT_STS_LEN_64, /* STS length, see allowed values in Enum + * dwt_sts_lengths_e */ + DWT_PDOA_M0 /* PDOA mode off */ +}; + +/* Index to access to sequence number of the blink frame in the tx_msg/rx_msg + * array. */ +#define BLINK_FRAME_SN_IDX 1 + +#ifdef DEMO_APP_TRANSMITTER /* TX Side define*/ + +/* The frame sent in this example is an 802.15.4e standard blink. It is a + * 12-byte frame composed of the following fields: + * - byte 0: frame type (0xC5 for a blink). + * - byte 1: sequence number, incremented for each new frame. + * - byte 2 -> end: message data + */ +static uint8_t tx_msg[] = +{ 0xC5, 0, 'S', 'I', 'L', 'I', 'C', 'O', 'N', 'L', 'A', 'B', 'S', '\0' }; + +/* The real length that is going to be transmitted */ +#define FRAME_LENGTH (sizeof(tx_msg) + FCS_LEN) + +/* Inter-frame delay period, in milliseconds. */ +#define TRANSMITTING_INTERVAL_MSEC 2000 + +static sl_sleeptimer_timer_handle_t app_timer_handle; +static volatile bool tx_trigger_process = false; +void app_tx_timer_callback(sl_sleeptimer_timer_handle_t *handle, void *data); + +#endif + +#ifndef DEMO_APP_TRANSMITTER /* RX Side define*/ + +#define RX_MSG_DATA_IDX 2 + +/* Buffer to store received frame. See NOTE 1 below. */ +static uint8_t rx_buffer[FRAME_LEN_MAX]; +static uint8_t rx_msg[FRAME_LEN_MAX]; +static uint8_t frame_id; + +/* Hold copy of status register state here for reference so that it can be + * examined at a debug breakpoint. */ +static uint32_t status_reg; + +/* Hold copy of frame length of frame received (if good) so that it can be + * examined at a debug breakpoint. */ +static uint16_t frame_len; + +#endif + +void app_init(void) +{ + app_log("DWM3000 - UWB 2 Click Driver\r\n"); + +#ifdef DEMO_APP_TRANSMITTER + app_log("Application Mode: Transmitter\r\n"); +#else + app_log("Application Mode: Receiver\r\n"); +#endif + + port_init_dw_chip(); + reset_DW3000(); + + if (dwt_probe((struct dwt_probe_s *)&dw3000_probe_interf)) { + app_log("DWM 3000 probe fail\r\n"); + while (1) {} + } + + /* This initialization is added to avoid crashing the board when calling APIs + * that writes inside local data + * like setxtaltrim */ + if (dwt_initialise(DWT_DW_INIT) != DWT_SUCCESS) { + app_log("DWM 3000 init fail\r\n"); + while (1) {} + } + + uint32_t dev_id = dwt_readdevid(); + + /* Reads and validate device ID returns DWT_ERROR if it does not match + * expected else DWT_SUCCESS */ + if (dwt_check_dev_id() == DWT_SUCCESS) { + app_log("DWM3000 dev id = 0x%lx\r\n", dev_id); + } else { + app_log("DWM3000 read dev id failed\r\n"); + } + + uint32_t part_id = dwt_getpartid(); + app_log("DWM3000 part id = 0x%lx\r\n", part_id); + + uint32_t lot_id = dwt_getlotid(); + app_log("DWM3000 lot id = 0x%lx\r\n", lot_id); + + uint8_t otprevision = dwt_otprevision(); + app_log("DWM3000 otp revision = 0x%x\r\n", otprevision); + + /* Enabling LEDs here for debug so that for each TX the D1 LED will flash on + * DW3000 red eval-shield boards. */ + dwt_setleds(DWT_LEDS_ENABLE | DWT_LEDS_INIT_BLINK); + + /* Configure DW IC. See NOTE 5 below. */ + + /* if the dwt_configure returns DWT_ERROR either the PLL or RX calibration has + * failed the host should reset the device */ + if (dwt_configure(&config)) { + app_log("DWM3000 config failed\r\n"); + while (1) {} + } + +#ifdef DEMO_APP_TRANSMITTER + + /* Configure the TX spectrum parameters (power PG delay and PG Count) */ + dwt_configuretxrf(&txconfig_options); + + app_log("Start TX timer periodic = 0x%lx\r\n", + sl_sleeptimer_start_periodic_timer_ms(&app_timer_handle, + TRANSMITTING_INTERVAL_MSEC, + app_tx_timer_callback, + NULL, + 0, + 0)); +#endif +} + +/***************************************************************************//** + * App ticking function. + ******************************************************************************/ +void app_process_action(void) +{ +#ifdef DEMO_APP_TRANSMITTER /* TX Side */ + if (tx_trigger_process) { + /* Write frame data to DW IC and prepare transmission. See NOTE 3 below.*/ + dwt_writetxdata(FRAME_LENGTH - FCS_LEN, tx_msg, 0); /* Zero offset + * in TX + * buffer. */ + + /* In this example since the length of the transmitted frame does not + * change, + * nor the other parameters of the dwt_writetxfctrl function, the + * dwt_writetxfctrl call could be outside the main while(1) loop. + */ + dwt_writetxfctrl(FRAME_LENGTH, 0, 0); /* Zero offset in TX buffer, + * no ranging. */ + + /* Start transmission. */ + dwt_starttx(DWT_START_TX_IMMEDIATE); + + /* Poll DW IC until TX frame sent event set. See NOTE 4 below. + * STATUS register is 4 bytes long but, as the event we are looking + * at is in the first byte of the register, we can use this simplest + * API function to access it.*/ + waitforsysstatus(NULL, NULL, DWT_INT_TXFRS_BIT_MASK, 0); + + /* Clear TX frame sent event. */ + dwt_writesysstatuslo(DWT_INT_TXFRS_BIT_MASK); + + app_log("TX Frame Sent #%d\r\n", tx_msg[BLINK_FRAME_SN_IDX]); + + /* Increment the blink frame sequence number (modulo 256). */ + tx_msg[BLINK_FRAME_SN_IDX]++; + + tx_trigger_process = false; + } + +#else /* RX Side */ + + /* Clear local RX buffer to avoid having leftovers from previous receptions + * This is not necessary but is included here to aid reading + * the RX buffer. + * This is a good place to put a breakpoint. Here (after first time through + * the loop) the local status register will be set for last event + * and if a good receive has happened the data buffer will have the data in + * it, and frame_len will be set to the length of the RX frame. */ + memset(rx_buffer, 0, sizeof(rx_buffer)); + memset(rx_msg, 0, sizeof(rx_msg)); + + /* Activate reception immediately. See NOTE 2 below. */ + dwt_rxenable(DWT_START_RX_IMMEDIATE); + + /* Poll until a frame is properly received or an error/timeout occurs. See + * NOTE 3 below. + * STATUS register is 5 bytes long but, as the event we are looking at is in + * the first byte of the register, we can use this simplest API + * function to access it. */ + waitforsysstatus(&status_reg, NULL, + (DWT_INT_RXFCG_BIT_MASK | SYS_STATUS_ALL_RX_ERR), 0); + + if (status_reg & DWT_INT_RXFCG_BIT_MASK) { + /* A frame has been received, copy it to our local buffer. */ + frame_len = dwt_getframelength(); + if (frame_len <= FRAME_LEN_MAX) { + /* No need to read the FCS/CRC. */ + dwt_readrxdata(rx_buffer, (frame_len - FCS_LEN), 0); + frame_id = *(rx_buffer + BLINK_FRAME_SN_IDX); + memcpy(rx_msg, (rx_buffer + RX_MSG_DATA_IDX), + (frame_len - FCS_LEN - RX_MSG_DATA_IDX)); + + app_log("Message received #%u: %s\r\n", + ( uint16_t ) frame_id, rx_msg); + + /* Clear good RX frame event in the DW IC status register. */ + dwt_writesysstatuslo(DWT_INT_RXFCG_BIT_MASK); + } + } else { + /* Clear RX error events in the DW IC status register. */ + dwt_writesysstatuslo(SYS_STATUS_ALL_RX_ERR); + } +#endif +} + +#ifdef DEMO_APP_TRANSMITTER +void app_tx_timer_callback(sl_sleeptimer_timer_handle_t *handle, void *data) +{ + (void) data; + (void) handle; + + tx_trigger_process = true; +} + +#endif diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/app.h b/app/example/mikroe_uwb2_dwm3000/app_files/app.h new file mode 100644 index 00000000..efa2fd7a --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/app.h @@ -0,0 +1,31 @@ +/***************************************************************************//** + * @file + * @brief Top level application functions + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * The licensor of this software is Silicon Laboratories Inc. Your use of this + * software is governed by the terms of Silicon Labs Master Software License + * Agreement (MSLA) available at + * www.silabs.com/about-us/legal/master-software-license-agreement. This + * software is distributed to you in Source Code format and is governed by the + * sections of the MSLA applicable to Source Code. + * + ******************************************************************************/ + +#ifndef APP_H +#define APP_H + +/***************************************************************************//** + * Initialize application. + ******************************************************************************/ +void app_init(void); + +/***************************************************************************//** + * App ticking function. + ******************************************************************************/ +void app_process_action(void); + +#endif // APP_H diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/config_options.c b/app/example/mikroe_uwb2_dwm3000/app_files/config_options.c new file mode 100644 index 00000000..6bf6d327 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/config_options.c @@ -0,0 +1,951 @@ +/*! ---------------------------------------------------------------------------- + * @file config_options.c + * @brief Configuration options are defined here. + * + * @attention + * + * Copyright 2019 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#include "config_options.h" + +/* String used to display measured distance on LCD screen (16 characters + * maximum). */ +char dist_str[16] = { 0 }; + +/* + * TX Power Configuration Settings + */ +/* Values for the PG_DELAY and TX_POWER registers reflect the bandwidth and + * power of the spectrum at the current + * temperature. These values can be calibrated prior to taking reference + * measurements. */ +dwt_txconfig_t txconfig_options = { + 0x34, /* PG delay. */ + 0xfdfdfdfd, /* TX power. */ + 0x0 /*PG count*/ +}; + +dwt_txconfig_t txconfig_options_ch9 = { + 0x34, /* PG delay. */ + 0xfefefefe, /* TX power. */ + 0x0 /*PG count*/ +}; + +/* + * Configuration options for the following parameters: + * Channel: 5, 9 + * PRF: 64 + * Preamble Length: 64, 128, 512, 1024 + * Preamble Code: 3/4 for 16MHz PRf, 9/10/11/12 for 64MHz PRF + * Data Rate: 0.85, 6.8 + * STS: Length 64 + */ + +#ifdef CONFIG_OPTION_01 + +/* Configuration option 01. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_02 + +/* Configuration option 02. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_03 + +/* Configuration option 03. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_04 + +/* Configuration option 04. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_05 + +/* Configuration option 05. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_06 + +/* Configuration option 06. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_07 + +/* Configuration option 07. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_08 + +/* Configuration option 08. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_09 + +/* Configuration option 09. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_10 + +/* Configuration option 10. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_11 + +/* Configuration option 11. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_12 + +/* Configuration option 12. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_13 + +/* Configuration option 13. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_14 + +/* Configuration option 14. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_15 + +/* Configuration option 15. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_16 + +/* Configuration option 16. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_850K, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_17 + +/* Configuration option 17. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_18 + +/* Configuration option 18. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_19 + +/* Configuration option 19. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_20 + +/* Configuration option 20. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_21 + +/* Configuration option 21. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_22 + +/* Configuration option 22. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_23 + +/* Configuration option 23. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_24 + +/* Configuration option 24. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_25 + +/* Configuration option 25. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_26 + +/* Configuration option 26. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_64, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard 8 + * symbol, 2 for non-standard 16 symbol SFD and 3 for 4z + * 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (64 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_27 + +/* Configuration option 27. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_28 + +/* Configuration option 28. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_29 + +/* Configuration option 29. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_30 + +/* Configuration option 30. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_512, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (512 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_31 + +/* Configuration option 31. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_32 + +/* Configuration option 32. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +dwt_config_t config_options = { + 9, /* Channel number. */ + DWT_PLEN_1024, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 10, /* TX preamble code. Used in TX only. */ + 10, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 + * for 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (1024 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_64, /* STS length*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; +#endif + +#ifdef CONFIG_OPTION_33 + +/* Configuration option 33. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 128 + */ +dwt_config_t config_options = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_1, /* Mode 1 STS enabled */ + DWT_STS_LEN_128, /* (STS length in blocks of 8) - 1*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; + +/* Configuration option SP3. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 128, STS Mode 3 + */ +dwt_config_t config_option_sp3 = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_ND, /* Mode 3 STS (no data) enabled */ + DWT_STS_LEN_128, /* (STS length in blocks of 8) - 1*/ + DWT_PDOA_M0 /* PDOA mode off */ +}; + +/* Configuration option SP0. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, No STS + */ +dwt_config_t config_option_sp0 = { + 5, /* Channel number. */ + DWT_PLEN_128, /* Preamble length. Used in TX only. */ + DWT_PAC8, /* Preamble acquisition chunk size. Used in RX only. */ + 9, /* TX preamble code. Used in TX only. */ + 9, /* RX preamble code. Used in RX only. */ + 3, /* 0 to use standard 8 symbol SFD, 1 to use non-standard + * 8 symbol, 2 for non-standard 16 symbol SFD and 3 for + * 4z 8 symbol SDF type */ + DWT_BR_6M8, /* Data rate. */ + DWT_PHRMODE_STD, /* PHY header mode. */ + DWT_PHRRATE_STD, /* PHY header rate. */ + (128 + 1 + 8 - 8), /* SFD timeout (preamble length + 1 + SFD length - PAC + * size). Used in RX only. */ + DWT_STS_MODE_OFF, /* STS Off */ + DWT_STS_LEN_128, /* Ignore value when STS is disabled */ + DWT_PDOA_M0 /* PDOA mode off */ +}; + +#endif diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/config_options.h b/app/example/mikroe_uwb2_dwm3000/app_files/config_options.h new file mode 100644 index 00000000..c1dfd069 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/config_options.h @@ -0,0 +1,281 @@ +/*! ---------------------------------------------------------------------------- + * @file config_options.h + * @brief Configuration options are selected here. + * + * @attention + * + * Copyright 2019(c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#include + +#ifndef EXAMPLES_CONFIG_OPTIONS_H_ +#define EXAMPLES_CONFIG_OPTIONS_H_ + +/* Index values for errors in array */ +#define CRC_ERR_IDX 0 +#define RSE_ERR_IDX 1 +#define PHE_ERR_IDX 2 +#define SFDTO_ERR_IDX 3 +#define PTO_ERR_IDX 4 +#define RTO_ERR_IDX 5 +#define SPICRC_ERR_IDX 6 +#define TXTO_ERR_IDX 7 +#define ARFE_ERR_IDX 8 +#define TS_MISMATCH_ERR_IDX 9 +#define BAD_FRAME_ERR_IDX 10 +#define PREAMBLE_COUNT_ERR_IDX 11 +#define CP_QUAL_ERR_IDX 12 +#define STS_PREAMBLE_ERR 13 +#define STS_PEAK_GROWTH_RATE_ERR 14 +#define STS_ADC_COUNT_ERR 15 +#define STS_SFD_COUNT_ERR 16 +#define STS_LATE_FIRST_PATH_ERR 17 +#define STS_LATE_COARSE_EST_ERR 18 +#define STS_COARSE_EST_EMPTY_ERR 19 +#define STS_HIGH_NOISE_THREASH_ERR 20 +#define STS_NON_TRIANGLE_ERR 21 +#define STS_LOG_REG_FAILED_ERR 22 + +/* + * Number of ranges to attempt in test + */ +#define RANGE_COUNT 200 + +/* Compensation value for CPU + * The time taken to receive the poll frame, check for errors, + * calculate length, read content, get poll timestamp, + * calculate response timestamp and send delayed response with timestamp will + * be different for each device. + * Adjusting this value lower and lower until dwt_starttx() starts returning + * DWT_ERROR status allows the user to tweak their system to calculate the + * shortest turn-around time for messages. + */ +#define CPU_PROCESSING_TIME 400 + +/* + * SPI Rate Configuration Settings + */ +#define CONFIG_SPI_FAST_RATE +// #define CONFIG_SPI_SLOW_RATE + +/* + * Changing threshold to 5ns for DW3000 B0 red board devices. + * ~10% of ranging attempts have a larger than usual difference between Ipatov + * and STS. + * A larger threshold allows for better coverage with this coverage. + * This should be fixed for DW3000 C0 devices. + */ +#define TS_MISMATCH_THRESHOLD 5 * 64 /* 64 = 1 ns --> 5 ns */ + +/* + * Please note that a PRF of 16 MHz and a STS PRF of 64 MHz will not be + * supported for the DW3000. + */ + +/* Configuration option 01. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_01 + +/* Configuration option 02. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_02 + +/* Configuration option 03. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_03 + +/* Configuration option 04. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_04 + +/* Configuration option 05. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_05 + +/* Configuration option 06. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_06 + +/* Configuration option 07. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_07 + +/* Configuration option 08. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_08 + +/* Configuration option 09. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_09 + +/* Configuration option 10. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_10 + +/* Configuration option 11. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_11 + +/* Configuration option 12. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_12 + +/* Configuration option 13. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_13 + +/* Configuration option 14. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_14 + +/* Configuration option 15. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_15 + +/* Configuration option 16. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_16 + +/* Configuration option 17. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_17 + +/* Configuration option 18. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_18 + +/* Configuration option 19. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_19 + +/* Configuration option 20. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_20 + +/* Configuration option 21. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 850k, STS Length 64 + */ +// #define CONFIG_OPTION_21 + +/* Configuration option 22. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_22 + +/* Configuration option 23. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_23 + +/* Configuration option 24. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_24 + +/* Configuration option 25. + * Channel 5, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_25 + +/* Configuration option 26. + * Channel 9, PRF 64M, Preamble Length 64, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_26 + +/* Configuration option 27. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_27 + +/* Configuration option 28. + * Channel 9, PRF 64M, Preamble Length 128, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_28 + +/* Configuration option 29. + * Channel 5, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_29 + +/* Configuration option 30. + * Channel 9, PRF 64M, Preamble Length 512, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_30 + +/* Configuration option 31. + * Channel 5, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_31 + +/* Configuration option 32. + * Channel 9, PRF 64M, Preamble Length 1024, PAC 8, Preamble code 10, Data Rate + * 6.8M, STS Length 64 + */ +// #define CONFIG_OPTION_32 + +/* Configuration option 33. + * Channel 5, PRF 64M, Preamble Length 128, PAC 8, Preamble code 9, Data Rate + * 6.8M, STS Length 128 + */ +#define CONFIG_OPTION_33 + +extern char dist_str[16]; +extern dwt_txconfig_t txconfig_options; +extern dwt_txconfig_t txconfig_options_ch9; + +#endif /* EXAMPLES_CONFIG_OPTIONS_H_ */ diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/shared_defines.h b/app/example/mikroe_uwb2_dwm3000/app_files/shared_defines.h new file mode 100644 index 00000000..6643f51f --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/shared_defines.h @@ -0,0 +1,71 @@ +/*! ---------------------------------------------------------------------------- + * @file shared_defines.h + * @brief Global definitions are found here + * + * @attention + * + * Copyright 2013 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#ifndef _SHARE_DEF_ +#define _SHARE_DEF_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef STM32F429xx +#include +#endif // STM32F429xx + +#define SPEED_OF_LIGHT (299702547) +#define FRAME_LEN_MAX (127) +#define FRAME_LEN_MAX_EX (1023) + +#define RXFLEN_MASK 0x0000007FUL /* Receive Frame Length (0 to 127) */ +#define RXFL_MASK_1023 0x000003FFUL /* Receive Frame Length Extension (0 to + * 1023) */ + +#define RESP_MSG_TS_LEN 4 +#define FINAL_MSG_TS_LEN 4 + +/* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion + * factor. + * 1 uus = 512 / 499.2 µs and 1 µs = 499.2 * 128 dtu. */ +#define UUS_TO_DWT_TIME 63898 + +#define TX_CHANGEABLE_DATA (10) /*Can change the length of TX data by this + * size*/ +#define MINIMAL_DATA_LENGTH (11) /*The TX length will be at least the buffer + * below*/ +#define SIMPLE_TX_DATA_SIZE (MINIMAL_DATA_LENGTH + TX_CHANGEABLE_DATA) +#define TX_LENGTH_BYTE_POS (2) /*This byte index represent the total length of + * the TX data*/ + +typedef enum +{ + DBL_BUFF_ERR_TYPE_UNKNOWN = -1, /*Unknown yet*/ + DBL_BUFF_ERR_TYPE_OK, /*No error*/ + DBL_BUFF_ERR_TYPE_TIMEOUT, /*Timeout*/ + DBL_BUFF_ERR_TYPE_ERROR, /*Error*/ + DBL_BUFF_ERR_TYPE_GOT_UNNEEDED_DATA, +} dbl_buff_error_type_e; + +typedef enum +{ + AES_RES_OK = 0, + AES_RES_ERROR_LENGTH = -1, + AES_RES_ERROR = -2, + AES_RES_ERROR_FRAME = -3, + AES_RES_ERROR_IGNORE_FRAME = -4 +} aes_results_e; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.c b/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.c new file mode 100644 index 00000000..fbb69e99 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.c @@ -0,0 +1,696 @@ +/*! ---------------------------------------------------------------------------- + * @file shared_functions.h + * @brief Global functions are found here + * + * @attention + * + * Copyright 2013 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#include "config_options.h" +#include +#include +#include +#include "shared_defines.h" +#include "shared_functions.h" +#include + +extern dwt_config_t config_options; + +/*Reference look-up table to calculate TxPower boost depending on frame duration + * Using two different tables as per logarithmic calculation: + * - 1000us to 200us range - index unit of 25us + * - 200us to 70us -- index unit of 10us + * The table values are in steps 0f 0.1dB + * This allow to have a maximum granularity of 0.5dB between two frame + * durations, which is + * in the magnitude of the DW3XXX TxOutput setting. + */ + +const uint8_t txpower_boost_per_frame_duration_1000_200_us[LUT_1000_200_US_NUM] + = { + 0, // 1000us + 1, // 975us -> 1*0.1dB boost between 975us and 1000us frames + 2, // 950us -> 2*0.1dB boost between 950us and 1000us frames + 3, // 925us + 4, // 900us + 5, // 875us + 6, // 850us + 7, // 825us + 8, // 800us + 9, // 775us + 10, // 750us + 11, // 725us + 13, // 700us + 15, // 675us + 17, // 650us + 19, // 625us + 21, // 600us + 23, // 575us + 25, // 550us + 27, // 525us + 29, // 500us + 31, // 475us + 33, // 450us + 35, // 425us + 38, // 400us + 41, // 375us + 44, // 350us + 47, // 325us + 50, // 300us + 54, // 275us + 58, // 250us + 63, // 225us + 68 // 200us + }; + +const uint8_t txpower_boost_per_frame_duration_200_70_us[LUT_200_70_US_NUM] = { + 68, // 200us -> 68*0.1dB boost between 200us frame and 1000us frame. + 70, // 190us -> 70*0.1dB boost between 190us and 1000us frame + 72, // 180us + 74, // 170us + 77, // 160us + 80, // 150us + 83, // 140us + 86, // 130us + 89, // 120us + 93, // 110us + 97, // 100us + 102, // 90us + 107, // 80us + 113 // 70us +}; + +/*! + * --------------------------------------------------------------------------- + * @fn calculate_power_boost() + * + * @brief Calculation the allowed power boost for a frame_duration_us frame + * relatively to a 1ms frame. + * + * @param reg: uint16_t duration of frame.. + * + * @return boost: the amount of boost in 0.1dB steps which is allowed when + * transmitting the frame_dur_us frame + * relatively to a 1ms frame. For example, if the frame duration + * is 500us, then relatively to 1ms, + * a 3dB boost is allowed, and the function will return 30. + */ +uint8_t calculate_power_boost(uint16_t frame_duration_us) +{ + const uint8_t *lut = NULL; + uint16_t lut_i; + uint16_t lut_num; + uint16_t lut_min; + uint16_t lut_step; + uint16_t limit; + + // If the frame is longer than the reference duration, then no boost to apply + if (frame_duration_us >= FRAME_DURATION_REF) { + return LUT_1000_200_US_MIN_BST; + } else if (frame_duration_us < LUT_200_70_US_MIN) { // If frame shorter than + // 70us apply the + // maximum boost + return LUT_200_70_US_MAX_BST; + } else if (frame_duration_us > LUT_1000_200_US_MIN) { // Select LUT table for + // frame 1000us > + // duration > 200us + lut_num = LUT_1000_200_US_NUM; + lut_min = LUT_1000_200_US_MIN; + lut_step = LUT_1000_200_US_STEP; + lut = txpower_boost_per_frame_duration_1000_200_us; + } else { // Select LUT table for frame 200us > duration > 70us + lut_num = LUT_200_70_US_NUM; + lut_min = LUT_200_70_US_MIN; + lut_step = LUT_200_70_US_STEP; + lut = txpower_boost_per_frame_duration_200_70_us; + } + + // Calculating the LUT index corresponding to the frame duration + lut_i = (lut_num - (frame_duration_us - lut_min) / lut_step); + limit = (lut_num - lut_i) * lut_step + lut_min; + + // Selecting the index that gives the closest LUT duration to the one passed + // as argument. + if (abs(frame_duration_us - limit) > lut_step / 2) { + lut_i--; + } + + // Boost is stored in the LUT at the calculated index - 1. + // -1 to account for index 0 + // lut_i cannot be == 0 or > lut_num here + return lut[lut_i - 1]; +} + +/*! + * --------------------------------------------------------------------------- + * @fn check_for_status_errors() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current TX preamble length set. + * + * @param reg: uint32_t value representing the current status register value. + * @param errors: pointer to a uint32_t buffer that contains the sum of + * different errors logged during program operation. + * + * @return none + */ +void check_for_status_errors(uint32_t reg, uint32_t *errors) +{ + uint16_t stsStatus = 0; + + if (!(reg & DWT_INT_RXFCG_BIT_MASK)) { + errors[BAD_FRAME_ERR_IDX] += 1; + } + + if (reg & DWT_INT_RXFSL_BIT_MASK) { + errors[RSE_ERR_IDX] += 1; + } + + if (reg & DWT_INT_RXPHE_BIT_MASK) { + errors[PHE_ERR_IDX] += 1; + } + + if (reg & DWT_INT_RXPTO_BIT_MASK) { + errors[PTO_ERR_IDX] += 1; + } + + if (reg & DWT_INT_ARFE_BIT_MASK) { + errors[ARFE_ERR_IDX] += 1; + } + + if ((reg & DWT_INT_RXFR_BIT_MASK) && !(reg & DWT_INT_RXFCG_BIT_MASK)) { + errors[CRC_ERR_IDX] += 1; + } + + if ((reg & DWT_INT_RXFTO_BIT_MASK) || (reg & SYS_STATUS_ALL_RX_TO)) { + errors[RTO_ERR_IDX] += 1; + } + + if (reg & DWT_INT_RXSTO_BIT_MASK) { + errors[SFDTO_ERR_IDX] += 1; + } + + if (reg & DWT_INT_CPERR_BIT_MASK) { + // There is a general STS error + errors[STS_PREAMBLE_ERR] += 1; + + // Get the status for a more detailed error reading of what went wrong with + // the STS + dwt_readstsstatus(&stsStatus, 0); + if (stsStatus & 0x100) { + // Peak growth rate warning + errors[STS_PEAK_GROWTH_RATE_ERR] += 1; + } + if (stsStatus & 0x080) { + // ADC count warning + errors[STS_ADC_COUNT_ERR] += 1; + } + if (stsStatus & 0x040) { + // SFD count warning + errors[STS_SFD_COUNT_ERR] += 1; + } + if (stsStatus & 0x020) { + // Late first path estimation + errors[STS_LATE_FIRST_PATH_ERR] += 1; + } + if (stsStatus & 0x010) { + // Late coarse estimation + errors[STS_LATE_COARSE_EST_ERR] += 1; + } + if (stsStatus & 0x008) { + // Coarse estimation empty + errors[STS_COARSE_EST_EMPTY_ERR] += 1; + } + if (stsStatus & 0x004) { + // High noise threshold + errors[STS_HIGH_NOISE_THREASH_ERR] += 1; + } + if (stsStatus & 0x002) { + // Non-triangle + errors[STS_NON_TRIANGLE_ERR] += 1; + } + if (stsStatus & 0x001) { + // Logistic regression failed + errors[STS_LOG_REG_FAILED_ERR] += 1; + } + } +} + +/*! + * --------------------------------------------------------------------------- + * @fn get_rx_delay_time_txpreamble() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current TX preamble length set. + * + * @param None + * + * @return delay_time - a uint32_t value indicating the required increase needed + * to delay the time by. + */ +uint32_t get_rx_delay_time_txpreamble(void) +{ + uint32_t delay_time = 0; + + /* Standard delay values for preamble lengths of 32, 64, 72 & 128 should be + * adequate. + * Additional time delay will be needed for larger preamble lengths. + * Delay required is dependent on the preamble length as it increases the + * frame length. */ + switch (config_options.txPreambLength) + { + case DWT_PLEN_256: + delay_time += 128; /* 256 - 128 */ + break; + case DWT_PLEN_512: + delay_time += 384; /* 512 - 128 */ + break; + case DWT_PLEN_1024: + delay_time += 896; /* 1024 - 128 */ + break; + case DWT_PLEN_1536: + delay_time += 1408; /* 1536 - 128 */ + break; + case DWT_PLEN_2048: + delay_time += 1920; /* 2048 - 128 */ + break; + case DWT_PLEN_4096: + delay_time += 3968; /* 4096 - 128 */ + break; + case DWT_PLEN_32: + case DWT_PLEN_64: + case DWT_PLEN_72: + case DWT_PLEN_128: + default: + break; + } + + return delay_time; +} + +/*! + * --------------------------------------------------------------------------- + * @fn get_rx_delay_time_data_rate() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current data rate set. + * + * @param None + * + * @return delay_time - a uint32_t value indicating the required increase needed + * to delay the time by. + */ +uint32_t get_rx_delay_time_data_rate(void) +{ + uint32_t delay_time = 0; + + /* + * If data rate is set to 850k (slower rate), + * increase the delay time + */ + switch (config_options.dataRate) + { + case DWT_BR_850K: + delay_time += 200; + break; + case DWT_BR_6M8: + default: + break; + } + + return delay_time; +} + +/*! + * --------------------------------------------------------------------------- + * @fn set_delayed_rx_time() + * + * @brief This function is used to set the delayed RX time before running + * dwt_rxenable() + * + * @param delay - This is a defined delay value (usually + * POLL_TX_TO_RESP_RX_DLY_UUS) + * @param config_options - pointer to dwt_config_t configuration structure that + * is in use at the time this function + * is called. + * + * @return None + */ +void set_delayed_rx_time(uint32_t delay, dwt_config_t *config_options) +{ + uint32_t delay_time = delay; + + switch (config_options->txPreambLength) + { + case DWT_PLEN_32: + delay_time -= 32; + break; + case DWT_PLEN_64: + delay_time -= 64; + break; + case DWT_PLEN_72: + delay_time -= 72; + break; + case DWT_PLEN_128: + delay_time -= 128; + break; + case DWT_PLEN_256: + delay_time -= 256; + break; + case DWT_PLEN_512: + delay_time -= 512; + break; + case DWT_PLEN_1024: + delay_time -= 1024; + break; + case DWT_PLEN_1536: + delay_time -= 1536; + break; + case DWT_PLEN_2048: + case DWT_PLEN_4096: + delay_time -= 2048; + break; + default: + break; + } + + /* Length of the STS effects the size of the frame also. + * This means the delay required is greater for larger STS lengths. */ + delay_time += ((1 << (config_options->stsLength + 2)) * 8); + + dwt_setdelayedtrxtime((uint32_t)((delay_time * UUS_TO_DWT_TIME) >> 8)); +} + +/*! + * --------------------------------------------------------------------------- + * @fn set_resp_rx_timeout() + * + * @brief This function is used to set the RX timeout value + * + * @param delay - This is a defined delay value (usually RESP_RX_TIMEOUT_UUS) + * @param config_options - pointer to dwt_config_t configuration structure that + * is in use at the time this function + * is called. + * + * @return None + */ +void set_resp_rx_timeout(uint32_t delay, dwt_config_t *config_options) +{ + /* + * The program will need to adjust the timeout value depending on the size of + * the frame + * Different sized frames require different time delays. + */ + uint32_t delay_time = delay + get_rx_delay_time_data_rate() + + get_rx_delay_time_txpreamble() + 500; + + /* Length of the STS effects the size of the frame also. + * This means the delay required is greater for larger STS lengths. */ + switch (config_options->stsLength) + { + case DWT_STS_LEN_256: + case DWT_STS_LEN_512: + case DWT_STS_LEN_1024: + case DWT_STS_LEN_2048: + delay_time += ((1 << (config_options->stsLength + 2)) * 8); + break; + case DWT_STS_LEN_32: + case DWT_STS_LEN_64: + case DWT_STS_LEN_128: + default: + break; + } + + dwt_setrxtimeout(delay_time); +} + +/*! + * --------------------------------------------------------------------------- + * @fn resp_msg_get_ts() + * + * @brief Read a given timestamp value from the response message. In the + * timestamp fields of the response message, the + * least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to get + * ts timestamp value + * + * @return none + */ +void resp_msg_get_ts(uint8_t *ts_field, uint32_t *ts) +{ + int i; + *ts = 0; + for (i = 0; i < RESP_MSG_TS_LEN; i++) + { + *ts += (uint32_t)ts_field[i] << (i * 8); + } +} + +/*! + * --------------------------------------------------------------------------- + * @fn get_tx_timestamp_u64() + * + * @brief Get the TX time-stamp in a 64-bit variable. + * /!\ This function assumes that length of time-stamps is 40 bits, for + * both TX and RX! + * + * @param none + * + * @return 64-bit value of the read time-stamp. + */ +uint64_t get_tx_timestamp_u64(void) +{ + uint8_t ts_tab[5]; + uint64_t ts = 0; + int8_t i; + dwt_readtxtimestamp(ts_tab); + for (i = 4; i >= 0; i--) + { + ts <<= 8; + ts |= ts_tab[i]; + } + return ts; +} + +/*! + * --------------------------------------------------------------------------- + * @fn get_rx_timestamp_u64() + * + * @brief Get the RX time-stamp in a 64-bit variable. + * /!\ This function assumes that length of time-stamps is 40 bits, for + * both TX and RX! + * + * @param none + * + * @return 64-bit value of the read time-stamp. + */ +uint64_t get_rx_timestamp_u64(void) +{ + uint8_t ts_tab[5]; + uint64_t ts = 0; + int8_t i; + dwt_readrxtimestamp(ts_tab); + for (i = 4; i >= 0; i--) + { + ts <<= 8; + ts |= ts_tab[i]; + } + return ts; +} + +/*! + * --------------------------------------------------------------------------- + * @fn final_msg_get_ts() + * + * @brief Read a given timestamp value from the final message. In the timestamp + * fields of the final message, the least + * significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to read + * ts timestamp value + * + * @return none + */ +void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts) +{ + uint8_t i; + *ts = 0; + for (i = 0; i < FINAL_MSG_TS_LEN; i++) + { + *ts += ((uint32_t)ts_field[i] << (i * 8)); + } +} + +/*! + * --------------------------------------------------------------------------- + * @fn final_msg_set_ts() + * + * @brief Fill a given timestamp field in the final message with the given + * value. In the timestamp fields of the final + * message, the least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to fill + * ts timestamp value + * + * @return none + */ +void final_msg_set_ts(uint8_t *ts_field, uint64_t ts) +{ + uint8_t i; + for (i = 0; i < FINAL_MSG_TS_LEN; i++) + { + ts_field[i] = (uint8_t)ts; + ts >>= 8; + } +} + +/*! + * --------------------------------------------------------------------------- + * @fn resp_msg_set_ts() + * + * @brief Fill a given timestamp field in the response message with the given + * value. In the timestamp fields of the + * response message, the least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to fill + * ts timestamp value + * + * @return none + */ +void resp_msg_set_ts(uint8_t *ts_field, const uint64_t ts) +{ + uint8_t i; + for (i = 0; i < RESP_MSG_TS_LEN; i++) + { + ts_field[i] = (uint8_t)(ts >> (i * 8)); + } +} + +/*! + * --------------------------------------------------------------------------- + * @brief This function will continuously read the system status register until + * it matches the bits set in the mask + * input parameter. It will then exit the function. + * This is useful to use when waiting on particular events to occurs. For + * example, the user could wait for a + * good UWB frame to be received and/or no receive errors have occurred. + * The lower 32-bits of the system status register will be read in a + * while loop. Each iteration of the loop will check if a matching + * mask value for the higher 32-bits of the system status register is + * set. If the mask value is set in the higher 32-bits of the system + * status register, the function will return that value along with the + * last recorded value of the lower 32-bits of the system status + * register. Thus, the user should be aware that this function will not + * wait for high and low mask values to be set in both the low and high + * system status registers. Alternatively, the user can call this + * function to *only* check the higher or lower system status registers. + * + * input parameters + * @param lo_result - A pointer to a uint32_t that will contain the final value + * of the system status register (lower 32 bits). + * Pass in a NULL pointer to ignore returning this value. + * @param hi_result - A pointer to a uint32_t that will contain the final value + * of the system status register (higher 32 bits). + * Pass in a NULL pointer to ignore returning this value. + * @param lo_mask - a uint32 mask value that is used to check for certain bits + * to be set in the system status register (lower 32 bits). + * Example values to use are as follows: + * DWT_INT_TXFRS_BIT_MASK - Wait for a TX frame to be sent. + * SYS_STATUS_RXFCG_BIT_MASK | SYS_STATUS_ALL_RX_ERR - Wait for + * frame to be received and no reception errors. + * SYS_STATUS_RXFCG_BIT_MASK | SYS_STATUS_ALL_RX_TO | + * SYS_STATUS_ALL_RX_ERR - Wait for frame to be received and no receive + * timeout errors + * + * + * + * + * + * + * + * and + * no reception errors. + * SYS_STATUS_RXFR_BIT_MASK | SYS_STATUS_ALL_RX_TO | + * SYS_STATUS_ALL_ND_RX_ERR - Wait for packet to be received and no receive + * timeout errors + * + * + * + * + * + * + * + * and + * no reception errors. + * + * + * + * + * + * + * + * + * These + * flags are useful when polling for STS Mode 4 (no data) + * + * + * + * + * + * + * + * + * + * packets. + * 0 - The function will not wait for any bits in the system + * status register (lower 32 bits). + * @param hi_mask - a uint32 mask value that is used to check for certain bits + * to be set in the system status register (higher 32 bits). + * Example values to use are as follows: + * SYS_STATUS_HI_CCA_FAIL_BIT_MASK - Check for CCA fail status. + * 0 - The function will not wait for any bits in the system + * status register (lower 32 bits). + * + * return None + */ +void waitforsysstatus(uint32_t *lo_result, + uint32_t *hi_result, + uint32_t lo_mask, + uint32_t hi_mask) +{ + uint32_t lo_result_tmp = 0; + uint32_t hi_result_tmp = 0; + + // If a mask has been passed into the function for the system status register + // (lower 32-bits) + if (lo_mask) { + while (!((lo_result_tmp = dwt_readsysstatuslo()) & (lo_mask))) + { + // If a mask value is set for the system status register (higher 32-bits) + if (hi_mask) { + // If mask value for the system status register (higher 32-bits) is + // found + if ((hi_result_tmp = dwt_readsysstatushi()) & hi_mask) { + break; + } + } + } + } + // if only a mask value for the system status register (higher 32-bits) is set + else if (hi_mask) { + while (!((hi_result_tmp = dwt_readsysstatushi()) & (hi_mask))) {} + } + + if (lo_result != NULL) { + *lo_result = lo_result_tmp; + } + + if (hi_result != NULL) { + *hi_result = hi_result_tmp; + } +} diff --git a/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.h b/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.h new file mode 100644 index 00000000..4bedf6e4 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/app_files/shared_functions.h @@ -0,0 +1,294 @@ +#ifndef _SHARE_FUNC_ +#define _SHARE_FUNC_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Power boost calculation service function defines*/ + +/* Number of frames duration values for which look up table has corresponding + * dial back in units of 0.1dB */ +#define LUT_1000_200_US_NUM 33 + +/* Frame duration step in us between each ndex in LUT */ +#define LUT_1000_200_US_STEP 25 + +/* Minimum frame duration characterised by LUT */ +#define LUT_1000_200_US_MIN 200 + +/* Boost to apply when a frame is longer or equal to the maximum duration */ +#define LUT_1000_200_US_MIN_BST 0 + +/* Number of frames duration values for which look up table has corresponding + * dial back in units of 0.1dB */ +#define LUT_200_70_US_NUM 14 + +/* Frame duration step in us between each index in LUT */ +#define LUT_200_70_US_STEP 10 + +/* Minimum frame duration characterised by LUT */ +#define LUT_200_70_US_MIN 70 + +/* Total boost to apply when a frame is equal or shorter to the minimum + * duration */ +#define LUT_200_70_US_MAX_BST 113 + +/* The reference duration for a frame is 1000us. Longer frame will have 0dB + * boost. */ +#define FRAME_DURATION_REF 1000 + +/*! + * + * ----------------------------------------------------------------------------- + * @fn calculate_power_boost() + * + * @brief Calculation the allowed power boost for a frame_duration_us frame + * relatively to a 1ms frame. + * + * @param reg: uint16_t duration of frame.. + * + * @return boost: the amount of boost in 0.1dB steps which is allowed when + * transmitting the frame_dur_us frame + * relatively to a 1ms frame. For example, if the frame duration + * is 500us, then relatively to 1ms, + * a 3dB boost is allowed, and the function will return 30. + */ +uint8_t calculate_power_boost(uint16_t frame_duration_us); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn check_for_status_errors() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current TX preamble length set. + * + * @param reg: uint32_t value representing the current status register value. + * @param errors: pointer to a uint32_t buffer that contains the sum of + * different errors logged during program operation. + * + * @return none + */ +void check_for_status_errors(uint32_t reg, uint32_t *errors); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn get_rx_delay_time_txpreamble() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current TX preamble length set. + * + * @param None + * + * @return delay_time - a uint32_t value indicating the required increase needed + * to delay the time by. + */ +uint32_t get_rx_delay_time_txpreamble(void); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn get_rx_delay_time_data_rate() + * + * @brief This function is used to get a value to increase the delay timer by + * dependent on the current data rate set. + * + * @param None + * + * @return delay_time - a uint32_t value indicating the required increase needed + * to delay the time by. + */ +uint32_t get_rx_delay_time_data_rate(void); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn set_delayed_rx_time() + * + * @brief This function is used to set the delayed RX time before running + * dwt_rxenable() + * + * @param delay - This is a defined delay value (usually + * POLL_TX_TO_RESP_RX_DLY_UUS) + * @param config_options - pointer to dwt_config_t configuration structure that + * is in use at the time this function + * is called. + * + * @return None + */ +void set_delayed_rx_time(uint32_t delay, dwt_config_t *config_options); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn set_resp_rx_timeout() + * + * @brief This function is used to set the RX timeout value + * + * @param delay - This is a defined delay value (usually RESP_RX_TIMEOUT_UUS) + * @param config_options - pointer to dwt_config_t configuration structure that + * is in use at the time this function + * is called. + * + * @return None + */ +void set_resp_rx_timeout(uint32_t delay, dwt_config_t *config_options); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn resp_msg_get_ts() + * + * @brief Read a given timestamp value from the response message. In the + * timestamp fields of the response message, the + * least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to get + * ts timestamp value + * + * @return none + */ +void resp_msg_get_ts(uint8_t *ts_field, uint32_t *ts); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn get_tx_timestamp_u64() + * + * @brief Get the TX time-stamp in a 64-bit variable. + * /!\ This function assumes that length of time-stamps is 40 bits, for + * both TX and RX! + * + * @param none + * + * @return 64-bit value of the read time-stamp. + */ +uint64_t get_tx_timestamp_u64(void); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn get_rx_timestamp_u64() + * + * @brief Get the RX time-stamp in a 64-bit variable. + * /!\ This function assumes that length of time-stamps is 40 bits, for + * both TX and RX! + * + * @param none + * + * @return 64-bit value of the read time-stamp. + */ +uint64_t get_rx_timestamp_u64(void); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn final_msg_get_ts() + * + * @brief Read a given timestamp value from the final message. In the timestamp + * fields of the final message, the least + * significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to read + * ts timestamp value + * + * @return none + */ +void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn final_msg_set_ts() + * + * @brief Fill a given timestamp field in the final message with the given + * value. In the timestamp fields of the final + * message, the least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to fill + * ts timestamp value + * + * @return none + */ +void final_msg_set_ts(uint8_t *ts_field, uint64_t ts); + +/*! + * + * ----------------------------------------------------------------------------- + * @fn resp_msg_set_ts() + * + * @brief Fill a given timestamp field in the response message with the given + * value. In the timestamp fields of the + * response message, the least significant byte is at the lower address. + * + * @param ts_field pointer on the first byte of the timestamp field to fill + * ts timestamp value + * + * @return none + */ +void resp_msg_set_ts(uint8_t *ts_field, const uint64_t ts); + +/*! + * + * ----------------------------------------------------------------------------- + * @brief This function will continuously read the system status register until + * it matches the bits set in the mask + * input parameter. It will then exit the function. + * This is useful to use when waiting on particular events to occurs. For + * example, the user could wait for a + * good UWB frame to be received and/or no receive errors have occurred. + * The lower 32-bits of the system status register will be read in a + * while loop. Each iteration of the loop will check if a matching + * mask value for the higher 32-bits of the system status register is + * set. If the mask value is set in the higher 32-bits of the system + * status register, the function will return that value along with the + * last recorded value of the lower 32-bits of the system status + * register. Thus, the user should be aware that this function will not + * wait for high and low mask values to be set in both the low and high + * system status registers. Alternatively, the user can call this + * function to *only* check the higher or lower system status registers. + * + * input parameters + * @param lo_result - A pointer to a uint32_t that will contain the final value + * of the system status register (lower 32 bits). + * Pass in a NULL pointer to ignore returning this value. + * @param hi_result - A pointer to a uint32_t that will contain the final value + * of the system status register (higher 32 bits). + * Pass in a NULL pointer to ignore returning this value. + * @param lo_mask - a uint32 mask value that is used to check for certain bits + * to be set in the system status register (lower 32 bits). + * Example values to use are as follows: + * DWT_INT_TXFRS_BIT_MASK - Wait for a TX frame to be sent. + * SYS_STATUS_RXFCG_BIT_MASK | SYS_STATUS_ALL_RX_ERR - Wait for + * frame to be received and no reception errors. + * SYS_STATUS_RXFCG_BIT_MASK | SYS_STATUS_ALL_RX_TO | + * SYS_STATUS_ALL_RX_ERR - Wait for frame to be received and no receive + * timeout errors and no reception errors. + * SYS_STATUS_RXFR_BIT_MASK | SYS_STATUS_ALL_RX_TO | + * SYS_STATUS_ALL_ND_RX_ERR - Wait for packet to be received and no receive + * timeout errors no reception errors. These flags are useful when polling for + * STS Mode 4 (no data) packets. + * 0 - The function will not wait for any bits in the system + * status register (lower 32 bits). + * @param hi_mask - a uint32 mask value that is used to check for certain bits + * to be set in the system status register (higher 32 bits). + * Example values to use are as follows: + * SYS_STATUS_HI_CCA_FAIL_BIT_MASK - Check for CCA fail status. + * 0 - The function will not wait for any bits in the system + * status register (lower 32 bits). + * + * return None + */ +void waitforsysstatus(uint32_t *lo_result, + uint32_t *hi_result, + uint32_t lo_mask, + uint32_t hi_mask); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/example/mikroe_uwb2_dwm3000/linker_files/brd2703a/linkerfile.ld b/app/example/mikroe_uwb2_dwm3000/linker_files/brd2703a/linkerfile.ld new file mode 100644 index 00000000..dc1723aa --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/linker_files/brd2703a/linkerfile.ld @@ -0,0 +1,257 @@ +/***************************************************************************//** + * GCC Linker script for Silicon Labs devices + ******************************************************************************* + * # License + * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + MEMORY + { + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0x17e000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000 + } + +ENTRY(Reset_Handler) + +SECTIONS +{ + + .text : + { + linker_vectors_begin = .; + KEEP(*(.vectors)) + linker_vectors_end = .; + + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + + linker_code_begin = .; + *(SORT_BY_ALIGNMENT(.text*)) + . = ALIGN(32); + linker_code_end = .; + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + __code_classification_validator_start__ = .; + . = . + 0x20; + *(code_classification_validator) + . = ALIGN(32); + __code_classification_validator_end__ = .; + + *(.rodata*) + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + LONG (__etext) + LONG (__data_start__) + LONG ((__data_end__ - __data_start__) / 4) + + /* Add each additional data section here */ +/* + LONG (__etext2) + LONG (__data2_start__) + LONG ((__data2_end__ - __data2_start__) / 4) +*/ + __copy_table_end__ = .; + } > FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + /* Add each additional bss section here */ +/* + LONG (__bss2_start__) + LONG ((__bss2_end__ - __bss2_start__) / 4) +*/ + __zero_table_end__ = .; + } > FLASH + +.dw_drivers ALIGN(4): + { + __dw_drivers_start = . ; + KEEP(*(.dw_drivers*)) + __dw_drivers_end = . ; + } > FLASH + + __etext = .; + + /* Start placing output sections which are loaded into RAM */ + . = ORIGIN(RAM); + + .stack ALIGN(8) (NOLOAD): + { + __StackLimit = .; + KEEP(*(.stack*)) + . = ALIGN(4); + __StackTop = .; + PROVIDE(__stack = __StackTop); + } > RAM + + + .noinit . (NOLOAD): + { + *(.noinit*); + } > RAM + + .data . : AT (__etext) + { + . = ALIGN(4); + __data_start__ = .; + *(vtable) + *(SORT_BY_ALIGNMENT(.data*)) + . = ALIGN(4); + + PROVIDE(__ram_func_section_start = .); + *(.ram) + PROVIDE(__ram_func_section_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss . : + { + . = ALIGN(4); + __bss_start__ = .; + *(SORT_BY_ALIGNMENT(.bss*)) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + __ramfuncs_start__ = .; + + __vma_ramfuncs_start__ = .; + __lma_ramfuncs_start__ = __etext + SIZEOF(.data); + + __text_application_ram_offset__ = . - __vma_ramfuncs_start__; + text_application_ram . : AT(__lma_ramfuncs_start__ + __text_application_ram_offset__) + { + . = ALIGN(4); + __text_application_ram_start__ = .; + *(text_application_ram) + . = ALIGN(4); + __text_application_ram_end__ = .; + } > RAM + + . = ALIGN(4); + __vma_ramfuncs_end__ = .; + __lma_ramfuncs_end__ = __lma_ramfuncs_start__ + __text_application_ram_offset__ + SIZEOF(text_application_ram); + + __ramfuncs_end__ = .; + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + _end = __end__; + KEEP(*(.heap*)) + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + } > RAM + + __heap_size = __HeapLimit - __HeapBase; + __ram_end__ = 0x20000000 + 0x40000; + __main_flash_end__ = 0x8000000 + 0x17e000; + + /* This is where we handle flash storage blocks. We use dummy sections for finding the configured + * block sizes and then "place" them at the end of flash when the size is known. */ + .internal_storage (DSECT) : { + KEEP(*(.internal_storage*)) + } > FLASH + + + .nvm (DSECT) : { + KEEP(*(.simee*)) + } > FLASH + + linker_nvm_end = __main_flash_end__; + linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm); + linker_nvm_size = SIZEOF(.nvm); + linker_storage_end = linker_nvm_begin; + __nvm3Base = linker_nvm_begin; + + linker_storage_begin = linker_storage_end - SIZEOF(.internal_storage); + linker_storage_size = SIZEOF(.internal_storage); + ASSERT((linker_storage_begin >= (__etext + SIZEOF(.data))), "FLASH memory overflowed !") + + + app_flash_end = 0x8000000 + 0x17e000; + ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= app_flash_end, "NVM3 is excessing the flash size !") +} diff --git a/app/example/mikroe_uwb2_dwm3000/linker_files/brd4108a/linkerfile.ld b/app/example/mikroe_uwb2_dwm3000/linker_files/brd4108a/linkerfile.ld new file mode 100644 index 00000000..257408b8 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/linker_files/brd4108a/linkerfile.ld @@ -0,0 +1,255 @@ +/***************************************************************************//** + * GCC Linker script for Silicon Labs devices + ******************************************************************************* + * # License + * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + MEMORY + { + FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x7e000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 + } + +ENTRY(Reset_Handler) + +SECTIONS +{ + + .text : + { + linker_vectors_begin = .; + KEEP(*(.vectors)) + linker_vectors_end = .; + + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + + linker_code_begin = .; + *(SORT_BY_ALIGNMENT(.text*)) + . = ALIGN(32); + linker_code_end = .; + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + __code_classification_validator_start__ = .; + . = . + 0x20; + *(code_classification_validator) + . = ALIGN(32); + __code_classification_validator_end__ = .; + + *(.rodata*) + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + LONG (__etext) + LONG (__data_start__) + LONG ((__data_end__ - __data_start__) / 4) + + /* Add each additional data section here */ +/* + LONG (__etext2) + LONG (__data2_start__) + LONG ((__data2_end__ - __data2_start__) / 4) +*/ + __copy_table_end__ = .; + } > FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + /* Add each additional bss section here */ +/* + LONG (__bss2_start__) + LONG ((__bss2_end__ - __bss2_start__) / 4) +*/ + __zero_table_end__ = .; + } > FLASH + +.dw_drivers ALIGN(4): + { + __dw_drivers_start = . ; + KEEP(*(.dw_drivers*)) + __dw_drivers_end = . ; + } > FLASH + + __etext = .; + + /* Start placing output sections which are loaded into RAM */ + . = ORIGIN(RAM); + + .stack ALIGN(8) (NOLOAD): + { + __StackLimit = .; + KEEP(*(.stack*)) + . = ALIGN(4); + __StackTop = .; + PROVIDE(__stack = __StackTop); + } > RAM + + + .noinit . (NOLOAD): + { + *(.noinit*); + } > RAM + + .data . : AT (__etext) + { + . = ALIGN(4); + __data_start__ = .; + *(vtable) + *(SORT_BY_ALIGNMENT(.data*)) + . = ALIGN(4); + + PROVIDE(__ram_func_section_start = .); + *(.ram) + PROVIDE(__ram_func_section_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss . : + { + . = ALIGN(4); + __bss_start__ = .; + *(SORT_BY_ALIGNMENT(.bss*)) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + __ramfuncs_start__ = .; + + __vma_ramfuncs_start__ = .; + __lma_ramfuncs_start__ = __etext + SIZEOF(.data); + + __text_application_ram_offset__ = . - __vma_ramfuncs_start__; + text_application_ram . : AT(__lma_ramfuncs_start__ + __text_application_ram_offset__) + { + . = ALIGN(4); + __text_application_ram_start__ = .; + *(text_application_ram) + . = ALIGN(4); + __text_application_ram_end__ = .; + } > RAM + + . = ALIGN(4); + __vma_ramfuncs_end__ = .; + __lma_ramfuncs_end__ = __lma_ramfuncs_start__ + __text_application_ram_offset__ + SIZEOF(text_application_ram); + + __ramfuncs_end__ = .; + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + _end = __end__; + KEEP(*(.heap*)) + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + } > RAM + + __heap_size = __HeapLimit - __HeapBase; + __ram_end__ = 0x20000000 + 0x8000; + __main_flash_end__ = 0x0 + 0x7e000; + + /* This is where we handle flash storage blocks. We use dummy sections for finding the configured + * block sizes and then "place" them at the end of flash when the size is known. */ + .internal_storage (DSECT) : { + KEEP(*(.internal_storage*)) + } > FLASH + + + .nvm (DSECT) : { + KEEP(*(.simee*)) + } > FLASH + + linker_nvm_end = __main_flash_end__; + linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm); + linker_nvm_size = SIZEOF(.nvm); + linker_storage_end = linker_nvm_begin; + __nvm3Base = linker_nvm_begin; + + linker_storage_begin = linker_storage_end - SIZEOF(.internal_storage); + linker_storage_size = SIZEOF(.internal_storage); + ASSERT((linker_storage_begin >= (__etext + SIZEOF(.data))), "FLASH memory overflowed !") + + +} diff --git a/app/example/mikroe_uwb2_dwm3000/linker_files/brd4314a/linkerfile.ld b/app/example/mikroe_uwb2_dwm3000/linker_files/brd4314a/linkerfile.ld new file mode 100644 index 00000000..257408b8 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/linker_files/brd4314a/linkerfile.ld @@ -0,0 +1,255 @@ +/***************************************************************************//** + * GCC Linker script for Silicon Labs devices + ******************************************************************************* + * # License + * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************/ + MEMORY + { + FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x7e000 + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 + } + +ENTRY(Reset_Handler) + +SECTIONS +{ + + .text : + { + linker_vectors_begin = .; + KEEP(*(.vectors)) + linker_vectors_end = .; + + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + + linker_code_begin = .; + *(SORT_BY_ALIGNMENT(.text*)) + . = ALIGN(32); + linker_code_end = .; + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + __code_classification_validator_start__ = .; + . = . + 0x20; + *(code_classification_validator) + . = ALIGN(32); + __code_classification_validator_end__ = .; + + *(.rodata*) + *(.eh_frame*) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + LONG (__etext) + LONG (__data_start__) + LONG ((__data_end__ - __data_start__) / 4) + + /* Add each additional data section here */ +/* + LONG (__etext2) + LONG (__data2_start__) + LONG ((__data2_end__ - __data2_start__) / 4) +*/ + __copy_table_end__ = .; + } > FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + /* Add each additional bss section here */ +/* + LONG (__bss2_start__) + LONG ((__bss2_end__ - __bss2_start__) / 4) +*/ + __zero_table_end__ = .; + } > FLASH + +.dw_drivers ALIGN(4): + { + __dw_drivers_start = . ; + KEEP(*(.dw_drivers*)) + __dw_drivers_end = . ; + } > FLASH + + __etext = .; + + /* Start placing output sections which are loaded into RAM */ + . = ORIGIN(RAM); + + .stack ALIGN(8) (NOLOAD): + { + __StackLimit = .; + KEEP(*(.stack*)) + . = ALIGN(4); + __StackTop = .; + PROVIDE(__stack = __StackTop); + } > RAM + + + .noinit . (NOLOAD): + { + *(.noinit*); + } > RAM + + .data . : AT (__etext) + { + . = ALIGN(4); + __data_start__ = .; + *(vtable) + *(SORT_BY_ALIGNMENT(.data*)) + . = ALIGN(4); + + PROVIDE(__ram_func_section_start = .); + *(.ram) + PROVIDE(__ram_func_section_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > RAM + + .bss . : + { + . = ALIGN(4); + __bss_start__ = .; + *(SORT_BY_ALIGNMENT(.bss*)) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + __ramfuncs_start__ = .; + + __vma_ramfuncs_start__ = .; + __lma_ramfuncs_start__ = __etext + SIZEOF(.data); + + __text_application_ram_offset__ = . - __vma_ramfuncs_start__; + text_application_ram . : AT(__lma_ramfuncs_start__ + __text_application_ram_offset__) + { + . = ALIGN(4); + __text_application_ram_start__ = .; + *(text_application_ram) + . = ALIGN(4); + __text_application_ram_end__ = .; + } > RAM + + . = ALIGN(4); + __vma_ramfuncs_end__ = .; + __lma_ramfuncs_end__ = __lma_ramfuncs_start__ + __text_application_ram_offset__ + SIZEOF(text_application_ram); + + __ramfuncs_end__ = .; + + .heap (COPY): + { + __HeapBase = .; + __end__ = .; + end = __end__; + _end = __end__; + KEEP(*(.heap*)) + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + } > RAM + + __heap_size = __HeapLimit - __HeapBase; + __ram_end__ = 0x20000000 + 0x8000; + __main_flash_end__ = 0x0 + 0x7e000; + + /* This is where we handle flash storage blocks. We use dummy sections for finding the configured + * block sizes and then "place" them at the end of flash when the size is known. */ + .internal_storage (DSECT) : { + KEEP(*(.internal_storage*)) + } > FLASH + + + .nvm (DSECT) : { + KEEP(*(.simee*)) + } > FLASH + + linker_nvm_end = __main_flash_end__; + linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm); + linker_nvm_size = SIZEOF(.nvm); + linker_storage_end = linker_nvm_begin; + __nvm3Base = linker_nvm_begin; + + linker_storage_begin = linker_storage_end - SIZEOF(.internal_storage); + linker_storage_size = SIZEOF(.internal_storage); + ASSERT((linker_storage_begin >= (__etext + SIZEOF(.data))), "FLASH memory overflowed !") + + +} diff --git a/app/example/mikroe_uwb2_dwm3000/main.c b/app/example/mikroe_uwb2_dwm3000/main.c new file mode 100644 index 00000000..b6aa4e33 --- /dev/null +++ b/app/example/mikroe_uwb2_dwm3000/main.c @@ -0,0 +1,80 @@ +/***************************************************************************//** + * @file main.c + * @brief main() function. + ******************************************************************************* + ******************************************************************************* + * # License + * Copyright 2022 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided \'as-is\', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************* + * + * EVALUATION QUALITY + * This code has been minimally tested to ensure that it builds with the + * specified dependency versions and is suitable as a demonstration for + * evaluation purposes only. + * This code will be maintained at the sole discretion of Silicon Labs. + * + ******************************************************************************/ +#include "sl_component_catalog.h" +#include "sl_system_init.h" +#include "app.h" +#if defined(SL_CATALOG_POWER_MANAGER_PRESENT) +#include "sl_power_manager.h" +#endif +#if defined(SL_CATALOG_KERNEL_PRESENT) +#include "sl_system_kernel.h" +#else // SL_CATALOG_KERNEL_PRESENT +#include "sl_system_process_action.h" +#endif // SL_CATALOG_KERNEL_PRESENT + +int main(void) +{ + // Initialize Silicon Labs device, system, service(s) and protocol stack(s). + // Note that if the kernel is present, processing task(s) will be created by + // this call. + sl_system_init(); + + // Initialize the application. For example, create periodic timer(s) or + // task(s) if the kernel is present. + app_init(); + +#if defined(SL_CATALOG_KERNEL_PRESENT) + // Start the kernel. Task(s) created in app_init() will start running. + sl_system_kernel_start(); +#else // SL_CATALOG_KERNEL_PRESENT + while (1) { + // Do not remove this call: Silicon Labs components process action routine + // must be called from the super loop. + sl_system_process_action(); + + // Application process. + app_process_action(); + +#if defined(SL_CATALOG_POWER_MANAGER_PRESENT) + // Let the CPU go to sleep if the system allows it. + sl_power_manager_sleep(); +#endif + } +#endif // SL_CATALOG_KERNEL_PRESENT +} diff --git a/app/example/mikroe_water_detect/mikroe_water_detect.slcp b/app/example/mikroe_water_detect/mikroe_water_detect.slcp index 2d94b023..e34ca039 100644 --- a/app/example/mikroe_water_detect/mikroe_water_detect.slcp +++ b/app/example/mikroe_water_detect/mikroe_water_detect.slcp @@ -42,7 +42,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/mikroe_water_detect/image/create_example.png diff --git a/app/example/silabs_ir_generate/silabs_ir_generate.slcp b/app/example/silabs_ir_generate/silabs_ir_generate.slcp index 4a176e20..0dd5a62b 100644 --- a/app/example/silabs_ir_generate/silabs_ir_generate.slcp +++ b/app/example/silabs_ir_generate/silabs_ir_generate.slcp @@ -33,7 +33,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/silabs_ir_generate/image/create_example.png directory: "image" diff --git a/app/example/silabs_lin_bus/slave/silabs_lin_slave1.slcp b/app/example/silabs_lin_bus/slave/silabs_lin_slave1.slcp index 008ffc0f..bc5bc501 100644 --- a/app/example/silabs_lin_bus/slave/silabs_lin_slave1.slcp +++ b/app/example/silabs_lin_bus/slave/silabs_lin_slave1.slcp @@ -86,7 +86,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../../documentation/example/silabs_lin_bus/images/hardware_connection.jpg diff --git a/app/example/silabs_lin_bus/slave/silabs_lin_slave2.slcp b/app/example/silabs_lin_bus/slave/silabs_lin_slave2.slcp index 5d1943eb..34a5ef31 100644 --- a/app/example/silabs_lin_bus/slave/silabs_lin_slave2.slcp +++ b/app/example/silabs_lin_bus/slave/silabs_lin_slave2.slcp @@ -85,7 +85,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../../documentation/example/silabs_lin_bus/images/hardware_connection.jpg diff --git a/app/example/silabs_pir_ira_s210st01/silabs_pir_ira_s210st01.slcp b/app/example/silabs_pir_ira_s210st01/silabs_pir_ira_s210st01.slcp index 3d250438..57bfdf25 100644 --- a/app/example/silabs_pir_ira_s210st01/silabs_pir_ira_s210st01.slcp +++ b/app/example/silabs_pir_ira_s210st01/silabs_pir_ira_s210st01.slcp @@ -43,7 +43,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 ui_hints: highlight: - path: README.md diff --git a/app/example/silabs_triac/silabs_triac.slcp b/app/example/silabs_triac/silabs_triac.slcp index a2cc7a50..5ef0b569 100644 --- a/app/example/silabs_triac/silabs_triac.slcp +++ b/app/example/silabs_triac/silabs_triac.slcp @@ -33,7 +33,7 @@ define: - name: DEBUG_EFM sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/silabs_triac/image/create_example.png directory: "image" diff --git a/app/example/sparkfun_accelerometer_mma8452q/sparkfun_accelerometer_mma8452q.slcp b/app/example/sparkfun_accelerometer_mma8452q/sparkfun_accelerometer_mma8452q.slcp index 72b42ee0..97e6b91d 100644 --- a/app/example/sparkfun_accelerometer_mma8452q/sparkfun_accelerometer_mma8452q.slcp +++ b/app/example/sparkfun_accelerometer_mma8452q/sparkfun_accelerometer_mma8452q.slcp @@ -52,7 +52,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_accelerometer_mma8452q/image/api_overview.png diff --git a/app/example/sparkfun_air_quality_sgp40/sparkfun_air_quality_sgp40.slcp b/app/example/sparkfun_air_quality_sgp40/sparkfun_air_quality_sgp40.slcp index f319dbf9..7b6ee651 100644 --- a/app/example/sparkfun_air_quality_sgp40/sparkfun_air_quality_sgp40.slcp +++ b/app/example/sparkfun_air_quality_sgp40/sparkfun_air_quality_sgp40.slcp @@ -51,7 +51,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_air_quality_sgp40/image/create_example.png diff --git a/app/example/sparkfun_distance_vl53l1x/sparkfun_distance_vl53l1x.slcp b/app/example/sparkfun_distance_vl53l1x/sparkfun_distance_vl53l1x.slcp index 1192bd18..b593ff45 100644 --- a/app/example/sparkfun_distance_vl53l1x/sparkfun_distance_vl53l1x.slcp +++ b/app/example/sparkfun_distance_vl53l1x/sparkfun_distance_vl53l1x.slcp @@ -52,7 +52,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_distance_vl53l1x/image/create_example.png diff --git a/app/example/sparkfun_dosimeter_type5/sparkfun_dosimeter_type5.slcp b/app/example/sparkfun_dosimeter_type5/sparkfun_dosimeter_type5.slcp index 299b6c32..6c68d12a 100644 --- a/app/example/sparkfun_dosimeter_type5/sparkfun_dosimeter_type5.slcp +++ b/app/example/sparkfun_dosimeter_type5/sparkfun_dosimeter_type5.slcp @@ -44,7 +44,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_dosimeter_type5/image/connection.png diff --git a/app/example/sparkfun_environmental_bme280_ccs811/sparkfun_environmental_bme280_ccs811.slcp b/app/example/sparkfun_environmental_bme280_ccs811/sparkfun_environmental_bme280_ccs811.slcp index 570c14b8..77b2ac4a 100644 --- a/app/example/sparkfun_environmental_bme280_ccs811/sparkfun_environmental_bme280_ccs811.slcp +++ b/app/example/sparkfun_environmental_bme280_ccs811/sparkfun_environmental_bme280_ccs811.slcp @@ -53,7 +53,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_environmental_bme280_ccs811/image/console_log.png diff --git a/app/example/sparkfun_hr_po_max30101_max32664/sparkfun_hr_po_max30101_max32664.slcp b/app/example/sparkfun_hr_po_max30101_max32664/sparkfun_hr_po_max30101_max32664.slcp index 8e47749c..352626d1 100644 --- a/app/example/sparkfun_hr_po_max30101_max32664/sparkfun_hr_po_max30101_max32664.slcp +++ b/app/example/sparkfun_hr_po_max30101_max32664/sparkfun_hr_po_max30101_max32664.slcp @@ -51,7 +51,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_hr_po_max30101_max32664/image/create_example.png diff --git a/app/example/sparkfun_human_presence_ak9753/sparkfun_human_presence_ak9753.slcp b/app/example/sparkfun_human_presence_ak9753/sparkfun_human_presence_ak9753.slcp index 9552043d..35a8f894 100644 --- a/app/example/sparkfun_human_presence_ak9753/sparkfun_human_presence_ak9753.slcp +++ b/app/example/sparkfun_human_presence_ak9753/sparkfun_human_presence_ak9753.slcp @@ -54,7 +54,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_human_presence_ak9753/image/create_example.png diff --git a/app/example/sparkfun_ir_array_amg88xx/sparkfun_ir_array_amg88xx.slcp b/app/example/sparkfun_ir_array_amg88xx/sparkfun_ir_array_amg88xx.slcp index a3bd1158..86190c8b 100644 --- a/app/example/sparkfun_ir_array_amg88xx/sparkfun_ir_array_amg88xx.slcp +++ b/app/example/sparkfun_ir_array_amg88xx/sparkfun_ir_array_amg88xx.slcp @@ -53,7 +53,7 @@ configuration: value: "6144" sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_ir_array_amg88xx/image/create_example.png directory: image diff --git a/app/example/sparkfun_ir_array_mlx90640/sparkfun_ir_array_mlx90640.slcp b/app/example/sparkfun_ir_array_mlx90640/sparkfun_ir_array_mlx90640.slcp index 96a86cbf..bca1e540 100644 --- a/app/example/sparkfun_ir_array_mlx90640/sparkfun_ir_array_mlx90640.slcp +++ b/app/example/sparkfun_ir_array_mlx90640/sparkfun_ir_array_mlx90640.slcp @@ -62,7 +62,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_ir_array_mlx90640/image/connection.png diff --git a/app/example/sparkfun_micro_oled_ssd1306/sparkfun_micro_oled_ssd1306.slcp b/app/example/sparkfun_micro_oled_ssd1306/sparkfun_micro_oled_ssd1306.slcp index 5b67a21b..0fff6649 100644 --- a/app/example/sparkfun_micro_oled_ssd1306/sparkfun_micro_oled_ssd1306.slcp +++ b/app/example/sparkfun_micro_oled_ssd1306/sparkfun_micro_oled_ssd1306.slcp @@ -57,7 +57,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_micro_oled_ssd1306/image/bgm220_kit_sparkfun_oled.png diff --git a/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_i2c.slcp b/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_i2c.slcp index bccc6e97..290a237d 100644 --- a/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_i2c.slcp +++ b/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_i2c.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_particulate_matter_sensor_sps30/image/hw_connection_1.png diff --git a/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_uart.slcp b/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_uart.slcp index 633ba810..da33554d 100644 --- a/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_uart.slcp +++ b/app/example/sparkfun_particulate_matter_sensor_sps30/sparkfun_particulate_matter_sensor_sps30_uart.slcp @@ -46,7 +46,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_particulate_matter_sensor_sps30/image/hw_connection_1.png diff --git a/app/example/sparkfun_proximity_vcnl4040/sparkfun_proximity_vcnl4040.slcp b/app/example/sparkfun_proximity_vcnl4040/sparkfun_proximity_vcnl4040.slcp index 51ad7dee..c7681276 100644 --- a/app/example/sparkfun_proximity_vcnl4040/sparkfun_proximity_vcnl4040.slcp +++ b/app/example/sparkfun_proximity_vcnl4040/sparkfun_proximity_vcnl4040.slcp @@ -52,7 +52,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_proximity_vcnl4040/image/connection.png diff --git a/app/example/sparkfun_qwiic_joystick/sparkfun_qwiic_joystick.slcp b/app/example/sparkfun_qwiic_joystick/sparkfun_qwiic_joystick.slcp index 452f243a..e27e02fe 100644 --- a/app/example/sparkfun_qwiic_joystick/sparkfun_qwiic_joystick.slcp +++ b/app/example/sparkfun_qwiic_joystick/sparkfun_qwiic_joystick.slcp @@ -51,7 +51,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_qwiic_joystick/image/logs.png diff --git a/app/example/sparkfun_qwiic_keypad/sparkfun_qwiic_keypad.slcp b/app/example/sparkfun_qwiic_keypad/sparkfun_qwiic_keypad.slcp index 454c3b7a..c9292bcc 100644 --- a/app/example/sparkfun_qwiic_keypad/sparkfun_qwiic_keypad.slcp +++ b/app/example/sparkfun_qwiic_keypad/sparkfun_qwiic_keypad.slcp @@ -52,7 +52,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_qwiic_keypad/image/logs.png diff --git a/app/example/sparkfun_rfid_id12la/sparkfun_rfid_id12la.slcp b/app/example/sparkfun_rfid_id12la/sparkfun_rfid_id12la.slcp index 61452e69..16cbdd90 100644 --- a/app/example/sparkfun_rfid_id12la/sparkfun_rfid_id12la.slcp +++ b/app/example/sparkfun_rfid_id12la/sparkfun_rfid_id12la.slcp @@ -43,7 +43,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_rfid_id12la/image/api_overview.png diff --git a/app/example/sparkfun_soil_moisture/sparkfun_soil_moisture.slcp b/app/example/sparkfun_soil_moisture/sparkfun_soil_moisture.slcp index 55196616..932d4a28 100644 --- a/app/example/sparkfun_soil_moisture/sparkfun_soil_moisture.slcp +++ b/app/example/sparkfun_soil_moisture/sparkfun_soil_moisture.slcp @@ -49,7 +49,7 @@ config_file: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 define: - name: DEBUG_EFM diff --git a/app/example/sparkfun_spectroscopy_as7265x/sparkfun_spectroscopy_as7265x.slcp b/app/example/sparkfun_spectroscopy_as7265x/sparkfun_spectroscopy_as7265x.slcp index dfbf8dbc..33a0719d 100644 --- a/app/example/sparkfun_spectroscopy_as7265x/sparkfun_spectroscopy_as7265x.slcp +++ b/app/example/sparkfun_spectroscopy_as7265x/sparkfun_spectroscopy_as7265x.slcp @@ -56,7 +56,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_spectroscopy_as7265x/image/basic_reading.png diff --git a/app/example/sparkfun_weatherstation/sparkfun_weatherstation.slcp b/app/example/sparkfun_weatherstation/sparkfun_weatherstation.slcp index 50263d15..bd301f41 100644 --- a/app/example/sparkfun_weatherstation/sparkfun_weatherstation.slcp +++ b/app/example/sparkfun_weatherstation/sparkfun_weatherstation.slcp @@ -45,7 +45,7 @@ define: sdk_extension: - id: third_party_hw_drivers - version: 2.0.1 + version: 2.0.2 other_file: - path: ../../documentation/example/sparkfun_weatherstation/image/create_example.png diff --git a/driver/component/drivers/silabs/silabs_uwb2_dwm3000.slcc b/driver/component/drivers/silabs/silabs_uwb2_dwm3000.slcc new file mode 100644 index 00000000..d797c410 --- /dev/null +++ b/driver/component/drivers/silabs/silabs_uwb2_dwm3000.slcc @@ -0,0 +1,94 @@ +id: mikroe_uwb2_dwm3000 +package: third_party_hw_drivers +label: DWM3000 - UWB 2 Click (Mikroe) +description: Driver for the Mikroe DWM3000 UWB 2 Click. +category: Wireless Connectivity +quality: evaluation +ui_hints: + visibility: basic +root_path: driver + +requires: + - name: status + - name: udelay + - name: spidrv_core + - name: sleeptimer + - name: gpiointerrupt + +provides: + - name: mikroe_uwb2_dwm3000 + +template_contribution: + - name: component_catalog + value: mikroe_uwb2_dwm3000 + +config_file: + - path: public/silabs/uwb2_dwm3000/config/brd2703a/uwb2_dwm3000_config.h + file_id: driver_config_dwm3000 + condition: [brd2703a] + - path: public/silabs/uwb2_dwm3000/config/brd4108a/uwb2_dwm3000_config.h + file_id: driver_config_dwm3000 + condition: [brd4108a] + - path: public/silabs/uwb2_dwm3000/config/brd4314a/uwb2_dwm3000_config.h + file_id: driver_config_dwm3000 + condition: [brd4314a] + - path: public/silabs/uwb2_dwm3000/config/other/uwb2_dwm3000_config.h + file_id: driver_config_dwm3000 + unless: [brd4314a, brd4108a, brd2703a] + +include: + - path: inc + file_list: + - path: third_party_hw_drivers_helpers.h + - path: thirdparty/decawave/uwb2_dwm3000/inc + file_list: + - path: deca_device_api.h + - path: deca_interface.h + - path: deca_types.h + - path: deca_version.h + - path: common.h + - path: deca_dbg.h + - path: error.h + - path: rtls_interface.h + - path: uwb_frames.h + - path: version.h + - path: public/silabs/uwb2_dwm3000/platform/deca_probe + file_list: + - path: deca_probe_interface.h + - path: public/silabs/uwb2_dwm3000/platform/deca_spi + file_list: + - path: deca_spi.h + - path: public/silabs/uwb2_dwm3000/platform/port + file_list: + - path: port_hal.h + - path: port.h +source: + - path: public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.c + - path: public/silabs/uwb2_dwm3000/platform/deca_sleep/deca_sleep.c + - path: public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.c + - path: public/silabs/uwb2_dwm3000/platform/port/port_dw3000.c + +toolchain_settings: + - option: gcc_linker_option + value: "-Wl,--whole-archive ../libdwt_uwb_driver-m33-hfp-6.0.7.a -Wl,--no-whole-archive" + condition: + - "toolchain_gcc" + - "cortexm33" + - option: gcc_linker_option + value: "-Wl,--whole-archive ../libdwt_uwb_driver-m4-hfp-6.0.7.a -Wl,--no-whole-archive" + condition: + - "toolchain_gcc" + - "cortexm4" +other_file: + - path: "thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m33-hfp-6.0.7.a" + condition: + - "toolchain_gcc" + - "cortexm33" + project: + transfer_ownership: true + - path: "thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m4-hfp-6.0.7.a" + condition: + - "toolchain_gcc" + - "cortexm4" + project: + transfer_ownership: true \ No newline at end of file diff --git a/driver/public/silabs/bthome_v2/src/bthome_v2.c b/driver/public/silabs/bthome_v2/src/bthome_v2.c index c3a8cabd..859f7590 100644 --- a/driver/public/silabs/bthome_v2/src/bthome_v2.c +++ b/driver/public/silabs/bthome_v2/src/bthome_v2.c @@ -45,7 +45,7 @@ // ----------------------------------------------------------------------------- // Static Variables Declarations // ----------------------------------------------------------------------------- -static uint8_t sensor_data_index; +static uint8_t sensor_data_index = 0; static uint8_t sensor_data[MEASUREMENT_MAX_LEN] = { 0 }; static uint8_t *dev_name; static bool b_encrypt_enable; @@ -74,6 +74,8 @@ static uint16_t get_factor(uint8_t sens); static void sort_sensor_data(void); +static void remove_oldest_sensor_data(void); + // ----------------------------------------------------------------------------- // Public Function Definitions // ----------------------------------------------------------------------------- @@ -151,6 +153,7 @@ void bthome_v2_build_packet(void) uint8_t address_type; // dev_name length uint8_t dn_length; + uint8_t dn_flag = COMPLETE_NAME; // build encrypt uint8_t ciphertext[MEASUREMENT_MAX_LEN]; uint8_t encryption_mic[MIC_LEN]; @@ -175,30 +178,34 @@ void bthome_v2_build_packet(void) // local name if (!sl_str_is_empty((const char *)dev_name)) { - // +1(flag Complete local name) - dn_length = sl_strlen((char *)dev_name) + 1; + // +1(flag name)+1(name length) + dn_length = sl_strlen((char *)dev_name) + 2; if (b_encrypt_enable) { // deal with the device name to make sure the adv length <= 31 - // 18=3(FLAG)+1(device name length bit)+1(COMPLETE_NAME)+1(SERVICE_DATA) - // +2(UUID)+1(ENCRYPT)+4(nonce)+4(mic)+1(serviceData length bit) - if (dn_length > BLE_ADVERT_MAX_LEN - sensor_data_index - 18) { - dn_length = BLE_ADVERT_MAX_LEN - sensor_data_index - 18; + // 16=3(FLAG)+2(UUID)+1(ENCRYPT) + // +4(nonce)+4(mic)+1(serviceData length bit) + if (dn_length > BLE_ADVERT_MAX_LEN - sensor_data_index - 16) { + dn_length = BLE_ADVERT_MAX_LEN - sensor_data_index - 16; + dn_flag = SHORT_NAME; } } else { - // 10=3(FLAG)+1(device name length bit)+1(COMPLETE_NAME) - // +1(SERVICE_DATA)+2(UUID)+1(ENCRYPT)+1(serviceData length bit) - if (dn_length > BLE_ADVERT_MAX_LEN - sensor_data_index - 10) { - dn_length = BLE_ADVERT_MAX_LEN - sensor_data_index - 10; + // 8=3(FLAG)+1(SERVICE_DATA)+2(UUID) + // +1(ENCRYPT)+1(serviceData length bit) + if (dn_length > BLE_ADVERT_MAX_LEN - sensor_data_index - 8) { + dn_length = BLE_ADVERT_MAX_LEN - sensor_data_index - 8; + dn_flag = SHORT_NAME; } } // Add the length of the Name // Complete_Name: Complete local name -- Short_Name: Shortened Name - payload_data[payload_count++] = dn_length; - payload_data[payload_count++] = COMPLETE_NAME; - for (uint8_t i = 0; i < (dn_length - 1); i++) { - payload_data[payload_count++] = dev_name[i]; + if (dn_length > 2) { + payload_data[payload_count++] = dn_length - 1; + payload_data[payload_count++] = dn_flag; + for (uint8_t i = 0; i < (dn_length - 2); i++) { + payload_data[payload_count++] = dev_name[i]; + } } } @@ -327,6 +334,10 @@ void bthome_v2_add_measurement_state(uint8_t sensor_id, uint8_t state, uint8_t steps) { + if (sensor_id == EVENT_BUTTON) { + steps = 0; + } + if ((sensor_data_index + 2 + ((steps > 0) ? 1 : 0)) <= (MEASUREMENT_MAX_LEN - (b_encrypt_enable ? 8 : 0))) { sensor_data[sensor_data_index] = sensor_id & 0xff; @@ -345,6 +356,7 @@ void bthome_v2_add_measurement_state(uint8_t sensor_id, last_object_id = sensor_id; } else { bthome_v2_send_packet(); + remove_oldest_sensor_data(); bthome_v2_add_measurement_state(sensor_id, state, steps); } } @@ -360,8 +372,7 @@ void bthome_v2_add_measurement(uint8_t sensor_id, uint64_t value) <= (MEASUREMENT_MAX_LEN - (b_encrypt_enable ? 8 : 0))) { sensor_data[sensor_data_index] = sensor_id & 0xff; sensor_data_index++; - for (uint8_t i = 0; i < size; i++) - { + for (uint8_t i = 0; i < size; i++) { sensor_data[sensor_data_index] = (uint8_t)(((value * factor) >> (8 * i)) & 0xff); sensor_data_index++; @@ -374,6 +385,7 @@ void bthome_v2_add_measurement(uint8_t sensor_id, uint64_t value) last_object_id = sensor_id; } else { bthome_v2_send_packet(); + remove_oldest_sensor_data(); bthome_v2_add_measurement(sensor_id, value); } } @@ -390,8 +402,7 @@ void bthome_v2_add_measurement_float(uint8_t sensor_id, float value) uint64_t value2 = (uint64_t)(value * factor); sensor_data[sensor_data_index] = sensor_id & 0xff; sensor_data_index++; - for (uint8_t i = 0; i < size; i++) - { + for (uint8_t i = 0; i < size; i++) { sensor_data[sensor_data_index] = (uint8_t)((value2 >> (8 * i)) & 0xff); sensor_data_index++; } @@ -403,6 +414,7 @@ void bthome_v2_add_measurement_float(uint8_t sensor_id, float value) last_object_id = sensor_id; } else { bthome_v2_send_packet(); + remove_oldest_sensor_data(); bthome_v2_add_measurement_float(sensor_id, value); } } @@ -648,3 +660,16 @@ static void sort_sensor_data(void) } } } + +/***************************************************************************//** + * Sort the sensor data. + ******************************************************************************/ +static void remove_oldest_sensor_data(void) +{ + uint8_t remove_length = get_byte_number(sensor_data[0]) + 1; + + for (uint8_t i = 0; i < sensor_data_index - remove_length; i++) { + sensor_data[i] = sensor_data[i + remove_length]; + } + sensor_data_index = sensor_data_index - remove_length; +} diff --git a/driver/public/silabs/uwb2_dwm3000/config/brd2703a/uwb2_dwm3000_config.h b/driver/public/silabs/uwb2_dwm3000/config/brd2703a/uwb2_dwm3000_config.h new file mode 100644 index 00000000..437d743d --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/config/brd2703a/uwb2_dwm3000_config.h @@ -0,0 +1,127 @@ +/***************************************************************************//** + * @file mikroe_uwb2_dwm3000_config.h + * @brief DWM3000 UWB config. + * @version 0.0.1 + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided \'as-is\', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************* + * + * EVALUATION QUALITY + * This code has been minimally tested to ensure that it builds with the + * specified dependency versions and is suitable as a demonstration for + * evaluation purposes only. + * This code will be maintained at the sole discretion of Silicon Labs. + * + ******************************************************************************/ +#ifndef DWM3000_CONFIG_H_ +#define DWM3000_CONFIG_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +// <<< Use Configuration Wizard in Context Menu +// SPI Driver settings + +// HAL SPI TYPE +// USART +// EUSART +#define DWM3000_SPI_TYPE EUSART + +// HAL SPI NUMBER +// <0=> 0 +// <1=> 1 +// <2=> 2 +#define DWM3000_SPI_NUMBER 1 + +// SPI FREQUENCY MIN (Hz) +// 2000000 +#define DWM3000_FREQ_MIN 2000000 + +// SPI FREQUENCY MAX (Hz) +// 19500000 +#define DWM3000_FREQ_MAX 19500000 + +// +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> + +// DWM3000_RESET +// $[GPIO_DWM3000_RESET] +#define DWM3000_RESET_PORT gpioPortC +#define DWM3000_RESET_PIN 8 +// [GPIO_DWM3000_RESET]$ + +// DWM3000_INT +// $[GPIO_DWM3000_INT] +#define DWM3000_INT_PORT gpioPortB +#define DWM3000_INT_PIN 1 +// [GPIO_DWM3000_INT]$ + +// DWM3000_WAKE +// $[GPIO_DWM3000_WAKE] +// #define DWM3000_WAKE_PORT gpioPortB +// #define DWM3000_WAKE_PIN 0 +// [GPIO_DWM3000_WAKE]$ + +// DWM3000_ON +// $[GPIO_DWM3000_ON] +#define DWM3000_ON_PORT gpioPortA +#define DWM3000_ON_PIN 0 +// [GPIO_DWM3000_ON]$ + +// DWM3000_CS +// $[GPIO_DWM3000_CS] +#define DWM3000_CS_PORT gpioPortC +#define DWM3000_CS_PIN 0 +// [GPIO_DWM3000_CS]$ + +// DWM3000_CLK +// $[GPIO_DWM3000_CLK] +#define DWM3000_CLK_PORT gpioPortC +#define DWM3000_CLK_PIN 1 +// [GPIO_DWM3000_CLK]$ + +// DWM3000_MISO +// $[GPIO_DWM3000_MISO] +#define DWM3000_MISO_PORT gpioPortC +#define DWM3000_MISO_PIN 2 +// [GPIO_DWM3000_MISO]$ + +// DWM3000_MOSI +// $[GPIO_DWM3000_MOSI] +#define DWM3000_MOSI_PORT gpioPortC +#define DWM3000_MOSI_PIN 3 +// [GPIO_DWM3000_MOSI]$ + +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif /* DWM3000_CONFIG_H_ */ diff --git a/driver/public/silabs/uwb2_dwm3000/config/brd4108a/uwb2_dwm3000_config.h b/driver/public/silabs/uwb2_dwm3000/config/brd4108a/uwb2_dwm3000_config.h new file mode 100644 index 00000000..2ccd61a5 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/config/brd4108a/uwb2_dwm3000_config.h @@ -0,0 +1,159 @@ +/***************************************************************************//** + * @file mikroe_uwb2_dwm3000_config.h + * @brief DWM3000 UWB config. + * @version 0.0.1 + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided \'as-is\', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************* + * + * EVALUATION QUALITY + * This code has been minimally tested to ensure that it builds with the + * specified dependency versions and is suitable as a demonstration for + * evaluation purposes only. + * This code will be maintained at the sole discretion of Silicon Labs. + * + ******************************************************************************/ +#ifndef DWM3000_CONFIG_H_ +#define DWM3000_CONFIG_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +// <<< Use Configuration Wizard in Context Menu +// SPI Driver settings + +// HAL SPI TYPE +// USART +// EUSART +#define DWM3000_SPI_TYPE USART + +// HAL SPI NUMBER +// <0=> 0 +// <1=> 1 +// <2=> 2 +#define DWM3000_SPI_NUMBER 0 + +// SPI FREQUENCY MIN (Hz) +// 2000000 +#define DWM3000_FREQ_MIN 2000000 + +// SPI FREQUENCY MAX (Hz) +// 19500000 +#define DWM3000_FREQ_MAX 19500000 + +// +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> + +// DWM3000_RESET +// $[GPIO_DWM3000_RESET] +#ifndef DWM3000_RESET_PORT +#define DWM3000_RESET_PORT gpioPortC +#endif +#ifndef DWM3000_RESET_PIN +#define DWM3000_RESET_PIN 6 +#endif +// [GPIO_DWM3000_RESET]$ + +// DWM3000_INT +// $[GPIO_DWM3000_INT] +#ifndef DWM3000_INT_PORT +#define DWM3000_INT_PORT gpioPortB +#endif +#ifndef DWM3000_INT_PIN +#define DWM3000_INT_PIN 3 +#endif +// [GPIO_DWM3000_INT]$ + +// DWM3000_WAKE +// $[GPIO_DWM3000_WAKE] +// #ifndef DWM3000_WAKE_PORT +// #define DWM3000_WAKE_PORT gpioPortB +// #endif +// #ifndef DWM3000_WAKE_PIN +// #define DWM3000_WAKE_PIN 0 +// #endif +// [GPIO_DWM3000_WAKE]$ + +// DWM3000_ON +// $[GPIO_DWM3000_ON] +#ifndef DWM3000_ON_PORT +#define DWM3000_ON_PORT gpioPortB +#endif +#ifndef DWM3000_ON_PIN +#define DWM3000_ON_PIN 4 +#endif +// [GPIO_DWM3000_ON]$ + +// DWM3000_CS +// $[GPIO_DWM3000_CS] +#ifndef DWM3000_CS_PORT +#define DWM3000_CS_PORT gpioPortC +#endif +#ifndef DWM3000_CS_PIN +#define DWM3000_CS_PIN 3 +#endif +// [GPIO_DWM3000_CS]$ + +// DWM3000_CLK +// $[GPIO_DWM3000_CLK] +#ifndef DWM3000_CLK_PORT +#define DWM3000_CLK_PORT gpioPortC +#endif +#ifndef DWM3000_CLK_PIN +#define DWM3000_CLK_PIN 2 +#endif +// [GPIO_DWM3000_CLK]$ + +// DWM3000_MISO +// $[GPIO_DWM3000_MISO] +#ifndef DWM3000_MISO_PORT +#define DWM3000_MISO_PORT gpioPortC +#endif +#ifndef DWM3000_MISO_PIN +#define DWM3000_MISO_PIN 1 +#endif +// [GPIO_DWM3000_MISO]$ + +// DWM3000_MOSI +// $[GPIO_DWM3000_MOSI] +#ifndef DWM3000_MOSI_PORT +#define DWM3000_MOSI_PORT gpioPortC +#endif +#ifndef DWM3000_MOSI_PIN +#define DWM3000_MOSI_PIN 0 +#endif +// [GPIO_DWM3000_MOSI]$ + +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif /* DWM3000_CONFIG_H_ */ diff --git a/driver/public/silabs/uwb2_dwm3000/config/brd4314a/uwb2_dwm3000_config.h b/driver/public/silabs/uwb2_dwm3000/config/brd4314a/uwb2_dwm3000_config.h new file mode 100644 index 00000000..2ccd61a5 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/config/brd4314a/uwb2_dwm3000_config.h @@ -0,0 +1,159 @@ +/***************************************************************************//** + * @file mikroe_uwb2_dwm3000_config.h + * @brief DWM3000 UWB config. + * @version 0.0.1 + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided \'as-is\', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************* + * + * EVALUATION QUALITY + * This code has been minimally tested to ensure that it builds with the + * specified dependency versions and is suitable as a demonstration for + * evaluation purposes only. + * This code will be maintained at the sole discretion of Silicon Labs. + * + ******************************************************************************/ +#ifndef DWM3000_CONFIG_H_ +#define DWM3000_CONFIG_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +// <<< Use Configuration Wizard in Context Menu +// SPI Driver settings + +// HAL SPI TYPE +// USART +// EUSART +#define DWM3000_SPI_TYPE USART + +// HAL SPI NUMBER +// <0=> 0 +// <1=> 1 +// <2=> 2 +#define DWM3000_SPI_NUMBER 0 + +// SPI FREQUENCY MIN (Hz) +// 2000000 +#define DWM3000_FREQ_MIN 2000000 + +// SPI FREQUENCY MAX (Hz) +// 19500000 +#define DWM3000_FREQ_MAX 19500000 + +// +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> + +// DWM3000_RESET +// $[GPIO_DWM3000_RESET] +#ifndef DWM3000_RESET_PORT +#define DWM3000_RESET_PORT gpioPortC +#endif +#ifndef DWM3000_RESET_PIN +#define DWM3000_RESET_PIN 6 +#endif +// [GPIO_DWM3000_RESET]$ + +// DWM3000_INT +// $[GPIO_DWM3000_INT] +#ifndef DWM3000_INT_PORT +#define DWM3000_INT_PORT gpioPortB +#endif +#ifndef DWM3000_INT_PIN +#define DWM3000_INT_PIN 3 +#endif +// [GPIO_DWM3000_INT]$ + +// DWM3000_WAKE +// $[GPIO_DWM3000_WAKE] +// #ifndef DWM3000_WAKE_PORT +// #define DWM3000_WAKE_PORT gpioPortB +// #endif +// #ifndef DWM3000_WAKE_PIN +// #define DWM3000_WAKE_PIN 0 +// #endif +// [GPIO_DWM3000_WAKE]$ + +// DWM3000_ON +// $[GPIO_DWM3000_ON] +#ifndef DWM3000_ON_PORT +#define DWM3000_ON_PORT gpioPortB +#endif +#ifndef DWM3000_ON_PIN +#define DWM3000_ON_PIN 4 +#endif +// [GPIO_DWM3000_ON]$ + +// DWM3000_CS +// $[GPIO_DWM3000_CS] +#ifndef DWM3000_CS_PORT +#define DWM3000_CS_PORT gpioPortC +#endif +#ifndef DWM3000_CS_PIN +#define DWM3000_CS_PIN 3 +#endif +// [GPIO_DWM3000_CS]$ + +// DWM3000_CLK +// $[GPIO_DWM3000_CLK] +#ifndef DWM3000_CLK_PORT +#define DWM3000_CLK_PORT gpioPortC +#endif +#ifndef DWM3000_CLK_PIN +#define DWM3000_CLK_PIN 2 +#endif +// [GPIO_DWM3000_CLK]$ + +// DWM3000_MISO +// $[GPIO_DWM3000_MISO] +#ifndef DWM3000_MISO_PORT +#define DWM3000_MISO_PORT gpioPortC +#endif +#ifndef DWM3000_MISO_PIN +#define DWM3000_MISO_PIN 1 +#endif +// [GPIO_DWM3000_MISO]$ + +// DWM3000_MOSI +// $[GPIO_DWM3000_MOSI] +#ifndef DWM3000_MOSI_PORT +#define DWM3000_MOSI_PORT gpioPortC +#endif +#ifndef DWM3000_MOSI_PIN +#define DWM3000_MOSI_PIN 0 +#endif +// [GPIO_DWM3000_MOSI]$ + +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif /* DWM3000_CONFIG_H_ */ diff --git a/driver/public/silabs/uwb2_dwm3000/config/other/uwb2_dwm3000_config.h b/driver/public/silabs/uwb2_dwm3000/config/other/uwb2_dwm3000_config.h new file mode 100644 index 00000000..734a3eed --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/config/other/uwb2_dwm3000_config.h @@ -0,0 +1,167 @@ +/***************************************************************************//** + * @file mikroe_uwb2_dwm3000_config.h + * @brief DWM3000 UWB config. + * @version 0.0.1 + ******************************************************************************* + * # License + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided \'as-is\', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ******************************************************************************* + * + * EVALUATION QUALITY + * This code has been minimally tested to ensure that it builds with the + * specified dependency versions and is suitable as a demonstration for + * evaluation purposes only. + * This code will be maintained at the sole discretion of Silicon Labs. + * + ******************************************************************************/ +#ifndef DWM3000_CONFIG_H_ +#define DWM3000_CONFIG_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +// <<< Use Configuration Wizard in Context Menu +// SPI Driver settings + +// HAL SPI TYPE +// USART +// EUSART +#define DWM3000_SPI_TYPE EUSART + +// HAL SPI NUMBER +// <0=> 0 +// <1=> 1 +// <2=> 2 +#define DWM3000_SPI_NUMBER 1 + +// SPI FREQUENCY MIN (Hz) +// 2000000 +#define DWM3000_FREQ_MIN 2000000 + +// SPI FREQUENCY MAX (Hz) +// 19500000 +#define DWM3000_FREQ_MAX 19500000 + +// +// <<< end of configuration section >>> + +// <<< sl:start pin_tool >>> + +// DWM3000_RESET +// $[GPIO_DWM3000_RESET] +#warning "DWM3000_RESET is not configured" +// #ifndef DWM3000_RESET_PORT +// #define DWM3000_RESET_PORT gpioPortC +// #endif +// #ifndef DWM3000_RESET_PIN +// #define DWM3000_RESET_PIN 8 +// #endif +// [GPIO_DWM3000_RESET]$ + +// DWM3000_INT +// $[GPIO_DWM3000_INT] +#warning "DWM3000_INT is not configured" +// #ifndef DWM3000_INT_PORT +// #define DWM3000_INT_PORT gpioPortB +// #endif +// #ifndef DWM3000_INT_PIN +// #define DWM3000_INT_PIN 1 +// #endif +// [GPIO_DWM3000_INT]$ + +// DWM3000_WAKE +// $[GPIO_DWM3000_WAKE] +//#warning "DWM3000_WAKE is not configured" +// #ifndef DWM3000_WAKE_PORT +// #define DWM3000_WAKE_PORT gpioPortB +// #endif +// #ifndef DWM3000_WAKE_PIN +// #define DWM3000_WAKE_PIN 0 +// #endif +// [GPIO_DWM3000_WAKE]$ + +// DWM3000_ON +// $[GPIO_DWM3000_ON] +#warning "DWM3000_ON is not configured" +// #ifndef DWM3000_ON_PORT +// #define DWM3000_ON_PORT gpioPortA +// #endif +// #ifndef DWM3000_ON_PIN +// #define DWM3000_ON_PIN 0 +// #endif +// [GPIO_DWM3000_ON]$ + +// DWM3000_CS +// $[GPIO_DWM3000_CS] +#warning "DWM3000_CS is not configured" +// #ifndef DWM3000_CS_PORT +// #define DWM3000_CS_PORT gpioPortC +// #endif +// #ifndef DWM3000_CS_PIN +// #define DWM3000_CS_PIN 0 +// #endif +// [GPIO_DWM3000_CS]$ + +// DWM3000_CLK +// $[GPIO_DWM3000_CLK] +#warning "DWM3000_CLK is not configured" +// #ifndef DWM3000_CLK_PORT +// #define DWM3000_CLK_PORT gpioPortC +// #endif +// #ifndef DWM3000_CLK_PIN +// #define DWM3000_CLK_PIN 1 +// #endif +// [GPIO_DWM3000_CLK]$ + +// DWM3000_MISO +// $[GPIO_DWM3000_MISO] +#warning "DWM3000_MISO is not configured" +// #ifndef DWM3000_MISO_PORT +// #define DWM3000_MISO_PORT gpioPortC +// #endif +// #ifndef DWM3000_MISO_PIN +// #define DWM3000_MISO_PIN 2 +// #endif +// [GPIO_DWM3000_MISO]$ + +// DWM3000_MOSI +// $[GPIO_DWM3000_MOSI] +#warning "DWM3000_MOSI is not configured" +// #ifndef DWM3000_MOSI_PORT +// #define DWM3000_MOSI_PORT gpioPortC +// #endif +// #ifndef DWM3000_MOSI_PIN +// #define DWM3000_MOSI_PIN 3 +// #endif +// [GPIO_DWM3000_MOSI]$ + +// <<< sl:end pin_tool >>> + +#ifdef __cplusplus +} +#endif +#endif /* DWM3000_CONFIG_H_ */ diff --git a/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.c b/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.c new file mode 100644 index 00000000..69b88157 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.c @@ -0,0 +1,31 @@ +/*! ---------------------------------------------------------------------------- + * @file deca_probe_interface.c + * @brief Interface structure. Provides external dependencies required by the + * driver + * + * @attention + * + * Copyright 2015 - 2021 (c) DecaWave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ +#include "deca_probe_interface.h" +#include "deca_interface.h" +#include "deca_spi.h" +#include "port.h" + +static const struct dwt_spi_s dw3000_spi_fct = { + .readfromspi = readfromspi, + .writetospi = writetospi, + .writetospiwithcrc = writetospiwithcrc, + .setslowrate = set_dw_spi_slow_rate, + .setfastrate = set_dw_spi_fast_rate +}; + +const struct dwt_probe_s dw3000_probe_interf = +{ + .dw = NULL, + .spi = (void *)&dw3000_spi_fct, + .wakeup_device_with_io = wakeup_device_with_io +}; diff --git a/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.h b/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.h new file mode 100644 index 00000000..95cceca0 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/deca_probe/deca_probe_interface.h @@ -0,0 +1,19 @@ +/*! ---------------------------------------------------------------------------- + * @file deca_probe_interface.h + * @brief Interface structure. Provides external dependencies required by the + * driver + * + * @attention + * + * Copyright 2015 - 2021 (c) DecaWave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ +#ifndef DECA_PROBE_INTERFACE_H +#define DECA_PROBE_INTERFACE_H +#include "deca_device_api.h" + +extern const struct dwt_probe_s dw3000_probe_interf; + +#endif diff --git a/driver/public/silabs/uwb2_dwm3000/platform/deca_sleep/deca_sleep.c b/driver/public/silabs/uwb2_dwm3000/platform/deca_sleep/deca_sleep.c new file mode 100644 index 00000000..a1a72262 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/deca_sleep/deca_sleep.c @@ -0,0 +1,28 @@ +/**- + * @file deca_sleep.c + * + * @brief platform dependent sleep implementation + * + * @attention + * + * Copyright 2015 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + * @author Decawave + */ + +#include "port.h" +#include "sl_udelay.h" + +/* Wrapper function to be used by decadriver. Declared in deca_device_api.h */ +void deca_sleep(unsigned int time_ms) +{ + sl_udelay_wait(time_ms * 1000); +} + +/* Wrapper function to be used by decadriver. Declared in deca_device_api.h */ +void deca_usleep(unsigned long time_us) +{ + sl_udelay_wait(time_us); +} diff --git a/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.c b/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.c new file mode 100644 index 00000000..eaf1176d --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.c @@ -0,0 +1,227 @@ +/** + * @file deca_spi.c + * + * @brief SPI functions to interface to DW3000 chip's from EFR32. + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#include "port.h" +#include "em_cmu.h" +#include "em_gpio.h" +#include "em_eusart.h" +#include "em_usart.h" +#include "spidrv.h" +#if defined (SL_CATALOG_POWER_MANAGER_PRESENT) +#include "sl_power_manager.h" +#endif +#include "deca_spi.h" +#include + +#ifndef SPI_USE_SPIDRV_API +#define SPI_USE_SPIDRV_API 0 +#endif +#define SPI_GPIO_SLOW_SLEWRATE 5 +#define SPI_GPIO_FAST_SLEWRATE 7 +#define SPI_DUMMY_TX_VALUE 0xFF + +#define EUSART_SpiTransfer EUSART_Spi_TxRx +#define spi_tx_rx(data) HAL_CAT2(HAL_SPI_TYPE, _SpiTransfer)(HAL_SPI_PERIPHERAL, \ + data) + +static SPIDRV_HandleData_t spi_driver_handle; +static volatile bool spi_lock; + +/*! + * + * ----------------------------------------------------------------------------- + * Function: openspi() + * + * Low level abstract function to open and initialise access to the SPI device. + * returns 0 for success, or -1 for error + */ +int openspi(void) +{ + SPIDRV_Init_t spi_init = { + .port = HAL_SPI_PERIPHERAL, + .portTx = HAL_SPI_MOSI_PORT, + .portRx = HAL_SPI_MISO_PORT, + .portClk = HAL_SPI_CLK_PORT, + .portCs = HAL_SPI_CS_PORT, + .pinTx = HAL_SPI_MOSI_PIN, + .pinRx = HAL_SPI_MISO_PIN, + .pinClk = HAL_SPI_CLK_PIN, + .pinCs = HAL_SPI_CS_PIN, + .bitRate = HAL_SPI_FREQ_MIN, + .frameLength = 8, + .dummyTxValue = SPI_DUMMY_TX_VALUE, + .type = spidrvMaster, + .bitOrder = spidrvBitOrderMsbFirst, + .clockMode = spidrvClockMode0, + .csControl = spidrvCsControlApplication, + }; + + CMU_ClockEnable(cmuClock_GPIO, true); + GPIO_SlewrateSet(spi_init.portClk, + SPI_GPIO_SLOW_SLEWRATE, + SPI_GPIO_SLOW_SLEWRATE); + GPIO_SlewrateSet(spi_init.portTx, + SPI_GPIO_SLOW_SLEWRATE, + SPI_GPIO_SLOW_SLEWRATE); + GPIO_PinModeSet(spi_init.portCs, spi_init.pinCs, gpioModePushPull, 1); + return SPIDRV_Init(&spi_driver_handle, &spi_init); +} + +/*! + * + * ----------------------------------------------------------------------------- + * Function: closespi() + * + * Low level abstract function to close the the SPI device. + * returns 0 for success, or -1 for error + */ +int closespi(void) +{ + return SPIDRV_DeInit(&spi_driver_handle); +} + +static void port_spi_set_bitrate(uint32_t goal_bitrate) +{ + uint32_t required_slewrate = + (goal_bitrate + >= 10000000) ? SPI_GPIO_FAST_SLEWRATE : SPI_GPIO_SLOW_SLEWRATE; + GPIO_SlewrateSet(spi_driver_handle.initData.portClk, + required_slewrate, + required_slewrate); + GPIO_SlewrateSet(spi_driver_handle.initData.portTx, + required_slewrate, + required_slewrate); + SPIDRV_SetBitrate(&spi_driver_handle, goal_bitrate); +} + +/* @fn set_dw_spi_slow_rate + * @brief sets slow SPI clock speed for the DW chip + * left for compatibility. + * */ +void set_dw_spi_slow_rate(void) +{ + port_spi_set_bitrate(HAL_SPI_FREQ_MIN); +} + +/* @fn set_dw_spi_fast_rate + * @brief sets High SPI clock speed for the DW chip + * */ +void set_dw_spi_fast_rate(void) +{ + port_spi_set_bitrate(HAL_SPI_FREQ_MAX); +} + +static inline void spi_transfer_open(void) +{ + // TODO: not thread safe at all... (but same as other Vendors' implementation) + while (spi_lock) {} + spi_lock = true; + +#if (!SPI_USE_SPIDRV_API) && defined (SL_CATALOG_POWER_MANAGER_PRESENT) + sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1); +#endif + GPIO_PinOutClear(spi_driver_handle.initData.portCs, + spi_driver_handle.initData.pinCs); +} + +static inline void spi_transfer_close(void) +{ + GPIO_PinOutSet(spi_driver_handle.initData.portCs, + spi_driver_handle.initData.pinCs); +#if (!SPI_USE_SPIDRV_API) && defined (SL_CATALOG_POWER_MANAGER_PRESENT) + sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1); +#endif + spi_lock = false; +} + +static inline Ecode_t spi_blocking_transmit(const uint8_t *buffer, int count) +{ +#if SPI_USE_SPIDRV_API + return SPIDRV_MTransmitB(&spi_driver_handle, buffer, count); +#else + for (int i = 0; i < count; i++) { + spi_tx_rx(buffer[i]); + } + return ECODE_OK; +#endif +} + +static inline Ecode_t spi_blocking_receive(uint8_t *buffer, int count) +{ +#if SPI_USE_SPIDRV_API + return SPIDRV_MReceiveB(&spi_driver_handle, buffer, count); +#else + for (int i = 0; i < count; i++) { + buffer[i] = spi_tx_rx(SPI_DUMMY_TX_VALUE); + } + return ECODE_OK; +#endif +} + +int readfromspi(uint16_t headerLength, + uint8_t *headerBuffer, + uint16_t readLength, + uint8_t *readBuffer) +{ + Ecode_t sc = 0; + + spi_transfer_open(); + if (headerBuffer && headerLength) { + sc |= spi_blocking_transmit(headerBuffer, headerLength); + } + if (!sc && readBuffer && readLength) { + sc |= spi_blocking_receive(readBuffer, readLength); + } + spi_transfer_close(); + + return sc; +} + +static int spi_write(uint16_t headerLength, + const uint8_t *headerBuffer, + uint16_t bodyLength, + const uint8_t *bodyBuffer, + uint8_t *crc8) +{ + Ecode_t sc = 0; + + spi_transfer_open(); + if (headerBuffer && headerLength) { + sc |= spi_blocking_transmit(headerBuffer, headerLength); + } + if (!sc && bodyBuffer && bodyLength) { + sc |= spi_blocking_transmit(bodyBuffer, bodyLength); + } + if (crc8) { + sc |= spi_blocking_transmit(crc8, sizeof(*crc8)); + } + spi_transfer_close(); + + return sc; +} + +int writetospi(uint16_t headerLength, + const uint8_t *headerBuffer, + uint16_t bodyLength, + const uint8_t *bodyBuffer) +{ + return spi_write(headerLength, headerBuffer, bodyLength, bodyBuffer, NULL); +} + +int writetospiwithcrc(uint16_t headerLength, + const uint8_t *headerBuffer, + uint16_t bodyLength, + const uint8_t *bodyBuffer, + uint8_t crc8) +{ + return spi_write(headerLength, headerBuffer, bodyLength, bodyBuffer, &crc8); +} diff --git a/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.h b/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.h new file mode 100644 index 00000000..412afe24 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/deca_spi/deca_spi.h @@ -0,0 +1,55 @@ +/** + * @file deca_spi.h + * + * @brief SPI interface access function protypes + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + */ + +#ifndef _DECA_SPI_H_ +#define _DECA_SPI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/**--------------------------------------- + * Function: openspi() + * + * Low level abstract function to open and initialise access to the SPI device. + * returns 0 for success, or -1 for error + */ +int openspi(void); + +/**--------------------------------------- + * Function: closespi() + * + * Low level abstract function to close the the SPI device. + * returns 0 for success, or -1 for error + */ +int closespi(void); + +int writetospi(uint16_t headerLength, + const uint8_t *headerBuffer, + uint16_t bodyLength, + const uint8_t *bodyBuffer); +int writetospiwithcrc(uint16_t headerLength, + const uint8_t *headerBuffer, + uint16_t bodyLength, + const uint8_t *bodyBuffer, + uint8_t crc8); +int readfromspi(uint16_t headerLength, + uint8_t *headerBuffer, + uint16_t readlength, + uint8_t *readBuffer); +void set_dw_spi_fast_rate(void); +void set_dw_spi_slow_rate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _DECA_SPI_H_ */ diff --git a/driver/public/silabs/uwb2_dwm3000/platform/port/port.h b/driver/public/silabs/uwb2_dwm3000/platform/port/port.h new file mode 100644 index 00000000..e31e2ab7 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/port/port.h @@ -0,0 +1,47 @@ +/** + * @file port.h + * + * @brief port headers file to EFR32BG22 + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef PORT__H_ +#define PORT__H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "error.h" +#include "port_hal.h" +#include "deca_spi.h" +#include "deca_device_api.h" + +/* port functions prototypes */ +error_e port_init_dw_chip(void); +error_e port_wakeup_dw3000_fast(void); +error_e port_wakeup_dw3000(void); +void wakeup_device_with_io(void); + +void dw_irq_init(void); +void init_dw3000_irq(void); +void enable_dw3000_irq(void); +void disable_dw3000_irq(void); +void reset_DW3000(void); + +void port_stop_all_UWB(void); + +error_e port_disable_dw_irq_and_reset(int reset); + +#ifdef __cplusplus +} +#endif + +#endif /* PORT__H__ */ diff --git a/driver/public/silabs/uwb2_dwm3000/platform/port/port_dw3000.c b/driver/public/silabs/uwb2_dwm3000/platform/port/port_dw3000.c new file mode 100644 index 00000000..c63cdc81 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/port/port_dw3000.c @@ -0,0 +1,263 @@ +/*! ---------------------------------------------------------------------------- + * @file port_dw3000.c + * @brief HW specific definitions and functions for DW3000 Interface + * + * @attention + * + * Copyright 2016 (c) DecaWave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + * @author + */ + +#include "port.h" +#include "em_gpio.h" +#include "sl_udelay.h" +#include "gpiointerrupt.h" + +#if defined(HAL_UWB_WAKEUP_PORT) && defined(HAL_UWB_WAKEUP_PIN) +#define port_wakeup_start() GPIO_PinModeSet(HAL_UWB_WAKEUP_PORT, \ + HAL_UWB_WAKEUP_PIN, \ + gpioModePushPull, \ + 1); +#define port_wakeup_end() GPIO_PinModeSet(HAL_UWB_WAKEUP_PORT, \ + HAL_UWB_WAKEUP_PIN, \ + gpioModePushPull, \ + 0); +#else +#define port_wakeup_start() GPIO_PinModeSet(HAL_SPI_CS_PORT, \ + HAL_SPI_CS_PIN, \ + gpioModePushPull, \ + 0); +#define port_wakeup_end() GPIO_PinModeSet(HAL_SPI_CS_PORT, \ + HAL_SPI_CS_PIN, \ + gpioModePushPull, \ + 1); +#endif + +/* @brief manually configuring of EXTI priority + * */ +void init_dw3000_irq(void) +{ +} + +void disable_dw3000_irq(void) +{ + GPIO_IntDisable(1 << HAL_UWB_IRQ_IT_NBR); +} + +void enable_dw3000_irq(void) +{ + GPIO_IntEnable(1 << HAL_UWB_IRQ_IT_NBR); +} + +/* @fn reset_DW1000 + * @brief DW_RESET pin on DW1000 has 2 functions + * In general it is output, but it also can be used to reset the + * digital part of DW1000 by driving this pin low. + * Note, the DW_RESET pin should not be driven high externally. + * */ +void reset_DW3000(void) +{ + GPIO_PinModeSet(HAL_UWB_RST_PORT, HAL_UWB_RST_PIN, gpioModePushPull, 0); + sl_udelay_wait(2000); + GPIO_PinModeSet(HAL_UWB_RST_PORT, HAL_UWB_RST_PIN, gpioModeInputPull, 1); + sl_udelay_wait(2000); +} + +__attribute__((weak)) void wakeup_device_with_io(void) +{ + port_wakeup_dw3000_fast(); +} + +/* @fn port_wakeup_dw3000_fast + * @brief waking up of DW3000 using DW_CS pin + * + * the fast wakeup takes ~1ms: + * 500us to hold the CS - TODO: this time can be reduced + * 500us to the crystal to startup + * + ~various time 100us...10ms + * */ +error_e port_wakeup_dw3000_fast(void) +{ + port_wakeup_start(); + sl_udelay_wait(500); + port_wakeup_end(); + + return _NO_ERR; +} + +/* @fn port_wakeup_dw3000 + * @brief waking up of DW3000 using DW_CS pin + * + * the fast wakeup takes ~1ms: + * 500us to hold the CS - TODO: this time can be reduced + * 500us to the crystal to startup + * + ~various time 100us...10ms + * */ +error_e port_wakeup_dw3000(void) +{ + // device wake-up + port_wakeup_dw3000_fast(); + + // it takes ~500us for crystal startup total for the DW3000 to switch to + // RC_IDLE 120MHz + sl_udelay_wait(500); + + // we are here on 120MHz RC + + /* Need to make sure DW IC is in IDLE_RC before proceeding */ + uint32_t cnt = 0; + for (; (!dwt_checkidlerc()) && (cnt < 10); cnt++) + { + // FIXME: DW3000 B0 silicon bugfix + if (cnt == 5) { + port_wakeup_dw3000_fast(); + } + sl_udelay_wait(20); + } + return (cnt >= 10) ? _ERR_INIT : _NO_ERR; +} + +/** + * @brief Bare-metal level + * initialise master/slave DW1000 (check if can talk to device and wake + * up and reset) + */ +static int port_init_device(void) +{ + set_dw_spi_slow_rate(); + + if (dwt_check_dev_id() != DWT_SUCCESS) { + return DWT_ERROR; + } + + // clear the sleep bit in case it is set - so that after the hard reset below + // the DW does not go into sleep + dwt_softreset(0); + + return 0; +} + +error_e port_disable_wake_init_dw(void) +{ + disable_dw3000_irq(); /**< disable NVIC IRQ until we configure + * the device */ + + reset_DW3000(); + + // this is called here to wake up the device (i.e. if it was in sleep mode + // before the restart) + port_wakeup_dw3000(); + + if (port_init_device() != 0x00) { + return _ERR_INIT; + } + return _NO_ERR; +} + +error_e port_init_dw_chip(void) +{ + dwt_setlocaldataptr(0); + + int sc = openspi(); + if (0 != sc) { + return _ERR_SPI; + } + return _NO_ERR; +} + +void port_stop_all_UWB(void) +{ + port_disable_dw_irq_and_reset(1); + dwt_setcallbacks(NULL, NULL, NULL, NULL, NULL, NULL, NULL); +} + +/****************************************************************************** +* +* IRQ section +* +******************************************************************************/ +/*! ---------------------------------------------------------------------------- + * Function: decamutexon() + * + * Description: This function should disable interrupts. + * + * + * input parameters: void + * + * output parameters: uint16 + * returns the state of the DW1000 interrupt + */ +decaIrqStatus_t decamutexon(void) +{ + uint32_t s = GPIO_EnabledIntGet(); + if (s & (1 << HAL_UWB_IRQ_IT_NBR)) { + GPIO_IntDisable(1 << HAL_UWB_IRQ_IT_NBR); + } + return s; +} + +/*! ---------------------------------------------------------------------------- + * Function: decamutexoff() + * + * Description: This function should re-enable interrupts, or at least restore + * their state as returned(&saved) by decamutexon + * This is called at the end of a critical section + * + * input parameters: + * @param s - the state of the DW1000 interrupt as returned by decamutexon + * + * output parameters + * + * returns the state of the DW1000 interrupt + */ +void decamutexoff(decaIrqStatus_t s) +{ + if (s & (1 << HAL_UWB_IRQ_IT_NBR)) { + GPIO_IntEnable(1 << HAL_UWB_IRQ_IT_NBR); + } +} + +/* @fn process_deca_irq + * @brief main call-back for processing of DW3000 IRQ + * it re-enters the IRQ routing and processes all events. + * After processing of all events, DW3000 will clear the IRQ line. + * */ +static void process_deca_irq(uint8_t interrupt_number) +{ + (void)interrupt_number; + + while (GPIO_PinInGet(HAL_UWB_IRQ_PORT, HAL_UWB_IRQ_PIN) != 0) + { + dwt_isr(); + } // while DW3000 IRQ line active +} + +void dw_irq_init(void) +{ + GPIO_PinModeSet(HAL_UWB_IRQ_PORT, HAL_UWB_IRQ_PIN, gpioModeInputPull, 0); + + GPIOINT_CallbackRegister(HAL_UWB_IRQ_IT_NBR, process_deca_irq); + GPIO_ExtIntConfig(HAL_UWB_IRQ_PORT, HAL_UWB_IRQ_PIN, + HAL_UWB_IRQ_IT_NBR, true, false, false); +} + +/* + * @brief disable DW_IRQ, reset DW3000 + * and set + * app.DwCanSleep = DW_CANNOT_SLEEP; + * app.DwEnterSleep = DW_NOT_SLEEPING; + * */ +error_e port_disable_dw_irq_and_reset(int reset) +{ + disable_dw3000_irq(); /**< disable NVIC IRQ until we configure the device */ + + // this is called to reset the DW device + if (reset) { + reset_DW3000(); + } + + return _NO_ERR; +} diff --git a/driver/public/silabs/uwb2_dwm3000/platform/port/port_hal.h b/driver/public/silabs/uwb2_dwm3000/platform/port/port_hal.h new file mode 100644 index 00000000..ef27a131 --- /dev/null +++ b/driver/public/silabs/uwb2_dwm3000/platform/port/port_hal.h @@ -0,0 +1,57 @@ +/** + * @file port_hal.h + * + * @brief port Hardware Abstraction Layer headers file + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#include "uwb2_dwm3000_config.h" + +#define _HAL_CAT2EXP(a, b) a ## b +#define HAL_CAT2(a, b) _HAL_CAT2EXP(a, b) +#define _HAL_CAT3EXP(a, b, c) a ## b ## c +#define HAL_CAT3(a, b, c) _HAL_CAT3EXP(a, b, c) + +// UWB/DW3000 +#define HAL_UWB_IRQ_PORT DWM3000_INT_PORT +#define HAL_UWB_IRQ_PIN DWM3000_INT_PIN +#define HAL_UWB_IRQ_IT_NBR DWM3000_INT_PIN + +#define HAL_UWB_RST_PORT DWM3000_RESET_PORT +#define HAL_UWB_RST_PIN DWM3000_RESET_PIN +#define HAL_UWB_RST_IT_NBR DWM3000_RESET_PIN + +#if defined(DWM3000_WAKE_PORT) && defined(DWM3000_WAKE_PIN) +#define HAL_UWB_WAKEUP_PORT DWM3000_WAKE_PORT +#define HAL_UWB_WAKEUP_PIN DWM3000_WAKE_PIN +#define HAL_UWB_WAKEUP_IT_NBR DWM3000_WAKE_PIN +#endif + +#define HAL_UWB_EXTON_PORT DWM3000_ON_PORT +#define HAL_UWB_EXTON_PIN DWM3000_ON_PIN +#define HAL_UWB_EXTON_IT_NBR DWM3000_ON_PIN + +// SPI +#define HAL_SPI_TYPE DWM3000_SPI_TYPE +#define HAL_SPI_NUMBER DWM3000_SPI_NUMBER +#define HAL_SPI_PERIPHERAL HAL_CAT2(HAL_SPI_TYPE, HAL_SPI_NUMBER) + +#define HAL_SPI_CS_PORT DWM3000_CS_PORT +#define HAL_SPI_CS_PIN DWM3000_CS_PIN + +#define HAL_SPI_CLK_PORT DWM3000_CLK_PORT +#define HAL_SPI_CLK_PIN DWM3000_CLK_PIN + +#define HAL_SPI_MISO_PORT DWM3000_MISO_PORT +#define HAL_SPI_MISO_PIN DWM3000_MISO_PIN + +#define HAL_SPI_MOSI_PORT DWM3000_MOSI_PORT +#define HAL_SPI_MOSI_PIN DWM3000_MOSI_PIN + +#define HAL_SPI_FREQ_MIN DWM3000_FREQ_MIN +#define HAL_SPI_FREQ_MAX DWM3000_FREQ_MAX diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/common.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/common.h new file mode 100644 index 00000000..be53e76a --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/common.h @@ -0,0 +1,147 @@ +/** + * @file common.h + * + * @brief Only common macros and enumerations + * + * @author Decawave Software + * + * @attention Copyright 2017-2020 (c) DecaWave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef COMMON_H_ +#define COMMON_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#define TS_40B_SIZE (5) + +#define PHY_READ_DIG_ENABLE (0x1) +#define PHY_READ_ACC_ENABLE (0x2) + +#define SPEED_OF_LIGHT (299702547.0) // in m/s in air + +#define CCP_FIXED_REPLY_DELAY_US 150000 /* us */ + +#ifndef EVENT_BUFSIZE +#define EVENT_BUFSIZE 0x20 +#endif + +#ifdef UWB_BH_ENABLE + +/* With UWB_BH option the max throughput would be smaller, because each instance + * has the ETH_REPORT_BUFSIZE buffer */ +# define NUM_BH_BUFFERS (8) /* the maximum number of supported + * downstream anchors: should be 1<rx[tail].msg.blinkMsg. \ + frameCtrl[0] == HEAD_MSG_BLINK) +#define APP_EV_CLOCK_SYNC_RX ((phyevent->rx[tail].msg.ccpMsg. \ + messageData[0] \ + == RTLS_MSG_ANCH_CLK_SYNC) && \ + (phyevent->rx[tail].rxDataLen \ + == sizeof(ccp_msg_t))) +#define APP_EV_DATA_RX (phyevent->rx[tail].msg.bcastMsg. \ + messageData[0] == APP_MSG_DATA) +#define APP_EV_UWB_BH_DWNSTREAM_RX ((phyevent->rx[tail].msg.bcastMsg. \ + messageData[0] \ + == APP_MSG_UWB_BH_DWNSTREAM) && \ + (phyevent->rx[tail].rxDataLen \ + == sizeof(uwb_bh_dwnstream_msg_t))) +#define APP_EV_UWB_BH_UPSTREAM_RX ((phyevent->rx[tail].msg.bcastMsg. \ + messageData[0] \ + == APP_MSG_UWB_BH_UPSTREAM) && \ + (phyevent->rx[tail].rxDataLen \ + == sizeof(uwb_bh_upstream_msg_t))) + +// ----------------------------------------------------------------------------- +// common macros + +#ifndef SWAP +#define SWAP(a, b) { a ^= b; b ^= a; a ^= b; } +#endif /* SWAP */ + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif /* MIN */ + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif /* MAX */ + +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ + +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ + +#define MASK_40BIT (0x00FFFFFFFFFFULL) // DW1000 counter is 40 bits +#define MASK_TXDTS (0x00FFFFFFFE00ULL) // The TX timestamp will snap + // to 8 ns resolution - + // mask lower 9 bits. + +#ifdef __cplusplus +} +#endif + +#endif /* COMMON_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_dbg.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_dbg.h new file mode 100644 index 00000000..73838ea0 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_dbg.h @@ -0,0 +1,126 @@ +/** + * @file deca_dbg.h + * + * @brief Debug macros for debug prints + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ +#ifndef DECA_DBG_H_ +#define DECA_DBG_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usb_uart_tx.h" +#include +#include + +#if 0 +#define DBG_PRINTF diag_printf + +#define DBG_TRACE_EVENTS if (!TX_EVENT_RECEIVED) printf( \ + "MsgPtrs [ %d - %d %d %d - %3d - 0x%X] \n", \ + rxData[ \ + phyEvent[app.eventIdx].rxDataPtr].rxDataLen, \ + phyCfg.eventIdx, \ + app.eventIdx, \ + phyEvent[app.eventIdx].type, \ + rxData[ \ + phyEvent[app.eventIdx].rxDataPtr].msg.stdMsg.seqNum, \ + rxData[ \ + phyEvent[app.eventIdx].rxDataPtr].msg.stdMsg.messageData[0]); + +#define DBG_TRACE_CLOCK_SYNC_TX printf( \ + "CS Sent at .. @ .. 0x%02x%02x%02x%02x%02x \n", \ + phyEvent[app.eventIdx].timeStamp[4], \ + phyEvent[app.eventIdx].timeStamp[3], \ + phyEvent[app.eventIdx].timeStamp[2], \ + phyEvent[app.eventIdx].timeStamp[1], \ + phyEvent[app.eventIdx].timeStamp[0]); \ + printf("C:%d\n", app.rtls_info.ccpSeqNum); + +#define DBG_TRACE_CLOCK_SYNC_RX printf( \ + "CS Received .. @ .. 0x%02x%02x%02x%02x%02x \n", \ + phyEvent[app.eventIdx].timeStamp[4], \ + phyEvent[app.eventIdx].timeStamp[3], \ + phyEvent[app.eventIdx].timeStamp[2], \ + phyEvent[app.eventIdx].timeStamp[1], \ + phyEvent[app.eventIdx].timeStamp[0]); \ + printf("C:%d\n", rxMsg.msg.bcastMsg.seqNum); + +#define DBG_TRACE_TAG_BLINK printf( \ + "Tag Blink : Seq : %d : Time : %lld \n", \ + rxMsg.msg.blinkMsg.seqNum, \ + phyEvent[app.eventIdx].timeStamp); \ + // printf("S:%d\n", rxMsg.msg.blinkMsg.seqNum); + +#define DBG_TRACE_NETWORK_MSG printf( \ + "Received Network Configuration : %s %d \n", \ + (app.rtls_info.master?"MASTER":"SLAVE"), \ + app.rtls_info.id); + +#define DBG_TRACE_CONFIGURATION printf( \ + "Configuration Message %x %x : Time : %lld \n", \ + rxData[phyEvent[app.eventIdx]. \ + rxDataPtr].msg.stdMsg.messageData[0], \ + rxData[phyEvent[app.eventIdx]. \ + rxDataPtr].msg.stdMsg.messageData[1], \ + phyEvent[app.eventIdx].timeStamp); + +#else + +#define DIAG_BUF_LEN 0x8 +#define DIAG_STR_LEN 64 +// note, (DIAG_BUF_LEN*(DIAG_STR_LEN+4)) shall be < HTTP_PAGE_MALLOC_SIZE-16 +//
=4 +typedef struct +{ + uint8_t buf[DIAG_BUF_LEN][DIAG_STR_LEN]; + int head; +}gDiagPrintFStr_t; + +extern gDiagPrintFStr_t gDiagPrintFStr; + +#define diag_printf(...) do{ \ + snprintf((char *)(&gDiagPrintFStr.buf[gDiagPrintFStr.head][0]), \ + DIAG_STR_LEN, \ + __VA_ARGS__); \ + port_tx_msg(&gDiagPrintFStr.buf[gDiagPrintFStr.head][0], \ + strlen((char *)(&gDiagPrintFStr.buf[gDiagPrintFStr.head][0]))); \ + gDiagPrintFStr.head = (gDiagPrintFStr.head + 1) & (DIAG_BUF_LEN - 1); \ +}while (0) + +#define DBG_PRINTF diag_printf +#define DBG_TRACE_EVENTS +#define DBG_TRACE_CLOCK_SYNC_TX +#define DBG_TRACE_CLOCK_SYNC_RX +#define DBG_TRACE_TAG_BLINK +#define DBG_TRACE_NETWORK_MSG +#define DBG_TRACE_CONFIGURATION +#endif + +#define DBG_TRACE(x) { uint8_t buf; buf = x; dwt_writetodevice(0xb, \ + 0, \ + 1, \ + &buf); } + +/* TRACE_DEBUG and TRACE_INFO used in drivers when -DDEBUG in Makefile defined + */ +#ifdef DEBUG +#define TRACE_DEBUG diag_printf +#define TRACE_INFO diag_printf +#else +#define TRACE_DEBUG +#define TRACE_INFO diag_printf +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* DECA_DBG_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_device_api.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_device_api.h new file mode 100644 index 00000000..9d857bc2 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_device_api.h @@ -0,0 +1,4321 @@ +/*! ---------------------------------------------------------------------------- + * @file deca_device_api.h + * @brief DW3000 API Functions + * + * @attention + * + * Copyright 2013 - 2021(c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#ifndef _DECA_DEVICE_API_H_ +#define _DECA_DEVICE_API_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "deca_types.h" + +#ifndef DWT_NUM_DW_DEV +#define DWT_NUM_DW_DEV (1) +#endif + +#define DWT_BIT_MASK(bit_num) (((uint32_t)1) << (bit_num)) +#define FCS_LEN (2) + +#define GPIO_MFIO_MODE_MASK 0x7U +#define STS_CONFIG_HI_B0_MASK 0xFF // STS_CONFIG_HI Byte 0 mask. +#define RX_SFD_HLDOFF 0x20000000UL // Number of symbols of + // accumulation to wait before + // checking for an SFD pattern, + // when Ipatov len > 64. +#define RX_SFD_HLDOFF_DEF 0x14000000UL // Default number of symbols of + // accumulation to wait before + // checking for an SFD pattern. +#define RX_BUFFER_MAX_LEN (1023) + +/* Default interface implementation functions */ + +#define DW3000_CHIP_FREQ 499200000 +#define DW3000_CHIP_PER_DTU 2 +#define DW3000_CHIP_PER_DLY 512 +#define DW3000_DTU_FREQ (DW3000_CHIP_FREQ / DW3000_CHIP_PER_DTU) +#define DTU_TO_US(x) (int)((uint64_t)(x) * 1000000 / DW3000_DTU_FREQ) +#define US_TO_DTU(x) (int)((uint64_t)(x) * DW3000_DTU_FREQ / 1000000) +#define COEX_TIME_US 1000 +#define COEX_TIME_DTU US_TO_DTU(COEX_TIME_US) +#define COEX_MARGIN_US 20 +#define COEX_MARGIN_DTU US_TO_DTU(COEX_MARGIN_US) + +#define DWT_DW3720_PDOA_DEV_ID DWT_QM33120_PDOA_DEV_ID /* Backward + * compatibility + * definition of + * the P/N */ + +// Enable CRC functionality. Disable to save space when CRC not required. +#define DWT_ENABLE_CRC + +/* */ +typedef enum +{ + DWT_SUCCESS = 0, + DWT_ERROR = -1, + DWT_ERR_PLL_LOCK = -2, + DWT_ERR_RX_CAL_PGF = -3, + DWT_ERR_RX_CAL_RESI = -4, + DWT_ERR_RX_CAL_RESQ = -5, + DWT_ERR_RX_ADC_CAL = -6, +} dwt_error_e; + +#define DWT_TIME_UNITS (1.0 / 499.2e6 / 128.0) //!< = 15.65e-12 s + +typedef enum +{ + DWT_DW3000_DEV_ID = (int)(0xDECA0302), //!< DW3000 (non PDOA) + //!< silicon device ID + DWT_DW3000_PDOA_DEV_ID = (int)(0xDECA0312), //!< DW3000 (with PDOA) + //!< silicon device ID + DWT_DW3700_PDOA_DEV_ID = (int)(0xDECA0313), //!< DW3700 (with PDOA) + //!< silicon device ID + DWT_QM33120_PDOA_DEV_ID = (int)(0xDECA0314) //!< QM33120 (with PDOA) + //!< silicon device ID +} dw_chip_id_e; + +#define DELAY_20uUSec (20) /*Delay of 20uSec(measured 24uSec)*/ +#define MAX_RETRIES_FOR_PLL (50) /*The PLL calibration should take less than + * 400us, typically it is < 100us (however on + * some corners with ch9 it can take + * ~900us)*/ +#define MAX_RETRIES_FOR_PGF (3) + +typedef enum +{ + AOA, + NON_AOA +} dw3000type_e; + +typedef enum +{ + DW3000_SPI_RD_BIT = 0x0000U, + DW3000_SPI_RD_FAST_CMD = 0x0001U, + DW3000_SPI_WR_FAST_CMD = 0x0002U, + DW3000_SPI_WR_BIT = 0x8000U, + DW3000_SPI_AND_OR_8 = 0x8001U, + DW3000_SPI_AND_OR_16 = 0x8002U, + DW3000_SPI_AND_OR_32 = 0x8003U, +} spi_modes_e; + +//! enums for selecting the bit rate for data TX (and RX) +//! These are defined for write (with just a shift) the TX_FCTRL register +typedef enum +{ + DWT_BR_850K = 0, //!< UWB bit rate 850 kbits/s + DWT_BR_6M8 = 1, //!< UWB bit rate 6.8 Mbits/s + DWT_BR_NODATA = 2, //!< No data (SP3 packet format) +} dwt_uwb_bit_rate_e; + +//! enums for specifying the (Nominal) mean Pulse Repetition Frequency +//! These are defined for direct write (with a shift if necessary) to CHAN_CTRL +//! and TX_FCTRL regs +typedef enum +{ + DWT_PRF_16M = 1, //!< UWB PRF 16 MHz + DWT_PRF_64M = 2, //!< UWB PRF 64 MHz + DWT_PRF_SCP = 3, //!< SCP UWB PRF ~100 MHz +} dwt_prf_e; + +//! enums for specifying Preamble Acquisition Chunk (PAC) Size in symbols +typedef enum +{ + DWT_PAC8 = 0, //!< PAC 8 (recommended for RX of preamble length 128 + //!< and below + DWT_PAC16 = 1, //!< PAC 16 (recommended for RX of preamble length 256 + DWT_PAC32 = 2, //!< PAC 32 (recommended for RX of preamble length 512 + DWT_PAC4 = 3, //!< PAC 4 (recommended for RX of preamble length < 127 +} dwt_pac_size_e; + +//! enums for specifying SFD Types and size +typedef enum +{ + DWT_SFD_IEEE_4A = 0, //!< IEEE 8-bit ternary + DWT_SFD_DW_8 = 1, //!< DW 8-bit + DWT_SFD_DW_16 = 2, //!< DW 16-bit + DWT_SFD_IEEE_4Z = 3, //!< IEEE 8-bit binary (4z) + DWT_SFD_LEN8 = 8, //!< IEEE, and DW 8-bit are length 8 + DWT_SFD_LEN16 = 16, //!< DW 16-bit is length 16 +} dwt_sfd_type_e; + +//! enums for specifying TX Preamble length in symbols +//! These are defined to allow them be directly written into byte 2 of the +//! TX_FCTRL register +//! (i.e. a four bit value destined for bits 20..18 but shifted left by 2 for +//! byte alignment) +typedef enum +{ + DWT_PLEN_4096 = 0x03, //! Standard preamble length 4096 symbols + DWT_PLEN_2048 = 0x0A, //! Non-standard preamble length 2048 symbols + DWT_PLEN_1536 = 0x06, //! Non-standard preamble length 1536 symbols + DWT_PLEN_1024 = 0x02, //! Standard preamble length 1024 symbols + DWT_PLEN_512 = 0x0d, //! Non-standard preamble length 512 symbols + DWT_PLEN_256 = 0x09, //! Non-standard preamble length 256 symbols + DWT_PLEN_128 = 0x05, //! Non-standard preamble length 128 symbols + DWT_PLEN_64 = 0x01, //! Standard preamble length 64 symbols + DWT_PLEN_32 = 0x04, //! Non-standard length 32 + DWT_PLEN_72 = 0x07, //! Non-standard length 72 +} dwt_tx_plen_e; + +#define DWT_SFDTOC_DEF 129 // default SFD timeout value + +//! enums for selecting PHR modes +typedef enum +{ + DWT_PHRMODE_STD = 0x0, // standard PHR mode + DWT_PHRMODE_EXT = 0x1, // DW proprietary extended frames PHR mode +} dwt_phr_mode_e; + +//! enums for selecting PHR rate +typedef enum +{ + DWT_PHRRATE_STD = 0x0, // standard PHR rate + DWT_PHRRATE_DTA = 0x1, // PHR at data rate (6M81) +} dwt_phr_rate_e; + +// Define DW3000 PDOA modes +typedef enum +{ + DWT_PDOA_M0 = 0x0, // DW PDOA mode is off + DWT_PDOA_M1 = 0x1, // DW PDOA mode 1 + DWT_PDOA_M3 = 0x3, // DW PDOA mode 3 +} dwt_pdoa_mode_e; + +// Define DW3000 STS modes +typedef enum +{ + DWT_STS_MODE_OFF = 0x0, // STS is off + DWT_STS_MODE_1 = 0x1, // STS mode 1 + DWT_STS_MODE_2 = 0x2, // STS mode 2 + DWT_STS_MODE_ND = 0x3, // STS with no data + DWT_STS_MODE_SDC = 0x8, // Enable Super Deterministic Codes + DWT_STS_CONFIG_MASK = 0xB, + DWT_STS_CONFIG_MASK_NO_SDC = 0x3, +} dwt_sts_mode_e; + +#define DWT_SFD_COUNT_WARN (0x2000 >> 7) // SFD count warning bit (STS quality + // status bit) + +// Defined constants for "mode" bitmask parameter passed into dwt_starttx() +// function. +typedef enum +{ + DWT_START_TX_IMMEDIATE = 0x00, //! Send the frame immediately + DWT_START_TX_DELAYED = 0x01, //! Send the frame at specified time + //! (time must be less that half period + //! away) + DWT_RESPONSE_EXPECTED = 0x02, //! Will enable the receiver after TX has + //! completed + DWT_START_TX_DLY_REF = 0x04, //! Send the frame at specified time + //! (time in DREF_TIME register + any + //! time in DX_TIME register) + DWT_START_TX_DLY_RS = 0x08, //! Send the frame at specified time + //! (time in RX_TIME_0 register + any + //! time in DX_TIME register) + DWT_START_TX_DLY_TS = 0x10, //! Send the frame at specified time + //! (time in TX_TIME_LO register + any + //! time in DX_TIME register) + DWT_START_TX_CCA = 0x20, //! Send the frame if no preamble + //! detected within PTO time +} dwt_starttx_mode_e; + +// Defined constants for "mode" bitmask parameter passed into dwt_rxenable() +// function. +typedef enum +{ + DWT_START_RX_IMMEDIATE = 0x00, //! Enable the receiver immediately + DWT_START_RX_DELAYED = 0x01, //! Set up delayed RX, if "late" error + //! triggers, then the RX will be + //! enabled immediately + //! If delay RX fails due to "late" error then if this flag is set, the RX + //! will not be re-enabled immediately, and device will be in IDLE when + //! function + //! exits. + DWT_IDLE_ON_DLY_ERR = 0x02, + DWT_START_RX_DLY_REF = 0x04, //! Enable the receiver at specified time + //! (time in DREF_TIME register + any + //! time in DX_TIME register) + DWT_START_RX_DLY_RS = 0x08, //! Enable the receiver at specified time + //! (time in RX_TIME_0 register + any + //! time in DX_TIME register) + DWT_START_RX_DLY_TS = 0x10, //! Enable the receiver at specified time + //! (time in TX_TIME_LO register + any + //! time in DX_TIME register) +} dwt_startrx_mode_e; + +/****************************************************************************** + * @brief Bit definition of the SYS_ENABLE register + * exported for dwt_setinterrupt() API + **/ +typedef enum +{ + DWT_INT_TIMER1_BIT_MASK = (int)(0x80000000), // TIMER1 expiry + DWT_INT_TIMER0_BIT_MASK = 0x40000000UL, // TIMER0 expiry + DWT_INT_ARFE_BIT_MASK = 0x20000000UL, // Frame filtering error + DWT_INT_CPERR_BIT_MASK = 0x10000000UL, // STS quality + // warning/error + DWT_INT_HPDWARN_BIT_MASK = 0x8000000UL, // Half period warning flag + // when delayed TX/RX is + // used + DWT_INT_RXSTO_BIT_MASK = 0x4000000UL, // SFD timeout + DWT_INT_PLL_HILO_BIT_MASK = 0x2000000UL, // PLL calibration flag + DWT_INT_RCINIT_BIT_MASK = 0x1000000UL, // Device has entered + // IDLE_RC + DWT_INT_SPIRDY_BIT_MASK = 0x800000UL, // SPI ready flag + DWT_INT_RXPTO_BIT_MASK = 0x200000UL, // Preamble timeout + DWT_INT_RXOVRR_BIT_MASK = 0x100000UL, // RX overrun event when + // double RX buffer is + // used + DWT_INT_VWARN_BIT_MASK = 0x80000UL, // Brownout event detected + DWT_INT_CIAERR_BIT_MASK = 0x40000UL, // CIA error + DWT_INT_RXFTO_BIT_MASK = 0x20000UL, // RX frame wait timeout + DWT_INT_RXFSL_BIT_MASK = 0x10000UL, // Reed-Solomon error (RX + // sync loss) + DWT_INT_RXFCE_BIT_MASK = 0x8000U, // RX frame CRC error + DWT_INT_RXFCG_BIT_MASK = 0x4000U, // RX frame CRC good + DWT_INT_RXFR_BIT_MASK = 0x2000U, // RX ended - frame ready + DWT_INT_RXPHE_BIT_MASK = 0x1000U, // PHY header error + DWT_INT_RXPHD_BIT_MASK = 0x800U, // PHY header detected + DWT_INT_CIADONE_BIT_MASK = 0x400U, // CIA done + DWT_INT_RXSFDD_BIT_MASK = 0x200U, // SFD detected + DWT_INT_RXPRD_BIT_MASK = 0x100U, // Preamble detected + DWT_INT_TXFRS_BIT_MASK = 0x80U, // Frame sent + DWT_INT_TXPHS_BIT_MASK = 0x40U, // Frame PHR sent + DWT_INT_TXPRS_BIT_MASK = 0x20U, // Frame preamble sent + DWT_INT_TXFRB_BIT_MASK = 0x10U, // Frame transmission + // begins + DWT_INT_AAT_BIT_MASK = 0x8U, // Automatic ACK + // transmission pending + DWT_INT_SPICRCE_BIT_MASK = 0x4U, // SPI CRC error + DWT_INT_CP_LOCK_BIT_MASK = 0x2U, // PLL locked + DWT_INT_IRQS_BIT_MASK = 0x1U, // Interrupt set +} dwt_int_conf_e; + +// Bit definition of the double RX buffer status events +typedef enum +{ + DWT_RDB_STATUS_CP_ERR1_BIT_MASK = 0x80U, // STS quality warning/error + // in RX buffer 1 + DWT_RDB_STATUS_CIADONE1_BIT_MASK = 0x40U, // CIA done for frame in RX + // buffer 1 + DWT_RDB_STATUS_RXFR1_BIT_MASK = 0x20U, // Frame ready in RX buffer 1 + DWT_RDB_STATUS_RXFCG1_BIT_MASK = 0x10U, // Frame CC good in RX buffer + // 1 + DWT_RDB_STATUS_CP_ERR0_BIT_MASK = 0x8U, // STS quality warning/error + // in RX buffer 0 + DWT_RDB_STATUS_CIADONE0_BIT_MASK = 0x4U, // CIA done for frame in RX + // buffer 0 + DWT_RDB_STATUS_RXFR0_BIT_MASK = 0x2U, // Frame ready in RX buffer 0 + DWT_RDB_STATUS_RXFCG0_BIT_MASK = 0x1U, // Frame CC good in RX buffer + // 0 +} dwt_rdb_e; + +/* RX events mask relating to reception into RX buffer 0, when double buffer is + * used */ +#define DWT_RDB_STATUS_CLEAR_BUFF0_EVENTS (RDB_STATUS_CP_ERR0_BIT_MASK \ + | RDB_STATUS_CIADONE0_BIT_MASK \ + | RDB_STATUS_RXFR0_BIT_MASK \ + | RDB_STATUS_RXFCG0_BIT_MASK) + +/* RX events mask relating to reception into RX buffer 1, when double buffer is + * used */ +#define DWT_RDB_STATUS_CLEAR_BUFF1_EVENTS (RDB_STATUS_CP_ERR1_BIT_MASK \ + | RDB_STATUS_CIADONE1_BIT_MASK \ + | RDB_STATUS_RXFR1_BIT_MASK \ + | RDB_STATUS_RXFCG1_BIT_MASK) + +#define RDB_STATUS_RXOK \ + (DWT_RDB_STATUS_RXFCG0_BIT_MASK | DWT_RDB_STATUS_RXFR0_BIT_MASK \ + | DWT_RDB_STATUS_CIADONE0_BIT_MASK | DWT_RDB_STATUS_CP_ERR0_BIT_MASK \ + | DWT_RDB_STATUS_RXFCG1_BIT_MASK | DWT_RDB_STATUS_RXFR1_BIT_MASK \ + | DWT_RDB_STATUS_CIADONE1_BIT_MASK | DWT_RDB_STATUS_CP_ERR1_BIT_MASK) + +// DW37xx double RX buffer interrupt events +#define DWT_DB_INT_RX (RDB_STATUS_RXOK) + +// DW3000 interrupt events +#define DWT_INT_RX \ + (DWT_INT_CIADONE_BIT_MASK | DWT_INT_RXFCG_BIT_MASK | DWT_INT_RXPHE_BIT_MASK \ + | DWT_INT_RXFR_BIT_MASK | DWT_INT_RXFCE_BIT_MASK | DWT_INT_RXFSL_BIT_MASK \ + | DWT_INT_RXFTO_BIT_MASK | DWT_INT_CIAERR_BIT_MASK | DWT_INT_RXPTO_BIT_MASK \ + | DWT_INT_RXSTO_BIT_MASK | DWT_INT_ARFE_BIT_MASK) +#define DWT_INT_ALL_LO (0xffffffff) +#define DWT_INT_ALL_HI (0xffffffff) + +/* User defined RX timeouts (frame wait timeout and preamble detect timeout) + * mask. */ +#define SYS_STATUS_ALL_RX_TO (DWT_INT_RXFTO_BIT_MASK \ + | DWT_INT_RXPTO_BIT_MASK \ + | DWT_INT_CPERR_BIT_MASK) + +/* All RX errors mask. */ +#define SYS_STATUS_ALL_RX_ERR \ + (DWT_INT_RXPHE_BIT_MASK | DWT_INT_RXFCE_BIT_MASK | DWT_INT_RXFSL_BIT_MASK \ + | DWT_INT_RXSTO_BIT_MASK | DWT_INT_ARFE_BIT_MASK | DWT_INT_CIAERR_BIT_MASK \ + | DWT_INT_CPERR_BIT_MASK) + +/* All RX events after a correct packet reception mask. */ +#define SYS_STATUS_ALL_RX_GOOD \ + (DWT_INT_RXFR_BIT_MASK | DWT_INT_RXFCG_BIT_MASK | DWT_INT_RXPRD_BIT_MASK \ + | DWT_INT_RXSFDD_BIT_MASK | DWT_INT_RXPHD_BIT_MASK \ + | DWT_INT_CIADONE_BIT_MASK) + +/* All STS Mode 3 RX errors mask. */ +#define SYS_STATUS_ALL_ND_RX_ERR (DWT_INT_CIAERR_BIT_MASK \ + | DWT_INT_RXSTO_BIT_MASK) +#define DWT_INT_HI_CCA_FAIL_BIT_MASK 0x1000U + +#define DWT_INT_AES_STS_MEM_CONF_BIT_MASK 0x8U +#define DWT_INT_AES_STS_TRANS_ERR_BIT_MASK 0x4U +#define DWT_INT_AES_STS_AUTH_ERR_BIT_MASK 0x2U + +/* Entry point to AES IV 0 */ +#define DWT_AES_IV_ENTRY (0x10034) + +#define DWT_AES_ERRORS (DWT_INT_AES_STS_AUTH_ERR_BIT_MASK \ + | DWT_INT_AES_STS_TRANS_ERR_BIT_MASK \ + | DWT_INT_AES_STS_MEM_CONF_BIT_MASK) +// Defined constants when SPI CRC mode is used: +typedef enum +{ + DWT_SPI_CRC_MODE_NO = 0, /* No CRC */ + DWT_SPI_CRC_MODE_WR, /* This is used to enable SPI CRC check (the SPI + * CRC check will be enabled on DW3000 and CRC-8 + * added for SPI write transactions) */ + DWT_SPI_CRC_MODE_WRRD /* This is used to optionally enable additional + * CRC check on the SPI read operations, while + * the CRC check on the SPI write + * operations is also enabled */ +} dwt_spi_crc_mode_e; + +// Defined constants for "mode" bit field parameter passed to dwt_setleds() +// function. +typedef enum +{ + DWT_LEDS_DISABLE = 0x00, + DWT_LEDS_ENABLE = 0x01, + DWT_LEDS_INIT_BLINK = 0x02, + // Default blink time. Blink time is expressed in multiples of 14 ms. The + // value defined here is ~225 ms. + DWT_LEDS_BLINK_TIME_DEF = 0x10, +} dwt_setleds_mode_e; + +typedef enum +{ + // Common for all devices + GPIO_PIN0_EXTTXE = 0x2 << 0, /* Deprecated, only works for DW3000. + * The pin operates as the EXTTXE + * output (output TX state) */ + GPIO_PIN1_EXTRXE = 0x2 << (1 * 3), /* Deprecated, only works for DW3000. + * The pin operates as the EXTRXE + * output (output RX state) */ + GPIO_PIN2_RXLED = 0x1 << (2 * 3), /* The pin operates as the RXLED output + */ + GPIO_PIN3_TXLED = 0x1 << (3 * 3), /* The pin operates as the TXLED output + */ + GPIO_PIN4_EXTDA = 0x1 << (4 * 3), /* Deprecated, only works for DW3000. + * The pin operates to support + * external DA/PA */ + GPIO_PIN4_EXTTXE = 0x2 << (4 * 3), /* Deprecated, only works for DW37xx. + * The pin operates as the EXTTXE + * output (output TX state) */ + GPIO_PIN5_EXTTX = 0x1 << (5 * 3), /* Deprecated, only works for DW3000. + * The pin operates to support + * external PA / TX enable */ + GPIO_PIN5_EXTRXE = 0x2 << (5 * 3), /* Deprecated, only works for DW37xx. + * The pin operates as the EXTRXE + * output (output RX state) */ + GPIO_PIN6_EXTRX = 0x1 << (6 * 3), /* Deprecated, only works for DW3000. + * The pin operates to support + * external LNA */ + // DW3000 + DW3000_GPIO_PIN0_GPIO = 0x0, + DW3000_GPIO_PIN0_RXOKLED = 0x1, + DW3000_GPIO_PIN0_PDOA_SW_TX = 0x2, + DW3000_GPIO_PIN1_GPIO = 0x0 << (1 * 3), + DW3000_GPIO_PIN1_SFDLED = 0x1 << (1 * 3), + DW3000_GPIO_PIN1_PDOA_SW_RX = 0x2 << (1 * 3), + DW3000_GPIO_PIN2_GPIO = 0x0 << (2 * 3), + DW3000_GPIO_PIN2_RXLED = 0x1 << (2 * 3), + DW3000_GPIO_PIN2_PDOA_SW_RF1 = 0x2 << (2 * 3), + DW3000_GPIO_PIN3_GPIO = 0x0 << (3 * 3), + DW3000_GPIO_PIN3_TXLED = 0x1 << (3 * 3), + DW3000_GPIO_PIN3_PDOA_SW_RF2 = 0x2 << (3 * 3), + DW3000_GPIO_PIN4_GPIO = 0x0 << (4 * 3), + DW3000_GPIO_PIN4_EXTPA = 0x1 << (4 * 3), + DW3000_GPIO_PIN4_IRQ = 0x2 << (4 * 3), + DW3000_GPIO_PIN5_GPIO = 0x0 << (5 * 3), + DW3000_GPIO_PIN5_EXTTXE = 0x1 << (5 * 3), + DW3000_GPIO_PIN6_GPIO = 0x0 << (6 * 3), + DW3000_GPIO_PIN6_EXTRXE = 0x1 << (6 * 3), + DW3000_GPIO_PIN7_SYNC = 0x0 << (7 * 3), + DW3000_GPIO_PIN7_GPIO = 0x1 << (7 * 3), + DW3000_GPIO_PIN8_IRQ = 0x0 << (8 * 3), + DW3000_GPIO_PIN8_GPIO = 0x1 << (8 * 3), + // DW3700 and DW3720 + DW37XX_GPIO_PIN0_SPI2_CLK = 0x0, + DW37XX_GPIO_PIN0_RXOKLED = 0x1, + DW37XX_GPIO_PIN0_GPIO = 0x2, + DW37XX_GPIO_PIN1_SPI2_MISO = 0x0 << (1 * 3), + DW37XX_GPIO_PIN1_SFDLED = 0x1 << (1 * 3), + DW37XX_GPIO_PIN1_GPIO = 0x2 << (1 * 3), + DW37XX_GPIO_PIN2_IRQ2 = 0x0 << (2 * 3), + DW37XX_GPIO_PIN2_RXLED = 0x1 << (2 * 3), + DW37XX_GPIO_PIN2_GPIO = 0x2 << (2 * 3), + DW37XX_GPIO_PIN3_SPI2_MOSI = 0x0 << (3 * 3), + DW37XX_GPIO_PIN3_TXLED = 0x1 << (3 * 3), + DW37XX_GPIO_PIN3_GPIO = 0x2 << (3 * 3), + DW37XX_GPIO_PIN4_GPIO = 0x0 << (4 * 3), + DW37XX_GPIO_PIN4_COEX_IN = 0x1 << (4 * 3), + DW37XX_GPIO_PIN4_PDOA_SW_TX = 0x2 << (4 * 3), + DW37XX_GPIO_PIN5_GPIO = 0x0 << (5 * 3), + DW37XX_GPIO_PIN5_COEX_OUT = 0x1 << (5 * 3), + DW37XX_GPIO_PIN5_PDOA_SW_RX = 0x2 << (5 * 3), + DW37XX_GPIO_PIN6_GPIO = 0x0 << (6 * 3), + DW37XX_GPIO_PIN6_EXT_SW_RX = 0x1 << (6 * 3), + DW37XX_GPIO_PIN6_PDOA_SW_RF1 = 0x2 << (6 * 3), + DW37XX_GPIO_PIN7_SYNC = 0x0 << (7 * 3), + DW37XX_GPIO_PIN7_GPIO = 0x1 << (7 * 3), + DW37XX_GPIO_PIN7_PDOA_SW_RF2 = 0x2 << (7 * 3), + DW37XX_GPIO_PIN8_IRQ = 0x0 << (8 * 3), + DW37XX_GPIO_PIN8_GPIO = 0x1 << (8 * 3) +} dwt_gpio_pin_e; + +/* Mask that can be used in e.g ull_setgpiomode to use the GPIO mode of all GPIO + * pins on a DW3000 IC */ +#define DW3000_ENABLE_ALL_GPIOS_MASK 0x1200000 + +/* Mask that can be used in e.g ull_setgpiomode to use the GPIO mode of all GPIO + * pins on a DW3700 or DW3720 IC*/ +#define DW37XX_ENABLE_ALL_GPIOS_MASK 0x1200492 + +typedef enum +{ + GPIO0_FUNC_MASK = 0x0000007, + GPIO1_FUNC_MASK = 0x0000038, + GPIO2_FUNC_MASK = 0x00001c0, + GPIO3_FUNC_MASK = 0x0000e00, + GPIO4_FUNC_MASK = 0x0007000, + GPIO5_FUNC_MASK = 0x0038000, + GPIO6_FUNC_MASK = 0x01c0000, + GPIO7_FUNC_MASK = 0x0e00000, + GPIO8_FUNC_MASK = 0x7000000, +} dwt_gpio_func_mask_e; + +/* Mask values for GPIO pins on DW3xxx */ +typedef enum +{ + GPIO0_BIT_MASK = 0x001, + GPIO1_BIT_MASK = 0x002, + GPIO2_BIT_MASK = 0x004, + GPIO3_BIT_MASK = 0x008, + GPIO4_BIT_MASK = 0x010, + GPIO5_BIT_MASK = 0x020, + GPIO6_BIT_MASK = 0x040, + GPIO7_BIT_MASK = 0x080, + GPIO8_BIT_MASK = 0x100, +} dwt_gpio_mask_e; + +#define GPIO_BIT_MASK_ALL 0x1FF + +/* Deprecated. Use dwt_gpio_mask_e instead */ +typedef enum +{ + GPIO_0 = GPIO0_BIT_MASK, + GPIO_1 = GPIO1_BIT_MASK, + GPIO_2 = GPIO2_BIT_MASK, + GPIO_3 = GPIO3_BIT_MASK, + GPIO_4 = GPIO4_BIT_MASK, + GPIO_5 = GPIO5_BIT_MASK, + GPIO_6 = GPIO6_BIT_MASK, + GPIO_7 = GPIO7_BIT_MASK, + GPIO_8 = GPIO8_BIT_MASK, + GPIO_ALL = GPIO_BIT_MASK_ALL, +} gpio_num_e; + +#define GPIO_MFIO_MODE_MASK 0x7U + +/* Enable/disable WiFi co-existence */ +typedef enum +{ + DWT_EN_WIFI_COEX = 0, /* Configure GPIO for WiFi co-ex - GPIO high*/ + DWT_DIS_WIFI_COEX /* Configure GPIO for WiFi co-ex - GPIO low */ +} dwt_wifi_coex_e; + +// Defined constants for "lna_pa" bit field parameter passed to +// dwt_setlnapamode() function +typedef enum +{ + DWT_LNA_PA_DISABLE = 0x00, + DWT_LNA_ENABLE = 0x01, + DWT_PA_ENABLE = 0x02, + DWT_TXRX_EN = 0x04, +} dwt_setlnapmodes_e; + +typedef enum +{ + DWT_TIMER0 = 0, + DWT_TIMER1 +} dwt_timers_e; + +typedef enum +{ + DWT_TIM_SINGLE = 0, + DWT_TIM_REPEAT +} dwt_timer_mode_e; + +typedef enum +{ + DWT_XTAL = 0, // 38.4 MHz + DWT_XTAL_DIV2 = 1, // 19.2 MHz + DWT_XTAL_DIV4 = 2, // 9.6 MHz + DWT_XTAL_DIV8 = 3, // 4.8 MHz + DWT_XTAL_DIV16 = 4, // 2.4 MHz + DWT_XTAL_DIV32 = 5, // 1.2 MHz + DWT_XTAL_DIV64 = 6, // 0.6 MHz + DWT_XTAL_DIV128 = 7 // 0.3 MHz +} dwt_timer_period_e; + +typedef struct +{ + dwt_timers_e timer; // Select the timer to use. + dwt_timer_period_e timer_div; // Select the timer frequency (divider). + dwt_timer_mode_e timer_mode; // Select the timer mode. + uint8_t timer_gpio_stop; // Set to '1' to halt GPIO on interrupt. + uint8_t timer_coexout; // Configure GPIO for WiFi co-ex. +} dwt_timer_cfg_t; + +// Reset options +typedef enum +{ + DWT_RESET_ALL = 0x00, + DWT_RESET_CTRX = 0x0F, + DWT_RESET_RX = 0xEF, + DWT_RESET_CLEAR = 0xFF, +} dwt_reset_options_e; + +// frame filtering configuration options +typedef enum +{ + DWT_FF_ENABLE_802_15_4 = 0x2, // enable FF for 802.15.4 + DWT_FF_DISABLE = 0x0, // disable FF + DWT_FF_BEACON_EN = 0x001, // beacon frames allowed + DWT_FF_DATA_EN = 0x002, // data frames allowed + DWT_FF_ACK_EN = 0x004, // ack frames allowed + DWT_FF_MAC_EN = 0x008, // mac control frames allowed + DWT_FF_RSVD_EN = 0x010, // reserved frame types allowed + DWT_FF_MULTI_EN = 0x020, // multipurpose frames allowed + DWT_FF_FRAG_EN = 0x040, // fragmented frame types allowed + DWT_FF_EXTEND_EN = 0x080, // extended frame types allowed + DWT_FF_COORD_EN = 0x100, // behave as coordinator (can receive + // frames with no dest address (PAN ID + // has to match)) + DWT_FF_IMPBRCAST_EN = 0x200, // allow MAC implicit broadcast + DWT_FF_MAC_LE0_EN = 0x408, // mac frames allowed if address in + // LE0_PEND matches source address + DWT_FF_MAC_LE1_EN = 0x808, // mac frames allowed if address in + // LE1_PEND matches source address + DWT_FF_MAC_LE2_EN = 0x1008, // mac frames allowed if address in + // LE2_PEND matches source address + DWT_FF_MAC_LE3_EN = 0x2008, // mac frames allowed if address in + // LE3_PEND matches source address +} dwt_ff_conf_options_e; + +// DW3000 SLEEP and WAKEUP configuration parameters +typedef enum +{ + DWT_PGFCAL = 0x0800, + DWT_GOTORX = 0x0200, + DWT_GOTOIDLE = 0x0100, + DWT_SEL_OPS3 = 0x00C0, + DWT_SEL_OPS2 = 0x0080, // Short OPS table + DWT_SEL_OPS1 = 0x0040, // SCP + DWT_SEL_OPS0 = 0x0000, // Long OPS table + DWT_ALT_OPS = 0x0020, + DWT_LOADLDO = 0x0010, + DWT_LOADDGC = 0x0008, + DWT_LOADBIAS = 0x0004, + DWT_RUNSAR = 0x0002, + DWT_CONFIG = 0x0001, // download the AON array into the HIF + // (configuration download) +} dwt_on_wake_param_e; + +typedef enum +{ + DWT_PRES_SLEEP = 0x20, // allows for SLEEP_EN bit to be "preserved", + // although it will self - clear on wake up + DWT_WAKE_WUP = 0x10, // wake up on WAKEUP PIN + DWT_WAKE_CSN = 0x8, // wake up on chip select + DWT_BROUT_EN = 0x4, // enable brownout detector during sleep/deep + // sleep + DWT_SLEEP = 0x2, // enable sleep (if this bit is clear the device + // will enter deep sleep) + DWT_SLP_EN = 0x1, // enable sleep/deep sleep functionality +} dwt_wkup_param_e; + +// Events that can be used to automatically transition to SLEEP or DEEPSLEEP +typedef enum +{ + DWT_TX_COMPLETE = 0x01, + DWT_RX_COMPLETE = 0x02 +} dwt_sleep_after_param_e; + +// DW3000 IDLE/INIT mode definitions +typedef enum +{ + DWT_DW_INIT = 0x0, + DWT_DW_IDLE = 0x1, + DWT_DW_IDLE_RC = 0x2, +} dwt_idle_init_modes_e; + +typedef enum +{ + DWT_READ_OTP_PID = 0x10, // read part ID from OTP + DWT_READ_OTP_LID = 0x20, // read lot ID from OTP + DWT_READ_OTP_BAT = 0x40, // read ref voltage from OTP + DWT_READ_OTP_TMP = 0x80, // read ref temperature from OTP +} dwt_read_otp_modes_e; + +// DW3xxx RF Port configuration set selection +typedef enum +{ + DWT_RF_PORT_DEF = 0, // Configure RF port to default value 0 (device + // will internally switch depending on the PDoA + // mode) + DWT_RF_PORT_1 = 1, // select RF port 1 + DWT_RF_PORT_2 = 2, // select RF port 2 +} dwt_rf_port_selection_e; + +// DW3xxx enabling manual control of antenna selection +typedef enum +{ + DWT_RF_PORT_MAN_CTRL_EN = 1, // enabling manual control of antenna + // selection bits + DWT_RF_PORT_MAN_CTRL_DISEN = 0, // disabling manual control of antenna + // selection bits +} dwt_rf_port_ctrl_e; + +// Conversion factor to convert clock offset from PPM to ratio +#define CLOCK_OFFSET_PPM_TO_RATIO (1.0 / (1 << 26)) + +typedef enum +{ + AON_SLPCNT_LO = (0x102), // address of SLEEP counter bits [19:12] + // in AON memory + AON_SLPCNT_HI = (0x103), // address of SLEEP counter bits [27:20] + // in AON memory + AON_SLPCNT_CAL_CTRL = (0x104), // address of SLEEP counter cal control + AON_LPOSC_TRIM = (0x10B), // address of LP OSC trim code + AON_SLPCNT_CAL_LO = (0x10E), // address of SLEEP counter cal value low + // byte + AON_SLPCNT_CAL_HI = (0x10F), // address of SLEEP counter cal value + // high byte +} dwt_aon_sleep_conf_e; + +typedef enum +{ + DW_CIA_DIAG_LOG_MAX = 0x8, // CIA to copy to swinging set a maximum set + // of diagnostic registers in Double Buffer + // mode + DW_CIA_DIAG_LOG_MID = 0x4, // CIA to copy to swinging set a medium set + // of diagnostic registers in Double Buffer + // mode + DW_CIA_DIAG_LOG_MIN = 0x2, // CIA to copy to swinging set a minimal set + // of diagnostic registers in Double Buffer + // mode + DW_CIA_DIAG_LOG_ALL = 0x1, // CIA to log all diagnostic registers + DW_CIA_DIAG_LOG_OFF = 0x0, // CIA to log reduced set of diagnostic + // registers +} dwt_cia_diag_log_conf_e; + +// Call-back data RX frames flags +typedef enum +{ + DWT_CB_DATA_RX_FLAG_RNG = 0x01, // Ranging bit + DWT_CB_DATA_RX_FLAG_ND = 0x02, // No data mode + DWT_CB_DATA_RX_FLAG_CIA = 0x04, // CIA done + DWT_CB_DATA_RX_FLAG_CER = 0x08, // CIA error + DWT_CB_DATA_RX_FLAG_CPER = 0x10, // STS error +} dwt_cb_data_rx_flags_e; + +// Multiplication factors to convert carrier integrator value to a frequency +// offset in Hertz +#define FREQ_OFFSET_MULTIPLIER (998.4e6 / 2.0 / 1024.0 / 131072.0) + +// Multiplication factors to convert frequency offset in Hertz to PPM crystal +// offset +// NB: also changes sign so a positive value means the local RX clock is running +// slower than the remote TX device. +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6 / 6489.6e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_9 (-1.0e6 / 7987.2e6) + +#define DWT_VALID_TDOA_LIMIT (100) // If the abs(TDoA) value is larger + // than this constant, this means + // the PDoA will not be valid, + // and should not be used. + +// Low Energy (LE) device addresses +typedef enum +{ + LE0 = 0, // LE0_PEND address + LE1 = 1, // LE1_PEND address + LE2 = 2, // LE2_PEND address + LE3 = 3, // LE3_PEND address +} dwt_le_addresses_e; + +// TX/RX call-back data +typedef struct +{ + uint32_t status; // initial value of register as ISR is entered + uint16_t status_hi; // initial value of register as ISR is entered, if + // relevant for that event type + uint16_t datalength; // length of frame + uint8_t rx_flags; // RX frame flags, see above + uint8_t dss_stat; // Dual SPI status reg 11:38, 2 LSbits relevant : + // bit0 (DWT_CB_DSS_SPI1_AVAIL) and bit1 + // (DWT_CB_DSS_SPI2_AVAIL) + struct dwchip_s *dw; +} dwt_cb_data_t; + +// Call-back type for SPI read error event (if the DW3000 generated CRC does not +// match the one calculated by the dwt_generatecrc8 function) +typedef void (*dwt_spierrcb_t)(void); + +// Call-back type for all interrupt events +typedef void (*dwt_cb_t)(const dwt_cb_data_t *); + +#define SQRT_FACTOR 181 /*Factor of sqrt(2) for calculation*/ +#define STS_LEN_SUPPORTED 7 /*The supported STS length options*/ +#define SQRT_SHIFT_VAL 7 +#define SHIFT_VALUE 11 +#define MOD_VALUE 2048 +#define HALF_MOD (MOD_VALUE >> 1) + +/*This Enum holds INT working options.*/ +typedef enum +{ + DWT_DISABLE_INT = 0, /* Disable these INT */ + DWT_ENABLE_INT, /* Enable these INT */ + DWT_ENABLE_INT_ONLY, /* Enable only these INT*/ + DWT_ENABLE_INT_DUAL_SPI, /* Enable these INT, dual SPI mode */ + DWT_ENABLE_INT_ONLY_DUAL_SPI, /* Enable only these INT, dual SPI mode */ +} dwt_INT_options_e; + +/*This Enum holds the index for factor calculation.*/ +typedef enum +{ + DWT_STS_LEN_32 = 0, + DWT_STS_LEN_64 = 1, + DWT_STS_LEN_128 = 2, + DWT_STS_LEN_256 = 3, + DWT_STS_LEN_512 = 4, + DWT_STS_LEN_1024 = 5, + DWT_STS_LEN_2048 = 6 +} dwt_sts_lengths_e; + +/* Returns the value to set in CP_CFG0_ID for STS length. The x is the enum + * value from dwt_sts_lengths_e */ +#define GET_STS_REG_SET_VALUE(x) ((uint16_t)1 << ((x) + 2)) + +/* Enum used for selecting channel for DGC on-wake kick. */ +typedef enum +{ + DWT_DGC_SEL_CH5 = 0, + DWT_DGC_SEL_CH9 +} dwt_dgc_chan_sel; + +/* Enum used for selecting location to load DGC data from */ +typedef enum +{ + DWT_DGC_LOAD_FROM_SW = 0, + DWT_DGC_LOAD_FROM_OTP +} dwt_dgc_load_location; + +/*! + * --------------------------------------------------------------------------- + * Structure typedef: dwt_config_t + * + * Structure for setting device configuration via dwt_configure() function + * + */ +typedef struct +{ + uint8_t chan; //!< Channel number (5 or 9) + dwt_tx_plen_e txPreambLength; //!< DWT_PLEN_64..DWT_PLEN_4096 + dwt_pac_size_e rxPAC; //!< Acquisition Chunk Size (Relates to RX + //!< preamble length) + uint8_t txCode; //!< TX preamble code (the code configures + //!< the PRF, e.g. 9 -> PRF of 64 MHz) + uint8_t rxCode; //!< RX preamble code (the code configures + //!< the PRF, e.g. 9 -> PRF of 64 MHz) + dwt_sfd_type_e sfdType; //!< SFD type (0 for short IEEE 8-bit + //!< standard, 1 for DW 8-bit, 2 for DW + //!< 16-bit, 3 for 4z BPRF) + dwt_uwb_bit_rate_e dataRate; //!< Data rate {DWT_BR_850K or DWT_BR_6M8} + dwt_phr_mode_e phrMode; //!< PHR mode {0x0 - standard + //!< DWT_PHRMODE_STD, 0x3 - extended + //!< frames DWT_PHRMODE_EXT} + dwt_phr_rate_e phrRate; //!< PHR rate {0x0 - standard + //!< DWT_PHRRATE_STD, 0x1 - at datarate + //!< DWT_PHRRATE_DTA} + uint16_t sfdTO; //!< SFD timeout value (in symbols) + dwt_sts_mode_e stsMode; //!< STS mode (no STS, STS before PHR or + //!< STS after data) + dwt_sts_lengths_e stsLength; //!< STS length (the allowed values are + //!< listed in dwt_sts_lengths_e + dwt_pdoa_mode_e pdoaMode; //!< PDOA mode +#ifndef WIN32 +} __attribute__((packed)) dwt_config_t; +#else +} dwt_config_t; +#endif // WIN32 + +typedef struct +{ + uint8_t PGdly; + // TX POWER + // 31:24 TX_CP_PWR + // 23:16 TX_SHR_PWR + // 15:8 TX_PHR_PWR + // 7:0 TX_DATA_PWR + uint32_t power; + uint16_t PGcount; +#ifndef WIN32 +} __attribute__((packed)) dwt_txconfig_t; +#else +} dwt_txconfig_t; +#endif // WIN32 + +typedef struct +{ + uint8_t ipatovRxTime[5]; // RX timestamp from Ipatov sequence + uint8_t ipatovRxStatus; // RX status info for Ipatov sequence + uint16_t ipatovPOA; // POA of Ipatov + + uint8_t stsRxTime[5]; // RX timestamp from STS + uint16_t stsRxStatus; // RX status info for STS + uint16_t stsPOA; // POA of STS block 1 + uint8_t sts2RxTime[5]; // RX timestamp from STS + uint16_t sts2RxStatus; // RX status info for STS + uint16_t sts2POA; // POA of STS block 2 + + uint8_t tdoa[6]; // TDOA from two STS RX timestamps + int16_t pdoa; // PDOA from two STS POAs signed int [1:-11] in radians + + int16_t xtalOffset; // estimated xtal offset of remote device + uint32_t ciaDiag1; // Diagnostics common to both sequences + + uint32_t ipatovPeak; // index and amplitude of peak sample in + // Ipatov sequence CIR + uint32_t ipatovPower; // channel area allows estimation of channel + // power for the Ipatov sequence + uint32_t ipatovF1; // F1 for Ipatov sequence + uint32_t ipatovF2; // F2 for Ipatov sequence + uint32_t ipatovF3; // F3 for Ipatov sequence + uint16_t ipatovFpIndex; // First path index for Ipatov sequence + uint16_t ipatovAccumCount; // Number accumulated symbols for Ipatov + // sequence + + uint32_t stsPeak; // index and amplitude of peak sample in STS CIR + uint32_t stsPower; // channel area allows estimation of channel + // power for the STS + uint32_t stsF1; // F1 for STS + uint32_t stsF2; // F2 for STS + uint32_t stsF3; // F3 for STS + uint16_t stsFpIndex; // First path index for STS + uint16_t stsAccumCount; // Number accumulated symbols for STS + + uint32_t sts2Peak; // index and amplitude of peak sample in STS + // CIR + uint32_t sts2Power; // channel area allows estimation of channel + // power for the STS + uint32_t sts2F1; // F1 for STS + uint32_t sts2F2; // F2 for STS + uint32_t sts2F3; // F3 for STS + uint16_t sts2FpIndex; // First path index for STS + uint16_t sts2AccumCount; // Number accumulated symbols for STS + +#ifndef WIN32 +} __attribute__((packed)) dwt_rxdiag_t; +#else +} dwt_rxdiag_t; +#endif // WIN32 + +typedef struct +{ + // all of the below are mapped to a register in DW3000 + uint16_t PHE; // 12-bit number of received header error events + uint16_t RSL; // 12-bit number of received frame sync loss event + // events + uint16_t CRCG; // 12-bit number of good CRC received frame events + uint16_t CRCB; // 12-bit number of bad CRC (CRC error) received frame + // events + uint8_t ARFE; // 8-bit number of address filter error events + uint8_t OVER; // 8-bit number of receive buffer overrun events (used + // in double buffer mode) + uint16_t SFDTO; // 12-bit number of SFD timeout events + uint16_t PTO; // 12-bit number of Preamble timeout events + uint8_t RTO; // 8-bit number of RX frame wait timeout events + uint16_t TXF; // 12-bit number of transmitted frame events + uint8_t HPW; // 8-bit half period warning events (when delayed RX/TX + // enable is used) + uint8_t CRCE; // 8-bit SPI CRC error events + uint16_t PREJ; // 12-bit number of Preamble rejection events + uint16_t SFDD; // 12-bit SFD detection events ... only DW3720 + uint8_t STSE; // 8-bit STS error/warning events +#ifndef WIN32 +} __attribute__((packed)) dwt_deviceentcnts_t; +#else +} dwt_deviceentcnts_t; +#endif // WIN32 + +/* BEGIN: CHIP_SPECIFIC_SECTION DW37xx */ + +/* Hosts for the SPI bus */ +typedef enum +{ + DWT_HOST_SPI1 = 0, /* Host using SPI1 interface */ + DWT_HOST_SPI2 /* Host using SPI2 interface */ +} dwt_spi_host_e; + +#define SPI2MAVAIL_BIT_MASK 0x2 // bit 1 of 1a:01 +#define SPI1MAVAIL_BIT_MASK 0x4 // bit 2 of 1a:01 + +typedef enum +{ + HOST_EN_SLEEP = 0x00, /* Host enable Sleep/Deepsleep */ + HOST_DIS_SLEEP = 0x60 /* Host disable Sleep/Deepsleep */ +} dwt_host_sleep_en_e; + +/* END: CHIP_SPECIFIC_SECTION DW37xx */ + +/******************************************************************************/ + +/* AES BLOCK + * */ + +/******************************************************************************/ + +// enums below are defined in such a way as to allow a simple write to DW3000 +// AES configuration registers + +/* For MIC size definition */ +typedef enum +{ + MIC_0 = 0, + MIC_4, + MIC_6, + MIC_8, + MIC_10, + MIC_12, + MIC_14, + MIC_16 +} dwt_mic_size_e; + +/* Key size definition */ +typedef enum +{ + AES_KEY_128bit = 0, + AES_KEY_192bit = 1, + AES_KEY_256bit = 2 +} dwt_aes_key_size_e; + +/* Load key from RAM selection */ +typedef enum +{ + AES_KEY_No_Load = 0, + AES_KEY_Load +} dwt_aes_key_load_e; + +/* Key source - RAM or registers */ +typedef enum +{ + AES_KEY_Src_Register = 0, /* Use AES KEY from registers */ + AES_KEY_Src_RAMorOTP /* Use AES KEY from RAM or OTP (depending if + * AES_key_OTP set), + * AES_KEY_Load needs to be set as well + */ +} dwt_aes_key_src_e; + +/* Operation selection */ +typedef enum +{ + AES_Encrypt = 0, + AES_Decrypt +} dwt_aes_mode_e; + +/* This defines the source port for encrypted/unencrypted data */ +typedef enum +{ + AES_Src_Scratch = 0, + AES_Src_Rx_buf_0, + AES_Src_Rx_buf_1, + AES_Src_Tx_buf +} dwt_aes_src_port_e; + +/* This defines the dest port for encrypted/unencrypted data */ +typedef enum +{ + AES_Dst_Scratch = 0, + AES_Dst_Rx_buf_0, + AES_Dst_Rx_buf_1, + AES_Dst_Tx_buf, + AES_Dst_STS_key +} dwt_aes_dst_port_e; + +/* storage for 128/192/256-bit key */ +typedef struct +{ + uint32_t key0; + uint32_t key1; + uint32_t key2; + uint32_t key3; + uint32_t key4; + uint32_t key5; + uint32_t key6; + uint32_t key7; +} dwt_aes_key_t; + +typedef enum +{ + AES_core_type_GCM = 0, /* Core type GCM */ + AES_core_type_CCM /* Core type CCM */ +} dwt_aes_core_type_e; + +typedef enum +{ + AES_key_RAM = 0, /* Use the AES KEY from RAM */ + AES_key_OTP /* Use the AES KEY from OTP, key_load needs to match -> + * needs to be set to AES_KEY_Src_Ram */ +} dwt_aes_key_otp_type_e; + +typedef enum +{ + AES_key_otp_sel_1st_128 = 0, /* Key first 128bits */ + AES_key_otp_sel_2nd_128 /* Key second 128bits */ +} dwt_aes_otp_sel_key_block_e; + +typedef struct +{ + dwt_aes_otp_sel_key_block_e aes_otp_sel_key_block; //!< Select OTP key, + //!< first 128 or + //!< 2nd 128 bits + dwt_aes_key_otp_type_e aes_key_otp_type; //!< Using KEY from + //!< OTP or RAM, if + //!< this is set to + //!< AES_key_OTP, + //!< KEY from OTP + //!< is used + dwt_aes_core_type_e aes_core_type; //!< Core type GCM or + //!< CCM* + dwt_mic_size_e mic; //!< Message + //!< integrity code + //!< size + dwt_aes_key_src_e key_src; //!< Location of the + //!< key: either as + //!< programmed in + //!< registers(128 + //!< bit) or in the + //!< RAM or in the + //!< OTP + dwt_aes_key_load_e key_load; //!< Loads key from + //!< RAM or uses + //!< KEY from the + //!< registers + uint8_t key_addr; //!< Address offset + //!< of AES key + //!< when using AES + //!< key in RAM + dwt_aes_key_size_e key_size; //!< AES key length + //!< configuration + //!< corresponding + //!< to + //!< AES_KEY_128/192/256bit + dwt_aes_mode_e mode; //!< Operation type + //!< encrypt/decrypt +} dwt_aes_config_t; + +typedef struct +{ + uint8_t *nonce; //!< Pointer to the nonce + uint8_t *header; //!< Pointer to header (this is not + //!< encrypted/decrypted) + uint8_t *payload; //!< Pointer to payload (this is + //!< encrypted/decrypted) + uint8_t header_len; //!< Header size + uint16_t payload_len; //!< Payload size + dwt_aes_src_port_e src_port; //!< Source port + dwt_aes_dst_port_e dst_port; //!< Dest port + dwt_aes_mode_e mode; //!< Encryption or decryption + uint8_t mic_size; //!< tag_size; +} dwt_aes_job_t; + +/* storage for 128-bit STS CP key */ +typedef struct +{ + uint32_t key0; + uint32_t key1; + uint32_t key2; + uint32_t key3; +#ifndef WIN32 +} __attribute__((packed)) dwt_sts_cp_key_t; +#else +} dwt_sts_cp_key_t; +#endif // WIN32 + +/* storage for 128-bit STS CP IV (nonce) */ +typedef struct +{ + uint32_t iv0; + uint32_t iv1; + uint32_t iv2; + uint32_t iv3; +#ifndef WIN32 +} __attribute__((packed)) dwt_sts_cp_iv_t; +#else +} dwt_sts_cp_iv_t; +#endif // WIN32 + +#define ERROR_DATA_SIZE (-1) +#define ERROR_WRONG_MODE (-2) +#define ERROR_WRONG_MIC_SIZE (-3) +#define ERROR_PAYLOAD_SIZE (-4) +#define MIC_ERROR (0xff) +#define STS_LEN_128BIT (16) + +typedef enum +{ + DBL_BUF_STATE_EN = 0, /*Double buffer enabled*/ + DBL_BUF_STATE_DIS /*Double buffer disabled*/ +} dwt_dbl_buff_state_e; + +typedef enum +{ + DBL_BUF_MODE_AUTO = 0, /*Automatic*/ + DBL_BUF_MODE_MAN /*Manual*/ +} dwt_dbl_buff_mode_e; + +typedef enum +{ + DBL_BUFF_OFF = 0x0, + DBL_BUFF_ACCESS_BUFFER_0 = 0x1, + DBL_BUFF_ACCESS_BUFFER_1 = 0x3, +} dwt_dbl_buff_conf_e; + +// DW3000 NLOS DIAGNOSTIC TYPE +typedef enum +{ + IPATOV = 0x0, // Select Ipatov Diagnostic + STS1 = 0x1, // Select STS1 Diagnostic + STS2 = 0x2, // Select STS2 Diagnostic +} dwt_diag_type_e; + +// NLOS structs +typedef struct +{ + uint32_t accumCount; // the number of preamble symbols + // accumulated, or accumulated STS + // length. + uint32_t F1; // the First Path Amplitude (point 1) + // magnitude value. + uint32_t F2; // the First Path Amplitude (point 2) + // magnitude value. + uint32_t F3; // the First Path Amplitude (point 3) + // magnitude value. + uint32_t cir_power; // the Channel Impulse Response Power + // value. + uint8_t D; // the DGC_DECISION, treated as an + // unsigned integer in range 0 to 7. + dwt_diag_type_e diag_type; + uint8_t result; +} dwt_nlos_alldiag_t; + +typedef struct +{ + uint32_t index_fp_u32; // the First Path Index. + uint32_t index_pp_u32; // the Peak Path Index +} dwt_nlos_ipdiag_t; + +/* + * The default XTAL TRIM value for load capacitors of 2pF. + * During the initialization the XTAL TRIM value can be read from the OTP and in + * case it is not present, the default would be used instead + * */ +#define DEFAULT_XTAL_TRIM 0x2E + +/* + * Max allowed value for XTAL trim + * */ +#define XTAL_TRIM_BIT_MASK 0x3F + +/* + * Antenna configuration + */ +#define ANT_GPIO6_POS_MASK 0x1U +#define ANT_GPIO6_POS_OFFSET (0U) +#define ANT_GPIO6_VAL_MASK 0x2U +#define ANT_GPIO6_VAL_OFFSET (1U) +#define ANT_GPIO7_POS_MASK 0x4U +#define ANT_GPIO7_POS_OFFSET (2U) +#define ANT_GPIO7_VAL_MASK 0x8U +#define ANT_GPIO7_VAL_OFFSET (3U) + +/* + * DW37xx - enable/disable equaliser in the CIA + */ +typedef enum +{ + DWT_EQ_DISABLED = 0x0, + DWT_EQ_ENABLED = 0x1, +} dwt_eq_config_e; + +/* + * Debug register name/value structure + */ +typedef struct { + char *name; + uint32_t address; +} register_name_add_t; + +/*! + * --------------------------------------------------------------------------- + * @brief The dwt_probe_s structure is a structure assembling all the external + * structures and function + * that must be defined externally + * NB: In porting this to a particular microprocessor, the implementer needs to + * define the low + * level abstract functions matching the selected hardware. + */ +struct dwt_probe_s +{ + /*! + * ------------------------------------------------------------------------- + * @brief dw pointer to an externally defined dwchip_s. + * if set to NULL then an internal structure will be used + * the typical use case is to support multiple DW chip connection on the same + * board + * NB: see dwchip_s structure definition for details in deca_interface.h + */ + void *dw; + + /*! + * ------------------------------------------------------------------------- + * @brief dw pointer to an externally defined dwt_spi_s structure + * NB: see dwt_spi_s structure definition for details in deca_interface.h + */ + void *spi; + + /*! + * ------------------------------------------------------------------------- + * @brief This function wakeup device by an IO pin. DW3000 SPI_CS or WAKEUP + * pins can be used for this. + * wakeup_device_with_io() which is external to this file and is + * platform dependant and it should be modified to + * toggle the correct pin depending on the HW/MCU connections with + * DW3000. + */ + void(*wakeup_device_with_io)(void); +}; + +/******************************************************************************/ + +/* API LIST + * */ + +/******************************************************************************/ + +/*! + * --------------------------------------------------------------------------- + * @brief This function selects the correct DecaDriver from the list + * + * input parameters + * @param probe_interf pointer to a dwt_probe_s structure. See above description + * + * output parameters + * + * returns ret - DWT_ERROR if no driver found or DWT_SUCCESS if driver is + * found. + */ +int dwt_probe(struct dwt_probe_s *probe_interf); + +/*! + * --------------------------------------------------------------------------- + * @brief This function returns the version of the API + * + * input parameters + * + * output parameters + * + * returns version (DW3xxx_DRIVER_VERSION) + */ +int32_t dwt_apiversion(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will update dw pointer used by interrupt + * + * input parameters + * @param new_dw - dw instatiated by MCPS layer + * + * return parameters + * old_dw pointer. This pointer can be restored when deleting MCPS instance + * + */ +struct dwchip_s * dwt_update_dw(struct dwchip_s *new_dw); + +/*! + * --------------------------------------------------------------------------- + * @brief This function returns the driver version of the API + * + * input parameters + * + * output parameters + * + * returns version string + */ +char *dwt_version_string(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function sets the local data structure pointer to point to the + * element in the local array as given by the index. + * + * input parameters + * @param index - selects the array element to point to. Must be within the + * array bounds, i.e. < DWT_NUM_DW_DEV + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_setlocaldataptr(unsigned int index); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read V measured @ 3.0 V value recorded in + * OTP address 0x8 (VBAT_ADDRESS) + * + * NOTE: dwt_initialise() must be called prior to this function so that it can + * return a relevant value. + * + * input parameters + * + * output parameters + * + * returns the 8 bit V bat value as programmed in the factory + */ +uint8_t dwt_geticrefvolt(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read T measured @ 22 C value recorded in + * OTP address 0x9 (VTEMP_ADDRESS) + * + * NOTE: dwt_initialise() must be called prior to this function so that it can + * return a relevant value. + * + * input parameters + * + * output parameters + * + * returns the 8 bit V temp value as programmed in the factory + */ +uint8_t dwt_geticreftemp(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read part ID of the device + * + * NOTE: dwt_initialise() must be called prior to this function so that it can + * return a relevant value. + * + * input parameters + * + * output parameters + * + * returns the 32 bit part ID value as programmed in the factory + */ +uint32_t dwt_getpartid(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read lot ID of the device + * + * NOTE: dwt_initialise() must be called prior to this function so that it can + * return a relevant value. + * + * input parameters + * + * output parameters + * + * returns the 32 bit lot ID value as programmed in the factory + */ +uint32_t dwt_getlotid(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read device type and revision information + * of the DW UWB chip + * + * input parameters + * + * output parameters + * + * returns the silicon DevID + */ +uint32_t dwt_readdevid(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return the read OTP revision + * + * NOTE: dwt_initialise() must be called prior to this function so that it can + * return a relevant value. + * + * input parameters + * + * output parameters + * + * returns the read OTP revision value + */ +uint8_t dwt_otprevision(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables/disables the fine grain TX sequencing (enabled + * by default). + * + * input parameters + * @param enable - 1 to enable fine grain TX sequencing, 0 to disable it. + * + * output parameters none + * + * no return value + */ +void dwt_setfinegraintxseq(int enable); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to enable GPIO for external LNA or PA functionality - HW + * dependent, consult the DW3000 User Manual. + * This can also be used for debug as enabling TX and RX GPIOs is quite + * handy to monitor DW3000's activity. + * + * NOTE: Enabling PA functionality requires that fine grain TX sequencing is + * deactivated. This can be done using + * dwt_setfinegraintxseq(). + * + * input parameters + * @param lna_pa - bit field: bit 0 if set will enable LNA functionality, + * : bit 1 if set will enable PA functionality, + * : to disable LNA/PA set the bits to 0 ( + * output parameters + * + * no return value + */ +void dwt_setlnapamode(int lna_pa); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to configure GPIO function + * + * + * input parameters + * @param gpio_mask - the mask of the GPIOs to change the mode of. Typically + * built from dwt_gpio_mask_e values. + * @param gpio_modes - the GPIO modes to set. Typically built from + * dwt_gpio_pin_e values. + * + * output parameters + * + * no return value + */ +void dwt_setgpiomode(uint32_t gpio_mask, uint32_t gpio_modes); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to configure the GPIOs as inputs or outputs, default is + * input == 1 + * + * input parameters + * @param in_out - if corresponding GPIO bit is set to 1 then it is input, + * otherwise it is output + * - GPIO 0 = bit 0, GPIO 1 = bit 1 etc... + * + * output parameters + * + * no return value + */ +void dwt_setgpiodir(uint16_t in_out); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to set output value on GPIOs that have been configured + * for output via dwt_setgpiodir() API + * + * input parameters + * @param gpio - should be one or multiple of dwt_gpio_mask_e values + * @param value - Logic value for GPIO or GPIOs if multiple set at same time. + * + * output parameters + * + * no return value + */ +void dwt_setgpiovalue(uint16_t gpio, int value); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the raw value of the GPIO pins. + * It is presumed that functions such as dwt_setgpiomode(), + * dwt_setgpiovalue() and dwt_setgpiodir() are called before this function. + * + * input parameters + * + * returns a uint16_t value that holds the value read on the GPIO pins. + */ +uint16_t dwt_readgpiovalue(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function initialises the DW3xxx transceiver: + * It performs the initially required device configurations and initializes + * a static data belonging to the low-level driver. + * + * NOTES: + * 1.this function needs to be run before dwt_configuresleep, also the SPI + * frequency has to be < 7MHz + * 2.it also reads and applies LDO and BIAS tune and crystal trim values from + * OTP memory + * 3.it is assumed this function is called after a reset or on power up of the + * DW3xxx transceiver + * + * input parameters + * @param mode - mask which defines which OTP values to read. + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_initialise(int mode); + +/*! + * --------------------------------------------------------------------------- + * @brief This function can place DW3000 into IDLE/IDLE_PLL or IDLE_RC mode when + * it is not actively in TX or RX. + * + * input parameters + * @param state - DWT_DW_IDLE (1) to put DW3000 into IDLE/IDLE_PLL state; + * DWT_DW_INIT (0) to put DW3000 into INIT_RC state; + * DWT_DE_IDLE_RC (2) to put DW3000 into IDLE_RC state. + * + * output parameters none + * + * no return value + */ +void dwt_setdwstate(int state); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to enable GPIO clocks. The clocks are needed to ensure + * correct GPIO operation + * + * input parameters + * + * output parameters + * + * no return value + */ +void dwt_enablegpioclocks(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function needs to be called after device is woken up from + * DEEPSLEEP/SLEEP state, to restore the + * configuration which has not been automatically restored from AON + * + * input parameters + * + * return DWT_SUCCESS + * + */ +void dwt_restoreconfig(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures STS mode: e.g. DWT_STS_MODE_OFF, + * DWT_STS_MODE_1 etc + * The dwt_configure should be called prior to this to configure other + * parameters + * + * input parameters + * @param stsMode - e.g. DWT_STS_MODE_OFF, DWT_STS_MODE_1 etc. + * + * return DWT_SUCCESS + * + */ +void dwt_configurestsmode(uint8_t stsMode); + +/*! + * --------------------------------------------------------------------------- + * @brief This function provides the main API for the configuration of the + * DW3000 and this low-level driver. The input is a pointer to the data + * structure + * of type dwt_config_t that holds all the configurable items. + * The dwt_config_t structure shows which ones are supported + * + * input parameters + * @param config - pointer to the configuration structure, which contains + * the device configuration data. + * + * output parameters + * + * return DWT_SUCCESS or DWT_ERROR (e.g. when PLL CAL fails / PLL fails to lock) + */ +int dwt_configure(dwt_config_t *config); + +/*! + * --------------------------------------------------------------------------- + * @brief This function provides the API for the configuration of the TX + * spectrum + * including the power and pulse generator delay. The input is a pointer to the + * data structure + * of type dwt_txconfig_t that holds all the configurable items. + * + * input parameters + * @param config - pointer to the txrf configuration structure, which + * contains the tx rf config data + * + * output parameters + * + * no return value + */ +void dwt_configuretxrf(dwt_txconfig_t *config); + +/*! + * --------------------------------------------------------------------------- + * @brief This function re-loads the STS AES initial value + * + * input parameters + * + * output parameters + * + * no return value + */ +void dwt_configurestsloadiv(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function sets the default values of the lookup tables depending + * on the channel selected. + * + * input parameters + * @param[in] channel - Channel that the device will be transmitting/receiving + * on. + * + * no return value + */ +void dwt_configmrxlut(int channel); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures the STS AES 128 bit key value. + * the default value is [31:00]c9a375fa, + * [63:32]8df43a20, + * [95:64]b5e5a4ed, + * [127:96]0738123b + * + * input parameters + * @param pStsKey - the pointer to the structure of dwt_sts_cp_key_t type, which + * holds the AES128 key value to generate STS + * + * output parameters + * + * no return value + */ +void dwt_configurestskey(dwt_sts_cp_key_t *pStsKey); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures the STS AES 128 bit initial value, the + * default value is 1, i.e. DW3000 reset value is 1. + * + * input parameters + * @param pStsIv - the pointer to the structure of dwt_sts_cp_iv_t type, which + * holds the IV value to generate STS + * + * output parameters + * + * no return value + */ +void dwt_configurestsiv(dwt_sts_cp_iv_t *pStsIv); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function writes the antenna delay (in time units) to RX + * registers + * + * input parameters: + * @param rxDelay - this is the total (RX) antenna delay value, which + * will be programmed into the RX register + * + * output parameters + * + * no return value + */ +void dwt_setrxantennadelay(uint16_t antennaDly); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function reads the antenna delay (in time units) from the RX + * antenna delay register + * + * input parameters: + * @param dw - DW3xxx chip descriptor handler. + * + * output parameters + * + * returns 16-bit RX antenna delay value which is currently programmed in + * CIA_CONF_ID register + */ +uint16_t dwt_getrxantennadelay(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function writes the antenna delay (in time units) to TX + * registers + * + * input parameters: + * @param txDelay - this is the total (TX) antenna delay value, which + * will be programmed into the TX delay register + * + * output parameters + * + * no return value + */ +void dwt_settxantennadelay(uint16_t antennaDly); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function reads the antenna delay (in time units) from the TX + * antenna delay register + * + * input parameters: + * @param dw - DW3xxx chip descriptor handler. + * + * output parameters + * + * returns 16-bit TX antenna delay value which is currently programmed in + * TX_ANTD_ID register + */ +uint16_t dwt_gettxantennadelay(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function writes the supplied TX data into the DW3000's + * TX buffer. The input parameters are the data length in bytes and a pointer + * to those data bytes. + * + * input parameters + * @param txDataLength - This is the total length of data (in bytes) to write + * to the tx buffer. + * Note: the size of tx buffer is 1024 bytes. + * The standard PHR mode allows to transmit frames of up + * to 127 bytes (including 2 byte CRC) + * The extended PHR mode allows to transmit frames of up + * to 1023 bytes (including 2 byte CRC) + * if > 127 is programmed, DWT_PHRMODE_EXT needs to be + * set in the phrMode configuration + * see dwt_configure function + * @param txDataBytes - Pointer to the user's buffer containing the data to + * send. + * @param txBufferOffset - This specifies an offset in the DW IC's TX Buffer at + * which to start writing data. + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_writetxdata(uint16_t txDataLength, + uint8_t *txDataBytes, + uint16_t txBufferOffset); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function configures the TX frame control register before the + * transmission of a frame + * + * input parameters: + * @param txFrameLength - this is the length of TX message (including the 2 byte + * CRC) - max is 1023 + * NOTE: standard PHR mode allows up to 127 bytes + * if > 127 is programmed, DWT_PHRMODE_EXT needs to + * be set in the phrMode configuration + * see dwt_configure function + * @param txBufferOffset - the offset in the tx buffer to start writing the data + * @param ranging - 1 if this is a ranging frame, else 0 + * + * output parameters + * + * no return value + */ +void dwt_writetxfctrl(uint16_t txFrameLength, + uint16_t txBufferOffset, + uint8_t ranging); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function is used to configure frame preamble length, the + * frame premable length can be + * configured in steps of 8, from 16 to 2048 symbols. If a non-zero value is + * configured, then the TXPSR_PE setting is ignored. + * + * input parameters: + * @param preambleLength - sets the length of the preamble, value of 0 disables + * this setting and the length of the + * frame will be dependent on the TXPSR_PE setting as + * configured by dwt_configure function + * + * output parameters + * + * no return value + */ +void dwt_setplenfine(uint8_t preambleLength); + +/*! + * --------------------------------------------------------------------------- + * @brief This call initiates the transmission, input parameter indicates which + * TX mode is used see below + * + * input parameters: + * @param mode - if mode = DWT_START_TX_IMMEDIATE - immediate TX (no response + * expected) + * if mode = DWT_START_TX_DELAYED - delayed TX (no response + * expected) at specified time (time in DX_TIME register) + * if mode = DWT_START_TX_DLY_REF - delayed TX (no response + * expected) at specified time + * (time in DREF_TIME register + * + any time in DX_TIME register) + * if mode = DWT_START_TX_DLY_RS - delayed TX (no response + * expected) at specified time + * (time in RX_TIME_0 register + * + any time in DX_TIME register) + * if mode = DWT_START_TX_DLY_TS - delayed TX (no response + * expected) at specified time + * (time in TX_TIME_LO register + * + any time in DX_TIME register) + * if mode = DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED - + * immediate TX (response expected, + * so + * the receiver will be automatically + * + * + * turned + * on after TX is done) + * if mode = DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED - + * delayed TX (response expected, + * so the + * receiver will be automatically + * turned + * on after TX is done) + * if mode = DWT_START_TX_CCA - Send the frame if no + * preamble detected within PTO time + * if mode = DWT_START_TX_CCA | DWT_RESPONSE_EXPECTED - Send the + * frame if no preamble detected + * within + * PTO time and then enable RX output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed + * transmission will be cancelled if the delayed time has passed) + */ +int dwt_starttx(uint8_t mode); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function configures the reference time used for relative + * timing of delayed sending and reception. + * The value is at a 8ns resolution. + * + * input parameters + * @param reftime - the reference time (which together with DX_TIME or TX + * timestamp or RX timestamp time is used to define a + * transmission time or delayed RX on time) + * + * output parameters none + * + * no return value + */ +void dwt_setreferencetrxtime(uint32_t reftime); + +/*! + * --------------------------------------------------------------------------- + * @brief This API function configures the delayed transmit time or the delayed + * RX on time + * + * input parameters + * @param starttime - the TX/RX start time (the 32 bits should be the high 32 + * bits of the system time at which to send the message, + * or at which to turn on the receiver) + * + * output parameters none + * + * no return value + */ +void dwt_setdelayedtrxtime(uint32_t starttime); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the DGC_DECISION index when RX_TUNING is enabled, + * this value is used to adjust the + * RX level and FP level estimation + * + * input parameters + * + * output parameters - the index value to be used in RX level and FP level + * formulas + * + * no return value + */ +uint8_t dwt_get_dgcdecision(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the TX timestamp (adjusted with the programmed + * antenna delay) + * + * input parameters + * @param timestamp - a pointer to a 5-byte buffer which will store the read TX + * timestamp time + * + * output parameters - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readtxtimestamp(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the high 32-bits of the TX timestamp (adjusted + * with the programmed antenna delay) + * + * input parameters + * + * output parameters + * + * returns high 32-bits of TX timestamp + */ +uint32_t dwt_readtxtimestamphi32(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the low 32-bits of the TX timestamp (adjusted + * with the programmed antenna delay) + * + * input parameters + * + * output parameters + * + * returns low 32-bits of TX timestamp + */ +uint32_t dwt_readtxtimestamplo32(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the PDOA result, it is the phase difference + * between either the Ipatov and STS POA, or + * the two STS POAs, depending on the PDOA mode of operation. (POA - Phase Of + * Arrival) + * + * NOTE: To convert to degrees: float pdoa_deg = ((float)pdoa / (1 << 11)) * 180 + * / M_PI + * + * input parameters + * + * output parameters - the PDOA result (signed in [1:-11] radian units) + * + * no return value + */ +int16_t dwt_readpdoa(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function is used to read the TDOA (Time Difference On Arrival). + * The TDOA value that is read from the + * register is 41-bits in length. However, 6 bytes (or 48 bits) are read from + * the register. The remaining 7 bits at + * the 'top' of the 6 bytes that are not part of the TDOA value should be set to + * zero and should not interfere with + * rest of the 41-bit value. However, there is no harm in masking the returned + * value. + * + * input parameters + * + * output parameters + * @param tdoa: time difference on arrival - buffer of 6 bytes that will be + * filled with TDOA value by calling this function + * + * no return value + */ +void dwt_readtdoa(uint8_t *tdoa); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the RX timestamp (adjusted time of arrival) + * + * input parameters + * @param timestamp - a pointer to a 5-byte buffer which will store the read RX + * timestamp time + * + * output parameters - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readrxtimestamp(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the RX timestamp (unadjusted time of arrival) + * + * input parameters + * @param timestamp - a pointer to a 5-byte buffer which will store the read RX + * timestamp time + * + * output parameters - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readrxtimestampunadj(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the RX timestamp (adjusted time of arrival) + * w.r.t. Ipatov CIR + * + * input parameters + * @param timestamp - a pointer to a 5-byte buffer which will store the read RX + * timestamp time + * + * output parameters - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readrxtimestamp_ipatov(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the RX timestamp (adjusted time of arrival) + * w.r.t. STS CIR + * + * input parameters + * @param timestamp - a pointer to a 5-byte buffer which will store the read RX + * timestamp time + * + * output parameters - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readrxtimestamp_sts(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the high 32-bits of the RX timestamp (adjusted + * with the programmed antenna delay) + * + * NOTE: This should not be used when RX double buffer mode is enabled. + * Following APIs to read RX timestamp should be + * used: dwt_readrxtimestamp_ipatov or dwt_readrxtimestamp_sts or + * dwt_readrxtimestamp + * + * input parameters + * + * output parameters + * + * returns high 32-bits of RX timestamp + */ +uint32_t dwt_readrxtimestamphi32(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the low 32-bits of the RX timestamp (adjusted + * with the programmed antenna delay) + * + * NOTE: This should not be used when RX double buffer mode is enabled. + * Following APIs to read RX timestamp should be + * used: dwt_readrxtimestamp_ipatov or dwt_readrxtimestamp_sts or + * dwt_readrxtimestamp + * + * input parameters + * + * output parameters + * + * returns low 32-bits of RX timestamp + */ +uint32_t dwt_readrxtimestamplo32(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the high 32-bits of the system time + * + * input parameters + * + * output parameters + * + * returns high 32-bits of system time timestamp + */ +uint32_t dwt_readsystimestamphi32(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the system time + * + * input parameters + * @param timestamp - a pointer to a 4-byte buffer which will store the read + * system time + * + * output parameters + * @param timestamp - the timestamp buffer will contain the value after the + * function call + * + * no return value + */ +void dwt_readsystime(uint8_t *timestamp); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to turn off the transceiver + * + * input parameters + * + * output parameters + * + * no return value + */ +void dwt_forcetrxoff(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This call turns on the receiver, can be immediate or delayed + * (depending on the mode parameter). In the case of a + * "late" error the receiver will only be turned on if the DWT_IDLE_ON_DLY_ERR + * is not set. + * The receiver will stay turned on, listening to any messages until + * it either receives a good frame, an error (CRC, PHY header, Reed Solomon) or + * it times out (SFD, Preamble or Frame). + * + * input parameters + * @param mode - this can be one of the following allowed values: + * + * DWT_START_RX_IMMEDIATE 0x00 Enable the receiver immediately + * DWT_START_RX_DELAYED 0x01 Set up delayed RX, if "late" error + * triggers, then the RX will be enabled immediately + * DWT_IDLE_ON_DLY_ERR 0x02 If delayed RX failed due to "late" error + * then if this + * flag is set the RX will not be re-enabled + * immediately, and device will be in IDLE when function exits + * DWT_START_RX_DLY_REF 0x04 Enable the receiver at specified time + * (time in DREF_TIME register + any time in DX_TIME register) + * DWT_START_RX_DLY_RS 0x08 Enable the receiver at specified time + * (time in RX_TIME_0 register + any time in DX_TIME register) + * DWT_START_RX_DLY_TS 0x10 Enable the receiver at specified time + * (time in TX_TIME_LO register + any time in DX_TIME register) + * + * e.g. + * (DWT_START_RX_DELAYED | DWT_IDLE_ON_DLY_ERR) 0x03 used to disable re-enabling + * of receiver if delayed RX failed due to "late" error + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error (e.g. a delayed + * receive enable will be too far in the future if delayed time has passed) + */ +int dwt_rxenable(int mode); + +/*! + * --------------------------------------------------------------------------- + * @brief enable/disable and configure SNIFF mode. + * + * SNIFF mode is a low-power reception mode where the receiver is sequenced on + * and off instead of being on all the time. + * The time spent in each state (on/off) is specified through the parameters + * below. + * See DW3000 User Manual section 4.5 "Low-Power SNIFF mode" for more details. + * + * input parameters: + * @param enable - 1 to enable SNIFF mode, 0 to disable. When 0, all other + * parameters are not taken into account. + * @param timeOn - duration of receiver ON phase, expressed in multiples of PAC + * size. The counter automatically adds 1 PAC + * size to the value set. Min value that can be set is 1 (i.e. + * an ON time of 2 PAC size), max value is 15. + * @param timeOff - duration of receiver OFF phase, expressed in multiples of + * 128/125 us (~1 us). Max value is 255. + * + * output parameters + * + * no return value + */ +void dwt_setsniffmode(int enable, uint8_t timeOn, uint8_t timeOff); + +/*! + * --------------------------------------------------------------------------- + * @brief This call enables the double receive buffer mode + * + * input parameters + * @param dbl_buff_state - enum variable for enabling/disabling double buffering + * mode + * @param dbl_buff_mode - enum variable for Receiver Auto-Re-enable + * + * output parameters + * + * no return value + */ +void dwt_setdblrxbuffmode(dwt_dbl_buff_state_e dbl_buff_state, + dwt_dbl_buff_mode_e dbl_buff_mode); + +/*! + * --------------------------------------------------------------------------- + * @brief This call signal to the chip that the specific RX buff is free for + * fill + * + * input parameters + * @param None + * + * output parameters + * + * no return value + */ +void dwt_signal_rx_buff_free(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This call enables RX timeout (SY_STAT_RFTO event) + * + * input parameters + * @param time - how long the receiver remains on from the RX enable command + * The time parameter used here is in 1.0256 us (512/499.2MHz) + * units + * If set to 0 the timeout is disabled. + * + * output parameters + * + * no return value + */ +void dwt_setrxtimeout(uint32_t time); + +/*! + * --------------------------------------------------------------------------- + * @brief This call enables preamble timeout (SY_STAT_RXPTO event) + * + * input parameters + * @param timeout - Preamble detection timeout, expressed in multiples of PAC + * size. The counter automatically adds 1 PAC + * size to the value set. Min value that can be set is 1 (i.e. + * a timeout of 2 PAC size). + * + * output parameters + * + * no return value + */ +void dwt_setpreambledetecttimeout(uint16_t timeout); + +/*! + * --------------------------------------------------------------------------- + * @brief calibrates the local oscillator as its frequency can vary between 15 + * and 34kHz depending on temp and voltage + * + * NOTE: this function needs to be run before dwt_configuresleepcnt, so that we + * know what the counter units are + * + * input parameters + * + * output parameters + * + * returns the number of XTAL cycles per low-power oscillator cycle. LP OSC + * frequency = 38.4 MHz/return value + */ +uint16_t dwt_calibratesleepcnt(void); + +/*! + * --------------------------------------------------------------------------- + * @brief sets the sleep counter to new value, this function programs the high + * 16-bits of the 28-bit counter + * + * NOTE: this function needs to be run before dwt_configuresleep, also the SPI + * frequency has to be < 3MHz + * + * input parameters + * @param sleepcnt - this it value of the sleep counter to program + * + * output parameters + * + * no return value + */ +void dwt_configuresleepcnt(uint16_t sleepcnt); + +/*! + * --------------------------------------------------------------------------- + * @brief configures the device for both DEEP_SLEEP and SLEEP modes, and on-wake + * mode + * i.e. before entering the sleep, the device should be programmed for TX or RX, + * then upon "waking up" the TX/RX settings + * will be preserved and the device can immediately perform the desired action + * TX/RX + * + * NOTE: e.g. Tag operation - after deep sleep, the device needs to just load + * the TX buffer and send the frame + * + * + * mode: + * DWT_PGFCAL 0x0800 - Re-enable receiver on wake-up. !!!! on DW3720 + * - this should be cleared + * DWT_GOTORX 0x0200 + * DWT_GOTOIDLE 0x0100 + * DWT_SEL_OPS 0x0040 | 0x0080 + * DWT_LOADOPS 0x0020 + * DWT_LOADLDO 0x0010 + * DWT_LOADDGC 0x0008 + * DWT_LOADBIAS 0x0004 + * DWT_RUNSAR 0x0002 + * DWT_CONFIG 0x0001 - download the AON array into the HIF + * (configuration download) + * + * wake: wake up parameters + * DWT_SLP_CNT_RPT 0x40 - sleep counter loop after expiration + * DWT_PRESRVE_SLP 0x20 - allows for SLEEP_EN bit to be "preserved", + * although it will self-clear on wake up + * DWT_WAKE_WK 0x10 - wake up on WAKEUP PIN + * DWT_WAKE_CS 0x8 - wake up on chip select + * DWT_BR_DET 0x4 - enable brownout detector during sleep/deep sleep + * DWT_SLEEP 0x2 - enable sleep + * DWT_SLP_EN 0x1 - enable sleep/deep sleep functionality + * + * input parameters + * @param mode - config on-wake parameters + * @param wake - config wake up parameters + * + * output parameters + * + * no return value + */ +void dwt_configuresleep(uint16_t mode, uint8_t wake); + +/*! + * --------------------------------------------------------------------------- + * + * @brief this function clears the AON configuration in DW3000 + * + * input parameters: + * + * output parameters + * + * no return value + */ +void dwt_clearaonconfig(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function puts the device into deep sleep or sleep. + * dwt_configuresleep() should be called first + * to configure the sleep and on-wake/wake-up parameters. + * + * input parameters + * @param idle_rc - if this is set to DWT_DW_IDLE_RC, the auto INIT2IDLE bit + * will be cleared prior to going to sleep + * thus after wakeup device will stay in IDLE_RC state + * + * output parameters + * + * no return value + */ +void dwt_entersleep(int idle_rc); + +/*! + * --------------------------------------------------------------------------- + * @brief sets or clears the auto TX to sleep bit. This means that after a frame + * transmission the device will enter sleep or deep sleep mode. The + * dwt_configuresleep() function + * needs to be called before this to configure the on-wake settings + * + * NOTE: the IRQ line has to be low/inactive (i.e. no pending events) + * + * Deprecated, might be removed in a future mayor release. Consider using the + * dwt_entersleepafter() function instead. + * + * input parameters + * @param enable - 1 to configure the device to enter sleep or deep sleep after + * TX, 0 - disables the configuration + * + * no return value + */ +void dwt_entersleepaftertx(int enable); + +/*! + * --------------------------------------------------------------------------- + * @brief Sets or clears the auto TX and/or RX to sleep bits. + * + * This makes the device automatically enter deep sleep or sleep mode after a + * frame transmission and/or reception. + * dwt_configuresleep() needs to be called before this to configure the sleep + * and on-wake/wake-up parameters. + * + * NOTE: the IRQ line has to be low/inactive (i.e. no pending events) + * + * input parameters + * @param event_mask: bitmask to go to sleep after: + * - DWT_TX_COMPLETE to configure the device to enter sleep or deep sleep after + * TX + * - DWT_RX_COMPLETE to configure the device to enter sleep or deep sleep after + * RX + * + * output parameters + * + * no return value + */ +void dwt_entersleepafter(int event_mask); + +#ifdef WIN32 + +/*! + * --------------------------------------------------------------------------- + * @fn dwt_spicswakeup() --------- ********** NOTE: in decatest only + * **************** + * + * @brief wake up the device from sleep mode using the SPI read, + * the device will wake up on chip select line going low if the line is held low + * for at least 500us. + * To define the length depending on the time one wants to hold + * the chip select line low, use the following formula: + * + * length (bytes) = time (s) * byte_rate (Hz) + * + * where fastest byte_rate is spi_rate (Hz) / 8 if the SPI is sending the bytes + * back-to-back. + * To save time and power, a system designer could determine byte_rate value + * more precisely. + * + * NOTE: Alternatively the device can be waken up with WAKE_UP pin if configured + * for that operation + * + * input parameters + * @param buff - this is a pointer to the dummy buffer which will be used in + * the SPI read transaction used for the WAKE UP of the device + * @param length - this is the length of the dummy buffer + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_spicswakeup(uint8_t *buff, uint16_t length); + +#endif + +/*! + * --------------------------------------------------------------------------- + * @brief This function is used to register the different callbacks called when + * one of the corresponding event occurs. + * + * NOTE: Callbacks can be undefined (set to NULL). In this case, dwt_isr() will + * process the event as usual but the 'null' + * callback will not be called. + * + * input parameters + * @param cbTxDone - the pointer to the TX confirmation event callback function + * @param cbRxOk - the pointer to the RX good frame event callback function + * @param cbRxTo - the pointer to the RX timeout events callback function + * @param cbRxErr - the pointer to the RX error events callback function + * @param cbSPIErr - the pointer to the SPI error events callback function + * @param cbSPIRdy - the pointer to the SPI ready events callback function + * @param cbDualSPIEv - the pointer to the Dual SPI events callback function + * (SPI1 Avail, SPI2 Avail) + * + * output parameters + * + * no return value + */ +void dwt_setcallbacks(dwt_cb_t cbTxDone, + dwt_cb_t cbRxOk, + dwt_cb_t cbRxTo, + dwt_cb_t cbRxErr, + dwt_cb_t cbSPIErr, + dwt_cb_t cbSPIRdy, + dwt_cb_t cbDualSPIEv); + +/*! + * --------------------------------------------------------------------------- + * @brief This function checks if the IRQ line is active - this is used instead + * of interrupt handler + * + * input parameters + * + * output parameters + * + * return value is 1 if the IRQS bit is set and 0 otherwise + */ +uint8_t dwt_checkirq(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function checks if the DW3000 is in IDLE_RC state + * + * The DW3XXX states are described in the User Manual. On power up, or following + * a reset the device will progress from INIT_RC to IDLE_RC. + * Once the device is in IDLE_RC SPI rate ca be increased to more than 7 MHz. + * The device will automatically proceed from INIT_RC to IDLE_RC + * and both INIT_RC and SPI_RDY event flags will be set, once device is in + * IDLE_RC. + * + * It is recommended that host waits for SPI_RDY event, which will also generate + * interrupt once device is ready after reset/power on. + * If the host cannot use interrupt as a way to check device is ready for SPI + * comms, then we recommend the host waits for 2 ms and reads this function, + * which checks if the device is in IDLE_RC state by reading the SYS_STATUS + * register and checking for the IDLE_RC event to be set. + * If host initiates SPI transaction with the device prior to it being ready, + * the SPI transaction may be incorrectly decoded by the device and + * the device may be misconfigured. Reading registers over SPI prior to device + * being ready may return garbage on the MISO, which may confuse the host + * application. + * + * input parameters + * + * output parameters + * + * return value is 1 if the IDLE_RC bit is set and 0 otherwise + */ +uint8_t dwt_checkidlerc(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is the DW3000's general Interrupt Service Routine. It will + * process/report the following events: + * - RXFCG (through cbRxOk callback) + * - TXFRS (through cbTxDone callback) + * - RXRFTO/RXPTO (through cbRxTo callback) + * - RXPHE/RXFCE/RXRFSL/RXSFDTO/AFFREJ/LDEERR (through cbRxErr + * callback) + * For all events, corresponding interrupts are cleared and necessary + * resets are performed. In addition, in the RXFCG case, + * received frame information and frame control are read before calling + * the callback. If double buffering is activated, it + * will also toggle between reception buffers once the reception callback + * processing has ended. + * + * /!\ This version of the ISR supports double buffering but does not + * support automatic RX re-enabling! + * + * NOTE: In PC based system using (Cheetah or ARM) USB to SPI converter there + * can be no interrupts, however we still need something + * to take the place of it and operate in a polled way. In an embedded + * system this function should be configured to be triggered + * on any of the interrupts described above. + * + * input parameters + * + * output parameters + * + * no return value + */ +void dwt_isr(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables the specified events to trigger an interrupt. + * The following events can be found in SYS_ENABLE_LO and SYS_ENABLE_HI + * registers. + * + * + * input parameters: + * @param bitmask_lo - sets the events in SYS_ENABLE_LO_ID register which will + * generate interrupt + * @param bitmask_hi - sets the events in SYS_ENABLE_HI_ID register which will + * generate interrupt + * @param operation - if set to DWT_ENABLE_INT additional interrupts as + * selected in the bitmask are enabled + * - if set to DWT_ENABLE_INT_ONLY the interrupts in the + * bitmask are forced to selected state - + * i.e. the mask is written to the register directly. + * - otherwise (if set to DWT_DISABLE_INT) clear the + * interrupts as selected in the bitmask + * output parameters + * + * no return value + */ +void dwt_setinterrupt(uint32_t bitmask_lo, + uint32_t bitmask_hi, + dwt_INT_options_e INT_options); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to set the PAN ID + * + * input parameters + * @param panID - this is the PAN ID + * + * output parameters + * + * no return value + */ +void dwt_setpanid(uint16_t panID); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to set 16-bit (short) address + * + * input parameters + * @param shortAddress - this sets the 16 bit short address + * + * output parameters + * + * no return value + */ +void dwt_setaddress16(uint16_t shortAddress); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to set the EUI 64-bit (long) address + * + * input parameters + * @param eui64 - this is the pointer to a buffer that contains the 64bit + * address + * + * output parameters + * + * no return value + */ +void dwt_seteui(uint8_t *eui64); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to get the EUI 64-bit from the DW3000 + * + * input parameters + * @param eui64 - this is the pointer to a buffer that will contain the read + * 64-bit EUI value + * + * output parameters + * + * no return value + */ +void dwt_geteui(uint8_t *eui64); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read from AON memory + * + * input parameters + * @param aon_address - this is the address of the memory location to read + * + * output parameters - None + * + * returns 8-bits read from given AON memory address + */ +uint8_t dwt_aon_read(uint16_t aon_address); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to write to AON memory + * + * @param aon_address - this is the address of the memory location to write + * @param aon_write_data - this is the data to write + * + * output parameters - None + * + * no return value + * + */ +void dwt_aon_write(uint16_t aon_address, uint8_t aon_write_data); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to enable the frame filtering - (the default option is to + * accept any data and ACK frames with correct destination address + * + * input parameters + * @param enabletype (bitmask) - enables/disables the frame filtering and + * configures 802.15.4 type + * DWT_FF_ENABLE_802_15_4 0x2 // use 802.15.4 filtering + * rules + * DWT_FF_DISABLE 0x0 // disable FF + * @param filtermode (bitmask) - configures the frame filtering options + * according to + * DWT_FF_BEACON_EN 0x001 // beacon frames allowed + * DWT_FF_DATA_EN 0x002 // data frames allowed + * DWT_FF_ACK_EN 0x004 // ack frames allowed + * DWT_FF_MAC_EN 0x008 // mac control frames + * allowed + * DWT_FF_RSVD_EN 0x010 // reserved frame types + * allowed + * DWT_FF_MULTI_EN 0x020 // multipurpose frames + * allowed + * DWT_FF_FRAG_EN 0x040 // fragmented frame types + * allowed + * DWT_FF_EXTEND_EN 0x080 // extended frame types + * allowed + * DWT_FF_COORD_EN 0x100 // behave as coordinator + * (can receive frames with no dest address (PAN ID has to match)) + * DWT_FF_IMPBRCAST_EN 0x200 // allow MAC implicit + * broadcast + * + * output parameters + * + * no return value + */ +void dwt_configureframefilter(uint16_t enabletype, uint16_t filtermode); + +/*! + * --------------------------------------------------------------------------- + * @brief this function is used to calculate 8-bit CRC, it uses 100000111 + * polynomial (i.e. P(x) = x^8+ x^2+ x^1+ x^0) + * + * input parameters: + * @param byteArray - data to calculate CRC for + * @param flen - length of byteArray + * @param crcInit - initialisation value for CRC calculation + * + * output parameters + * + * returns 8-bit calculate CRC value + */ +uint8_t dwt_generatecrc8(const uint8_t *byteArray, int flen, uint8_t crcInit); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to enable SPI CRC check in DW3000 + * + * input parameters + * @param crc_mode - if set to DWT_SPI_CRC_MODE_WR then SPI CRC checking will be + * performed in DW3000 on each SPI write + * last byte of the SPI write transaction needs to be the + * 8-bit CRC, if it does not match + * the one calculated by DW3000 SPI CRC ERROR event will be + * set in the status register (SYS_STATUS_SPICRC) + * + * @param spireaderr_cb - this needs to contain the callback function pointer + * which will be called when SPI read error + * is detected (when the DW3000 generated CRC does not + * match the one calculated by dwt_generatecrc8 + * following the SPI read transaction) + * + * output parameters + * + * no return value + */ +void dwt_enablespicrccheck(dwt_spi_crc_mode_e crc_mode, + dwt_spierrcb_t spireaderr_cb); + +/*! + * --------------------------------------------------------------------------- + * @brief This call enables the auto-ACK feature. If the responseDelayTime + * (parameter) is 0, the ACK will be sent a.s.a.p. + * otherwise it will be sent with a programmed delay (in symbols), max is 255. + * NOTE: needs to have frame filtering enabled as well + * + * input parameters + * @param responseDelayTime - if non-zero the ACK is sent after this delay, max + * is 255. + * @param enable - enables or disables the auto-ACK feature + * + * output parameters + * + * no return value + */ +void dwt_enableautoack(uint8_t responseDelayTime, int enable); + +/*! + * --------------------------------------------------------------------------- + * @brief This sets the receiver turn on delay time after a transmission of a + * frame + * + * input parameters + * @param rxDelayTime - (20 bits) - the delay is in UWB microseconds + * + * output parameters + * + * no return value + */ +void dwt_setrxaftertxdelay(uint32_t rxDelayTime); + +/*! + * --------------------------------------------------------------------------- + * @brief this function resets the DW3000 + * + * NOTE: SPI rate must be <= 7MHz before a call to this function as the device + * will use FOSC/4 as part of internal reset + * + * input parameters: + * @param reset_semaphore - if set to 1 the semaphore will be also reset. (only + * valid for DW3720 device) + * + * output parameters + * + * no return value + */ +void dwt_softreset(int reset_semaphore); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the data from the RX buffer, from an offset + * location give by offset parameter + * + * input parameters + * @param buffer - the buffer into which the data will be read + * @param length - the length of data to read (in bytes) + * @param rxBufferOffset - the offset in the rx buffer from which to read the + * data + * + * output parameters + * + * no return value + */ +void dwt_readrxdata(uint8_t *buffer, uint16_t length, uint16_t rxBufferOffset); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to write the data from the RX scratch buffer, from an + * offset location given by offset parameter. + * + * input parameters + * @param buffer - the buffer which to write to the device + * @param length - the length of data to read (in bytes) + * @param bufferOffset - the offset in the scratch buffer to which to write the + * data + * + * output parameters + * + * no return value + */ +void dwt_write_rx_scratch_data(uint8_t *buffer, + uint16_t length, + uint16_t bufferOffset); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the data from the RX scratch buffer, from an + * offset location given by offset parameter. + * + * input parameters + * @param buffer - the buffer into which the data will be read + * @param length - the length of data to read (in bytes) + * @param bufferOffset - the offset in the scratch buffer from which to read the + * data + * + * output parameters + * + * no return value + */ +void dwt_read_rx_scratch_data(uint8_t *buffer, + uint16_t length, + uint16_t bufferOffset); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the 18 bit data from the Accumulator buffer, from + * an offset location give by offset parameter + * for 18 bit complex samples, each sample is 6 bytes (3 real and 3 + * imaginary) + * + * + * NOTE: Because of an internal memory access delay when reading the accumulator + * the first octet output is a dummy octet + * that should be discarded. This is true no matter what sub-index the + * read begins at. + * + * input parameters + * @param buffer - the buffer into which the data will be read + * @param length - the length of data to read (in bytes) + * @param accOffset - the offset in the acc buffer from which to read the data, + * this is a complex sample index + * e.g. to read 10 samples starting at sample 100 + * buffer would need to be >= 10*6 + 1, length is 61 (1 is + * for dummy), accOffset is 100 + * + * output parameters + * + * no return value + */ +void dwt_readaccdata(uint8_t *buffer, uint16_t len, uint16_t accOffset); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the crystal offset (relating to the frequency + * offset of the far DW3000 device compared to this one) + * Note: the returned signed 16-bit number shoudl be divided by 16 to get + * ppm offset. + * + * input parameters - NONE + * + * return value - the (int12) signed offset value. (s[6:-4]) + * A positive value means the local RX clock is running faster + * than the remote TX device. + */ +int16_t dwt_readclockoffset(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the RX carrier integrator value (relating to the + * frequency offset of the TX node) + * + * input parameters - NONE + * + * return value - the (int32_t) signed carrier integrator value. + * A positive value means the local RX clock is running faster + * than the remote TX device. + */ +int32_t dwt_readcarrierintegrator(void); + +/*! + * --------------------------------------------------------------------------- + * @brief this function enables CIA diagnostic data. When turned on the + * following registers will be logged: + * IP_TOA_LO, IP_TOA_HI, STS_TOA_LO, STS_TOA_HI, STS1_TOA_LO, STS1_TOA_HI, + * CIA_TDOA_0, CIA_TDOA_1_PDOA, CIA_DIAG_0, CIA_DIAG_1 + * + * input parameters + * @param enable_mask : DW_CIA_DIAG_LOG_MAX (0x8) //CIA to copy to + * swinging set a maximum set of diagnostic registers in Double Buffer mode + * DW_CIA_DIAG_LOG_MID (0x4) //CIA to copy to + * swinging set a medium set of diagnostic registers in Double Buffer mode + * DW_CIA_DIAG_LOG_MIN (0x2) //CIA to copy to + * swinging set a minimal set of diagnostic registers in Double Buffer mode + * DW_CIA_DIAG_LOG_ALL (0x1) //CIA to log all + * diagnostic registers + * DW_CIA_DIAG_LOG_OFF (0x0) //CIA to log reduced set + * of diagnostic registers + * + * output parameters + * + * no return value + */ +void dwt_configciadiag(uint8_t enable_mask); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the STS signal quality index + * + * input parameters + * @param rxStsQualityIndex - the (int16_t) signed STS quality index value. + * + * output parameters + * return value - >=0 for good and < 0 if bad STS quality. + * + * Note: For the 64 MHz PRF if value is >= 90% of the STS length then we can + * assume good STS reception. + * Otherwise the STS timestamp may not be accurate. + */ +int dwt_readstsquality(int16_t *rxStsQualityIndex); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the STS status + * + * input parameters + * @param stsstatus - the (uint8_t) STS status value. + * @param sts_num - 0 for 1st STS, 1 for 2nd STS (2nd only valid when PDOA + * Mode 3 is used) + * + * output parameters + * return value 0 for good/valid STS < 0 if bad STS quality. + */ +int dwt_readstsstatus(uint16_t *stsStatus, int sts_num); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the RX signal quality diagnostic data + * + * input parameters + * @param diagnostics - diagnostic structure pointer, this will contain the + * diagnostic data read from the DW3000 + * + * output parameters + * + * no return value + */ +void dwt_readdiagnostics(dwt_rxdiag_t *diagnostics); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to enable/disable the event counter in the IC + * + * input parameters + * @param - enable - 1 enables (and reset), 0 disables the event counters + * output parameters + * + * no return value + */ +void dwt_configeventcounters(int enable); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the event counters in the IC + * + * input parameters + * @param counters - pointer to the dwt_deviceentcnts_t structure which will + * hold the read data + * + * output parameters + * + * no return value + */ +void dwt_readeventcounters(dwt_deviceentcnts_t *counters); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the OTP data from given address into provided + * array + * + * input parameters + * @param address - this is the OTP address to read from + * @param array - this is the pointer to the array into which to read the data + * @param length - this is the number of 32 bit words to read (array needs to be + * at least this length) + * + * output parameters + * + * no return value + */ +void dwt_otpread(uint16_t address, uint32_t *array, uint8_t length); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to program 32-bit value into the DW3000 OTP memory. + * + * input parameters + * @param value - this is the 32-bit value to be programmed into OTP + * @param address - this is the 16-bit OTP address into which the 32-bit value + * is programmed + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_otpwriteandverify(uint32_t value, uint16_t address); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to program 32-bit value into the DW3700 OTP memory, it + * will not validate the word was written correctly + * + * input parameters + * @param value - this is the 32-bit value to be programmed into OTP + * @param address - this is the 16-bit OTP address into which the 32-bit value + * is programmed + * + * output parameters + * + * returns DWT_SUCCESS + */ +int dwt_otpwrite(uint32_t value, uint16_t address); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to set up Tx/Rx GPIOs which could be used to control LEDs + * Note: not completely IC dependent, also needs board with LEDS fitted on right + * I/O lines + * this function enables GPIOs 2 and 3 which are connected to LED3 and + * LED4 on EVB1000 + * + * input parameters + * @param mode - this is a bit field interpreted as follows: + * - bit 0: 1 to enable LEDs, 0 to disable them + * - bit 1: 1 to make LEDs blink once on init. Only valid if bit 0 is + * set (enable LEDs) + * - bit 2 to 7: reserved + * + * output parameters none + * + * no return value + */ +void dwt_setleds(uint8_t mode); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to adjust the crystal frequency + * + * input parameters: + * @param value - crystal trim value (in range 0x0 to 0x3F) 64 steps (~1.65ppm + * per step) + * + * output parameters + * + * no return value + */ +void dwt_setxtaltrim(uint8_t value); + +/*! + * --------------------------------------------------------------------------- + * @brief This function returns the value of XTAL trim that has been applied + * during initialisation (dwt_init). This can + * be either the value read in OTP memory or a default value. + * + * NOTE: The value returned by this function is the initial value only! It is + * not updated on dwt_setxtaltrim calls. + * + * input parameters + * + * output parameters + * + * returns the XTAL trim value set upon initialisation + */ +uint8_t dwt_getxtaltrim(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function disables repeated frames from being generated. + * + * input parameters: + * None + * + * output parameters: + * None + * + * No return value + */ +void dwt_stop_repeated_frames(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables repeated frames to be generated given a frame + * repetition rate. + * + * input parameters: + * @param framerepetitionrate - Value specifying the rate at which frames will + * be repeated. + * If the value is less than the frame duration, the + * frames are sent + * back-to-back. + * + * output parameters: + * None + * + * No return value + */ +void dwt_repeated_frames(uint32_t framerepetitionrate); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will enable a repeated continuous waveform on the device + * + * input parameters: + * @param cw_enable: CW mode enable + * @param cw_mode_config: CW configuration mode. + * + * output parameters: + * + */ +void dwt_repeated_cw(int cw_enable, int cw_mode_config); + +/*! + * --------------------------------------------------------------------------- + * @brief this function sets the DW3xxx to transmit continuous wave (CW) signal + * at specific channel frequency + * + * input parameters + * + * output parameters + * + * no return value + */ +void dwt_configcwmode(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function sets the DW3xxx to continuous tx frame mode for + * regulatory approvals testing. + * + * input parameters: + * @param framerepetitionrate - This is a 32-bit value that is used to set the + * interval between transmissions. + * The minimum value is 2. The units are approximately 4 ns. (or more precisely + * 512/(499.2e6*256) seconds)). + * + * output parameters + * + * no return value + */ +void dwt_configcontinuousframemode(uint32_t framerepetitionrate); + +/*! + * --------------------------------------------------------------------------- + * @brief This function stops the continuous tx frame mode. + * + * input parameters: + * + * output parameters + * + * no return value + */ +void dwt_disablecontinuousframemode(void); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the raw battery voltage and temperature values of + * the DW IC. + * The values read here will be the current values sampled by DW IC AtoD + * converters. + * + * + * input parameters: + * + * output parameters + * + * returns (temp_raw<<8)|(vbat_raw) + */ +uint16_t dwt_readtempvbat(void); + +/*! + * --------------------------------------------------------------------------- + * @brief this function takes in a raw temperature value and applies the + * conversion factor + * to give true temperature. The dwt_initialise needs to be called before call + * to this to + * ensure pdw3000local->tempP contains the SAR_LTEMP value from OTP. + * + * input parameters: + * @param raw_temp - this is the 8-bit raw temperature value as read by + * dwt_readtempvbat + * + * output parameters: + * + * returns: temperature sensor value + */ +float dwt_convertrawtemperature(uint8_t raw_temp); + +/*! + * --------------------------------------------------------------------------- + * @brief this function takes in a raw voltage value and applies the conversion + * factor + * to give true voltage. The dwt_initialise needs to be called before call to + * this to + * ensure pdw3000local->vBatP contains the SAR_LVBAT value from OTP + * + * input parameters: + * @param raw_voltage - this is the 8-bit raw voltage value as read by + * dwt_readtempvbat + * + * output parameters: + * + * returns: voltage sensor value + */ +float dwt_convertrawvoltage(uint8_t raw_voltage); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the temperature of the DW3000 that was sampled + * on waking from Sleep/Deepsleep. They are not current values, but read on last + * wakeup if DWT_TANDV bit is set in mode parameter of dwt_configuresleep + * + * input parameters: + * + * output parameters: + * + * returns: 8-bit raw temperature sensor value + */ +uint8_t dwt_readwakeuptemp(void); + +/*! + * --------------------------------------------------------------------------- + * @brief this function reads the battery voltage of the DW3000 that was sampled + * on waking from Sleep/Deepsleep. They are not current values, but read on last + * wakeup if DWT_TANDV bit is set in mode parameter of dwt_configuresleep + * + * input parameters: + * + * output parameters: + * + * returns: 8-bit raw battery voltage sensor value + */ +uint8_t dwt_readwakeupvbat(void); + +/*! + * --------------------------------------------------------------------------- + * @brief Returns the PG delay value of the TX + * + * input parameters + * + * output parameters + * + * returns uint8_t + */ +uint8_t dwt_readpgdelay(void); + +/*! + * --------------------------------------------------------------------------- + * @brief this function determines the adjusted bandwidth setting (PG_DELAY + * bitfield setting) + * of the DW3000. The adjustemnt is a result of DW3000 internal PG cal routine, + * given a target count value it will try to + * find the PG delay which gives the closest count value. + * Manual sequencing of TX blocks and TX clocks need to be enabled for either + * channel 5 or 9. + * This function presumes that the PLL is already in the IDLE state. Please + * configure the PLL to IDLE + * state before calling this function, by calling dwt_configure. + * + * input parameters: + * @param target_count - uint16_t - the PG count target to reach in order to + * correct the bandwidth + * + * output parameters: + * returns: (uint8_t) The setting that was written to the PG_DELAY register + * (when calibration completed) + */ +uint8_t dwt_calcbandwidthadj(uint16_t target_count); + +/*! + * --------------------------------------------------------------------------- + * @brief this function calculates the value in the pulse generator counter + * register (PGC_STATUS) for a given PG_DELAY + * This is used to take a reference measurement, and the value recorded as the + * reference is used to adjust the + * bandwidth of the device when the temperature changes. This function presumes + * that the PLL is already in the IDLE + * state. + * + * input parameters: + * @param pgdly - uint8_t - the PG_DELAY (max value 63) to set (to control + * bandwidth), and to find the corresponding count value for + * + * output parameters: + * returns (uint16_t) - The count value calculated from the provided PG_DELAY + * value (from PGC_STATUS) - used as reference + * for later bandwidth adjustments + */ +uint16_t dwt_calcpgcount(uint8_t pgdly); + +/******************************************************************************/ + +/* AES BLOCK + * */ + +/******************************************************************************/ + +/*! + * --------------------------------------------------------------------------- + * @brief This function provides the API for the configuration of the AES key + * before first usage. + * @param key - pointer to the key which will be programmed to the Key + * register + * Note, key register supports only 128-bit keys. + * + * output parameters + * + * no return value + */ +void dwt_set_keyreg_128(const dwt_aes_key_t *key); + +/*! + * --------------------------------------------------------------------------- + * @brief This function provides the API for the configuration of the AES + * block before its first usage. + * + * input parameters + * @param pCfg - pointer to the configuration structure, which contains the + * AES configuration data. + * + * output parameters + * + * no return value + */ +void dwt_configure_aes(const dwt_aes_config_t *pCfg); + +/*! + * --------------------------------------------------------------------------- + * @brief This function provides the API for the job of encript/decript the + * data block + * + * 128 bit key shall be pre-loaded with dwt_set_aes_key() + * dwt_configure_aes + * + * supports AES_KEY_Src_Register mode only + * packet sizes < 127 + * note, the "nonce" shall be unique for every transaction + * @param job - pointer to AES job, contains data info and encryption info. + * @param core_type - Core type + * + * @return AES_STS_ID status bits + * + * + */ +int8_t dwt_do_aes(dwt_aes_job_t *job, dwt_aes_core_type_e core_type); + +/******************************************************************************* +* +* Declaration of platform-dependent lower level functions. +* +*******************************************************************************/ + +/*! + * --------------------------------------------------------------------------- + * @brief This function wakeup device by an IO pin + * + * @param None + * + * output parameters + * + * no return value + */ +void dwt_wakeup_ic(void); + +// --------------------------------------------------------------------------- +// +// NB: The purpose of the deca_mutex.c file is to provide for microprocessor +// interrupt enable/disable, this is used for +// controlling mutual exclusion from critical sections in the code where +// interrupts and background +// processing may interact. The code using this is kept to a minimum and +// the disabling time is also +// kept to a minimum, so blanket interrupt disable may be the easiest way to +// provide this. But at a +// minimum those interrupts coming from the Decawave device should be +// disabled/re-enabled by this activity. +// +// In porting this to a particular microprocessor, the implementer may +// choose to use #defines here +// to map these calls transparently to the target system. Alternatively the +// appropriate code may +// be embedded in the functions provided in the deca_irq.c file. +// +// --------------------------------------------------------------------------- + +typedef int decaIrqStatus_t; // Type for remembering IRQ status + +/*! + * --------------------------------------------------------------------------- + * @brief This function should disable interrupts. This is called at the start + * of a critical section + * It returns the IRQ state before disable, this value is used to re-enable in + * decamutexoff call + * + * Note: The body of this function is defined in deca_mutex.c and is platform + * specific + * + * input parameters: + * + * output parameters + * + * returns the state of the DW3000 interrupt + */ +decaIrqStatus_t decamutexon(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function should re-enable interrupts, or at least restore their + * state as returned(&saved) by decamutexon + * This is called at the end of a critical section + * + * Note: The body of this function is defined in deca_mutex.c and is platform + * specific + * + * input parameters: + * @param s - the state of the DW3000 interrupt as returned by decamutexon + * + * output parameters + * + * returns the state of the DW3000 interrupt + */ +void decamutexoff(decaIrqStatus_t s); + +/*! + * --------------------------------------------------------------------------- + * @brief Wait for a given amount of time. + * NB: The body of this function is defined in deca_sleep.c and is platform + * specific + * + * input parameters: + * @param time_ms - time to wait in milliseconds + * + * output parameters + * + * no return value + */ +void deca_sleep(unsigned int time_ms); + +/*! + * --------------------------------------------------------------------------- + * @brief Wait for a given amount of time. + * NB: The body of this function is defined in deca_sleep.c and is platform + * specific + * + * input parameters: + * @param time_us - time to wait in microseconds + * + * output parameters + * + * no return value + */ +void deca_usleep(unsigned long time_us); + +/*! + * --------------------------------------------------------------------------- + * @brief this reads the device ID and checks if it is the right one + * + * input parameters + * None + * + * output parameters + * + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ +int dwt_check_dev_id(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief This function runs the PGF calibration. This is needed prior to + * reception. + * Note: If the RX calibration routine fails the device receiver performance + * will be severely affected, the application should reset and try again + * + * input parameters + * @param ldoen - if set to 1 the function will enable LDOs prior to + * calibration and disable afterwards. + * + * return result of PGF calibration (DWT_ERROR/-1 = error) + * + */ +int dwt_run_pgfcal(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function runs the PGF calibration. This is needed prior to + * reception. + * + * input parameters + * @param ldoen - if set to 1 the function will enable LDOs prior to + * calibration and disable afterwards. + * + * return result of PGF calibration (0 = error) + * + */ +int dwt_pgf_cal(int ldoen); + +/*! + * --------------------------------------------------------------------------- + * @brief + * This function will re-calibrate and re-lock the PLL. If the cal/lock is + * successful DWT_SUCCESS + * will be returned otherwise DWT_ERROR will be returned + * + * input parameters:None + * + * output parameters: + * returns DWT_SUCCESS for success or DWT_ERROR for error. + */ +int dwt_pll_cal(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function is used to control what rf port to use for TX/RX. + * + * @param rfPort - enum value for selecting desired port + * @param enable - enum value for enabling or disabling manual control of + * antenna selction + * + * No return value + */ +void dwt_configure_rf_port(dwt_rf_port_selection_e rfPort, + dwt_rf_port_ctrl_e enable); + +/*! + * --------------------------------------------------------------------------- + * + * @brief This function is used to write a 16 bit address to a desired + * Low-Energy device (LE) address. For frame pending to function when + * the correct bits are set in the frame filtering configuration via the + * dwt_configureframefilter. See dwt_configureframefilter for more details. + * + * @param addr - the address value to be written to the selected LE register + * @param leIndex - Low-Energy device (LE) address to write to + * + * no return value + * + */ +void dwt_configure_le_address(uint16_t addr, int leIndex); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures SFD type only: e.g. IEEE 4a - 8, DW-8, DW-16, + * or IEEE 4z -8 (binary) + * The dwt_configure should be called prior to this to configure other + * parameters + * + * input parameters + * @param sfdType - e.g. DWT_SFD_IEEE_4A, DWT_SFD_DW_8, DWT_SFD_DW_16, + * DWT_SFD_IEEE_4Z + * + * return none + * + */ +void dwt_configuresfdtype(uint8_t sfdType); + +/*! + * --------------------------------------------------------------------------- + * @brief This function writes a value to the system status register (lower). + * + * input parameters + * @param mask - mask value to send to the system status register (lower + * 32-bits). + * e.g. "SYS_STATUS_TXFRS_BIT_MASK" to clear the TX frame sent + * event. + * + * return none + */ +void dwt_writesysstatuslo(uint32_t mask); + +/*! + * --------------------------------------------------------------------------- + * @brief This function writes a value to the system status register (higher). + * + * input parameters + * @param mask - mask value to send to the system status register (higher bits). + * NOTE: Be aware that the size of this register varies per + * device. + * DW3000 devices only require a 16-bit mask value typecast to + * 32-bit. + * DW3700 devices only require a 16-bit mask value typecast to + * 32-bit. + * DW3720 devices require a 32-bit mask value. + * + * return none + */ +void dwt_writesysstatushi(uint32_t mask); + +/*! + * --------------------------------------------------------------------------- + * @brief This function reads the current value of the system status register + * (lower 32 bits) + * + * input parameters + * + * return A uint32_t value containing the value of the system status register + * (lower 32 bits) + */ +uint32_t dwt_readsysstatuslo(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function reads the current value of the system status register + * (higher bits) + * + * input parameters + * + * return A uint32_t value containing the value of the system status register + * (higher bits) + * NOTE: Be aware that the size of this register varies per device. + * DW3000 devices will return a 16-bit value of the register that is + * typecast to a 32-bit value. + * DW3700 devices will return a 16-bit value of the register that is + * typecast to a 32-bit value. + * DW3720 devices will return a 'true' 32-bit value of the register. + */ +uint32_t dwt_readsysstatushi(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function writes a value to the Receiver Double Buffer status + * register. + * + * input parameters + * @param mask - mask value to send to the register. + * e.g. "RDB_STATUS_CLEAR_BUFF0_EVENTS" to clear the clear buffer + * 0 events. + * + * return none + */ +void dwt_writerdbstatus(uint8_t mask); + +/*! + * --------------------------------------------------------------------------- + * @brief This function reads the current value of the Receiver Double Buffer + * status register. + * + * input parameters + * + * return A uint8_t value containing the value of the Receiver Double Buffer + * status register. + */ +uint8_t dwt_readrdbstatus(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will read the frame length of the last received frame. + * This function presumes that a good frame or packet has been received. + * + * input parameters + * + * return frame_len - A uint16_t with the number of octets in the received + * frame. + */ +uint16_t dwt_getframelength(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the value stored in CIA_ADJUST_ID register + * + * input parameters + * + * output parameters + * + * returns value stored in CIA_ADJUST_ID register + */ +uint32_t dwt_readpdoaoffset(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will set the value to the CIA_ADJUST_ID register. + * + * input parameters + * @param offset - the offset value to be written into the CIA_ADJUST_ID + * register. + * + * return None. + */ +void dwt_setpdoaoffset(uint16_t offset); + +/*! + * --------------------------------------------------------------------------- + * @brief This function can set GPIO output to high (1) or low (0) which can + * then be used to signal e.g. WiFi chip to + * turn off or on. This can be used in devices with multiple radios to minimise + * co-existence interference. + * + * input parameters + * @param enable - specifies if to enable or disable WiFi co-ex + * functionality on GPIO5 (or GPIO4) + * depending if coex_io_swap param is set to 1 or 0 + * @param coex_io_swap - when set to 0, GPIO5 is used as co-ex out, otherwise + * GPIO4 is used + * + * return event counts from both timers: TIMER0 events in bits [7:0], TIMER1 + * events in bits [15:8] + * + */ +void dwt_wifi_coex_set(dwt_wifi_coex_e enable, int coex_io_swap); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will reset the internal system time counter. The counter + * will be momentarily reset to 0, + * and then will continue counting as normal. The system time/counter is only + * available when device is in + * IDLE or TX/RX states. + * + * input parameters + * none + * + * return + * none + * + */ +void dwt_reset_system_counter(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function is used to configure the device for OSTR mode (One Shot + * Timebase Reset mode), this will + * prime the device to reset the internal system time counter on SYNC pulse / + * SYNC pin toggle. + * For more information on this operation please consult the device User Manual. + * + * input parameters + * @param enable - Set to 1 to enable OSTR mode and 0 to disable + * @param wait_time - When a counter running on the 38.4 MHz external clock + * and initiated on the rising edge + * of the SYNC signal equals the WAIT programmed value, + * the DW3700 timebase counter will be reset. + * + * NOTE: At the time the SYNC signal is asserted, the clock PLL dividers + * generating the DW3700 125 MHz system clock are reset, + * to ensure that a deterministic phase relationship exists between the system + * clock and the asynchronous 38.4 MHz external clock. + * For this reason, the WAIT value programmed will dictate the phase + * relationship and should be chosen to give the + * desired phase relationship, as given by WAIT modulo 4. A WAIT value of 33 + * decimal is recommended, + * but if a different value is chosen it should be chosen so that WAIT modulo 4 + * is equal to 1, i.e. 29, 37, and so on. + * + * return + * none + * + */ +void dwt_config_ostr_mode(uint8_t enable, uint16_t wait_time); + +/*! + * --------------------------------------------------------------------------- + * @brief This function drive the antenna configuration GPIO6/7 + * + * input parameters + * @param antenna_config - configure GPIO 6 and or 7 to use for Antenna + * selection with expected value. + * bitfield configuration: + * Bit 0: Use GPIO 6 + * Bit 1: Value to apply (0/1) + * Bit 2: Use GPIO 7 + * Bit 3: Value to apply (0/1) + * + * return none + * + */ +void dwt_configure_and_set_antenna_selection_gpio(uint8_t antenna_config); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will read the Diagnostics Registers - IPATOV, STS1, STS2 + * from the device, which can help in + * determining if packet has been received in LOS (line-of-sight) or NLOS + * (non-line-of-sight) condition. + * To help determine/estimate NLOS condition either Ipatov, STS1 or STS2 + * can be used, (or all three). + * + * NOTE: CIA Diagnostics need to be enabled to "DW_CIA_DIAG_LOG_ALL" else the + * diagnostic registers read will be 0. + * input parameters: + * @param dw - DW3xxx chip descriptor handler. + * + * @param all_diag - this is the pointer to the Structure into which to read + * the data. + * + * @return a uint8_t value indicating if success or failure. + */ +uint8_t dwt_nlos_alldiag(dwt_nlos_alldiag_t *all_diag); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will read the IPATOV Diagnostic Registers to get the + * First Path and Peak Path Index value. + * This function is used when signal power is low to determine the signal + * type (LOS or NLOS). Hence only + * Ipatov diagnostic registers are used to determine the signal type. + * + * input parameters: + * @param dw - DW3xxx chip descriptor handler. + * + * @param index - this is the pointer to the Structure into which to read the + * data. + * + */ +void dwt_nlos_ipdiag(dwt_nlos_ipdiag_t *index); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the value stored in CTR_DBG_ID register, these + * are the low 32-bits of the STS IV counter. + * + * input parameters + * + * output parameters + * + * returns value stored in CTR_DBG_ID register + */ +uint32_t dwt_readctrdbg(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to read the value stored in DGC_DBG_ID register. + * + * input parameters + * + * output parameters + * + * returns value stored in DGC_DBG_ID register + */ +uint32_t dwt_readdgcdbg(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function read CIA version in this device. + * + * input parameters + * @param dw - DW3xxx chip descriptor handler. + * + * return + * none + * + */ +uint32_t dwt_readCIAversion(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This is used to return base address of ACC_MEM_ID register (CIR base + * address) + * + * input parameters + * + * output parameters + * + * returns address of ACC_MEM_ID register + */ +uint32_t dwt_getcirregaddress(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This API enables returns a list of register name/value pairs, to + * enable debug output / logging in external applications + * e.g. DecaRanging + * + * input parameters + * @param regs - Pointer to registers structure register_name_add_t, will be + * returned + * + * return + * none + * + */ +register_name_add_t * dwt_get_reg_names(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function calculates the adjusted TxPower setting by applying a + * boost over a reference TxPower setting. + * The reference TxPower setting should correspond to a 1ms frame (or 0dB) + * boost. + * The boost to be applied should be provided in unit of 0.1dB boost. + * For example, for a 125us frame, a theoretical boost of 9dB can be applied. A + * boost of 90 should be provided as input + * parameter and will be applied over the reference TxPower setting for a 1ms + * frame. + * + * input parameters + * @param boost - the boost to apply in 0.1dB units. + * DW3XXX maximum boost is 354 in channel 5, 305 in channel 9. If the input + * value is greater than the maximum boost, + * then it will be discarded and maximum boost will be targeted. + * @param ref_tx_power - the tx_power_setting corresponding to a frame of 1ms + * (0dB boost) + * @param channel - the current RF channel used for transmission of UWB frames + * @param adj_tx_power - if successful, the adjusted tx power setting will be + * returned through this pointer + * @param applied_boost - if successful, the exact amount of boost applied will + * be returned through this pointer + * + * return + * int: DWT_SUCCESS: if an adjusted tx power setting could be calculated. In + * this case, the actual amount of boost that was + * applied and the adjusted tx power setting will be respectively returned + * through the parameters adj_tx_power and boost + * DWT_ERROR: if the API could not calculate a valid adjusted TxPower + * setting + * + * + */ +int dwt_adjust_tx_power(uint16_t boost, + uint32_t ref_tx_power, + uint8_t channel, + uint32_t *adj_tx_power, + uint16_t *applied_boost); + +/* BEGIN: CHIP_SPECIFIC_SECTION DW37xx */ + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables the specified double RX buffer to trigger an + * interrupt. + * The following events can be found in RDB_STAT_EN_ID registers. + * + * + * input parameters: + * @param bitmask - sets the events in RDB_STAT_EN_ID register which will + * generate interrupt + * @param operation - if set to DWT_ENABLE_INT additional interrupts as + * selected in the bitmask are enabled + * - if set to DWT_ENABLE_INT_ONLY the interrupts in the + * bitmask are forced to selected state - + * i.e. the mask is written to the register directly. + * - otherwise (if set to DWT_DISABLE_INT) clear the + * interrupts as selected in the bitmask + * output parameters + * + * no return value + */ +void dwt_setinterrupt_db(uint8_t bitmask, dwt_INT_options_e INT_options); + +/*! + * --------------------------------------------------------------------------- + * + * @brief This resets the DW3700 device including the semaphore. + * + * input parameters None + * + * output parameters None + * + * return None + */ +void dwt_softreset_fcmd(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief This resets the DW3700 device without the semaphore. + * + * input parameters None + * + * output parameters None + * + * return None + */ +void dwt_softreset_no_sema_fcmd(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief Request access to the device registers, using the dual SPI semaphore + * request command. If the semaphore is available, + * the semaphore will be given, this will be shown by the returned status value. + * + * input parameters + * @param + * + * @return semaphore value + * + */ +void dwt_ds_sema_request(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief Release the semaphore that was taken by this host + * + * input parameters + * + * output parameters + * + * return None + */ +void dwt_ds_sema_release(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief This can be used by host on the SPI2 to force taking of the semaphore. + * Take semaphore even if it is not available. + * This does not apply to host on SPI1, only host on SPI2 can force + * taking of the semaphore. + * + * input parameters + * + * output parameters + * + * return None + */ +void dwt_ds_sema_force(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief Reports the semaphore status low byte. + * + * input parameters + * + * output parameters + * + * @return semaphore value + */ +uint8_t dwt_ds_sema_status(void); + +/*! + * --------------------------------------------------------------------------- + * @brief Reports the semaphore status high byte. + * + * input parameters + * + * output parameters + * + * @return semaphore value + */ +uint8_t dwt_ds_sema_status_hi(void); + +/*! + * --------------------------------------------------------------------------- + * + * @brief With this API each host can prevent the device going into + * Sleep/Deepsleep state. + * By default it is possible for either host to place the device into + * Sleep/Deepsleep. This may not be desirable, + * thus a host once it is granted access can set a SLEEP_DISABLE bit in the + * register + * to prevent the other host from putting the device to sleep once it gives up + * its access. + * + * @param host_sleep_en - HOST_EN_SLEEP: clears the bit - allowing the the + * device to go to sleep. + * HOST_DIS_SLEEP: sets the bit to prevent the device + * from going to sleep + * + * return None + */ +void dwt_ds_en_sleep(dwt_host_sleep_en_e host_sleep_en); + +/*! + * --------------------------------------------------------------------------- + * + * @brief With this API the host on either SPI1 or SPI2 can enable/disable + * whether the interrupt is raised upon + * SPI1MAVAIL or SPI2MAVAIL event. + * + * @param dwt_spi_host_e spi_num - should be set to either DWT_HOST_SPI1 or + * DWT_HOST_SPI2 + * @param dwt_INT_options_e int_set - should be set to either DWT_ENABLE_INT + * or DWT_DISABLE_INT + * + * return DWT_SUCCESS or DWT_ERROR (if input parameters not consistent) + */ +int dwt_ds_setinterrupt_SPIxavailable(dwt_spi_host_e spi_num, + dwt_INT_options_e int_set); + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables or disables the equaliser block within in the + * CIA. The equaliser should be used when + * receiving from devices which transmit using a Symmetric Root Raised Cosine + * pulse shape. The equaliser will adjust + * the CIR to give improved receive timestamp results. Normally, this is left + * disabled (the default value), which + * gives the best receive timestamp performance when interworking with devices + * (like this IC) that use the + * IEEE 802.15.4z recommended minimum precursor pulse shape. + * + * @param en - DWT_EQ_ENABLED or DWT_EQ_DISABLED, enables/disables the equaliser + * block + */ +void dwt_enable_disable_eq(uint8_t en); + +/* END: CHIP_SPECIFIC_SECTION DW37xx */ + +/* BEGIN: CHIP_SPECIFIC_SECTION DW3720 */ + +/*! + * --------------------------------------------------------------------------- + * @brief This function will reset the timers block. It will reset both timers. + * It can be used to stop a timer running + * in repeat mode. + * + * input parameters + * none + * + * return none + * + */ +void dwt_timers_reset(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function will read the timers' event counts. When reading from + * this register the values will be reset/cleared, + * thus the host needs to read both timers' event counts the events relating to + * TIMER0 are in bits [7:0] and events + * relating to TIMER1 in bits [15:8]. + * + * input parameters + * none + * + * return event counts from both timers: TIMER0 events in bits [7:0], TIMER1 + * events in bits [15:8] + * + */ +uint16_t dwt_timers_read_and_clear_events(void); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures selected timer (TIMER0 or TIMER1) as per + * configuration structure + * + * input parameters + * @param tim_cfg - pointer to timer configuration structure + * + * return none + * + */ +void dwt_configure_timer(dwt_timer_cfg_t *tim_cfg); + +/*! + * --------------------------------------------------------------------------- + * @brief This function configures the GPIOs (4 and 5) for COEX_OUT + * + * input parameters + * @param timer_coexout - configure if timer controls the COEX_OUT + * @param coex_swap - configures if the COEX_OUT is on GPIO4 or GPIO5, when + * set to 1 the GPIO4 will be COEX_OUT + * + * return none + * + */ +void dwt_configure_wificoex_gpio(uint8_t timer_coexout, uint8_t coex_swap); + +/*! + * --------------------------------------------------------------------------- + * @brief This function sets timer expiration period, it is a 22-bit number + * + * input parameters + * @param timer_name - specify which timer period to set: TIMER0 or TIMER1 + * @param exp - expiry count - e.g. if units are XTAL/64 (1.66 us) then + * setting 1024 ~= 1.7 ms period + * + * return none + * + */ +void dwt_set_timer_expiration(dwt_timers_e timer_name, uint32_t exp); + +/*! + * --------------------------------------------------------------------------- + * @brief This function enables the timer. In order to enable, the timer enable + * bit [0] for TIMER0 or [1] for TIMER1 + * needs to transition from 0->1. + * + * input parameters + * @param enable - specifies which timer to enable + * + * return none + * + */ +void dwt_timer_enable(dwt_timers_e timer_name); + +/*! + * --------------------------------------------------------------------------- + * @brief This API enables "Fixed STS" function. The fixed STS function means + * that the same STS will be sent in each packet. + * And also in the receiver, when the receiver is enabled the STS will be reset. + * Thus transmitter and the receiver will be in sync. + * + * input parameters + * @param set - Set to 1 to set FIXED STS and 0 to disable + * + * return + * none + * + */ +void dwt_set_fixedsts(uint8_t set); + +/*! + * --------------------------------------------------------------------------- + * @brief This API sets the Alternative Pulse Shape according to ARIB. + * + * input parameters + * @param set_alternate - Set to 1 to enable the alternate pulse shape and 0 to + * restore default shape. + * + * return + * none + * + */ +void dwt_set_alternative_pulse_shape(uint8_t set_alternate); + +/* END: CHIP_SPECIFIC_SECTION DW3720 */ +#ifdef __cplusplus +} +#endif + +#endif /* _DECA_DEVICE_API_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_interface.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_interface.h new file mode 100644 index 00000000..7c679e4f --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_interface.h @@ -0,0 +1,679 @@ +/* + * @file: deca_interface.h + * @brief Interface to the Decawave driver + * + * @author Decawave + * + * @attention Copyright 2020 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + */ + +#ifndef DECA_INTERFACE_H_ +#define DECA_INTERFACE_H_ + +#include "deca_device_api.h" +#include + +typedef enum +{ + DWT_READ_REG, + DWT_WRITE_REG, + DWT_WAKEUP, + DWT_FORCETRXOFF, + DWT_STARTTX, + DWT_SETDELAYEDTRXTIME, + DWT_CONFIGURESFDTYPE, + DWT_CONFIGURELEADDRESS, + DWT_SETKEYREG128, + DWT_ENABLEGPIOCLOCKS, + DWT_OTPREVISION, + DWT_GETICREFVOLT, + DWT_GETICREFTEMP, + DWT_GETPARTID, + DWT_GETLOTID, + DWT_SIGNALRXBUFFFREE, + DWT_SETRXAFTERTXDELAY, + DWT_ENABLESPICRCCHECK, + DWT_SETFINEGRAINTXSEQ, + DWT_SETLNAPAMODE, + DWT_READPGDELAY, + DWT_CONFIGURESTSKEY, + DWT_CONFIGURESTSIV, + DWT_CONFIGURESTSLOADIV, + DWT_CONFIGMRXLUT, + DWT_RESTORECONFIG, + DWT_CONFIGURESTSMODE, + DWT_SETRXANTENNADELAY, + DWT_GETRXANTENNADELAY, + DWT_SETTXANTENNADELAY, + DWT_GETTXANTENNADELAY, + DWT_RXENABLE, + DWT_WRITETXDATA, + DWT_READRXDATA, + DWT_WRITERXSCRATCHDATA, + DWT_READRXSCRATCHDATA, + DWT_READCARRIERINTEGRATOR, + DWT_ENABLEAUTOACK, + DWT_CHECKDEVID, + DWT_CONFIGCIADIAG, + DWT_ENTERSLEEPAFTERTX, + DWT_ENTERSLEEPAFTER, + DWT_RUNPGFCAL, + DWT_PGF_CAL, + DWT_READCLOCKOFFSET, + DWT_CLEARAONCONFIG, + DWT_CALCBANDWIDTHADJ, + DWT_READDIAGNOSTICS, + DWT_READTXTIMESTAMPHI32, + DWT_READTXTIMESTAMPLO32, + DWT_READTXTIMESTAMP, + DWT_READPDOA, + DWT_READTDOA, + DWT_READWAKEUPTEMP, + DWT_READWAKEUPVBAT, + DWT_WRITETXFCTRL, + DWT_OTPWRITE, + DWT_OTPWRITEANDVERIFY, + DWT_ENTERSLEEP, + DWT_CONFIGURESLEEPCNT, + DWT_CALIBRATESLEEPCNT, + DWT_CONFIGURESLEEP, + DWT_SOFTRESET, + DWT_SETXTALTRIM, + DWT_GETXTALTRIM, + DWT_REPEATEDCW, + DWT_CONFIGCWMODE, + DWT_READTEMPVBAT, + DWT_CONVERTRAWTEMP, + DWT_CONVERTRAWVBAT, + DWT_CONFIGCONTINUOUSFRAMEMODE, + DWT_DISABLECONTINUOUSFRAMEMODE, + DWT_STOPREPEATEDFRAMES, + DWT_REPEATEDFRAMES, + DWT_DOAES, + DWT_READSTSQUALITY, + DWT_CONFIGUREAES, + DWT_READEVENTCOUNTERS, + DWT_CONFIGEVENTCOUNTERS, + DWT_SETPREAMBLEDETECTTIMEOUT, + DWT_SETSNIFFMODE, + DWT_SETRXTIMEOUT, + DWT_AONREAD, + DWT_AONWRITE, + DWT_READSTSSTATUS, + DWT_SETLEDS, + DWT_SETDWSTATE, + DWT_READSYSTIME, + DWT_CHECKIDLERC, + DWT_CHECKIRQ, + DWT_CONFIGUREFRAMEFILTER, + DWT_SETEUI, + DWT_GETEUI, + DWT_SETPANID, + DWT_SETADDRESS16, + DWT_READRXTIMESTAMP, + DWT_READRXTIMESTAMP_IPATOV, + DWT_READRXTIMESTAMPUNADJ, + DWT_READRXTIMESTAMPHI32, + DWT_READRXTIMESTAMPLO32, + DWT_READRXTIMESTAMP_STS, + DWT_READSYSTIMESTAMPHI32, + DWT_OTPREAD, + DWT_SETPLENFINE, + DWT_CALCPGCOUNT, + DWT_SETGPIOMODE, + DWT_SETGPIODIR, + DWT_SETGPIOVALUE, + DWT_GETDGCDECISION, + DWT_SETDBLRXBUFFMODE, + DWT_SETREFERENCETRXTIME, + DWT_MICSIZEFROMBYTES, + DWT_PLL_CAL, + DWT_CONFIGURE_RF_PORT, + DWT_SETPDOAOFFSET, + DWT_READPDOAOFFSET, +#ifdef WIN32 + DWT_SPICSWAKEUP, +#endif // WIN32 + DWT_WRITESYSSTATUSLO, + DWT_WRITESYSSTATUSHI, + DWT_READSYSSTATUSLO, + DWT_READSYSSTATUSHI, + DWT_WRITERDBSTATUS, + DWT_READRDBSTATUS, + DWT_GETFRAMELENGTH, + DWT_READGPIOVALUE, + DWT_CFGWIFICOEXSET, + DWT_CFGANTSEL, + DWT_RSTSYSTEMCNT, + DWT_CFGOSTRMODE, + DWT_NLOS_IPDIAG, + DWT_NLOS_ALLDIAG, + DWT_ADJ_TXPOWER, + + /* BEGIN: CHIP_SPECIFIC_SECTION DW3700 */ + DWT_SETINTERUPTDB, + DWT_ENTERSLEEPFCMD, + DWT_SOFTRESETFCMD, + DWT_SOFTRESETNOSEMAFCMD, + DWT_DSSEMAREQUEST, + DWT_DSSEMARELEASE, + DWT_DSSEMAFORCE, + DWT_DSSEMASTATUS, + DWT_DSENSLEEP, + DWT_DSSETINT_SPIAVAIL, + DWT_ENABLEDISABLEEQ, + + /* END: CHIP_SPECIFIC_SECTION DW3700 */ + /* BEGIN: CHIP_SPECIFIC_SECTION DW3720 */ + DWT_TIMERSRST, + DWT_TIMERSRSTCLR, + DWT_CONFIGTIMER, + DWT_TIMEREXPIRATION, + DWT_TIMERENABLE, + DWT_CFGWIFICOEXGPIO, + DWT_SETFIXEDSTS, + DWT_SET_ALT_PULSE_SHAPE, + + /* END: CHIP_SPECIFIC_SECTION DW3720 */ + /* BEGIN: MCPS SPECIFIC IOCTL */ + DWT_SET_STS_LEN, + DWT_CFG_STS, + + /* END: MCPS SPECIFIC IOCTL */ + /* BEGIN DEBUG */ + DWT_DBG_REGS, + DWT_READCTRDBG, + DWT_READDGCDBG, + DWT_CIA_VERSION, + DWT_GET_CIR_REGADD, + + /* END DEBUG */ +} dwt_ioctl_e; + +struct dwt_rw_data_s +{ + uint8_t *buffer; + uint16_t length; + uint16_t offset; +}; + +struct dwt_otp_read_s +{ + uint16_t address; + uint32_t *array; + uint8_t length; +}; + +struct dwt_enable_spi_crc_check_s +{ + dwt_spi_crc_mode_e crc_mode; + dwt_spierrcb_t spireaderr_cb; +}; + +struct dwt_set_gpio_mode_s +{ + uint32_t mask; + uint32_t mode; +}; + +struct dwt_set_gpio_value_s +{ + uint16_t gpio; // GPIO to set, can be single or multiple: + int value; // 0 or 1 +}; + +struct dwt_configure_ff_s +{ + uint16_t enabletype; + uint16_t filtermode; +}; + +struct dwt_aon_read_s +{ + uint8_t ret_val; + uint16_t aon_address; +}; + +struct dwt_aon_write_s +{ + uint16_t aon_address; + uint8_t aon_write_data; +}; + +struct dwt_opt_write_and_verify_s +{ + uint32_t value; + uint16_t address; +}; + +struct dwt_configure_sleep_s +{ + uint16_t mode; + uint8_t wake; +}; + +#ifdef WIN32 +struct dwt_spi_cs_wakeup_s +{ + uint8_t *buff; + uint16_t length; +}; + +#endif // WIN32 + +struct dwt_enable_auto_ack_s +{ + uint8_t responseDelayTime; + int enable; +}; + +struct dwt_set_dbl_rx_buff_mode_s +{ + dwt_dbl_buff_state_e dbl_buff_state; + dwt_dbl_buff_mode_e dbl_buff_mode; +}; + +struct dwt_set_sniff_mode_s +{ + int enable; + uint8_t timeOn; + uint8_t timeOff; +}; + +struct dwt_repeated_cw_s +{ + int cw_enable; + int cw_mode_config; +}; + +struct dwt_convert_raw_temp_s +{ + float result; + uint8_t raw_temp; +}; + +struct dwt_convert_raw_volt_s +{ + float result; + uint8_t raw_voltage; +}; + +struct dwt_calc_bandwidth_adj_s +{ + uint8_t result; + uint16_t target_count; +}; + +struct dwt_calc_pg_count_s +{ + uint16_t result; + uint8_t pgdly; +}; + +struct dwt_mic_size_from_bytes_s +{ + dwt_mic_size_e result; + uint8_t mic_size_in_bytes; +}; + +struct dwt_do_aes_s +{ + int8_t result; + dwt_aes_job_t *job; + dwt_aes_core_type_e core_type; +}; + +struct dwt_configure_le_address_s +{ + uint16_t addr; + int leIndex; +}; + +struct dwt_set_interrupt_db_s +{ + uint8_t bitmask; + dwt_INT_options_e INT_options; +}; + +struct dwt_tx_fctrl_s +{ + uint16_t txFrameLength; + uint16_t txBufferOffset; + uint8_t ranging; +}; + +struct dwt_config_rf_port_s +{ + dwt_rf_port_selection_e port; + dwt_rf_port_ctrl_e enable; +}; + +struct dwt_ostr_mode_s +{ + uint8_t enable; + uint16_t wait_time; +}; + +struct dwt_cfg_wifi_coex_set_s +{ + dwt_wifi_coex_e enable; + int coex_io_swap; +}; + +struct dwt_cfg_wifi_coex_s +{ + uint8_t timer_coexout; + uint8_t coex_swap; +}; + +struct dwt_timer_exp_s +{ + dwt_timers_e timer_name; + uint32_t exp; +}; + +struct dwt_adj_tx_power_s +{ + int result; + uint16_t boost; + uint32_t ref_tx_power; + uint8_t channel; + uint32_t *adj_tx_power; + uint16_t *applied_boost; +}; + +struct dwchip_s; +struct dw_rx_s; + +struct dwt_callbacks_s +{ + dwt_spierrcb_t cbSPIRDErr; // Callback for SPI read error events + dwt_cb_t cbTxDone; // Callback for TX confirmation event + dwt_cb_t cbRxOk; // Callback for RX good frame event + dwt_cb_t cbRxTo; // Callback for RX timeout events + dwt_cb_t cbRxErr; // Callback for RX error events + dwt_cb_t cbSPIErr; // Callback for SPI error events + dwt_cb_t cbSPIRdy; // Callback for SPI ready events + dwt_cb_t cbDualSPIEv; // Callback for dual SPI events + + int (*rx_frame)(struct dwchip_s *, struct dw_rx_s *); + int (*rx_error)(struct dwchip_s *, int); +}; + +/*! + * + * + * ----------------------------------------------------------------------------- + * functions that must be defined externally + * NB: In porting this to a particular microprocessor, the implementer needs to + * define the low + * level abstract functions matching the selected hardware. + */ +struct dwt_spi_s +{ +/*! + * + * + * ----------------------------------------------------------------------------- + * @brief readfromspi + * Low level abstract function to read from the SPI + * Takes two separate byte buffers for write header and read data + * input parameters: + * @param headerLength - number of bytes header to write + * @param headerBuffer - pointer to buffer containing the 'headerLength' bytes + * of header to write + * @param readlength - number of bytes data being read + * @param readBuffer - pointer to buffer containing to return the data (NB: + * size required = headerLength + readlength) + * + * output parameters: + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ + int (*readfromspi)(uint16_t headerLength, /*const*/ uint8_t *headerBuffer, + uint16_t readlength, uint8_t *readBuffer); + +/*! + * + * + * ----------------------------------------------------------------------------- + * @brief writetospi + * Low level abstract function to write to the SPI + * Takes two separate byte buffers for write header and write data + * input parameters: + * @param headerLength - number of bytes header being written + * @param headerBuffer - pointer to buffer containing the 'headerLength' bytes + * of header to be written + * @param bodylength - number of bytes data being written + * @param bodyBuffer - pointer to buffer containing the 'bodylength' bytes od + * data to be written + * + * output parameters: + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ + int (*writetospi)(uint16_t headerLength, const uint8_t *headerBuffer, + uint16_t bodyLength, const uint8_t *bodyBuffer); + +/*! + * + * + * ----------------------------------------------------------------------------- + * @brief writetospiwithcrc + * Low level abstract function to write to the SPI, this should be used when + * DW3000 SPI CRC mode is used + * Takes two separate byte buffers for write header and write data + * input parameters: + * @param headerLength - number of bytes header being written + * @param headerBuffer - pointer to buffer containing the 'headerLength' bytes + * of header to be written + * @param bodylength - number of bytes data being written + * @param bodyBuffer - pointer to buffer containing the 'bodylength' bytes od + * data to be written + * @param crc8 - 8-bit crc, calculated on the header and data bytes + * + * output parameters: + * returns DWT_SUCCESS for success, or DWT_ERROR for error + */ + int (*writetospiwithcrc)(uint16_t headerLength, const uint8_t *headerBuffer, + uint16_t bodyLength, const uint8_t *bodyBuffer, + uint8_t crc8); + + /*! + * + * + * --------------------------------------------------------------------------- + * @brief setslowrate + * Low level abstract function to switch the SPI into slow rate mode + * + * input parameters: + * + * output parameters + * + */ + void (*setslowrate)(void); + + /*! + * + * + * --------------------------------------------------------------------------- + * @brief setspifastrate + * Low level abstract function to switch the SPI into fast rate mode + * + * input parameters: + * + * output parameters + * + */ + void (*setfastrate)(void); +}; + +struct rxtx_configure_s +{ + dwt_config_t *pdwCfg; + dwt_txconfig_t *txConfig; + uint16_t frameFilter; + uint16_t frameFilterMode; + uint16_t txAntDelay; + uint16_t rxAntDelay; + uint16_t panId; + uint16_t shortadd; +}; + +typedef struct rxtx_configure_s rxtx_configure_t; + +struct dwt_mcps_config_s +{ + int mode; + int do_reset; + int led_mode; + int lnapamode; + int bitmask_lo; + int bitmask_hi; + int int_options; + struct dwt_configure_sleep_s sleep_config; + dwt_sts_cp_key_t *stsKey; /**< AES Key to be used to set the STS */ + dwt_sts_cp_iv_t *stsIv; /**< AES IV to be used to set the initial IV */ + rxtx_configure_t *rxtx_config; + uint8_t xtalTrim; + uint8_t cia_enable_mask; + uint8_t loadIv; + uint8_t event_counter; +}; + +typedef struct dwt_mcps_config_s dwt_mcps_config_t; + +/*The contract is that we have the SPI interface to the DW chip*/ +struct dwchip_s +{ + /*HAL*/ + struct dwt_spi_s *SPI; // first + void(*wakeup_device_with_io)(void); + + /*Driver*/ + struct dwt_driver_s *dwt_driver; + struct dwt_callbacks_s callbacks; + + /* driver configuration */ + struct dwt_mcps_config_s *config; + + /* MCPS */ + struct mcps802154_llhw *llhw; + struct mcps802154_ops *mcps_ops; + struct dw3000_calibration_data *calib_data; + struct dwt_mcps_runtime_s *mcps_runtime; + struct dwt_mcps_rx_s *rx; + + /* GPIO used to switch off WIFI while transmitting, for example */ + int8_t coex_gpio_pin; + int8_t coex_gpio_active_state; + + /** driver data*/ + void *priv; // last +}; + +typedef struct dwchip_s dwchip_t; + +struct dw_rx_frame_info_s +{ + uint32_t rx_date_dtu; + uint32_t rx_timeout_pac; + int rx_delayed; +}; + +struct dw_tx_frame_info_s +{ + uint32_t tx_date_dtu; /* 4ns time units: */ + int rx_delay_dly; /* sy: 1.0256us */ + uint32_t rx_timeout_pac; /* SFD Timeout ? */ + int flag; /* flag */ + +#ifndef MCPS_RANGING_BIT +#define MCPS_RANGING_BIT 0x40 +#endif +}; + +struct dw_addr_filt_s; + +struct dwt_ops_s +{ + int (*configure)(struct dwchip_s *dw, dwt_config_t *config); + int (*write_tx_data)(struct dwchip_s *dw, uint16_t txDataLength, + uint8_t *txDataBytes, uint16_t txBufferOffset); + void (*write_tx_fctrl)(struct dwchip_s *dw, uint16_t txFrameLength, + uint16_t txBufferOffset, uint8_t ranging); + void (*read_rx_data)(struct dwchip_s *dw, uint8_t *buffer, uint16_t length, + uint16_t rxBufferOffset); + void (*read_acc_data)(struct dwchip_s *dw, uint8_t *buffer, uint16_t length, + uint16_t accOffset); + void (*read_rx_timestamp)(struct dwchip_s *dw, uint8_t *timestamp); + void (*configure_tx_rf)(struct dwchip_s *dw, dwt_txconfig_t *config); + void (*set_interrupt)(struct dwchip_s *dw, uint32_t bitmask_lo, + uint32_t bitmask_hi, dwt_INT_options_e INT_options); + int (*rx_enable)(struct dwchip_s *dw, int mode); + int (*initialize)(struct dwchip_s *dw, int mode); + void (*xfer)(struct dwchip_s *dw, uint32_t regFileID, uint16_t index, + uint16_t length, uint8_t *buffer, const spi_modes_e mode); + + int (*ioctl)(struct dwchip_s *, dwt_ioctl_e, int parm, void *ptr); + + void (*isr)(struct dwchip_s *); + + void * (*dbg_fn)(struct dwchip_s *, dwt_ioctl_e, int parm, void *ptr); +}; + +struct dwt_mcps_ops_s +{ + int (*init)(struct dwchip_s *); + void (*deinit)(struct dwchip_s *); + int (*tx_frame)(struct dwchip_s *, uint8_t *data, size_t len, + struct dw_tx_frame_info_s *info); + int (*rx_enable)(struct dwchip_s *, struct dw_rx_frame_info_s *info); + int (*rx_disable)(struct dwchip_s *); + uint64_t (*get_timestamp)(struct dwchip_s *); + void (*get_rx_frame)(struct dwchip_s *, uint8_t *ptr, size_t len); + int (*set_hrp_uwb_params)(struct dwchip_s *, int prf, int fsr, + int sfd_selector, int phr_rate, int data_rate); + int (*set_channel)(struct dwchip_s *, int page, int channel, + int preamble_code); + int (*set_hw_addr_filt)(struct dwchip_s *, struct dw_addr_filt_s *file, + int changed); + + // Compat direct-access fns - Used in dw3000_mcps_mcu.c . This is required for + // compatibility purpose with some MCPS functions + struct mcps_compat_ + { + int (*sys_status_and_or)(struct dwchip_s *dw, uint32_t _and, uint32_t _or); + void (*ack_enable)(struct dwchip_s *dw, int enable); + void (*set_interrupt)(struct dwchip_s *dw, uint32_t bitmask_lo, + uint32_t bitmask_hi, dwt_INT_options_e INT_options); + } mcps_compat; + + int (*ioctl)(struct dwchip_s *, dwt_ioctl_e, int parm, void *ptr); + + void (*isr)(struct dwchip_s *); +}; + +struct dwt_driver_s +{ + uint32_t devid; + uint32_t devmatch; + const char *name; + const char *version; + const struct dwt_ops_s *dwt_ops; + const struct dwt_mcps_ops_s *dwt_mcps_ops; + uint32_t vernum; +}; + +/* STD interface fn() */ +int interface_init(struct dwchip_s *p); +void interface_deinit(struct dwchip_s *p); +int interface_tx_frame(struct dwchip_s *dw, + uint8_t *data, + size_t len, + struct dw_tx_frame_info_s *info); +int interface_rx_enable(struct dwchip_s *dw, struct dw_rx_frame_info_s *info); +int interface_rx_disable(struct dwchip_s *dw); +uint64_t interface_get_timestamp(struct dwchip_s *dw); +void interface_read_rx_frame(struct dwchip_s *dw, uint8_t *ptr, size_t len); + +#endif /* DECA_INTERFACE_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_types.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_types.h new file mode 100644 index 00000000..549bf760 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_types.h @@ -0,0 +1,90 @@ +/*! ---------------------------------------------------------------------------- + * @file deca_types.h + * @brief Decawave general type definitions + * + * @attention + * + * Copyright 2013 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#ifndef _DECA_TYPES_D0_H_ +#define _DECA_TYPES_D0_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +#ifdef STM32F429xx +#ifndef uint8_t +#ifndef _DECA_UINT8_ +#define _DECA_UINT8_ +typedef unsigned char uint8_t; +#endif +#endif + +#ifndef uint16_t +#ifndef _DECA_UINT16_ +#define _DECA_UINT16_ +typedef unsigned short uint16_t; +#endif +#endif + +#ifndef uint32_t +#ifndef _DECA_UINT32_ +#define _DECA_UINT32_ +typedef unsigned long uint32_t; +#endif +#endif + +#ifndef int8_t +#ifndef _DECA_INT8_ +#define _DECA_INT8_ +typedef signed char int8_t; +#endif +#endif + +#ifndef int16_t +#ifndef _DECA_INT16_ +#define _DECA_INT16_ +typedef signed short int16_t; +#endif +#endif + +#ifndef int32_t +#ifndef _DECA_INT32_ +#define _DECA_INT32_ +typedef signed long int32_t; +#endif +#endif + +#ifndef uint64_t +#ifndef _DECA_UINT64_ +#define _DECA_UINT64_ +typedef unsigned long long uint64_t; +#endif +#endif + +#ifndef int64_t +#ifndef _DECA_INT64_ +#define _DECA_INT64_ +typedef signed long long int64_t; +#endif +#endif +#endif // STM32F429xx + +#ifndef NULL +#define NULL ((void *)0UL) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* DECA_TYPES_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_version.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_version.h new file mode 100644 index 00000000..39cf0c77 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/deca_version.h @@ -0,0 +1,40 @@ +/*! ---------------------------------------------------------------------------- + * @file deca_version.h + * @brief Defines the version info for the DW3XXX device driver including its + * API + * + * @attention + * + * Copyright 2017 - 2021 (c) Decawave Ltd, Dublin, Ireland. + * + * All rights reserved. + * + */ + +#ifndef _DECA_VERSION_DW3XXX_H_ +#define _DECA_VERSION_DW3XXX_H_ 1 + +// +// The DW3XXX device driver is separately version numbered to any version the +// application using it may have +// +// Two symbols are defined here: one hexadecimal value and one string that +// includes the hex bytes. +// Both should be updated together in a consistent way when the software is +// being modified. +// +// The format of the hex version is 0xAABBCC and the string ends with AA.BB.CC, +// where... +// +// Quantity CC is updated for minor changes/bug fixes that should not need user +// code changes +// Quantity BB is updated for changes/bug fixes that may need user code changes +// Quantity AA is updated for major changes that will need user code changes +// + +#define DRIVER_NAME "DW3XXX" + +#define DRIVER_VERSION_HEX 0x060007 +#define DRIVER_VERSION_STR "DW3XXX Device Driver Version 06.00.07" + +#endif diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/error.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/error.h new file mode 100644 index 00000000..3e5a32f1 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/error.h @@ -0,0 +1,106 @@ +/** + * @file error.h + * + * @brief Header file for errors + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef INC_ERROR_H_ +#define INC_ERROR_H_ + +// #include + +typedef enum { + _NO_ERR = 0, + _ERR, + _ERR_Busy, + _ERR_Timeout, + _ERR_DEVID, + _ERR_IWDG, + _ERR_INSTANCE, + _ERR_INIT, + _ERR_IMU_INIT, + _ERR_TxBuf_Overflow, + _ERR_RxBuf_Overflow, + _ERR_Usb_Tx, + _ERR_Flash_Ob, + _ERR_Flash_Prog, + _ERR_Flash_Erase, + _ERR_Flash_Error, + _ERR_Flash_Verify, + _ERR_Flash_Protected, + _ERR_LSM_R, + _ERR_LSM_W, + _ERR_SPI, + _ERR_SPI_RRX, + _ERR_SPI_WTX, + _ERR_SPI_DMA, + _ERR_UART_DMA, + _ERR_UART_INIT, + _ERR_UART_RX, + _ERR_UART_TX, + _ERR_UART_RxCplt, + _ERR_UART_RxCplt_Overflow, + _ERR_USB_UART_RX, + _ERR_TCFM, + _ERR_TWR_CANNOT_START, + _ERR_MEM_CORRUPTED, + _ERR_Configure_WKUP_Timer, + _ERR_PLL, + +/*TWR*/ + _ERR_Twr_Bad_State, + _ERR_Not_Twr_Frame, + _ERR_Unknown_Tag, + _ERR_DelayedTX_Late, + _ERR_Range_Calculation, + _ERR_Ranging_Config, + _ERR_RC_Version_Unknown, + _ERR_Non_Compatible_TWR_Parameters, + _NO_Err_New_Tag, + _NO_Err_Tx_Sent, + _NO_Err_Start_Rx, + _NO_Err_Final, + _NO_Err_Ranging_Config, + _NO_Err_Ranging_Update, + _NO_Err_Response, + _NO_Err_Idata, + _NO_Err_Rdata, + _NO_Err_Can_Sleep, + +/*USB2SPI*/ + _ERR_Usb2Spi_ptr_busy, + _ERR_Usb2Spi_ptr_alloc, + +/*RTOS*/ + _ERR_General_Error, + _ERR_Create_Task_Bad, + _ERR_Timer_Create_Bad, + _ERR_Timer_Start_Bad, + _ERR_Signal_Bad, + _ERR_Cannot_Delete_Timer, + _ERR_Cannot_Delete_Task, + _ERR_Cannot_Delete_usb2spiTask, + _ERR_Cannot_Delete_tcfmTask, + _ERR_Cannot_Delete_tcwmTask, + _ERR_Cannot_Delete_imuTask, + _ERR_Cannot_Delete_rtlsTask, + _ERR_Cannot_Delete_rxTask, + _ERR_Cannot_Delete_calcTask, + _ERR_Cannot_Delete_twrTask, + _ERR_Cannot_Delete_commTask, + _ERR_Cannot_Send_Mail, + _ERR_Cannot_Alloc_Mail, + _ERR_Cannot_Alloc_Memory, + _ERR_Cannot_Alloc_NodeMemory, + _ERR_Malloc_Failed, // 71 + _ERR_Stack_Overflow, + _ERR_No_pTwrInfo +}error_e; + +#endif /* INC_ERROR_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/rtls_interface.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/rtls_interface.h new file mode 100644 index 00000000..c1956408 --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/rtls_interface.h @@ -0,0 +1,415 @@ +/** + * @file rtls_interface.h + * + * @brief Decawave RTLS CLE / RTLS anchor common definitions / APIs + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef RTLS_INTERFACE_H_ +#define RTLS_INTERFACE_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "uwb_frames.h" + +// Protocol structs and enums : +enum RTLS_CMD { + RTLS_CMD_PARM_STOP = 0, RTLS_CMD_PARM_START = 1, + + RTLS_CMD_REQ_CFG = 0x42, // Anchor: request configuration + RTLS_CMD_SET_CFG_CCP = 0x44, // CLE: response on RTLS_CMD_REQ_CFG request + + // Anchor -> LE + RTLS_CMD_DEBUG = 0x37, // Anchor: Debug Message + + RTLS_CMD_REPORT_TOA = 0x3A, // v.3 TDOA + RTLS_CMD_REPORT_TOA_EX = 0x3B, // v.3 TDOA with extra data (e.g. IMU data) + RTLS_CMD_REPORT_TX_CS = 0x3E, // v.3 CCP Tx report + RTLS_CMD_REPORT_RX_CS = 0x3F, // v.3 CCP Rx report + + RTLS_CMD_REPORT_TX_CS_V4 = 0x30, // v.4 CCP Tx report + RTLS_CMD_REPORT_RX_CS_V4 = 0x31, // v.4 CCP Rx report + RTLS_CMD_REPORT_TOA_V4 = 0x32, // v.4 TDOA with FP + RTLS_CMD_REPORT_TOA_IMU_V4 = 0x33, // v.4 TDOA with FP and IMU data + + // LE -> Anchor + RTLS_COMM_TEST_START_REQ = 0x53, + RTLS_COMM_TEST_RESULT_REQ = 0x54, + RTLS_RANGE_MEAS_REQ = 0x55, + RTLS_INIT_REQ = 0x56, + RTLS_START_REQ = 0x57, + RTLS_POWER_TEST_START_REQ = 0x58, + RTLS_RESET_REQ = 0x59, + RTLS_SINGLE_TWR_MODE_REQ = 0x5A, + RTLS_ASYMM_TWR_MODE_REQ = 0x5B, + + RTLS_CFG_IND = 0x80, + RTLS_COMM_TEST_DONE_IND = 0x81, + RTLS_COMM_TEST_RESULT_IND = 0x82, + RTLS_RANGE_MEAS_IND = 0x83, + RTLS_RANGE_MEAS_IND_FINAL = 0x84, + RTLS_POWER_TEST_DONE_IND = 0x85, + + RTLS_TEMP_VBAT_IND = 0x87, // Temperature and VBAT + RTLS_LOG_ACCUMULATOR_REQ = 0x88, // Request Accumulator for CCP or Blink + RTLS_LOG_ACCUMULATOR_IND = 0x91 // Accumulator Report for CCP or Blink +}; + +#define RTLS_CMD_SET_CFG_CCP_LEN sizeof(cmd_config_t) +#define RTLS_POWER_TEST_START_LEN sizeof(cmd_power_test_t) +#define RTLS_COMM_TEST_START_LEN sizeof(cmd_comm_test_t) +#define RTLS_COMM_TEST_RESULT_REQ_LEN (1) +#define RTLS_RANGE_MEAS_REQ_LEN (21) +#define RTLS_SINGLE_TWR_MODE_REQ_LEN (17) +#define RTLS_ASYMM_TWR_MODE_REQ_LEN (27) +#define RTLS_START_REQ_LEN (2) +#define RTLS_LOG_ACC_REQ_LEN (4) +#define RTLS_RESET_REQ_LEN (18) + +#define RTLS_CMD_REPORT_TOA_LEN (16) + +/* minimum length of longer TDoA report, extra byte, specifying extra data + * length */ +#define RTLS_CMD_REPORT_TOA_EX_LEN (17) +#define RTLS_CMD_REPORT_TX_CS_LEN (8) +#define RTLS_CMD_REPORT_RX_CS_LEN (16) + +#define RTLS_CMD_REPORT_TOA_V4_LEN (18) +#define RTLS_CMD_REPORT_TX_CS_V4_LEN (8) +#define RTLS_CMD_REPORT_RX_CS_V4_LEN (18) + +#define RTLS_CMD_DEBUG_LEN (3) + +#define RTLS_POWER_TEST_DONE_IND_LEN (1) +#define RTLS_COMM_TEST_DONE_IND_LEN (1) +#define RTLS_COMM_TEST_RESULT_IND_LEN (5) +#define RTLS_RANGE_MEAS_IND_LEN (14) +#define RTLS_TEMP_VBAT_IND_LEN (12) + +/* 1 byte (MSG ID) + 1 byte frame type (CCP or Blink) + 1 byte seq Num + + * 4 bytes log Num + 8 bytes of source address (CCP Master or Blink Tag) + */ +#define RTLS_ACC_LOG_HEADER_LEN (15) + +/* fpIndex, maxNoise, firstPathAmp1, stdNoise, firstPathAmp2, firstPathAmp3, + * maxGrowthCIR, rxPreamCount + */ +#define RTLS_ACC_LOG_REG_LEN (16) + +/* 16M PRF is 992*4+1 */ +#define RTLS_DW_ACCUMULATOR_LEN_16 (992 * 4 + 1) + +/* 64M PRF is 1016*4+1 */ +#define RTLS_DW_ACCUMULATOR_LEN_64 (1016 * 4 + 1) + +#define RTLS_LOG_ACCUMULATOR_IND_LEN_16 (RTLS_ACC_LOG_HEADER_LEN \ + + RTLS_ACC_LOG_REG_LEN \ + + \ + RTLS_DW_ACCUMULATOR_LEN_16) +#define RTLS_LOG_ACCUMULATOR_IND_LEN_64 (RTLS_ACC_LOG_HEADER_LEN \ + + RTLS_ACC_LOG_REG_LEN \ + + \ + RTLS_DW_ACCUMULATOR_LEN_64) +#define RTLS_LOG_ACCUMULATOR_IND_LEN (( \ + RTLS_LOG_ACCUMULATOR_IND_LEN_16 \ + < \ + RTLS_LOG_ACCUMULATOR_IND_LEN_64) \ + ? \ + RTLS_LOG_ACCUMULATOR_IND_LEN_16 \ + : \ + RTLS_LOG_ACCUMULATOR_IND_LEN_64) + +/* accumulator reading is only used to read blinks and CCPs */ +#define ACCUM_TYPE_BLINK 0xA1 + +/* accumulator reading is only used to read blinks and CCPs */ +#define ACCUM_TYPE_CCP 0xA2 + +#define DWT_DIAGNOSTIC_LOG_REV_5 (5) +#define DWT_DIAGNOSTIC_LOG_V_5 (5) +#define DWT_SIZEOFDIAGNOSTICDATA_5 (66) +#define DWT_SIZE_OF_IMUDATA (30) + +#define DWT_LOG_NUM_SIZE (4) + +/* The data is framed as follows : + *.....> + * STX = 0x2 + * LEN is the length of data message(16 bits) + * CRC is the 16 - bit CRC of the data bytes + * ETX = 0x3 + * FC = is the function code(API code) + * + */ +#define FRAME_HEADER_LEN (6) +#define FRAME_START_IDX (0) +#define FRAME_LENGTH_IDX (1) +#define FRAME_DATA_IDX (3) + +enum RTLS_DATA { + RTLS_DATA_ANCHOR_REQ = 0x41, + + RTLS_DATA_ANCHOR = 0x61, + RTLS_DATA_BLINK = 0x62, + RTLS_DATA_STATS = 0x63, + RTLS_DATA_IMU = 0x64, + RTLS_DATA_BLINK_EXT = 0x65 +}; + +/* Network commands + * use byte access if in doubt + */ + +#define UN16(x) union { uint16_t x ## 16; uint8_t x[2];} + +#define UN32(x) union { uint32_t x ## 32; uint8_t x[4];} + +/* Wire format of messages from Anchor to CLE */ +#pragma pack (push, 1) + +/* Standard Diagnostics v5 */ +struct diag_v5_s { + // NOTE: diagnostics data format rev 5 (DWT_DIAGNOSTIC_LOG_REV_5) + uint8_t header; // 00 this could be a header (format version number) + uint8_t r0F[5]; // 01 register 0xF - length 5 bytes + uint8_t r10[4]; // 06 register 0x10 - length 4 bytes + uint8_t r12[8]; // 10 register 0x12 - length 8 bytes + uint8_t r13[4]; // 18 register 0x13 - length 4 bytes + uint8_t r14[5]; // 22 register 0x14 - length 5 bytes + uint8_t r15[14]; // 27 register 0x15 - length 14 bytes (5 TS, 2 FP, 2 + // Diag, 5 TSraw) + uint8_t r25[16]; // 41 register 0x25 @FP (first path) -> 16 bytes + // starting at FP + 1 dummy + uint8_t r2E[2]; // 58 register 0x2E (0x1000) - 2 bytes + uint8_t r27[4]; // 60 register 0x27 (0x28) - 4 bytes + uint8_t r2E2[2]; // 64 register 0x2E (0x1002) - 2 bytes + uint8_t dummy; + // 66 total +}; + +typedef struct diag_v5_s diag_v5_t; + +struct ccp_rx_v4_s { + uint8_t type; // 0 : type = CCP RX timestamp + uint8_t seqNum; // 1 : CCP Seq Num + uint8_t masterID[ADDR_BYTE_SIZE_L]; // 2-9 : master anchor ID (that sent + // the CCP frame) + uint8_t csRxTime[TS_40B_SIZE]; // 10-14 : CCP Rx time + UN16(firstPath); // 15-16 : raw Firstpath + uint8_t extLen; // 17 : length of ext below +}; + +typedef struct ccp_rx_v4_s ccp_rx_v4_t; + +struct toa_v4_s { + uint8_t type; // 0 : type = TOA report + uint8_t seqNum; // 1 : Blink message sequence number + uint8_t tagID[ADDR_BYTE_SIZE_L]; // 2-9 : tag ID + uint8_t rawTOA[TS_40B_SIZE]; // 10-14 : raw timestamp + UN16(firstPath); // 15-16 : raw Firstpath + uint8_t extLen; // 17 : length of ext below +}; + +typedef struct toa_v4_s toa_v4_t; + +/* RTLS_CMD_REPORT_TOA_IMU_V4 */ +struct report_toa_imu_v4_s { + toa_v4_t toa; + union { + uint8_t ext[DWT_SIZE_OF_IMUDATA + sizeof(uint32_t) + sizeof(diag_v5_t)]; + struct { + uint8_t dataIMU[DWT_SIZE_OF_IMUDATA]; // : IMU data sent from the + // tag(2 (ench + exth) + 1 + // (dwh)+27 (dwp)) + UN32(logNum); + diag_v5_t diag; + }; + }; +}; + +typedef struct report_toa_imu_v4_s report_toa_imu_v4_t; + +/* RTLS_CMD_REPORT_TOA_V4 */ +struct report_toa_v4_s { + toa_v4_t toa; + union { + uint8_t ext[sizeof(uint32_t) + sizeof(diag_v5_t)]; + struct { + UN32(logNum); + diag_v5_t diag; + }; + }; +}; + +typedef struct report_toa_v4_s report_toa_v4_t; + +/* RTLS_CMD_REPORT_RX_CS_V4 */ +struct report_ccp_rx_v4_s { + ccp_rx_v4_t ccp; + + union { + uint8_t ext[sizeof(uint32_t) + sizeof(diag_v5_t)]; + struct { + UN32(logNum); + diag_v5_t diag; + }; + }; +}; + +typedef struct report_ccp_rx_v4_s report_ccp_rx_v4_t; + +/* RTLS_CMD_REPORT_TX_CS_V4 */ +struct report_ccp_tx_v4_s { + uint8_t type; // 0 : type = CCP TX timestamp + uint8_t seqNum; // 1 : CCP Seq Num + uint8_t csTxTime[TS_40B_SIZE]; // 2-6 : CCP Tx time + uint8_t extLen; // 7 : length of ext below + union { + uint8_t ext[sizeof(uint32_t)]; + UN32(logNum); + }; +}; + +typedef struct report_ccp_tx_v4_s report_ccp_tx_v4_t; + +/* RTLS_TEMP_VBAT_IND */ +struct report_temp_vbat_s { + uint8_t type; // 0: type = Battery abnd Voltage Level + // report + uint8_t bat; // 1 : battery voltage value + uint8_t temp; // 2 : temperature value + UN16(atemp); // 3-4 : ambient Sensor + // temperature value + uint8_t apress[3]; // 5-7 : ambient Sensor pressure + // value + UN32(logNum); // 8-11 : log number +}; + +typedef struct report_temp_vbat_s report_temp_vbat_t; + +/* to be structured: + * RTLS_COMM_TEST_RESULT_REQ + * RTLS_START_REQ + * RTLS_LOG_ACCUMULATOR_REQ + * RTLS_RESET_REQ + */ + +/* RTLS_CMD_SET_CFG_CCP */ +struct cmd_config_s { + uint8_t command; // 0 + uint8_t id; // 1 + uint8_t master; // 2 + uint8_t prf_ch; // 3 + uint8_t datarate; // 4 + uint8_t code; // 5 + uint8_t txPreambLength; // 6 + uint8_t nsSFD_rxPAC; // 7 + UN16(delay_rx); // 8-9 + UN16(delay_tx); // 10-11 + uint8_t free_12; // 12 + uint8_t debug_logs; // 13 + uint8_t eui64_to_follow[8]; // 14-21 + UN32(lag_delay); // 22-25 +}; + +typedef struct cmd_config_s cmd_config_t; + +/* RTLS_SINGLE_TWR_MODE_REQ */ +struct cmd_twr_single_s { + uint8_t command; // 0 : RTLS_SINGLE_TWR_MODE_REQ + uint8_t role; // 1 : initiator==1 responder==0 + uint8_t use_ant_delay; // 2 + UN16(delay_tx); // 3-4 + UN16(delay_rx); // 5-6 + UN16(response_delay); // 7-8 + UN16(addr); // 9-10 + uint8_t lna_on; // 11 + UN32(power); // 12-15 + uint8_t log_all; // 16 +}; + +typedef struct cmd_twr_single_s cmd_twr_single_t; + +/* RTLS_RANGE_MEAS_REQ */ +struct cmd_twr_s { + uint8_t command; // 0 : RTLS_RANGE_MEAS_REQ + uint8_t log_all; // 1 + uint8_t role; // 2 + UN16(num_ranges); // 3-4 + uint8_t use_ant_delay; // 5 + UN16(delay_tx); // 6-7 + UN16(delay_rx); // 8-9 + UN16(response_delay); // 10-11 + UN16(initiator_addr); // 12-13 + UN16(responder_addr); // 14-15 + uint8_t lna_on; // 16 + UN32(power); // 17-20 +}; + +typedef struct cmd_twr_s cmd_twr_t; + +/* RTLS_RANGE_MEAS_REQ */ +struct cmd_twr_asymm_s { + uint8_t command; // 0 : RTLS_RANGE_MEAS_REQ + uint8_t log_all; // 1 + uint8_t role; // 2 + UN16(num_ranges); // 3-4 + uint8_t use_ant_delay; // 5 + UN16(delay_tx); // 6-7 + UN16(delay_rx); // 8-9 + UN16(response_delay); // 10-11 + UN16(final_delay); // 12-13 + UN16(report_delay); // 14-15 + UN16(poll_period); // 16-17 + UN16(initiator_addr); // 18-19 + UN16(responder_addr); // 20-21 + uint8_t lna_on; // 22 + UN32(power); // 23-26 +}; + +typedef struct cmd_twr_asymm_s cmd_twr_asymm_t; + +/* RTLS_POWER_TEST_START_REQ */ +struct cmd_power_test_s { + uint8_t command; // 0 + uint8_t start; // 1 + UN16(duration); // 2-3 +}; + +typedef struct cmd_power_test_s cmd_power_test_t; + +/* RTLS_COMM_TEST_START_REQ */ +struct cmd_comm_test_s { + uint8_t command; // 0 + uint8_t transmit[1]; // 1 + UN16(data); // 2-3 +}; + +typedef struct cmd_comm_test_s cmd_comm_test_t; + +/* */ +struct request_configCle_s +{ + uint8_t head; + uint8_t uid[ADDR_BYTE_SIZE_L]; + char ver[64 - (ADDR_BYTE_SIZE_L + 1)]; // hardcoded to be 64 bytes long +}; + +typedef struct request_configCle_s request_configCle_t; + +#pragma pack(pop) + +#undef UN16 +#undef UN32 + +#ifdef __cplusplus +} +#endif +#endif //RTLS_INTERFACE_H diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/uwb_frames.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/uwb_frames.h new file mode 100644 index 00000000..4e68e5fe --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/uwb_frames.h @@ -0,0 +1,450 @@ +/** + * @file uwb_frames.h + * + * @brief UWB message frames definitions and typedefs + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef UWB_FRAMES_H_ +#define UWB_FRAMES_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define STANDARD_FRAME_SIZE 127 + +#define ADDR_BYTE_SIZE_L (8) +#define ADDR_BYTE_SIZE_S (2) + +#define TS_40B_SIZE (5) +#define TS_UWB_SIZE (5) + +#define FRAME_CONTROL_BYTES 2 +#define FRAME_SEQ_NUM_BYTES 1 +#define FRAME_PANID 2 +#define FRAME_CRC 2 +#define FRAME_SOURCE_ADDRESS_S (ADDR_BYTE_SIZE_S) +#define FRAME_DEST_ADDRESS_S (ADDR_BYTE_SIZE_S) +#define FRAME_SOURCE_ADDRESS_L (ADDR_BYTE_SIZE_L) +#define FRAME_DEST_ADDRESS_L (ADDR_BYTE_SIZE_L) + +/* 5 Bytes */ +#define FRAME_CTRLP (FRAME_CONTROL_BYTES + FRAME_SEQ_NUM_BYTES \ + + FRAME_PANID) + +/* 21 bytes for 64-bit addresses) */ +#define FRAME_CTRL_AND_ADDRESS_L (FRAME_DEST_ADDRESS_L \ + + FRAME_SOURCE_ADDRESS_L + FRAME_CTRLP) + +/* 9 bytes for 16-bit addresses) */ +#define FRAME_CTRL_AND_ADDRESS_S (FRAME_DEST_ADDRESS_S \ + + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) + +/* 15 bytes for 1 16-bit address and 1 64-bit address) */ +#define FRAME_CTRL_AND_ADDRESS_LS (FRAME_DEST_ADDRESS_L \ + + FRAME_SOURCE_ADDRESS_S + FRAME_CTRLP) + +/* 127 - 21 - 2 = 104 */ +#define MAX_USER_PAYLOAD_STRING_LL (STANDARD_FRAME_SIZE \ + - FRAME_CTRL_AND_ADDRESS_L - FRAME_CRC) + +/* 127 - 9 - 2 = 116 */ +#define MAX_USER_PAYLOAD_STRING_SS (STANDARD_FRAME_SIZE \ + - FRAME_CTRL_AND_ADDRESS_S - FRAME_CRC) + +/* 127 - 15 - 2 = 110 */ +#define MAX_USER_PAYLOAD_STRING_LS (STANDARD_FRAME_SIZE \ + - FRAME_CTRL_AND_ADDRESS_LS - FRAME_CRC) + +#define FRAME_DEST_ADDRESS_S_IDX (FRAME_CTRLP) +#define FRAME_SRC_ADDRESS_S_IDX (FRAME_CTRLP + ADDR_BYTE_SIZE_S) +// NOTE: the user payload assumes that there are only 88 "free" bytes to be used +// for the user message (it does not scale according to the addressing modes) +#define MAX_USER_PAYLOAD_STRING MAX_USER_PAYLOAD_STRING_LL + +#define RC_VERSION_PDOA (3) +#define RC_VERSION_DR (4) + +enum { + Head_Msg_BLINK = 0xC5, + Head_Msg_STD = (0x40 | 0x01), + Head_Msg_STD_AR = (0x40 | 0x20 | 0x01), + Frame_Ctrl_SS = (0x80 | 0x08), // Message addressing: destination + // short (16-bit), source short + // (16-bit) + Frame_Ctrl_LS = (0x80 | 0x0C), // Message addressing: destination + // long (64-bit), source short + // (16-bit) + Frame_Ctrl_MASK = 0xCC +}; + +/* enumeration of function codes used in PDoA TWR protocol */ +typedef enum { + Twr_Fcode_Not_Defined = 0xFF, // Special : nothing + Twr_Fcode_Blink = 0xEE, // Special : Blink + Twr_Fcode_Rng_Config = 0x20, // Responder (Node) Ranging Config + // message : reply to blink + Twr_Fcode_Tag_Poll = 0x84, // Initiator (Tag) Poll message + // : twr start + // message + Twr_Fcode_Resp_Ext = 0x72, // Responder (Node) Response Extended + // : reply to Poll with + // X/Y previous results + Twr_Fcode_Tag_Final = 0x88, // Initiator (Tag) Final message back + // to Responder : reply to Response + Twr_Fcode_Tag_Accel_Final = 0x89, // Initiator (Tag) Final message back + // to Responder : reply to Response + + // Accelerometer data +}fcode_e; + +// TDOA TWR +enum { + RTLS_TWR_MSG_RNG_INIT = Twr_Fcode_Rng_Config, // Ranging + // initiation + // message + RTLS_TWR_MSG_TAG_POLL = 0x81, // Initiator (Tag) poll message + RTLS_TWR_MSG_ANCH_RESP = 0x70, // Responder (Anchor) response to + // poll + RTLS_TWR_MSG_TAG_FINAL = 0x82, // Initiator (Tag) final message + // back to Responder + RTLS_TWR_MSG_ANCH_TOFR = 0x71, // Responder (Anchor) TOF Report + // message to Initiator + + RTLS_MSG_ANCH_CLK_SYNC = 0x2C, // Anchor CLK SYNC message + // (broadcast) + + HEAD_MSG_BLINK = Head_Msg_BLINK, // Tag standard Blink + // message + HEAD_MSG_STD = Head_Msg_STD, // Std message header + + APP_MSG_DATA = 0x7A, // Data Transfer Message (this is + // Communications Test function + // code) + + APP_MSG_UWB_BH_DWNSTREAM = 0x7B, // UWB Command from CLE via Master + // to Slave + APP_MSG_UWB_BH_UPSTREAM = 0x7C, // UWB Data Backhaul back from Slave + // to CLE via Master +}; + +/* UWB packet types : MAC headers */ +typedef struct +{ + uint8_t frameCtrl[2]; // frame control bytes 00-01 + uint8_t seqNum; // sequence_number 02 + uint8_t panID[2]; // PAN ID 03-04 + uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06 + uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 07-08 +}__attribute__((packed)) +mac_header_ss_t; + +typedef struct +{ + uint8_t frameCtrl[2]; // frame control bytes 00-01 + uint8_t seqNum; // sequence_number 02 + uint8_t panID[2]; // PAN ID 03-04 + uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 or using 64 bit + // addresses (05-12) + uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 13-20 or using 64 bit + // addresses (13-20) +}__attribute__((packed)) +mac_header_ll_t; + +typedef struct +{ + uint8_t frameCtrl[2]; // frame control bytes 00-01 + uint8_t seqNum; // sequence_number 02 + uint8_t panID[2]; // PAN ID 03-04 + uint8_t destAddr[ADDR_BYTE_SIZE_L]; // 05-12 using 64 bit addresses + uint8_t sourceAddr[ADDR_BYTE_SIZE_S]; // 13-14 +}__attribute__((packed)) +mac_header_ls_t; + +typedef struct +{ + uint8_t frameCtrl[2]; // frame control bytes 00-01 + uint8_t seqNum; // sequence_number 02 + uint8_t panID[2]; // PAN ID 03-04 + uint8_t destAddr[ADDR_BYTE_SIZE_S]; // 05-06 + uint8_t sourceAddr[ADDR_BYTE_SIZE_L]; // 7-14 using 64 bit addresses +}__attribute__((packed)) +mac_header_sl_t; + +/* General UWB packet types : Messages */ +typedef struct +{ + mac_header_ll_t mac; + uint8_t messageData[MAX_USER_PAYLOAD_STRING_LL]; // 21-124 + // (application + // data and any + // user payload) + uint8_t fcs[2]; // 125-126 we allow space for the CRC as it is + // logically part of the message. + // DW1000 calculates and adds these bytes. +}__attribute__((packed)) +std_msg_ll_t; + +typedef struct +{ + mac_header_ss_t mac; + uint8_t messageData[MAX_USER_PAYLOAD_STRING_SS]; // 09-124 + // (application + // data and any + // user payload) + uint8_t fcs[2]; +}__attribute__((packed)) +std_msg_ss_t; + +typedef struct +{ + mac_header_ls_t mac; + uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS]; // 15-124 + // (application + // data and any + // user payload) + uint8_t fcs[2]; +}__attribute__((packed)) +std_msg_ls_t; + +// 12 octets for Minimum IEEE ID blink +typedef struct +{ + uint8_t frameCtrl[1]; // frame control bytes 00 + uint8_t seqNum; // sequence_number 01 + uint8_t tagID[ADDR_BYTE_SIZE_L]; // 02-09 64 bit addresses + uint8_t fcs[2]; +}__attribute__((packed)) +blink_msg_t; + +/* Ranging Config rest of configuration. + * The Node's address and PanId, are in the MAC header */ +typedef struct +{ + /* Compatibility to the EVK's Ranging Init */ + uint8_t fCode; + uint8_t tagAddr[ADDR_BYTE_SIZE_S]; // tag's short address + uint8_t ANC_RESP_DLY[2]; // backward compatibility to EVK1000 RI + // message : delayRx_us + poll_us, + // coded in us with bit 15 == 0, coded + // in ms when bit 15 == 1 + uint8_t TAG_RESP_DLY[2]; // backward compatibility to EVK1000 RI + // message : , coded in us with bit 15 + // == 0, coded in ms when bit 15 == 1 + + /* PDOA TWR unique message */ + uint8_t version; // version + + uint8_t sframePeriod_ms[2]; // Super Frame period, ms + uint8_t pollTxToFinalTx_us[2]; // time from the RMARKER of Poll to the + // RMARKER of Final that the Tag shall + // set. + uint8_t delayRx_us[2]; // time from end of transmission of the Poll + // to start of reception of Response, that + // the Tag shall set. + uint8_t slotCorr_us[4]; // Slot correction for current reception + // (i.e. for blink), us + uint8_t pollMultFast[2]; // multiplier for fast ranging in Super + // Frame counts + uint8_t pollMultSlow[2]; // multiplier for slow ranging in Super + // Frame counts + + union + { + uint8_t mode[2]; // bitfields for mode of operation: IMU + // on/off, etc. + struct + { + uint8_t imuOn : 1; // currently only IMU ON switch is + // defined/used + }; + }; +}__attribute__((packed)) +rng_cfg_t; + +typedef struct +{ + uint8_t fCode; // msgdata+0 + uint8_t rNum; +}__attribute__((packed)) +poll_t; + +typedef struct +{ + uint8_t fCode; // msgdata+0 + uint8_t slotCorr_us[4]; + uint8_t rNum; + uint8_t x_cm[2]; // X coordinate of Tag wrt Node in + // centimeters [0..65535cm] + uint8_t y_cm[2]; // Y coordinate of Tag wrt Node in + // centimeters [0..65535cm] + uint8_t clkOffset_pphm[2]; // part per (hundreds of millions) = + // (100*ppm) +}__attribute__((packed)) +resp_tag_t; + +typedef struct +{ + uint8_t fCode; // msgdata+0 + uint8_t rNum; + uint8_t pollTx_ts[TS_UWB_SIZE]; + uint8_t responseRx_ts[TS_UWB_SIZE]; + uint8_t finalTx_ts[TS_UWB_SIZE]; + uint8_t flag; // 1 data bytes bitfields. IMU:0 + uint8_t acc_x[2]; // Normalized accel data X from the + // Tag, mg + uint8_t acc_y[2]; // Normalized accel data Y from the + // Tag, mg + uint8_t acc_z[2]; // Normalized accel data Z from the + // Tag, mg +}__attribute__((packed)) +final_accel_t; + +/* UWB packet types : Application-specific messages */ + +/* Ranging Config message during Discovery + * the Node's address and PanId are in the MAC header */ +typedef struct +{ + mac_header_ls_t mac; + rng_cfg_t rngCfg; + uint8_t fcs[2]; +}__attribute__((packed)) +rng_cfg_msg_t; + +typedef struct +{ + mac_header_ss_t mac; + rng_cfg_t rngCfg; + uint8_t fcs[2]; +}__attribute__((packed)) +rng_cfg_upd_msg_t; + +typedef struct +{ + mac_header_ss_t mac; + poll_t poll; + uint8_t fcs[2]; +}__attribute__((packed)) +poll_msg_t; + +typedef struct +{ + mac_header_ss_t mac; + resp_tag_t resp; + uint8_t fcs[2]; +}__attribute__((packed)) +resp_pdoa_msg_t; + +typedef struct +{ + mac_header_ss_t mac; + final_accel_t final; + uint8_t fcs[2]; +}__attribute__((packed)) +final_msg_accel_t; + +typedef struct +{ + mac_header_sl_t mac; + uint8_t messageData[1]; // 09 or 15 + // header(1) + uint8_t fcs[2]; // 15-16 or + // 21-22 we + // allow space + // for the CRC + // as it is + // logically + // part of the + // message. + // However + // ScenSor TX + // calculates + // and adds + // these bytes. +}__attribute__((__packed__)) +ccp_msg_t; + +typedef struct +{ + mac_header_sl_t mac; + uint8_t messageData[MAX_USER_PAYLOAD_STRING_LS]; // 15-124 (application + // data and any user + // payload) + uint8_t fcs[2]; // 125-126 we allow + // space for the CRC as + // it is logically part + // of the message. + // However ScenSor TX + // calculates and adds + // these bytes. +}__attribute__((packed)) +bcast_msg_t; + +// Up to 42 octets for extended blink message with IMU and other data as defined +// below +typedef struct +{ + uint8_t frameCtrl[1]; // frame control bytes 00 + uint8_t seqNum; // sequence_number 01 + uint8_t tagID[ADDR_BYTE_SIZE_L]; // 02-09 64 bit addresses + uint8_t ench; // 10 - encoding header + // (0x43: No Extended ID, no + // Temperature Data, No + // Battery Status) + uint8_t exth; // 11 - extension header + // (0x00: No blink + // Rate/Listening or other + // Data) + uint8_t dwh; // 12 - Decawave Blink + // Header: 0x01: SENSOR DATA + // TYPE 1 + // [According to ISO + // 24730-62, this octet and + // any subsequent data can + // only be interpreted if we + // identify from the Tag ID + // field that this is a + // Decawave tag] + uint8_t dwp[27]; // 13 - 39 Decawave Blink + // Payload – Defined below + // for Sensor Data Type 1 + // [0] - mask, [1] DWtemp, + // [2] DWvbat, [3] DWGPIO, + // [4-9] Magneto, [10-15] + // Accel, [16-21] Gyro, + // [22-24] Atmosph Pressure, + // [25-26] Atmosph Temp + uint8_t fcs[2]; // 40-41 we allow space for + // the CRC as it is + // logically part of the + // message. However ScenSor + // TX calculates and adds + // these bytes. +}__attribute__((packed)) +blinkIMU_msg_t; + +typedef struct +{ + uint8_t frameCtrl[2]; // frame control bytes + // 00-01 + uint8_t seqNum; // sequence_number 02 + uint8_t fcs[2]; // 03-04 CRC +}__attribute__((packed)) +ack_msg_t; + +typedef std_msg_ll_t std_msg_t; +typedef std_msg_ss_t twr_msg_t; + +#ifdef __cplusplus +} +#endif + +#endif /* UWB_FRAMES_H_ */ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/inc/version.h b/driver/thirdparty/decawave/uwb2_dwm3000/inc/version.h new file mode 100644 index 00000000..6903505f --- /dev/null +++ b/driver/thirdparty/decawave/uwb2_dwm3000/inc/version.h @@ -0,0 +1,111 @@ +/** + * @file version.h + * + * @brief version number + * Construct the version name as "MAJOR.MINOR.YYMMDD" + * VER_MAJOR 0..999 + * VER_MINOR 0..999 + * + * @author Decawave + * + * @attention Copyright 2017-2019 (c) Decawave Ltd, Dublin, Ireland. + * All rights reserved. + * + */ + +#ifndef VERSION_H_ +#define VERSION_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#define VER_MAJOR 6 +#define VER_MINOR 0 + +/** + * construction of the version name as "MAJOR.MINOR.YYMMDD" + * e.g. "Oct 7 2014" => "141007" + **/ + +#define YEAR_CH2 (__DATE__[9]) +#define YEAR_CH3 (__DATE__[10]) + +#define MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' \ + && __DATE__[2] == 'n') +#define MONTH_IS_FEB (__DATE__[0] == 'F') +#define MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' \ + && __DATE__[2] == 'r') +#define MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p') +#define MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' \ + && __DATE__[2] == 'y') +#define MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' \ + && __DATE__[2] == 'n') +#define MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[2] == 'l') +#define MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u') +#define MONTH_IS_SEP (__DATE__[0] == 'S') +#define MONTH_IS_OCT (__DATE__[0] == 'O') +#define MONTH_IS_NOV (__DATE__[0] == 'N') +#define MONTH_IS_DEC (__DATE__[0] == 'D') + +#define MONTH_CH0 ((MONTH_IS_OCT || MONTH_IS_NOV \ + || MONTH_IS_DEC) ? '1' : '0') + +#define MONTH_CH1 \ + ((MONTH_IS_JAN) ? '1' : \ + (MONTH_IS_FEB) ? '2' : \ + (MONTH_IS_MAR) ? '3' : \ + (MONTH_IS_APR) ? '4' : \ + (MONTH_IS_MAY) ? '5' : \ + (MONTH_IS_JUN) ? '6' : \ + (MONTH_IS_JUL) ? '7' : \ + (MONTH_IS_AUG) ? '8' : \ + (MONTH_IS_SEP) ? '9' : \ + (MONTH_IS_OCT) ? '0' : \ + (MONTH_IS_NOV) ? '1' : \ + (MONTH_IS_DEC) ? '2' : \ + /* default */ '?' \ + ) + +#define DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0') +#define DAY_CH1 (__DATE__[5]) + +#if VER_MAJOR >= 100 +#define VMAJOR ((VER_MAJOR / 100) + '0'), \ + (((VER_MAJOR % 100) / 10) + '0'), \ + ((VER_MAJOR % 10) + '0') +#elif VER_MAJOR >= 10 +#define VMAJOR ((VER_MAJOR / 10) + '0'), \ + ((VER_MAJOR % 10) + '0') +#else +#define VMAJOR (VER_MAJOR + '0') +#endif + +#if VER_MINOR >= 100 +#define VMINOR ((VER_MINOR / 100) + '0'), \ + (((VER_MINOR % 100) / 10) + '0'), \ + ((VER_MINOR % 10) + '0') +#elif VER_MINOR >= 10 +#define VMINOR ((VER_MINOR / 10) + '0'), \ + ((VER_MINOR % 10) + '0') +#else +#define VMINOR (VER_MINOR + '0') +#endif + +/* VERSION */ +#define FULL_VERSION { VMAJOR, '.', VMINOR, '.', \ + YEAR_CH2, YEAR_CH3, \ + MONTH_CH0, MONTH_CH1, \ + DAY_CH0, DAY_CH1, \ + '\0' } + +#define DATE_VERSION { YEAR_CH2, YEAR_CH3, MONTH_CH0, MONTH_CH1, DAY_CH0, \ + DAY_CH1, '\0' } + +#define RTLS_APP_VERSION FULL_VERSION + +#ifdef __cplusplus +} +#endif + +#endif // VERSION_H_ diff --git a/driver/thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m33-hfp-6.0.7.a b/driver/thirdparty/decawave/uwb2_dwm3000/lib/libdwt_uwb_driver-m33-hfp-6.0.7.a new file mode 100644 index 0000000000000000000000000000000000000000..54fe918c430c0dbb64bb2df294b052423e8ce230 GIT binary patch literal 166866 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

NB*!YPCOJ-thF1=Q?W>b=g)VFM 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 b8~s>^V$4%Y;dQj}En0(n{*Xl}#rOXKt)Y=n literal 0 HcmV?d00001 diff --git a/templates.xml b/templates.xml index 983b6517..e07cb47b 100644 --- a/templates.xml +++ b/templates.xml @@ -1529,4 +1529,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party_hw_drivers.slce b/third_party_hw_drivers.slce index 2e3e6f57..2190a591 100644 --- a/third_party_hw_drivers.slce +++ b/third_party_hw_drivers.slce @@ -2,7 +2,7 @@ id: third_party_hw_drivers label: Third Party Hardware Drivers description: > Third Party Hardware Driver extension for the Gecko SDK Suite -version: 2.0.1 +version: 2.0.2 sdk: id: gecko_sdk version: 4.4.0 diff --git a/third_party_hw_drivers.slsdk b/third_party_hw_drivers.slsdk index 209a4d75..29140365 100644 --- a/third_party_hw_drivers.slsdk +++ b/third_party_hw_drivers.slsdk @@ -1,10 +1,10 @@ # Properties file for Simplicity Studio metadata id=uc.extension.third_party_hw_drivers -version=2.0.1 +version=2.0.2 label=Third Party Hardware Drivers description=Third Party Hardware Drivers prop.file.templatesFile=templates.xml -prop.subLabel=Third\\ Party\\ Hardware\\ Drivers\\ 2.0.1 +prop.subLabel=Third\\ Party\\ Hardware\\ Drivers\\ 2.0.2