| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /**
- ******************************************************************************************************************************
- *
- *@file driver_irrx.c
- *
- *@brief Source file for IR rx driver
- *
- *Copyright (c) 2023, BLUETRUM
- ******************************************************************************************************************************
- **/
- #include "driver_ir.h"
- /**
- * @brief Set the clock,and clock/rx io init.Set irrx register.
- * @param irrx_reg: irrx register address
- * @param irrx_param: irrx params,include wakup_en/clock/int_en/data_format.
- * @retval None
- */
- void irrx_base_init(irrx_typedef *irrx_reg, const irrx_param_t *irrx_param)
- {
- irrx_decode_config(irrx_reg, irrx_param);
- irrx_init(irrx_reg, irrx_param);
- }
- /**
- * @brief Set irrx wakup_en/int_en/data_format.
- * @param irrx_reg: irrx register address
- * @param irrx_param: irrx params,include wakup_en/clock/int_en/data_format.
- * @retval None
- */
- void irrx_init(irrx_typedef *irrx_reg, const irrx_param_t *irrx_param)
- {
- // IR RX Wake Up Sleep Mode Enable
- if (IRRX_WAKUP_SLEEP_ENABLE == irrx_param->wakup_en) {
- SETF_REG_IRRXCON_IRWKEN();
- }
- else if (IRRX_WAKUP_SLEEP_DISABLE == irrx_param->wakup_en) {
- CLRF_REG_IRRXCON_IRWKEN();
- }
- // IR RX Data Select 16 Bit Data
- if (IRRX_DATA_SELECT_16BIT == irrx_param->data_format) {
- SETF_REG_IRRXCON_IRRXSEL();
- }
- else if (IRRX_DATA_SELECT_32BIT == irrx_param->data_format) {
- CLRF_REG_IRRXCON_IRRXSEL();
- }
- // IR RX Interrupt Enable
- if (IRRX_INT_DISABLE == irrx_param->int_en) {
- CLRF_REG_IRRXCON_IRIE();
- }
- else if (IRRX_INT_ENABLE == irrx_param->int_en) {
- SETF_REG_IRRXCON_IRIE();
- }
- // IR RX Enable
- if (IRRX_DISABLE == irrx_param->irrx_en) {
- CLRF_REG_IRRXCON_IREN();
- }
- else if (IRRX_ENABLE == irrx_param->irrx_en) {
- SETF_REG_IRRXCON_IREN();
- }
- }
- /**
- * @brief irrx enable and set irrx period0/period1/err0/err1 value.
- * @param irrx_reg: irrx register address
- * @retval None
- */
- void irrx_decode_config(irrx_typedef *irrx_reg, const irrx_param_t *irrx_param)
- {
- double prescale;
- volatile u32 timing_prescale, period0, period1, err0, err1;
- timing_prescale = ir_timing_freq_get(irrx_param->clk_sel);
- prescale = ((double)timing_prescale/1000000);
- period0 = BIT(16) * (uint16_t)(RPTPR_CNT * prescale) |
- (uint16_t)(DATPR_CNT * prescale);
- period1 = BIT(16) * (uint16_t)(DATA_1_CNT * prescale) |
- (uint16_t)(DATA_0_CNT * prescale);
- err0 = BIT(16) * (uint16_t)(RPTERR_CNT * prescale) |
- (uint16_t)(DATERR_CNT * prescale);
- err1 = BIT(20) * (uint16_t)(TOPR_CNT * prescale) |
- BIT(10) * (uint16_t)(ONEERR_CNT * prescale) |
- (uint16_t)(ZEROERR_CNT * prescale);
- irrx_reg->period0 = period0;
- irrx_reg->period1 = period1;
- irrx_reg->err0 = err0;
- irrx_reg->err1 = err1;
- //SETF_REG_IRRXCON_IREN();
- }
- void irrx_decode_init(irrx_typedef *irrx_reg, const irrx_param_t *irrx_param)
- {
- ir_clk_init(irrx_param->clk_sel);
- clk_gate1_cmd(CLK_GATE1_IRRX, CLK_EN);
- irrx_base_init(irrx_reg, irrx_param);
- }
- void irrx_wake_init(irrx_typedef *irrx_reg, const irrx_param_t *irrx_param)
- {
- ir_clk_init(irrx_param->clk_sel);
- clk_gate1_cmd(CLK_GATE1_IRRX, CLK_EN);
- irrx_base_init(irrx_reg, irrx_param);
- }
|