123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2022-07-15 Emuzit first version
- */
- #ifndef __CH56X_TIMER_H__
- #define __CH56X_TIMER_H__
- #include "soc.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- union _timer_ctrl_mod
- {
- uint8_t reg;
- struct
- {
- uint8_t mode_in : 1; // B.0 : RW, timer mode setting
- uint8_t all_clear : 1; // B.1 : RW, clear FIFO/count/int-flag
- uint8_t count_en : 1; // B.2 : RW, enable timer module
- uint8_t out_en : 1; // B.3 : RW, timer output enable
- uint8_t out_polar : 1; // B.4 : RW, output polarity for PWM mode
- uint8_t resv_5 : 1;
- uint8_t pwm_repeat : 2; // B.7-6 : RW, PWM repeat count, 1/4/8/16
- };
- struct
- {
- uint8_t stuff_0 : 6;
- uint8_t cap_edge : 2; // B.7-6 : RW, capture edge mode
- };
- };
- #define RB_TMR_MODE_IN 0x01
- #define RB_TMR_ALL_CLEAR 0x02
- #define RB_TMR_COUNT_EN 0x04
- #define RB_TMR_OUT_EN 0x08
- #define RB_TMR_OUT_POLAR 0x10
- #define RB_TMR_CAP_COUNT 0x10
- #define RB_TMR_PWM_REPEAT 0xc0
- #define RB_TMR_CAP_EDGE 0xc0
- #define TMR_MODE_TIMER_PWM 0
- #define TMR_MODE_CAP_COUNT 1
- #define TMR_PWM_REPEAT_1 0
- #define TMR_PWM_REPEAT_4 1
- #define TMR_PWM_REPEAT_8 2
- #define TMR_PWM_REPEAT_16 3
- #define TMR_CAP_EDGE_NONE 0
- #define TMR_CAP_EDGE_BOTH 1
- #define TMR_CAP_EDGE_F2F 2
- #define TMR_CAP_EDGE_R2R 3
- union _timer_ctrl_dma
- {
- uint8_t reg;
- struct
- {
- uint8_t dma_enable : 1; // B.0 : RW, enable DMA
- uint8_t resv_1 : 1;
- uint8_t dma_loop : 1; // B.2 : RW, enable DMA address looping
- uint8_t resv_3 : 5;
- };
- };
- #define RB_TMR_DMA_ENABLE 0x01
- #define RB_TMR_DMA_LOOP 0x04
- union _timer_interrupt
- {
- uint8_t reg;
- struct
- {
- uint8_t cyc_end : 1; // B.0
- uint8_t data_act : 1; // B.1
- uint8_t fifo_hf : 1; // B.2
- uint8_t dma_end : 1; // B.3
- uint8_t fifo_ov : 1; // B.4
- uint8_t resv_5 : 3;
- };
- };
- #define RB_TMR_IX_MASK 0x1f
- #define RB_TMR_IE_CYC_END 0x01 // RW, enable interrupt for timer capture count timeout or PWM cycle end
- #define RB_TMR_IE_DATA_ACT 0x02 // RW, enable interrupt for timer capture input action or PWM trigger
- #define RB_TMR_IE_FIFO_HF 0x04 // RW, enable interrupt for timer FIFO half (capture fifo >=4 or PWM fifo <=3)
- #define RB_TMR_IE_DMA_END 0x08 // RW, enable interrupt for timer1/2 DMA completion
- #define RB_TMR_IE_FIFO_OV 0x10 // RW, enable interrupt for timer FIFO overflow
- #define RB_TMR_IF_CYC_END 0x01 // RW1, interrupt flag for timer capture count timeout or PWM cycle end
- #define RB_TMR_IF_DATA_ACT 0x02 // RW1, interrupt flag for timer capture input action or PWM trigger
- #define RB_TMR_IF_FIFO_HF 0x04 // RW1, interrupt flag for timer FIFO half (capture fifo >=4 or PWM fifo <=3)
- #define RB_TMR_IF_DMA_END 0x08 // RW1, interrupt flag for timer1/2 DMA completion
- #define RB_TMR_IF_FIFO_OV 0x10 // RW1, interrupt flag for timer FIFO overflow
- /*
- * 0x00 R8_TMRx_CTRL_MOD: mode setting register
- * 0x01 R8_TMRx_CTRL_DMA: DMA control register
- * 0x02 R8_TMRx_INTER_EN: interrupt enable register
- * 0x06 R8_TMRx_INT_FLAG: interrupt flag register
- * 0x07 R8_TMRx_FIFO_COUNT: RO, FIFO count register
- * 0x08 R32_TMRx_COUNT: RO, timer current count register
- * 0x0c R32_TMRx_CNT_END: RW, timer count end register
- * 0x10 R32_TMRx_FIFO: RO/WO, FIFO data register, LSB 26 bits
- * 0x14 R32_TMRx_DMA_NOW: RW, DMA buffer current address, LSB 18 bits
- * 0x18 R32_TMRx_DMA_BEG: RW, DMA buffer begin address, LSB 18 bits
- * 0x1c R32_TMRx_DMA_END: RW, DMA buffer end address (exclusive), LSB 18 bits
- *
- * Note: DMA related registers (0x10,0x14,0x18,0x1c) are TMR1/2 only
- *
- * CAVEAT: gcc (as of 8.2.0) tends to read 32-bit word for bit field test.
- * Be careful for those with side effect for read.
- */
- struct timer_registers
- {
- union _timer_ctrl_mod CTRL_MOD;
- union _timer_ctrl_dma CTRL_DMA;
- union _timer_interrupt INTER_EN;
- uint8_t resv_3[3];
- union _timer_interrupt INT_FLAG;
- uint8_t FIFO_COUNT;
- uint32_t COUNT;
- uint32_t CNT_END;
- uint32_t FIFO;
- uint32_t DMA_NOW;
- uint32_t DMA_BEG;
- uint32_t DMA_END;
- } __packed;
- CHECK_STRUCT_SIZE(struct timer_registers, 0x20);
- #ifdef __cplusplus
- }
- #endif
- #endif
|