12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019 |
- /*
- * Copyright (c) 2023 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #ifndef HPM_SEI_DRV_H
- #define HPM_SEI_DRV_H
- #include "hpm_common.h"
- #include "hpm_sei_regs.h"
- #include "hpm_soc_feature.h"
- #include "hpm_soc_ip_feature.h"
- /**
- * @brief sei arming action
- */
- typedef enum {
- sei_arming_direct_exec = 0,
- sei_arming_wait_trigger
- } sei_arming_mode_t;
- /**
- * @brief sei watchdog action
- */
- typedef enum {
- sei_wdg_exec_next_instr = 0,
- sei_wdg_exec_exception_instr
- } sei_wdg_action_t;
- /**
- * @brief sei transfer mode
- */
- typedef enum {
- sei_synchronous_master_mode = 0,
- sei_synchronous_slave_mode,
- sei_asynchronous_mode
- } sei_tranceiver_mode_t;
- /**
- * @brief sei asynchronous mode parity
- */
- typedef enum {
- sei_asynchronous_parity_even = 0,
- sei_asynchronous_parity_odd
- } sei_asynchronous_parity_t;
- /**
- * @brief sei ilde state
- */
- typedef enum {
- sei_idle_low_state = 0,
- sei_idle_high_state,
- } sei_idle_state_t;
- /**
- * @brief sei data mode
- */
- typedef enum {
- sei_data_mode = 0,
- sei_check_mode,
- sei_crc_mode
- } sei_data_mode_t;
- /**
- * @brief sei data bit order
- */
- typedef enum {
- sei_bit_lsb_first = 0,
- sei_bit_msb_first
- } sei_data_bit_order_t;
- /**
- * @brief sei data word order
- */
- typedef enum {
- sei_word_nonreverse = 0,
- sei_word_reverse
- } sei_data_word_order_t;
- /**
- * @brief sei state transition condition
- */
- typedef enum {
- sei_state_tran_condition_high_match = 0,
- sei_state_tran_condition_low_dismatch,
- sei_state_tran_condition_rise_entry,
- sei_state_tran_condition_fall_leave
- } sei_state_tran_condition_t;
- /**
- * @brief sei trig in type
- */
- typedef enum {
- sei_trig_in0 = 0,
- sei_trig_in1,
- sei_trig_in_period,
- sei_trig_in_soft
- } sei_trig_in_type_t; /**< trig input type */
- /**
- * @brief sei irq event
- */
- typedef enum {
- sei_irq_stall_event = SEI_CTRL_IRQ_INT_FLAG_STALL_MASK,
- sei_irq_execpt_event = SEI_CTRL_IRQ_INT_FLAG_EXCEPT_MASK,
- sei_irq_wdog_event = SEI_CTRL_IRQ_INT_FLAG_WDOG_MASK,
- sei_irq_instr_ptr0_start_event = SEI_CTRL_IRQ_INT_FLAG_PTR0_ST_MASK,
- sei_irq_instr_ptr1_start_event = SEI_CTRL_IRQ_INT_FLAG_PTR1_ST_MASK,
- sei_irq_instr_value0_start_event = SEI_CTRL_IRQ_INT_FLAG_INSTR0_ST_MASK,
- sei_irq_instr_value1_start_event = SEI_CTRL_IRQ_INT_FLAG_INSTR1_ST_MASK,
- sei_irq_instr_ptr0_end_event = SEI_CTRL_IRQ_INT_FLAG_PTR0_END_MASK,
- sei_irq_instr_ptr1_end_event = SEI_CTRL_IRQ_INT_FLAG_PTR1_END_MASK,
- sei_irq_instr_value0_end_event = SEI_CTRL_IRQ_INT_FLAG_INSTR0_END_MASK,
- sei_irq_instr_value1_end_event = SEI_CTRL_IRQ_INT_FLAG_INSTR1_END_MASK,
- sei_irq_trx_err_event = SEI_CTRL_IRQ_INT_FLAG_TRX_ERR_MASK,
- sei_irq_timeout_event = SEI_CTRL_IRQ_INT_FLAG_TIMEOUT_MASK,
- sei_irq_latch0_event = SEI_CTRL_IRQ_INT_FLAG_LATCH0_MASK,
- sei_irq_latch1_event = SEI_CTRL_IRQ_INT_FLAG_LATCH1_MASK,
- sei_irq_latch2_event = SEI_CTRL_IRQ_INT_FLAG_LATCH2_MASK,
- sei_irq_latch3_event = SEI_CTRL_IRQ_INT_FLAG_LATCH3_MASK,
- sei_irq_sample_err_event = SEI_CTRL_IRQ_INT_FLAG_SMP_ERR_MASK,
- sei_irq_trig0_event = SEI_CTRL_IRQ_INT_FLAG_TRIGER0_MASK,
- sei_irq_trig1_event = SEI_CTRL_IRQ_INT_FLAG_TRIGER1_MASK,
- sei_irq_trig2_event = SEI_CTRL_IRQ_INT_FLAG_TRIGER2_MASK,
- sei_irq_trig3_event = SEI_CTRL_IRQ_INT_FLAG_TRIGER3_MASK,
- sei_irq_trig0_err_event = SEI_CTRL_IRQ_INT_FLAG_TRG_ERR0_MASK,
- sei_irq_trig1_err_event = SEI_CTRL_IRQ_INT_FLAG_TRG_ERR1_MASK,
- sei_irq_trig2_err_event = SEI_CTRL_IRQ_INT_FLAG_TRG_ERR2_MASK,
- sei_irq_trig3_err_event = SEI_CTRL_IRQ_INT_FLAG_TRG_ERR3_MASK,
- } sei_irq_event_t; /**< irq event type */
- /**
- * @brief sei select command or data
- */
- #define SEI_SELECT_CMD true /**< select cmd */
- #define SEI_SELECT_DATA false /**< select data */
- /**
- * @brief sei const data register index
- */
- #define SEI_DATA_CONST_0 (30UL)
- #define SEI_DATA_CONST_1 (31UL)
- /**
- * @brief sei instruction operation command
- */
- #define SEI_INSTR_OP_HALT 0u /**< op halt */
- #define SEI_INSTR_OP_JUMP 1u /**< op jump */
- #define SEI_INSTR_OP_SEND_WDG 2u /**< op send with watchdog */
- #define SEI_INSTR_OP_SEND 3u /**< op send */
- #define SEI_INSTR_OP_WAIT_WDG 4u /**< op wait with watchdog */
- #define SEI_INSTR_OP_WAIT 5u /**< op wait */
- #define SEI_INSTR_OP_RECV_WDG 6u /**< op recv with watchdog */
- #define SEI_INSTR_OP_RECV 7u /**< op recv */
- /**
- * @brief sei instruction synchronous master clock type
- */
- #define SEI_INSTR_M_CK_LOW 0u /**< clock low */
- #define SEI_INSTR_M_CK_RISE_FALL 1u /**< clock rise fall */
- #define SEI_INSTR_M_CK_FALL_RISE 2u /**< clock fall rise */
- #define SEI_INSTR_M_CK_HIGH 3u /**< clock high */
- /**
- * @brief sei instruction synchronous slave clock type
- */
- #define SEI_INSTR_S_CK_DEFAULT 0u /**< default */
- #define SEI_INSTR_S_CK_TRX_EXCH 1u /**< rx tx exchange */
- #define SEI_INSTR_S_CK_TIMEOUT_EN 2u /**< enable timeout */
- #define SEI_INSTR_S_CK_TRX_EXCH_TIMEOUT_EN 3u /**< rx tx exchange and enable timeout */
- /**
- * @brief sei instruction jump intructions index
- */
- #define SEI_JUMP_INIT_INSTR_IDX 0x00u /**< jump init instr index */
- #define SEI_JUMP_WDG_INSTR_IDX 0x01u /**< jump watchdog instr index */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX0 0x10u /**< jump command table instr ptr0 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX1 0x11u /**< jump command table instr ptr1 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX2 0x12u /**< jump command table instr ptr2 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX3 0x13u /**< jump command table instr ptr3 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX4 0x14u /**< jump command table instr ptr4 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX5 0x15u /**< jump command table instr ptr5 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX6 0x16u /**< jump command table instr ptr6 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX7 0x17u /**< jump command table instr ptr7 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX8 0x18u /**< jump command table instr ptr8 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX9 0x19u /**< jump command table instr ptr9 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX10 0x1Au /**< jump command table instr ptr10 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX11 0x1Bu /**< jump command table instr ptr11 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX12 0x1Cu /**< jump command table instr ptr12 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX13 0x1Du /**< jump command table instr ptr13 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX14 0x1Eu /**< jump command table instr ptr14 */
- #define SEI_JUMP_CMD_TABLE_INSTR_IDX15 0x1Fu /**< jump command table instr ptr15 */
- /**
- * @brief sei engine config structure
- */
- typedef struct {
- sei_arming_mode_t arming_mode;
- uint8_t data_cdm_idx;
- uint8_t data_base_idx;
- uint8_t init_instr_idx;
- bool wdg_enable;
- sei_wdg_action_t wdg_action;
- uint8_t wdg_instr_idx;
- uint16_t wdg_time;
- } sei_engine_config_t; /**< engine config struct */
- /**
- * @brief sei tranceiver synchronous master mode config structure
- */
- typedef struct {
- bool data_idle_high_z;
- sei_idle_state_t data_idle_state;
- bool clock_idle_high_z;
- sei_idle_state_t clock_idle_state;
- uint32_t baudrate;
- } sei_tranceiver_synchronous_master_config_t; /**< tranceiver synchronous master config struct */
- /**
- * @brief sei tranceiver synchronous master mode config structure
- */
- typedef struct {
- bool data_idle_high_z;
- sei_idle_state_t data_idle_state;
- bool clock_idle_high_z;
- sei_idle_state_t clock_idle_state;
- uint32_t max_baudrate;
- uint16_t ck0_timeout_us;
- uint16_t ck1_timeout_us;
- } sei_tranceiver_synchronous_slave_config_t; /**< tranceiver synchronous slave config struct */
- /**
- * @brief sei tranceiver asynchronous mode config structure
- */
- typedef struct {
- uint8_t wait_len;
- uint8_t data_len;
- bool parity_enable;
- sei_asynchronous_parity_t parity;
- bool data_idle_high_z;
- sei_idle_state_t data_idle_state;
- uint32_t baudrate;
- } sei_tranceiver_asynchronous_config_t; /**< tranceiver asynchronous config struct */
- /**
- * @brief sei tranceiver config structure
- */
- typedef struct {
- sei_tranceiver_mode_t mode;
- bool tri_sample;
- uint32_t src_clk_freq;
- sei_tranceiver_synchronous_master_config_t synchronous_master_config;
- sei_tranceiver_synchronous_slave_config_t synchronous_slave_config;
- sei_tranceiver_asynchronous_config_t asynchronous_config;
- } sei_tranceiver_config_t; /**< tranceiver config struct */
- /**
- * @brief sei trigger input config structure
- */
- typedef struct {
- bool trig_in0_enable;
- uint8_t trig_in0_select;
- bool trig_in1_enable;
- uint8_t trig_in1_select;
- bool trig_period_enable;
- sei_arming_mode_t trig_period_arming_mode;
- bool trig_period_sync_enable;
- uint8_t trig_period_sync_select;
- uint32_t trig_period_time;
- #if defined(HPM_IP_FEATURE_SEI_TIMEOUT_REWIND_FEATURE) && HPM_IP_FEATURE_SEI_TIMEOUT_REWIND_FEATURE
- uint8_t rewind_enable;
- uint8_t rewind_select;
- #endif
- } sei_trigger_input_config_t; /**< trigger input config struct */
- /**
- * @brief sei trigger output config structure
- */
- typedef struct {
- uint8_t src_latch_select;
- bool trig_out_enable;
- uint8_t trig_out_select;
- } sei_trigger_output_config_t; /**< trigger output config struct */
- /**
- * @brief sei data format config structure
- */
- typedef struct {
- sei_data_mode_t mode;
- bool signed_flag;
- sei_data_bit_order_t bit_order;
- sei_data_word_order_t word_order;
- uint8_t word_len;
- bool crc_invert;
- bool crc_shift_mode;
- uint8_t crc_len;
- uint8_t last_bit;
- uint8_t first_bit;
- uint8_t max_bit;
- uint8_t min_bit;
- uint32_t gold_value;
- uint32_t crc_init_value;
- uint32_t crc_poly;
- } sei_data_format_config_t; /**< cmd or data format config struct */
- /**
- * @brief sei command table config structure
- */
- typedef struct {
- uint32_t cmd_min_value;
- uint32_t cmd_max_value;
- uint32_t cmd_mask_value;
- uint8_t instr_idx[16];
- } sei_command_table_config_t; /**< cmd table config struct */
- /**
- * @brief sei state transition config structure
- */
- typedef struct {
- bool disable_instr_ptr_check;
- sei_state_tran_condition_t instr_ptr_cfg;
- uint8_t instr_ptr_value;
- bool disable_clk_check;
- sei_state_tran_condition_t clk_cfg;
- bool disable_txd_check;
- sei_state_tran_condition_t txd_cfg;
- bool disable_rxd_check;
- sei_state_tran_condition_t rxd_cfg;
- bool disable_timeout_check;
- sei_state_tran_condition_t timeout_cfg;
- } sei_state_transition_config_t; /**< state transition config struct */
- /**
- * @brief sei state transition latch config structure
- */
- typedef struct {
- bool enable;
- uint8_t output_select;
- uint16_t delay;
- } sei_state_transition_latch_config_t; /**< state transition latch config struct */
- /**
- * @brief sei sample config structure
- */
- typedef struct {
- uint8_t acc_data_idx;
- uint8_t spd_data_idx;
- uint8_t rev_data_idx;
- uint8_t pos_data_idx;
- bool acc_data_use_rx; /**< true - use rx data, false - use override data */
- bool spd_data_use_rx; /**< true - use rx data, false - use override data */
- bool rev_data_use_rx; /**< true - use rx data, false - use override data */
- bool pos_data_use_rx; /**< true - use rx data, false - use override data */
- uint8_t latch_select;
- bool sample_once;
- uint16_t sample_window;
- uint32_t data_register_select;
- } sei_sample_config_t; /**< sample config struct */
- /**
- * @brief sei update config structure
- */
- typedef struct {
- uint8_t acc_data_idx;
- uint8_t spd_data_idx;
- uint8_t rev_data_idx;
- uint8_t pos_data_idx;
- bool acc_data_use_rx; /**< true - use rx data, false - use override data */
- bool spd_data_use_rx; /**< true - use rx data, false - use override data */
- bool rev_data_use_rx; /**< true - use rx data, false - use override data */
- bool pos_data_use_rx; /**< true - use rx data, false - use override data */
- bool time_use_override; /**< true - use override data, false - use timestamp data */
- bool update_on_err;
- uint8_t latch_select;
- uint32_t data_register_select;
- } sei_update_config_t; /**< update config struct */
- #if defined(__cplusplus)
- extern "C" {
- #endif /* __cplusplus */
- /**
- * @brief Set the SEI engine enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] enable enable or disable
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_engine_enable(SEI_Type *ptr, uint8_t idx, bool enable)
- {
- if (enable) {
- ptr->CTRL[idx].ENGINE.CTRL |= SEI_CTRL_ENGINE_CTRL_ENABLE_MASK;
- } else {
- ptr->CTRL[idx].ENGINE.CTRL &= ~SEI_CTRL_ENGINE_CTRL_ENABLE_MASK;
- }
- }
- /**
- * @brief Rewind the SEI engine
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- */
- static inline void sei_set_engine_rewind(SEI_Type *ptr, uint8_t idx)
- {
- ptr->CTRL[idx].ENGINE.CTRL |= SEI_CTRL_ENGINE_CTRL_REWIND_MASK;
- }
- /**
- * @brief Set the SEI trigger input trig in0 enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] enable enable or disable
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_trig_input_in0_enable(SEI_Type *ptr, uint8_t idx, bool enable)
- {
- if (enable) {
- ptr->CTRL[idx].TRG.IN_CFG |= SEI_CTRL_TRG_IN_CFG_IN0_EN_MASK;
- } else {
- ptr->CTRL[idx].TRG.IN_CFG &= ~SEI_CTRL_TRG_IN_CFG_IN0_EN_MASK;
- }
- }
- /**
- * @brief Set the SEI trigger input trig in1 enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] enable enable or disable
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_trig_input_in1_enable(SEI_Type *ptr, uint8_t idx, bool enable)
- {
- if (enable) {
- ptr->CTRL[idx].TRG.IN_CFG |= SEI_CTRL_TRG_IN_CFG_IN1_EN_MASK;
- } else {
- ptr->CTRL[idx].TRG.IN_CFG &= ~SEI_CTRL_TRG_IN_CFG_IN1_EN_MASK;
- }
- }
- /**
- * @brief Set the SEI trigger input period enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] enable enable or disable
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_trig_input_period_enable(SEI_Type *ptr, uint8_t idx, bool enable)
- {
- if (enable) {
- ptr->CTRL[idx].TRG.IN_CFG |= SEI_CTRL_TRG_IN_CFG_PRD_EN_MASK;
- } else {
- ptr->CTRL[idx].TRG.IN_CFG &= ~SEI_CTRL_TRG_IN_CFG_PRD_EN_MASK;
- }
- }
- /**
- * @brief Set the SEI trigger input soft enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_trig_input_soft_enable(SEI_Type *ptr, uint8_t idx)
- {
- ptr->CTRL[idx].TRG.SW |= SEI_CTRL_TRG_SW_SOFT_MASK;
- }
- /**
- * @brief Set the SEI trigger input command value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] type trigger input type @ref sei_trig_in_type_t
- * @param [in] data command data
- */
- static inline void sei_set_trig_input_command_value(SEI_Type *ptr, uint8_t idx, sei_trig_in_type_t type, uint32_t data)
- {
- ptr->CTRL[idx].TRG_TABLE.CMD[type] = data;
- }
- /**
- * @brief Get the SEI trigger input time
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] type trigger input type @ref sei_trig_in_type_t
- * @retval trigger input time
- */
- static inline uint32_t sei_get_trig_input_time(SEI_Type *ptr, uint8_t idx, sei_trig_in_type_t type)
- {
- return ptr->CTRL[idx].TRG_TABLE.TIME[type];
- }
- /**
- * @brief Get the SEI latch time
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] latch_idx
- * @arg SEI_LATCH_0
- * @arg SEI_LATCH_1
- * @arg SEI_LATCH_2
- * @arg SEI_LATCH_3
- * @retval latch time
- */
- static inline uint32_t sei_get_latch_time(SEI_Type *ptr, uint8_t idx, uint8_t latch_idx)
- {
- return ptr->CTRL[idx].LATCH[latch_idx].TIME;
- }
- /**
- * @brief Set the SEI tranceiver rx point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] point rx point value
- */
- static inline void sei_set_xcvr_rx_point(SEI_Type *ptr, uint8_t idx, uint16_t point)
- {
- uint32_t tmp;
- assert(point > 0);
- tmp = ptr->CTRL[idx].XCVR.DATA_CFG;
- tmp &= ~SEI_CTRL_XCVR_DATA_CFG_RXD_POINT_MASK;
- tmp |= SEI_CTRL_XCVR_DATA_CFG_RXD_POINT_SET(point);
- ptr->CTRL[idx].XCVR.DATA_CFG = tmp;
- }
- /**
- * @brief Set the SEI tranceiver tx point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] point tx point value
- */
- static inline void sei_set_xcvr_tx_point(SEI_Type *ptr, uint8_t idx, uint16_t point)
- {
- uint32_t tmp;
- assert(point > 0);
- tmp = ptr->CTRL[idx].XCVR.DATA_CFG;
- tmp &= ~SEI_CTRL_XCVR_DATA_CFG_TXD_POINT_MASK;
- tmp |= SEI_CTRL_XCVR_DATA_CFG_TXD_POINT_SET(point);
- ptr->CTRL[idx].XCVR.DATA_CFG = tmp;
- }
- /**
- * @brief Set the SEI tranceiver ck0 point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] point ck0 point value
- */
- static inline void sei_set_xcvr_ck0_point(SEI_Type *ptr, uint8_t idx, uint16_t point)
- {
- uint32_t tmp;
- assert(point > 0);
- tmp = ptr->CTRL[idx].XCVR.CLK_CFG;
- tmp &= ~SEI_CTRL_XCVR_CLK_CFG_CK0_POINT_MASK;
- tmp |= SEI_CTRL_XCVR_CLK_CFG_CK0_POINT_SET(point);
- ptr->CTRL[idx].XCVR.CLK_CFG = tmp;
- }
- /**
- * @brief Set the SEI tranceiver ck1 point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] point ck1 point value
- */
- static inline void sei_set_xcvr_ck1_point(SEI_Type *ptr, uint8_t idx, uint16_t point)
- {
- uint32_t tmp;
- assert(point > 0);
- tmp = ptr->CTRL[idx].XCVR.CLK_CFG;
- tmp &= ~SEI_CTRL_XCVR_CLK_CFG_CK1_POINT_MASK;
- tmp |= SEI_CTRL_XCVR_CLK_CFG_CK1_POINT_SET(point);
- ptr->CTRL[idx].XCVR.CLK_CFG = tmp;
- }
- /**
- * @brief Get the SEI tranceiver ck0 point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @retval ck0 point value
- */
- static inline uint16_t sei_get_xcvr_ck0_point(SEI_Type *ptr, uint8_t idx)
- {
- return SEI_CTRL_XCVR_CLK_CFG_CK0_POINT_GET(ptr->CTRL[idx].XCVR.CLK_CFG);
- }
- /**
- * @brief Get the SEI tranceiver ck1 point
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @retval ck1 point value
- */
- static inline uint16_t sei_get_xcvr_ck1_point(SEI_Type *ptr, uint8_t idx)
- {
- return SEI_CTRL_XCVR_CLK_CFG_CK1_POINT_GET(ptr->CTRL[idx].XCVR.CLK_CFG);
- }
- /**
- * @brief Set the SEI command value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] cmd command value
- */
- static inline void sei_set_command_value(SEI_Type *ptr, uint8_t idx, uint32_t cmd)
- {
- ptr->CTRL[idx].CMD.CMD = cmd;
- }
- /**
- * @brief Get the SEI command value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @retval command value
- */
- static inline uint32_t sei_get_command_value(SEI_Type *ptr, uint8_t idx)
- {
- return ptr->CTRL[idx].CMD.CMD;
- }
- /**
- * @brief Rewind the SEI command
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- */
- static inline void sei_set_command_rewind(SEI_Type *ptr, uint8_t idx)
- {
- ptr->CTRL[idx].CMD.MODE |= SEI_CTRL_CMD_MODE_REWIND_MASK;
- }
- /**
- * @brief Set the SEI data value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI data index, such as SEI_DAT_2, SEI_DAT_3, etc.
- * @param [in] data data value
- */
- static inline void sei_set_data_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->DAT[idx].DATA = data;
- }
- /**
- * @brief Get the SEI data value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI data index, such as SEI_DAT_2, SEI_DAT_3, etc.
- * @retval data value
- */
- static inline uint32_t sei_get_data_value(SEI_Type *ptr, uint8_t idx)
- {
- return ptr->DAT[idx].DATA;
- }
- /**
- * @brief Rewind the SEI data
- * @param [in] ptr SEI base address
- * @param [in] idx SEI data index, such as SEI_DAT_2, SEI_DAT_3, etc.
- */
- static inline void sei_set_data_rewind(SEI_Type *ptr, uint8_t idx)
- {
- ptr->DAT[idx].MODE |= SEI_DAT_MODE_REWIND_MASK;
- }
- /**
- * @brief Set the SEI sample position (singleturn) override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data position (singleturn) override value
- */
- static inline void sei_set_sample_pos_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.SMP_POS = data;
- }
- /**
- * @brief Set the SEI sample revolution (multiturn) override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data revolution (multiturn) override value
- */
- static inline void sei_set_sample_rev_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.SMP_REV = data;
- }
- /**
- * @brief Set the SEI sample speed override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data speed override value
- */
- static inline void sei_set_sample_spd_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.SMP_SPD = data;
- }
- /**
- * @brief Set the SEI sample acceleration override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data acceleration override value
- */
- static inline void sei_set_sample_acc_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.SMP_ACC = data;
- }
- /**
- * @brief Set the SEI update position (singleturn) override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data position (singleturn) override value
- */
- static inline void sei_set_update_pos_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.UPD_POS = data;
- }
- /**
- * @brief Set the SEI update revolution (multiturn) override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data revolution (multiturn) override value
- */
- static inline void sei_set_update_rev_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.UPD_REV = data;
- }
- /**
- * @brief Set the SEI update speed override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data speed override value
- */
- static inline void sei_set_update_spd_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.UPD_SPD = data;
- }
- /**
- * @brief Set the SEI update acceleration override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data acceleration override value
- */
- static inline void sei_set_update_acc_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.UPD_ACC = data;
- }
- /**
- * @brief Set the SEI update time override value
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] data time override value
- */
- static inline void sei_set_update_time_override_value(SEI_Type *ptr, uint8_t idx, uint32_t data)
- {
- ptr->CTRL[idx].POS.UPD_TIME = data;
- }
- /**
- * @brief Set the SEI irq match pointer0
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] instr_idx match instr0 index
- */
- static inline void sei_set_irq_match_instr0_ptr(SEI_Type *ptr, uint8_t idx, uint8_t instr_idx)
- {
- ptr->CTRL[idx].IRQ.POINTER0 = SEI_CTRL_IRQ_POINTER0_POINTER_SET(instr_idx);
- }
- /**
- * @brief Set the SEI irq match pointer1
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] instr_idx match instr1 index
- */
- static inline void sei_set_irq_match_instr1_ptr(SEI_Type *ptr, uint8_t idx, uint8_t instr_idx)
- {
- ptr->CTRL[idx].IRQ.POINTER1 = SEI_CTRL_IRQ_POINTER1_POINTER_SET(instr_idx);
- }
- /**
- * @brief Set the SEI irq match instr0
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] instr_value match instr0 value
- */
- static inline void sei_set_irq_match_instr0_value(SEI_Type *ptr, uint8_t idx, uint32_t instr_value)
- {
- ptr->CTRL[idx].IRQ.INSTR0 = SEI_CTRL_IRQ_INSTR0_INSTR_SET(instr_value);
- }
- /**
- * @brief Set the SEI irq match instr1
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] instr_value match instr1 value
- */
- static inline void sei_set_irq_match_instr1_value(SEI_Type *ptr, uint8_t idx, uint32_t instr_value)
- {
- ptr->CTRL[idx].IRQ.INSTR1 = SEI_CTRL_IRQ_INSTR1_INSTR_SET(instr_value);
- }
- /**
- * @brief Set the SEI irq enable or disable
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] irq_mask irq mask, @ref sei_irq_event_t
- * @param [in] enable enable or disable
- * @arg true enable
- * @arg false disable
- */
- static inline void sei_set_irq_enable(SEI_Type *ptr, uint8_t idx, uint32_t irq_mask, bool enable)
- {
- if (enable) {
- ptr->CTRL[idx].IRQ.INT_EN |= irq_mask;
- } else {
- ptr->CTRL[idx].IRQ.INT_EN &= ~irq_mask;
- }
- }
- /**
- * @brief Get the SEI irq status
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] irq_mask irq mask, @ref sei_irq_event_t
- *
- * @retval true-has irq req, false-no irq req.
- */
- static inline bool sei_get_irq_status(SEI_Type *ptr, uint8_t idx, uint32_t irq_mask)
- {
- return ((ptr->CTRL[idx].IRQ.INT_FLAG & irq_mask) == irq_mask) ? true : false;
- }
- /**
- * @brief Clear the SEI irq flag
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] irq_mask irq mask, @ref sei_irq_event_t
- */
- static inline void sei_clear_irq_flag(SEI_Type *ptr, uint8_t idx, uint32_t irq_mask)
- {
- ptr->CTRL[idx].IRQ.INT_FLAG = irq_mask;
- }
- /**
- * @brief Init SEI tranceiver configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config tranceiver configuration @ref sei_tranceiver_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_tranceiver_config_init(SEI_Type *ptr, uint8_t idx, sei_tranceiver_config_t *config);
- /**
- * @brief Init SEI command or data format configuration
- * @param [in] ptr SEI base address
- * @param [in] cmd_data_select
- * @arg @ref SEI_SELECT_CMD select command
- * @arg @ref SEI_SELECT_DATA select data
- * @param [in] idx SEI ctrl index or data index, decided by cmd_data_select, such as SEI_CTRL_0, SEI_CTRL_1, SEI_DAT_2, SEI_DAT_3, etc.
- * @param [in] config command or data format configuration @ref sei_data_format_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_cmd_data_format_config_init(SEI_Type *ptr, bool cmd_data_select, uint8_t idx, sei_data_format_config_t *config);
- /**
- * @brief Init SEI command table configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] table_idx command table index, 0 - 7
- * @param [in] config command table configuration @ref sei_command_table_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_cmd_table_config_init(SEI_Type *ptr, uint8_t idx, uint8_t table_idx, sei_command_table_config_t *config);
- /**
- * @brief Init SEI state transition configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] latch_idx latch index
- * @arg SEI_LATCH_0
- * @arg SEI_LATCH_1
- * @arg SEI_LATCH_2
- * @arg SEI_LATCH_3
- * @param [in] state transition state
- * @arg SEI_CTRL_LATCH_TRAN_0_1
- * @arg SEI_CTRL_LATCH_TRAN_1_2
- * @arg SEI_CTRL_LATCH_TRAN_2_3
- * @arg SEI_CTRL_LATCH_TRAN_3_0
- * @param [in] config state transition configuration @ref sei_state_transition_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_state_transition_config_init(SEI_Type *ptr, uint8_t idx, uint8_t latch_idx, uint8_t state, sei_state_transition_config_t *config);
- /**
- * @brief Init SEI state transition latch configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] latch_idx latch index
- * @arg SEI_LATCH_0
- * @arg SEI_LATCH_1
- * @arg SEI_LATCH_2
- * @arg SEI_LATCH_3
- * @param [in] config state transition latch configuration @ref sei_state_transition_latch_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_state_transition_latch_config_init(SEI_Type *ptr, uint8_t idx, uint8_t latch_idx, sei_state_transition_latch_config_t *config);
- /**
- * @brief Init SEI sample configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config sample configuration @ref sei_sample_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_sample_config_init(SEI_Type *ptr, uint8_t idx, sei_sample_config_t *config);
- /**
- * @brief Init SEI update configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config update configuration @ref sei_update_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_update_config_init(SEI_Type *ptr, uint8_t idx, sei_update_config_t *config);
- /**
- * @brief Init SEI trigger input configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config trigger input configuration @ref sei_trigger_input_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_trigger_input_config_init(SEI_Type *ptr, uint8_t idx, sei_trigger_input_config_t *config);
- /**
- * @brief Init SEI trigger output configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config trigger output configuration @ref sei_trigger_output_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_trigger_output_config_init(SEI_Type *ptr, uint8_t idx, sei_trigger_output_config_t *config);
- /**
- * @brief Init SEI engine configuration
- * @param [in] ptr SEI base address
- * @param [in] idx SEI ctrl index, such as SEI_CTRL_0, SEI_CTRL_1, etc.
- * @param [in] config engine configuration @ref sei_engine_config_t
- * @retval API execution status
- */
- hpm_stat_t sei_engine_config_init(SEI_Type *ptr, uint8_t idx, sei_engine_config_t *config);
- /**
- * @brief Set SEI Intsructions
- * @param [in] ptr SEI base address
- * @param [in] idx SEI instruction index.
- * @param [in] op SEI instruction operation
- * @arg @ref SEI_INSTR_OP_HALT
- * @arg @ref SEI_INSTR_OP_JUMP
- * @arg @ref SEI_INSTR_OP_SEND_WDG
- * @arg @ref SEI_INSTR_OP_SEND
- * @arg @ref SEI_INSTR_OP_WAIT_WDG
- * @arg @ref SEI_INSTR_OP_WAIT
- * @arg @ref SEI_INSTR_OP_RECV_WDG
- * @arg @ref SEI_INSTR_OP_RECV
- * @param [in] ck SEI instruction clock
- * [1] synchronous master clock type
- * @arg @ref SEI_INSTR_M_CK_LOW
- * @arg @ref SEI_INSTR_M_CK_RISE_FALL
- * @arg @ref SEI_INSTR_M_CK_FALL_RISE
- * @arg @ref SEI_INSTR_M_CK_HIGH
- * [2] synchronous slave clock type
- * @arg @ref SEI_INSTR_S_CK_DEFAULT
- * @arg @ref SEI_INSTR_S_CK_TRX_EXCH
- * @arg @ref SEI_INSTR_S_CK_TIMEOUT_EN
- * @arg @ref SEI_INSTR_S_CK_TRX_EXCH_TIMEOUT_EN
- * @param [in] crc SEI instruction crc register, such as SEI_DAT_0, SEI_DAT_1, etc.
- * @param [in] data SEI instruction data register, such as SEI_DAT_0, SEI_DAT_1, etc.
- * @param [in] opr SEI instruction operand.
- * [1] When OP is SEI_INSTR_OP_HALT, opr is the halt time in baudrate, 0 represents infinite time.
- * [2] When OP is SEI_INSTR_OP_JUMP, opr is command table pointer, init pointer or wdg pointer.
- * @arg @ref SEI_JUMP_INIT_INSTR_IDX
- * @arg @ref SEI_JUMP_WDG_INSTR_IDX
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX0
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX1
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX2
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX3
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX4
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX5
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX6
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX7
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX8
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX9
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX10
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX11
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX12
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX13
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX14
- * @arg @ref SEI_JUMP_CMD_TABLE_INSTR_IDX15
- * [3] Other OP, this area is the data length.
- */
- void sei_set_instr(SEI_Type *ptr, uint8_t idx, uint8_t op, uint8_t ck, uint8_t crc, uint8_t data, uint8_t opr);
- #if defined(__cplusplus)
- }
- #endif /* __cplusplus */
- #endif
|