fcan_hw.h 11.4 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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
/*
 * 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: fcan_hw.h
 * Date: 2022-02-10 14:53:42
 * LastEditTime: 2022-02-18 08:29:05
 * Description:  This files is for
 *
 * Modify History:
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 */


#ifndef FT_CAN_HW_H
#define FT_CAN_HW_H

#include "ftypes.h"
#include "fio.h"
#include "sdkconfig.h"

/***ft CAN REGISTER offset*/
#define FCAN_CTRL_OFFSET            0x00 /* Global control register */
#define FCAN_INTR_OFFSET            0x04 /* Interrupt register */
#define FCAN_ARB_RATE_CTRL_OFFSET   0x08 /* Arbitration rate control register */
#define FCAN_DAT_RATE_CTRL_OFFSET   0x0C /* Data rate control register */
#define FCAN_ACC_ID0_OFFSET         0x10 /* Acceptance identifier0 register */
#define FCAN_ACC_ID1_OFFSET         0x14 /* Acceptance identifier1 register */
#define FCAN_ACC_ID2_OFFSET         0x18 /* Acceptance identifier2 register */
#define FCAN_ACC_ID3_OFFSET         0x1C /* Acceptance identifier3 register */
#define FCAN_ACC_ID0_MASK_OFFSET    0x20 /* Acceptance identifier0 mask register */
#define FCAN_ACC_ID1_MASK_OFFSET    0x24 /* Acceptance identifier1 mask register */
#define FCAN_ACC_ID2_MASK_OFFSET    0x28 /* Acceptance identifier2 mask register */
#define FCAN_ACC_ID3_MASK_OFFSET    0x2C /* Acceptance identifier3 mask register */
#define FCAN_XFER_STS_OFFSET        0x30 /* Transfer status register */
#define FCAN_ERR_CNT_OFFSET         0x34 /* Error counter register */
#define FCAN_FIFO_CNT_OFFSET        0x38 /* FIFO counter register */
#define FCAN_DMA_CTRL_OFFSET        0x3C /* DMA request control register */
#define FCAN_XFER_EN_OFFSET         0x40 /* Transfer enable register */
#define FCAN_FRM_INFO_OFFSET        0x48 /* Frame valid number register */
#define FCAN_TX_FIFO_OFFSET         0x100/* TX FIFO shadow register */
#define FCAN_RX_FIFO_OFFSET         0x200/* RX FIFO shadow register */

/*----------------------------------------------------------------------------*/
/* CAN register bit masks - FCAN_<REG>_<BIT>_MASK                            */
/*----------------------------------------------------------------------------*/

/* FCAN_CTRL mask */
#define FCAN_CTRL_XFER_MASK     BIT(0)   /*Transfer enable*/
#define FCAN_CTRL_TXREQ_MASK    BIT(1)   /*Transmit request*/
#define FCAN_CTRL_AIME_MASK     BIT(2)   /*Acceptance identifier mask enable*/
#define FCAN_CTRL_RST_MASK      BIT(7)   /* Soft rest 1:reset and auto clear */
#define FCAN_CTRL_RFEIDF_MASK   BIT(8)   /* whether generates frame recv completion interrupt when filtering frames */
#define FCAN_CTRL_IRFEDT_MASK   BIT(9)   /* whether generates frame recv completion interrupt when sending frame */
#define FCAN_CTRL_IOF_MASK      BIT(10)  /* send overload frame */
#define FCAN_CTRL_FDCRC_MASK    BIT(11)  /* Stuff count, crc mode */

