ftimer_tacho_hw.h 8.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
/*
 * Copyright : (C) 2022 Phytium Information Technology, Inc.
 * All Rights Reserved.
 *
 * This program is OPEN SOURCE software: you can redistribute it and/or modify it
 * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
 * either version 1.0 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the Phytium Public License for more details.
 *
 *
 * FilePath: ftimer_tacho_hw.h
 * Date: 2022-02-10 14:53:42
 * LastEditTime: 2022-02-18 09:09:15
 * Description:  This files is for
 *
 * Modify History:
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 */

#ifndef BSP_DRIVERS_E2000_TIMER_HW_H
#define BSP_DRIVERS_E2000_TIMER_HW_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "fio.h"
#include "ftypes.h"
#include "fkernel.h"
#include "fparameters.h"

/* register offset */
#define FTIMER_CTRL_REG_OFFSET (0x0)                /*Timer or Tachometer 控制寄存器*/
#define FTACHO_RESULT_REG_OFFSET (0x4)                /*一个转速周期内的时钟周期计数结果*/
#define FTIMER_COMP_VALU_OFFSET (0x8)               /*定时计数值高 32 位*/
#define FTIMER_COMP_VALL_OFFSET (0x1c)              /*timer模式下:定时计数值低32位,tacho模式下:配置tach转速周期 = pulse_num*/
#define FTIMER_CNT_VALU_OFFSET (0x20)               /*计数器当前计数值高 32 位*/
#define FTIMER_CNT_VALL_OFFSET (0x24)               /*计数器当前计数值低 32 位*/
#define FTIMER_INTR_MASK_OFFSET (0x28)              /*中断使能寄存器*/
#define FTIMER_INTR_STATUS_OFFSET (0x2c)            /*中断状态寄存器*/
#define FTACHO_OVER_LIM_OFFSET (0x30)               /*预设的 tach 最大值*/
#define FTACHO_UNDER_LIM_OFFSET (0x34)              /*预设的 tach 最小值*/
#define FTIMER_START_VAL_OFFSET (0x38)              /*计数器初始值*/

/* bit set */
/* timer ctrl */
#define FTIMER_REG_TACHO_MODE_MASK (0x3 << 0)       /*bit [1:0] RW*/
#define FTIMER_REG_TACHO_MODE_TIMER (0x0 << 0)      /*定时器功能*/
#define FTIMER_REG_TACHO_MODE_TACHO (0x1 << 0)      /*tachometer 功能*/
#define FTIMER_REG_TACHO_MODE_CAPTURE (0x2 << 0)    /*输入 capture 功能*/

#define FTIMER_REG_TACHO_RESET (0x1 << 2)           /*in reset status*/

#define FTIMER_REG_TACHO_FORCE_LOAD (0x1 << 3)      /*force to update*/
#define FTIMER_REG_TACHO_CAPTURE_ENABLE (0x1 << 4)  /*enable input capture*/
#define FTIMER_REG_TACHO_CAPTURE_CNT_MASK (0x7f << 5)    /*in capture mode, cause intr when egde counting reach this val*/
#define FTIMER_REG_TACHO_CAPTURE_CNT_SHIFT 5        /*cap_cnt shift*/

#define FTACHO_REG_ANTI_JITTER_MASK (0x3 << 18)     /*anti jitter num = N + 1*/
#define FTACHO_REG_ANTI_JITTER_SHIFT 18             /*anti_jitter_number shift*/

#define FTACHO_REG_MODE_MASK (0x3 << 20)            /*select tacho input mode*/
#define FTACHO_REG_MODE_FALLING_EDGE (0x0 << 20)    /*select falling edge*/
#define FTACHO_REG_MODE_RISING_EDGE (0x1 << 20)     /*select rising edge*/
#define FTACHO_REG_MODE_DOUBLE_EDGE (0x2 << 20)     /*select both falling edge and rising*/

#define FTIMER_REG_CNT_RESTART (0x1 << 22)          /*select timer restart mode*/
#define FTIMER_REG_CNT_FREERUN (0x0 << 22)          /*select timer free_run mode*/

#define FTIMER_REG_CNT_SERIES_64BIT (0x1 << 24)     /*select counter bit 64 */
#define FTIMER_REG_CNT_SERIES_32BIT (0x0 << 24)     /*select counter bit 32 */

#define FTIMER_REG_ENABLE (0x1 << 25)               /*enable timer count*/

#define FTIMER_REG_CNT_CLR (0x1 << 26)              /*clear counter*/
#define FTIMER_REG_CNT_NOCLR (0x0 << 26)            /*don't clear counter*/

#define FTIMER_REG_MODE_ONCE (0x1 << 27)            /*one time timer*/
#define FTIMER_REG_MODE_CYC (0x0 << 27)             /*cycle timer*/

#define FTACHO_REG_CAP_IN_ENABLE (0x1 << 31)        /*enable tacho capture input*/

/* tacho result */
#define FTACHO_REG_RESU_MASK GENMASK(30, 0)         /*bit [30:0], tacho result*/
#define FTACHO_REG_RESU_ISVALID (0x1 << 31)         /*tacho result is valid*/

/* tacho over */
#define FTACHO_REG_OVER_MASK GENMASK(30, 0)         /*tacho max value mask*/

/* tacho under */
#define FTACHO_REG_UNDER_MASK GENMASK(30, 0)        /*tacho min value mask*/

/* intr mask */
#define FTACHO_OVER_INTR_EN (0x1 << 0)              /*tach 超转速中断使能*/
#define FTACHO_UNDER_INTR_EN (0x1 << 1)             /*tach 低于转速中断使能*/
#define FTIMER_ROLLOVER_INTR_EN (0x1 << 2)          /*计数器翻转中断使能*/
#define FTIMER_ONCECMP_INTR_EN (0x1 << 3)           /*一次定时输出中断使能*/
#define FTIMER_CYCCMP_INTR_EN (0x1 << 4)            /*重复定时输出中断使能*/
#define FTACHO_CAPTURE_INTR_EN (0x1 << 5)           /*tach 输入捕获中断使能*/

#define FTIMER_ALL_INTR_EN (FTIMER_ROLLOVER_INTR_EN | FTIMER_ONCECMP_INTR_EN | FTIMER_CYCCMP_INTR_EN)

/* intr status */
#define FTACHO_OVER_INTR_STATUS (0x1 << 0)          /*tach 超转速中断*/
#define FTACHO_UNDER_INTR_STATUS (0x1 << 1)         /*tach 低于转速中断*/
#define FTIMER_ROLLOVER_INTR_STATUS (0x1 << 2)      /*计数器翻转中断*/
#define FTIMER_ONCECMP_INTR_STATUS (0x1 << 3)       /*一次定时输出中断*/
#define FTIMER_CYCCMP_INTR_STATUS (0x1 << 4)        /*重复定时输出中断*/
#define FTACHO_CAPTURE_INTR_STATUS (0x1 << 5)       /*tach 输入捕获中断*/

/**
 * @name: FTIMER_READ_REG32
 * @msg:  读取定时器寄存器
 * @param {u32} addr 定时器的基地址
 * @param {u32} reg_offset   定时器的寄存器的偏移
 * @return {u32} 寄存器参数
 */
#define FTIMER_READ_REG32(addr, reg_offset) FtIn32(addr + (u32)reg_offset)

/**
 * @name: FTIMER_WRITE_REG32
 * @msg:  写入定时器寄存器
 * @param {u32} addr 定时器的基地址
 * @param {u32} reg_offset   定时器的寄存器的偏移
 * @param {u32} reg_value    写入寄存器参数
 * @return {void}
 */
#define FTIMER_WRITE_REG32(addr, reg_offset, reg_value) FtOut32(addr + (u32)reg_offset, (u32)reg_value)

#define FTIMER_TIMEOUT 3000     /*超时时间*/

#define FTIMER_BASE_ADDR(instance_p) TIMER_TACHO_BASE_ADDR((instance_p)->config.id)        /*获取设备基地址*/
/*read and write reg value*/
#define FTIMER_CTRL_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_CTRL_REG_OFFSET)
#define FTIMER_CTRL_WRITE(instance_p, regVal) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_CTRL_REG_OFFSET, (regVal))
#define FTIMER_CMPL_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_COMP_VALL_OFFSET)
#define FTIMER_CMPL_WRITE(instance_p, cmpL) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_COMP_VALL_OFFSET, (cmpL))
#define FTIMER_CMPU_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_COMP_VALU_OFFSET)
#define FTIMER_CMPU_WRITE(instance_p, cmpU) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_COMP_VALU_OFFSET, (cmpU))
#define FTIMER_STAR_WRITE(instance_p, cnt) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_START_VAL_OFFSET, (cnt))
#define FTIMER_STAR_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_START_VAL_OFFSET)
#define FTIMER_CNTL_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_CNT_VALL_OFFSET)
#define FTIMER_CNTU_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_CNT_VALU_OFFSET)
#define FTACHO_RESU_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTACHO_RESULT_REG_OFFSET)
#define FTACHO_OVER_WRITE(instance_p, over) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTACHO_OVER_LIM_OFFSET, (over))
#define FTACHO_UNDER_WRITE(instance_p, under) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTACHO_UNDER_LIM_OFFSET, (under))

#define FTIMER_INTR_M_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_INTR_MASK_OFFSET)
#define FTIMER_INTR_M_WRITE(instance_p, mask) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_INTR_MASK_OFFSET, (mask))
#define FTIMER_INTR_S_READ(instance_p) FTIMER_READ_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_INTR_STATUS_OFFSET)
/* write 1 clear */
#define FTIMER_INTR_S_CLEAR(instance_p, status) FTIMER_WRITE_REG32(FTIMER_BASE_ADDR(instance_p), FTIMER_INTR_STATUS_OFFSET, (status))

#ifdef __cplusplus
}
#endif

#endif // !