271 lines
9.4 KiB
C
271 lines
9.4 KiB
C
/*
|
||
* 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: fi2c_hw.h
|
||
* Date: 2022-02-10 14:53:42
|
||
* LastEditTime: 2022-02-18 08:36:32
|
||
* Description: This files is for
|
||
*
|
||
* Modify History:
|
||
* Ver Who Date Changes
|
||
* ----- ------ -------- --------------------------------------
|
||
*/
|
||
|
||
|
||
#ifndef DRIVERS_I2C_FI2C_HW_H
|
||
#define DRIVERS_I2C_FI2C_HW_H
|
||
|
||
/* - 传入模块基地址,不能复杂结构体
|
||
- hardware interface of device || low-level driver function prototypes
|
||
|
||
- 包括驱动寄存器参数和low-level操作定义
|
||
1. 定义寄存器偏移
|
||
2. 对上提供该模块寄存器操作的接口
|
||
3. 一些简单外设提供直接操作接口
|
||
4. 可以定义一些状态的接口,用于响应驱动状态的变化 */
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
/***************************** Include Files *********************************/
|
||
|
||
#include "fparameters.h"
|
||
#include "fio.h"
|
||
#include "ferror_code.h"
|
||
#include "fkernel.h"
|
||
|
||
/************************** Constant Definitions *****************************/
|
||
|
||
/** @name Register Map
|
||
*
|
||
* Register offsets from the base address of an I2C device.
|
||
* @{
|
||
*/
|
||
#define FI2C_CON_OFFSET 0x00
|
||
#define FI2C_TAR_OFFSET 0x04
|
||
#define FI2C_SAR_OFFSET 0x08
|
||
#define FI2C_HS_MADDR_OFFSET 0x0C
|
||
#define FI2C_DATA_CMD_OFFSET 0x10
|
||
#define FI2C_SS_SCL_HCNT_OFFSET 0x14
|
||
#define FI2C_SS_SCL_LCNT_OFFSET 0x18
|
||
#define FI2C_FS_SCL_HCNT_OFFSET 0x1C
|
||
#define FI2C_FS_SCL_LCNT_OFFSET 0x20
|
||
#define FI2C_HS_SCL_HCNT_OFFSET 0x24
|
||
#define FI2C_HS_SCL_LCNT_OFFSET 0x28
|
||
#define FI2C_INTR_STAT_OFFSET 0x2C
|
||
#define FI2C_INTR_MASK_OFFSET 0x30
|
||
#define FI2C_RAW_INTR_STAT_OFFSET 0x34
|
||
#define FI2C_RX_TL_OFFSET 0x38
|
||
#define FI2C_TX_TL_OFFSET 0x3C
|
||
#define FI2C_CLR_INTR_OFFSET 0x40
|
||
#define FI2C_CLR_RX_UNDER_OFFSET 0x44
|
||
#define FI2C_CLR_RX_OVER_OFFSET 0x48
|
||
#define FI2C_CLR_TX_OVER_OFFSET 0x4C
|
||
#define FI2C_CLR_RD_REQ_OFFSET 0x50
|
||
#define FI2C_CLR_TX_ABRT_OFFSET 0x54
|
||
#define FI2C_CLR_RX_DONE_OFFSET 0x58
|
||
#define FI2C_CLR_ACTIVITY_OFFSET 0x5c
|
||
#define FI2C_CLR_STOP_DET_OFFSET 0x60
|
||
#define FI2C_CLR_START_DET_OFFSET 0x64
|
||
#define FI2C_CLR_GEN_CALL_OFFSET 0x68
|
||
#define FI2C_ENABLE_OFFSET 0x6C
|
||
#define FI2C_STATUS_OFFSET 0x70
|
||
#define FI2C_TXFLR_OFFSET 0x74
|
||
#define FI2C_RXFLR_OFFSET 0x78
|
||
#define FI2C_SDA_HOLD_OFFSET 0x7c
|
||
#define FI2C_TX_ABRT_SOURCE_OFFSET 0x80
|
||
#define FI2C_SLV_DATA_NACK_ONLY_OFFSET 0x84
|
||
#define FI2C_DMA_CR_OFFSET 0x88
|
||
#define FI2C_DMA_TDLR_OFFSET 0x8c
|
||
#define FI2C_DMA_RDLR_OFFSET 0x90
|
||
#define FI2C_SDA_SETUP_OFFSET 0x94
|
||
#define FI2C_ACK_GENERAL_CALL_OFFSET 0x98
|
||
#define FI2C_ENABLE_STATUS_OFFSET 0x9C
|
||
#define FI2C_FS_SPKLEN_OFFSET 0xa0
|
||
#define FI2C_HS_SPKLEN_OFFSET 0xa4
|
||
#define FI2C_COMP_PARAM_1_OFFSET 0xf4
|
||
#define FI2C_COMP_VERSION_OFFSET 0xf8
|
||
#define FI2C_COMP_TYPE_OFFSET 0xfc
|
||
|
||
/** @name FI2C_CON_OFFSET Register
|
||
*/
|
||
#define FI2C_CON_MASTER_MODE (0x1 << 0)
|
||
#define FI2C_CON_SLAVE_MODE (0x0 << 0)
|
||
|
||
#define FI2C_CON_SPEED_MASK GENMASK(2, 1)
|
||
#define FI2C_CON_STD_SPEED (0x1 << 1)
|
||
#define FI2C_CON_FAST_SPEED (0x2 << 1)
|
||
#define FI2C_CON_HIGH_SPEED (0x3 << 1)
|
||
|
||
/* for slave mode */
|
||
#define FI2C_CON_SLAVE_ADR_7BIT (0x0 << 3)
|
||
#define FI2C_CON_SLAVE_ADR_10BIT (0x1 << 3)
|
||
|
||
/* for master mode */
|
||
#define FI2C_CON_MASTER_ADR_7BIT (0x0 << 4)
|
||
#define FI2C_CON_MASTER_ADR_10BIT (0x1 << 4)
|
||
|
||
#define FI2C_CON_RESTART_EN (0x1 << 5)
|
||
#define FI2C_CON_SLAVE_DISABLE (0x1 << 6)
|
||
|
||
/** @name FI2C_TAR_OFFSET Register
|
||
*/
|
||
#define FI2C_IC_TAR_MASK GENMASK(9, 0)
|
||
#define FI2C_GC_OR_START (0x1 << 10)
|
||
#define FI2C_SPECIAL (0x1 << 11)
|
||
#define FI2C_TAR_ADR_7BIT (0x0 << 12)
|
||
#define FI2C_TAR_ADR_10BIT (0x1 << 12)
|
||
|
||
/** @name FI2C_SAR_OFFSET Register
|
||
*/
|
||
#define FI2C_IC_SAR_MASK GENMASK(9, 0) //Slave addr when in slave mode
|
||
|
||
/** @name FI2C_HS_MADDR_OFFSET Register
|
||
*/
|
||
#define FI2C_IC_HS_MAR GENMASK(2, 0) //I2C High Speed模式主机编码
|
||
|
||
/** @name FI2C_DATA_CMD_OFFSET Register
|
||
*/
|
||
#define FI2C_DATA_MASK GENMASK(7, 0)
|
||
#define FI2C_DATA_CMD_READ (0x1 << 8)
|
||
#define FI2C_DATA_CMD_WRITE (0x0 << 8)
|
||
#define FI2C_DATA_CMD_STOP (0x1 << 9)
|
||
#define FI2C_DATA_CMD_RESTART (0x1 << 10)
|
||
|
||
/** @name FI2C_INTR_STAT_OFFSET Register
|
||
* @name FI2C_INTR_MASK_OFFSET Register
|
||
* @name FI2C_RAW_INTR_STAT_OFFSET Register
|
||
*/
|
||
#define FI2C_INTR_RX_UNDER (0x1 << 0) /* 接收缓冲区为空 */
|
||
#define FI2C_INTR_RX_OVER (0x1 << 1) /* 接收缓冲区大小达到 IC_RX_BUFFER_DEPTH ,且还继续从外部接收数据 */
|
||
#define FI2C_INTR_RX_FULL (0x1 << 2) /* 接收缓冲区大于等于 IC_RX_TL 中设定的门限值(RX_TL) */
|
||
#define FI2C_INTR_TX_OVER (0x1 << 3) /* 发送缓冲区大小达到 IC_TX_BUFFER_DEPTH,并且还在尝试写数据 */
|
||
#define FI2C_INTR_TX_EMPTY (0x1 << 4) /* 发送缓冲区小于等于 IC_TX_TL 寄存器中设定的门限值 */
|
||
#define FI2C_INTR_RD_REQ (0x1 << 5) /* 读请求标志 */
|
||
#define FI2C_INTR_TX_ABRT (0x1 << 6) /* I2C 不能完成FIFO内容的传输 */
|
||
#define FI2C_INTR_RX_DONE (0x1 << 7) /* Slave工作模式下,规定时间内没有Master的回应,通信结束 */
|
||
#define FI2C_INTR_ACTIVITY (0x1 << 8) /* I2C 控制器的活动状态 */
|
||
#define FI2C_INTR_STOP_DET (0x1 << 9) /* I2C 总线接口上是否产生了 STOP */
|
||
#define FI2C_INTR_START_DET (0x1 << 10) /* I2C 总线接口上是否产生了 START 或 RESTART */
|
||
#define FI2C_INTR_GEN_CALL (0x1 << 11) /* I2C 总线接口上接收并识别到General Call格式 */
|
||
|
||
#define FI2C_INTR_ALL_MASK 0x8FF
|
||
|
||
#define FI2C_INTR_MASTER_WR_MASK (FI2C_INTR_TX_EMPTY | FI2C_INTR_TX_ABRT)
|
||
#define FI2C_INTR_MASTER_RD_MASK (FI2C_INTR_MASTER_WR_MASK | FI2C_INTR_RX_FULL)
|
||
|
||
#define FI2C_INTR_SLAVE_DEF_MASK (FI2C_INTR_RX_FULL | FI2C_INTR_STOP_DET | \
|
||
FI2C_INTR_RD_REQ | FI2C_INTR_RX_DONE | \
|
||
FI2C_INTR_RX_UNDER | FI2C_INTR_TX_ABRT |\
|
||
FI2C_INTR_START_DET)
|
||
|
||
/** @name FI2C_RX_TL_OFFSET Register
|
||
*/
|
||
#define FI2C_RX_TL_MASK GENMASK(7, 0)
|
||
|
||
/** @name FI2C_TX_TL_OFFSET Register
|
||
*/
|
||
#define FI2C_TX_TL_MASK GENMASK(7, 0)
|
||
|
||
/** @name FI2C_IC_ENABLE_OFFSET Register
|
||
*/
|
||
#define FI2C_ENABLE_CONTROLLER (0x1 << 0)
|
||
#define FI2C_DISABLE_CONTROLLER (0x0 << 0)
|
||
|
||
/** @name FI2C_STATUS_OFFSET Register
|
||
*/
|
||
#define FI2C_STATUS_ACTIVITY (0x1 << 0)
|
||
#define FI2C_STATUS_TFNF (0x1 << 1)
|
||
#define FI2C_STATUS_TFE (0x1 << 2)
|
||
#define FI2C_STATUS_RFNE (0x1 << 3)
|
||
#define FI2C_STATUS_RFF (0x1 << 4)
|
||
#define FI2C_STATUS_MST_ACTIVITY (0x1 << 5)
|
||
#define FI2C_STATUS_SLV_ACTIVITY (0x1 << 6)
|
||
|
||
/** @name FI2C_ENABLE_OFFSET Register
|
||
*/
|
||
#define FI2C_IC_ENABLE (0x1 << 0)
|
||
#define FI2C_IC_DISABLE (0x0 << 0)
|
||
#define FI2C_IC_ENABLE_MASK (0x1 << 0)
|
||
|
||
#define FI2C_SLV_DISABLED_WHILE_BUSY (0x1 << 1)
|
||
#define FI2C_SLV_RX_DATA_LOST (0x1 << 2)
|
||
|
||
/* High and low times in different speed modes (in ns) */
|
||
#define FI2C_MIN_SS_SCL_HIGHTIME 4000
|
||
#define FI2C_MIN_SS_SCL_LOWTIME 4700
|
||
#define FI2C_MIN_FS_SCL_HIGHTIME 600
|
||
#define FI2C_MIN_FS_SCL_LOWTIME 1300
|
||
#define FI2C_MIN_FP_SCL_HIGHTIME 500
|
||
#define FI2C_MIN_FP_SCL_LOWTIME 500
|
||
#define FI2C_MIN_HS_SCL_HIGHTIME 60
|
||
#define FI2C_MIN_HS_SCL_LOWTIME 160
|
||
#define FI2C_DEFAULT_SDA_HOLD_TIME 300
|
||
|
||
#define FI2C_READ_REG32(addr, reg_offset) FtIn32((addr) + (u32)(reg_offset))
|
||
#define FI2C_WRITE_REG32(addr, reg_offset, reg_value) FtOut32((addr) + (u32)(reg_offset), (u32)(reg_value))
|
||
|
||
#define FI2C_IIC_FIFO_MAX_LV 8
|
||
|
||
/**************************** Type Definitions *******************************/
|
||
|
||
/************************** Variable Definitions *****************************/
|
||
enum
|
||
{
|
||
FI2C_STANDARD_SPEED = 0,
|
||
FI2C_FAST_SPEED,
|
||
|
||
FI2C_SPEED_MODE_MAX
|
||
};
|
||
/***************** Macros (Inline Functions) Definitions *********************/
|
||
#define FI2C_GET_INTRRUPT_MASK(addr) FI2C_READ_REG32((addr), FI2C_INTR_MASK_OFFSET)
|
||
|
||
#define FI2C_SET_INTRRUPT_MASK(addr, mask) FI2C_WRITE_REG32((addr), FI2C_INTR_MASK_OFFSET, (mask))
|
||
|
||
#define FI2C_CLEAR_INTR_STATUS(addr) FI2C_READ_REG32((addr), FI2C_CLR_INTR_OFFSET)
|
||
|
||
#define FI2C_GET_STATUS(addr) FI2C_READ_REG32((addr), FI2C_STATUS_OFFSET)
|
||
|
||
#define FI2C_READ_DATA(addr) (u8)(FI2C_DATA_MASK & FI2C_READ_REG32(addr, FI2C_DATA_CMD_OFFSET))
|
||
|
||
#define FI2C_WRITE_DATA(addr, dat) FI2C_WRITE_REG32((addr), FI2C_DATA_CMD_OFFSET, (dat))
|
||
|
||
#define FI2C_SET_RX_TL(addr, level) FI2C_WRITE_REG32((addr), FI2C_RX_TL_OFFSET, (level))
|
||
|
||
#define FI2C_SET_TX_TL(addr, level) FI2C_WRITE_REG32((addr), FI2C_TX_TL_OFFSET, (level))
|
||
|
||
#define FI2C_READ_INTR_STAT(addr) FI2C_READ_REG32((addr), FI2C_INTR_STAT_OFFSET)
|
||
|
||
#define FI2C_READ_RAW_INTR_STAT(addr) FI2C_READ_REG32((addr), FI2C_RAW_INTR_STAT_OFFSET)
|
||
|
||
inline static u32 FI2cGetEnable(uintptr addr)
|
||
{
|
||
return FI2C_READ_REG32(addr, FI2C_ENABLE_STATUS_OFFSET);
|
||
}
|
||
|
||
/************************** Function Prototypes ******************************/
|
||
FError FI2cSetEnable(uintptr addr, boolean enable);
|
||
FError FI2cSetSpeed(uintptr addr, u32 speed_rate);
|
||
FError FI2cWaitStatus(uintptr addr, u32 stat_bit);
|
||
FError FI2cWaitBusBusy(uintptr addr);
|
||
FError FI2cSetTar(uintptr addr, u32 tar_addr);
|
||
FError FI2cSetSar(uintptr addr, u32 sar_addr);
|
||
FError FI2cFlushRxFifo(uintptr addr);
|
||
u32 FI2cClearIntrBits(uintptr addr, u32 *last_err_p);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif |