/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BOARD_H_ #define BOARD_H_ #include "mk_common.h" #include "mk_trace.h" #include "mk_gpio.h" #ifndef TRACE_BAUD_RATE #define TRACE_BAUD_RATE (BAUD_921600) #endif #ifndef X38M4_AUTO_TUNE_EN #define X38M4_AUTO_TUNE_EN (0) #else #endif /* LGA CSP IO00 - UART1 RX - UART1 RX IO01 - UART1 TX - UART1 TX (trace port) IO02 - Ranging Role - Ranging Role IO03 - - ISP_EN IO04 - Ranging Role - UCI Handshake S->H | Ranging Role IO05 - UART0_TX - UART0_TX | SPI_MISO IO06 - UART0_RX - UART0_RX | SPI_MOSI IO07 - LED - LED | SPI_CLK IO08 - LED - LED | SPI_CS IO09 - - EXT Flash IO10 - - EXT Flash IO11 - SPI_MOSI - EXT Flash IO12 - SPI_MISO - EXT Flash IO13 - SPI_CLK - EXT Flash IO14 - SPI_CS - EXT Flash IO15 - SWDIO - SWDIO IO16 - SWDCLK - SWDCLK IO17 - Button - UCI Handshake H->S */ /* Evaluation Kit */ #define BOARD_TYPE MK8000_EVK /* Board buttons */ #define BOARD_SW_1 IO_PIN_17 /* Board leds */ #define BOARD_LED_1 IO_PIN_7 //#define BOARD_LED_2 IO_PIN_8 /** UCI handshake pin, from host to slave */ #define HOST2SLAVE_HS_GPIO (IO_PIN_17) /** UCI handshake pin, from slave to host */ #define SLAVE2HOST_HS_GPIO (IO_PIN_4) /** Ranging role pin */ #if (X38M4_AUTO_TUNE_EN == 2) #define RANGING_ROLE_PIN (IO_PIN_4) #else #define RANGING_ROLE_PIN (IO_PIN_2) #endif #define CALIB_CH9 0 #define CALIB_CH5 1 #define CALIB_CH2 2 #define CALIB_CH_NUM 3 #define CALIB_CH(x) (x == 9 ? 0 : (x == 5 ? 1 : 2)) enum BOARD_NVM_ITEM_ID_T { BOARD_X38M4_LOAD_CAP = 1, BOARD_LOCAL_SHORT_ADDR = 2, BOARD_PEER_SHORT_ADDR = 3, BOARD_RANGING_SESSION_ID = 4, BOARD_TX_POWER_FCC_LEVEL = 5, BOARD_ANT_DELAYS = 6, BOARD_DEV_ROLE = 7, BOARD_DEV_ROLE_IDX = 8, BOARD_PDOA_DELAYS = 9, BOARD_PDOA_GAINS = 10, BOARD_PDOA_ANT_SPACE = 11, BOARD_PDOA_OFFSETS = 12, BOARD_X32K_LOAD_CAP = 13, BOARD_CALIB_X38M4_TEMPERATURE = 14, BOARD_CALIB_X38M4_PPM = 15, BOARD_ANGLE_CORRECTION = 16, }; /* Board parameters */ struct BOARD_PARAM_T { uint32_t flag; uint8_t x38m4_load_cap; uint8_t tx_power_fcc[CALIB_CH_NUM]; // [CH9, CH5, CH2] uint16_t ranging_session_id; uint16_t local_short_addr; uint16_t peer_short_addr; int16_t ant_delays[CALIB_CH_NUM][4]; // [CH9, CH5, CH2][ANT0, ANT1, ANT2, ANT3], unit: 15.65ps int16_t pdoa_delays[CALIB_CH_NUM][4]; // [CH9, CH5, CH2][ANT0, ANT1, ANT2, ANT3], uint: ps int16_t pdoa_gains[CALIB_CH_NUM][4]; // [CH9, CH5, CH2][ANT0, ANT1, ANT2, ANT3] int16_t pdoa_ant_space; // unit: 0.1mm int16_t pdoa_offsets[2]; // [azimuth, elevation], unit: 0.1degree uint8_t dev_role; uint8_t dev_role_idx; uint8_t x32k_load_cap; int16_t calib_x38m4_temperature; // degree centigrade int16_t calib_x38m4_ppm; // unit is 0.01 ppm // [azimuth_correction[8],elevation_correction[8]],azimuth_correction[8]=[k,b,s1,k1,b1,s2,k2,b2],k=gain*0.001,b=offset*0.1,s=angle_threshold*0.1 int16_t angle_correction[16]; }; #if defined(__cplusplus) extern "C" { #endif extern struct BOARD_PARAM_T board_param; /** * @brief Configure clock. * */ void board_clock_run(void); /** * @brief Configure pin routing and optionally pin electrical features. * */ void board_pins_config(void); /** * @brief Configure debug trace port. * @param[in] port Trace port * */ void board_debug_console_open(enum TRACE_PORT_T port); /** * @brief Load default calibration parameters. * */ void board_calibration_params_default(void); /** * @brief Load calibration parameters from NVM. * */ void board_calibration_params_load(void); /** * @brief Write calibration item into NVM. * @param[in] id calibration item ID * @param[in] param pointer of the parameter to be written * @param[in] param_len parameter length * @return TRUE sucess or FALSE fail */ uint8_t board_calibration_param_write(uint8_t id, uint8_t *param, uint8_t param_len); /** * @brief Correct ranging result, correction formula depends on the antenna design * * @param [inout] distance Pointer of ranging distance result * @param [inout] azimuth Pointer of azimuth result * @param [inout] elevation Pointer of elevation result */ void board_ranging_result_correct(uint16_t *distance, int16_t *azimuth, int16_t *elevation); /** * @brief Get XTAL 38.4M Frequency offset. * @param[in] p_ppm pointer of the ppm to be written, unit is 0.01 ppm * @return * @arg DRV_DEV_UNAVAILABLE get unavaliable value * @arg DRV_ERROR adc_get error id * @arg DRV_BUSY adc_get send failed because of ADC is busy * @arg DEV_OK get ppm success */ int32_t board_x38m4_ppm_get(int32_t *p_ppm); /** * @brief Configure button GPIO. * @param[in] irq_handler button interrupt process handler * */ void board_button_init(GPIO_IRQ_HANDLER_T irq_handler); /** * @brief Configure LED GPIO. * */ void board_led_init(void); /** * @brief LED on. * @param[in] idx LED index * */ void board_led_on(enum IO_PIN_T idx); /** * @brief LED off. * @param[in] idx LED index * */ void board_led_off(enum IO_PIN_T idx); /** * @brief LED toggle. * @param[in] idx LED index * */ void board_led_toggle(enum IO_PIN_T idx); /** * @brief Configure peripherals on board (for board function extension). * */ void board_configure(void); /** * @brief Prepare to enter power down mode. * */ void board_prepare_for_power_down(void); /** * @brief Restore board setting from power down mode. * */ void board_restore_from_power_down(void); #if defined(__cplusplus) } #endif #endif /* BOARD_H_ */