/* FCAN_INTR mask */
#define FCAN_INTR_BOIS_MASK     BIT(0)  /* Bus off interrupt status*/
#define FCAN_INTR_PWIS_MASK     BIT(1)  /* Passive warning interrupt status*/
#define FCAN_INTR_PEIS_MASK     BIT(2)  /* Passive error interrupt status*/
#define FCAN_INTR_RFIS_MASK     BIT(3)  /* RX FIFO full interrupt status*/
#define FCAN_INTR_TFIS_MASK     BIT(4)  /* TX FIFO empty interrupt status*/
#define FCAN_INTR_REIS_MASK     BIT(5)  /* RX frame end interrupt status*/
#define FCAN_INTR_TEIS_MASK     BIT(6)  /* TX frame end interrupt status*/
#define FCAN_INTR_EIS_MASK      BIT(7)  /* Error interrupt status*/
#define FCAN_INTR_BOIE_MASK     BIT(8)  /* Bus off interrupt enable*/
#define FCAN_INTR_PWIE_MASK     BIT(9)  /* Passive warning interrupt enable*/
#define FCAN_INTR_PEIE_MASK     BIT(10) /* Passive error interrupt enable*/
#define FCAN_INTR_RFIE_MASK     BIT(11) /* RX FIFO full interrupt enable*/
#define FCAN_INTR_TFIE_MASK     BIT(12) /* TX FIFO empty interrupt enable*/
#define FCAN_INTR_REIE_MASK     BIT(13) /* RX frame end interrupt enable*/
#define FCAN_INTR_TEIE_MASK     BIT(14) /* TX frame end interrupt enable*/
#define FCAN_INTR_EIE_MASK      BIT(15) /* Error interrupt enable*/
#define FCAN_INTR_BOIC_MASK     BIT(16) /* Bus off interrupt clear*/
#define FCAN_INTR_PWIC_MASK     BIT(17) /* Passive warning interrupt clear*/
#define FCAN_INTR_PEIC_MASK     BIT(18) /* Passive error interrupt clear*/
#define FCAN_INTR_RFIC_MASK     BIT(19) /* RX FIFO full interrupt clear*/
#define FCAN_INTR_TFIC_MASK     BIT(20) /* TX FIFO empty interrupt clear*/
#define FCAN_INTR_REIC_MASK     BIT(21) /* RX frame end interrupt clear*/
#define FCAN_INTR_TEIC_MASK     BIT(22) /* TX frame end interrupt clear*/
#define FCAN_INTR_EIC_MASK      BIT(23)  /* Error interrupt clear*/
#define FCAN_INTR_BORIS_MASK    BIT(24)
#define FCAN_INTR_PWRIS_MASK    BIT(25)
#define FCAN_INTR_PERIS_MASK    BIT(26)
#define FCAN_INTR_RFRIS_MASK    BIT(27)
#define FCAN_INTR_TFRIS_MASK    BIT(28)
#define FCAN_INTR_RERIS_MASK    BIT(29)
#define FCAN_INTR_TERIS_MASK    BIT(30)
#define FCAN_INTR_ERIS_MASK     BIT(31)

/* FCAN_DAT_RATE_CTRL mask */

/* FCAN_ACC_ID(0-3)_MASK mask */
#define FCAN_ACC_IDN_MASK           GENMASK(28, 0)/*don’t care the matching */

#define FCAN_ACC_ID_REG_NUM         4

/* FCAN_XFER_STS mask */
#define FCAN_XFER_STS_XFERS_GET(x)     GET_REG32_BITS((x), 10, 10)
#define FCAN_XFER_STS_RS_GET(x)        GET_REG32_BITS((x), 9, 9)
#define FCAN_XFER_STS_TS_GET(x)        GET_REG32_BITS((x), 8, 8)
#define FCAN_XFER_STS_FIES_GET(x)      GET_REG32_BITS((x), 7, 3)
#define FCAN_XFER_STS_FRAS_GET(x)      GET_REG32_BITS((x), 2, 0)

/* FCAN_ERR_CNT_OFFSET mask */
#define FCAN_ERR_CNT_RFN_MASK       GENMASK(8, 0)    /*Receive error counter*/
#define FCAN_ERR_CNT_RFN_GET(x)     GET_REG32_BITS((x), 8, 0)
#define FCAN_ERR_CNT_RFN_SET(x)     SET_REG32_BITS((x), 8, 0)

#define FCAN_ERR_CNT_TFN_MASK       GENMASK(24, 16)    /*Transmit error counter*/
#define FCAN_ERR_CNT_TFN_GET(x)     GET_REG32_BITS((x), 24, 16)
#define FCAN_ERR_CNT_TFN_SET(x)     SET_REG32_BITS((x), 24, 16)

/* FCAN_FIFO_CNT_OFFSET mask */
#define FCAN_FIFO_CNT_RFN_MASK       GENMASK(6, 0)    /*Receive FIFO valid data number*/
#define FCAN_FIFO_CNT_RFN_GET(x)     GET_REG32_BITS((x), 6, 0)
#define FCAN_FIFO_CNT_RFN_SET(x)     SET_REG32_BITS((x), 6, 0)

#define FCAN_FIFO_CNT_TFN_MASK       GENMASK(6, 0)    /*Transmit FIFO valid data number*/
#define FCAN_FIFO_CNT_TFN_GET(x)     GET_REG32_BITS((x), 22, 16)
#define FCAN_FIFO_CNT_TFN_SET(x)     SET_REG32_BITS((x), 22, 16)

#define FCAN_IDR_ID1_SHIFT          21 /* Standard Messg Identifier */
#define FCAN_IDR_SDLC_SHIFT         14
#define FCANFD_IDR_EDLC_SHIFT       24
#define FCAN_IDR_EDLC_SHIFT         26
#define FCAN_ACC_IDN_SHIFT          18 /*Standard ACC ID shift*/
#define FCANFD_IDR_GET_EDLC_SHIFT   12
#define FCANFD_IDR1_SDLC_SHIFT      11

/* can */
#define FCAN_IDR_ID2_GET(x)   GET_REG32_BITS((x), 18, 1)  /* Get extended message ident */
#define FCAN_IDR_ID2_SET(x)   SET_REG32_BITS((x), 18, 1)  /* Set extended message ident */
#define FCAN_IDR_ID1_GET(x)   GET_REG32_BITS((x), 31, 21)  /* Get standard msg identifier */
#define FCAN_IDR_ID1_SET(x)   SET_REG32_BITS((x), 31, 21)  /* Set standard msg identifier */
#define FCAN_IDR_IDE_MASK   BIT(19)     /* Identifier extension */
#define FCAN_IDR_SRR_MASK   BIT(20)  /* Substitute remote TXreq */
#define FCAN_IDR_RTR_MASK   BIT(0)  /* Extended frames remote TX request */
#define FCAN_IDR_PAD_MASK   GENMASK(13, 0)  /* Standard msg padding 1 */
#define FCAN_IDR_DLC_GET(x)   GET_REG32_BITS((x), 17, 14)  /* Standard msg dlc */
#define FCAN_IDR_EDLC_GET(x)  GET_REG32_BITS((x), 29, 26)  /* Extended msg dlc */

/* canfd */
#define FTCANFD_ID1_FDL_MASK    BIT(18)     /* CANFD Standard FDF */
#define FTCANFD_ID1_BRS_MASK    BIT(16)     /* CANFD Standard BRS */
#define FTCANFD_ID1_ESI_MASK    BIT(15)     /* CANFD Standard ESI */
#define FTCANFD_ID1_SDLC_GET(x)   GET_REG32_BITS((x),14, 11)  /* CANFD Standard msg dlc */
#define FTCANFD_IDR_PAD_MASK    GENMASK(10, 0)  /* CANFD Standard msg padding 1 */

#define FTCANFD_ID2_FDL_MASK    BIT(31)  /* CANFD Extended FDF */
#define FTCANFD_ID2_BRS_MASK    BIT(29)  /* CANFD Extended BRS */
#define FTCANFD_ID2_ESI_MASK    BIT(28)  /* CANFD Extended ESI */
#define FTCANFD_ID2_EDLC_GET(x)    GET_REG32_BITS((x), 27, 24)  /* CANFD Extended msg dlc */

#define FTCAN_INTR_EN (FTCAN_INTR_TEIE_MASK | FTCAN_INTR_REIE_MASK | FTCAN_INTR_RFIE_MASK)

/* Can timming */
#if defined(CONFIG_TARGET_F2000_4) || defined(CONFIG_TARGET_D2000)

    #define FCAN_ARB_TSEG1_MIN  1
    #define FCAN_ARB_TSEG1_MAX  16
    #define FCAN_ARB_TSEG2_MIN  1
    #define FCAN_ARB_TSEG2_MAX  8
    #define FCAN_ARB_SJW_MAX    4
    #define FCAN_ARB_BRP_MIN    1
    #define FCAN_ARB_BRP_MAX    512
    #define FCAN_ARB_BRP_INC    1

    #define FCAN_DATA_TSEG1_MIN 1
    #define FCAN_DATA_TSEG1_MAX 16
    #define FCAN_DATA_TSEG2_MIN 1
    #define FCAN_DATA_TSEG2_MAX 8
    #define FCAN_DATA_SJW_MAX   4
    #define FCAN_DATA_BRP_MIN   1
    #define FCAN_DATA_BRP_MAX   512
    #define FCAN_DATA_BRP_INC   1

#elif defined(CONFIG_TARGET_E2000)

    #define FCAN_ARB_TSEG1_MIN  1
    #define FCAN_ARB_TSEG1_MAX  16
    #define FCAN_ARB_TSEG2_MIN  1
    #define FCAN_ARB_TSEG2_MAX  8
    #define FCAN_ARB_SJW_MAX    4
    #define FCAN_ARB_BRP_MIN    1
    #define FCAN_ARB_BRP_MAX    8192
    #define FCAN_ARB_BRP_INC    1

    #define FCAN_DATA_TSEG1_MIN 1
    #define FCAN_DATA_TSEG1_MAX 16
    #define FCAN_DATA_TSEG2_MIN 1
    #define FCAN_DATA_TSEG2_MAX 8
    #define FCAN_DATA_SJW_MAX   4
    #define FCAN_DATA_BRP_MIN   1
    #define FCAN_DATA_BRP_MAX   8192
    #define FCAN_DATA_BRP_INC   1

#endif


#define FCAN_FIFO_DEPTH     64

/**
* This macro reads the given register.
* @param    base_addr is the base address of the device.
* @param    reg_offset is the register offset to be read.
* @return   The 32-bit value of the register
* @note     None.
*****************************************************************************/
#define FCAN_READ_REG32(addr, reg_offset) FtIn32((addr) + (u32)(reg_offset))

/****************************************************************************/
/**
* This macro writes the given register.
* @param    base_addr is the base address of the device.
* @param    reg_offset is the register offset to be written.
* @param    data is the 32-bit value to write to the register.
* @return   None.
* @note     None.
*****************************************************************************/
#define FCAN_WRITE_REG32(addr, reg_offset, reg_value) FtOut32((addr) + (u32)reg_offset, (u32)reg_value)

#define FCAN_SETBIT(base_addr, reg_offset, data)      FtSetBit32((base_addr) + (u32)(reg_offset), (u32)(data))

#define FCAN_CLEARBIT(base_addr, reg_offset, data)     FtClearBit32((base_addr) + (u32)(reg_offset), (u32)(data))


#define FCAN_TX_FIFO_FULL(instance_p) (FCAN_FIFO_DEPTH == FCAN_FIFO_CNT_TFN_GET(FCAN_READ_REG32(instance_p->config.base_address, FCAN_FIFO_CNT_OFFSET)))

#define FCAN_RX_FIFO_EMPTY(instance_p) (0 == FCAN_FIFO_CNT_RFN_GET(FCAN_READ_REG32(instance_p->config.base_address, FCAN_FIFO_CNT_OFFSET)))


void FCanDump(uintptr base_addr);

#endif // !