221 lines
9.4 KiB
C
221 lines
9.4 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
#ifndef __HAL_I2C_H__
|
|
#define __HAL_I2C_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "plat_types.h"
|
|
#include "hal_gpio.h"
|
|
#include "hal_sensor_eng.h"
|
|
|
|
// For 10-bit address devices: OR the following mask with the real address
|
|
#define HAL_I2C_10BITADDR_MASK (1 << 15)
|
|
|
|
enum HAL_I2C_ACTION_AFTER_WRITE_T {
|
|
HAL_I2C_STOP_AFTER_WRITE = 0,
|
|
HAL_I2C_RESTART_AFTER_WRITE,
|
|
};
|
|
|
|
enum HAL_I2C_ID_T {
|
|
HAL_I2C_ID_0 = 0,
|
|
#if (CHIP_HAS_I2C > 1)
|
|
HAL_I2C_ID_1,
|
|
#endif
|
|
|
|
HAL_I2C_ID_NUM,
|
|
};
|
|
|
|
enum HAL_I2C_API_MODE_T {
|
|
HAL_I2C_API_MODE_TASK = 0,
|
|
HAL_I2C_API_MODE_SIMPLE,
|
|
HAL_I2C_API_MODE_SENSOR_ENGINE,
|
|
};
|
|
|
|
enum HAL_I2C_INT_STATUS_T {
|
|
HAL_I2C_INT_STATUS_GEN_CALL_MASK = 0x1<<11,
|
|
HAL_I2C_INT_STATUS_START_DET_MASK = 0x1<<10,
|
|
HAL_I2C_INT_STATUS_STOP_DET_MASK = 0x1<<9,
|
|
HAL_I2C_INT_STATUS_ACTIVITY_MASK = 0x1<<8,
|
|
HAL_I2C_INT_STATUS_RX_DONE_MASK = 0x1<<7,
|
|
HAL_I2C_INT_STATUS_TX_ABRT_MASK = 0x1<<6,
|
|
HAL_I2C_INT_STATUS_RD_REQ_MASK = 0x1<<5,
|
|
HAL_I2C_INT_STATUS_TX_EMPTY_MASK = 0x1<<4,
|
|
HAL_I2C_INT_STATUS_TX_OVER_MASK = 0x1<<3,
|
|
HAL_I2C_INT_STATUS_RX_FULL_MASK = 0x1<<2,
|
|
HAL_I2C_INT_STATUS_RX_OVER_MASK = 0x1<<1,
|
|
HAL_I2C_INT_STATUS_RX_UNDER_MASK = 0x1<<0,
|
|
/* FIXME : same as i2cip definitions
|
|
#define I2CIP_INT_STATUS_GEN_CALL_SHIFT (11)
|
|
#define I2CIP_INT_STATUS_START_DET_SHIFT (10)
|
|
#define I2CIP_INT_STATUS_STOP_DET_SHIFT (9)
|
|
#define I2CIP_INT_STATUS_ACTIVITY_SHIFT (8)
|
|
#define I2CIP_INT_STATUS_RX_DONE_SHIFT (7)
|
|
#define I2CIP_INT_STATUS_TX_ABRT_SHIFT (6)
|
|
#define I2CIP_INT_STATUS_RD_REQ_SHIFT (5)
|
|
#define I2CIP_INT_STATUS_TX_EMPTY_SHIFT (4)
|
|
#define I2CIP_INT_STATUS_TX_OVER_SHIFT (3)
|
|
#define I2CIP_INT_STATUS_RX_FULL_SHIFT (2)
|
|
#define I2CIP_INT_STATUS_RX_OVER_SHIFT (1)
|
|
#define I2CIP_INT_STATUS_RX_UNDER_SHIFT (0)
|
|
*/
|
|
};
|
|
|
|
enum HAL_I2C_ERRCODE_T {
|
|
HAL_I2C_ERRCODE_SLVRD_INTX = 1<<15,
|
|
HAL_I2C_ERRCODE_SLV_ARBLOST = 1<<14,
|
|
HAL_I2C_ERRCODE_SLVFLUSH_TXFIFO = 1<<13,
|
|
HAL_I2C_ERRCODE_ARB_LOST = 1<<12,
|
|
HAL_I2C_ERRCODE_MASTER_DIS = 1<<11,
|
|
HAL_I2C_ERRCODE_10B_RD_NORSTRT = 1<<10,
|
|
HAL_I2C_ERRCODE_SBYTE_NORSTRT = 1<<9,
|
|
HAL_I2C_ERRCODE_HS_NORSTRT = 1<<8,
|
|
HAL_I2C_ERRCODE_SBYTE_ACKDET = 1<<7,
|
|
HAL_I2C_ERRCODE_HS_ACKDET = 1<<6,
|
|
HAL_I2C_ERRCODE_GCALL_READ = 1<<5,
|
|
HAL_I2C_ERRCODE_GCALL_NOACK = 1<<4,
|
|
HAL_I2C_ERRCODE_TXDATA_NOACK = 1<<3,
|
|
HAL_I2C_ERRCODE_10ADDR2_NOACK = 1<<2,
|
|
HAL_I2C_ERRCODE_10ADDR1_NOACK = 1<<1,
|
|
HAL_I2C_ERRCODE_7B_ADDR_NOACK = 1<<0,
|
|
|
|
HAL_I2C_ERRCODE_INV_PARAM = 1<<31,
|
|
HAL_I2C_ERRCODE_IN_USE = 1<<30,
|
|
HAL_I2C_ERRCODE_FIFO_ERR = 1<<29,
|
|
HAL_I2C_ERRCODE_SYNC_TIMEOUT = 1<<28,
|
|
HAL_I2C_ERRCODE_ACT_TIMEOUT = 1<<27,
|
|
HAL_I2C_ERRCODE_TFNF_TIMEOUT = 1<<26,
|
|
HAL_I2C_ERRCODE_TFE_TIMEOUT = 1<<25,
|
|
HAL_I2C_ERRCODE_RFNE_TIMEOUT = 1<<24,
|
|
|
|
/* FIXME : same as i2cip definitions
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_SLVRD_INTX_SHIFT (15)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST_SHIFT (14)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO_SHIFT (13)
|
|
#define I2CIP_TX_ABRT_SOURCE_ARB_LOST_SHIFT (12)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_MASTER_DIS_SHIFT (11)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT_SHIFT (10)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT_SHIFT (9)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_HS_NORSTRT_SHIFT (8)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET_SHIFT (7)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_HS_ACKDET_SHIFT (6)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_GCALL_READ_SHIFT (5)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_GCALL_NOACK_SHIFT (4)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK_SHIFT (3)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK_SHIFT (2)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK_SHIFT (1)
|
|
#define I2CIP_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK_SHIFT (0)
|
|
*/
|
|
};
|
|
|
|
struct HAL_I2C_CONFIG_T {
|
|
/* mode
|
|
SIMPLE_MODE : pulling when reading or writing (always sync), or use dma external;master or slave;only enable slave related irq;
|
|
TASK_MODE : task to driven reading or writing (sync or async, dma or non-dma);only master
|
|
*/
|
|
enum HAL_I2C_API_MODE_T mode;
|
|
|
|
uint8_t use_sync;
|
|
uint8_t use_dma;
|
|
uint8_t as_master;
|
|
uint32_t speed;
|
|
uint32_t addr_as_slave;
|
|
};
|
|
|
|
typedef void (*HAL_I2C_SENSOR_ENG_HANDLER_T)(enum HAL_I2C_ID_T id, const uint8_t *buf, uint32_t len);
|
|
|
|
struct HAL_I2C_SENSOR_ENGINE_CONFIG_T {
|
|
enum HAL_SENSOR_ENGINE_ID_T id;
|
|
enum HAL_SENSOR_ENGINE_TRIGGER_T trigger_type;
|
|
enum HAL_GPIO_PIN_T trigger_gpio;
|
|
uint32_t period_us;
|
|
uint16_t target_addr;
|
|
uint8_t *write_buf;
|
|
uint16_t write_txn_len;
|
|
uint8_t *read_buf;
|
|
uint16_t read_txn_len;
|
|
uint16_t txn_cnt;
|
|
uint8_t read_burst_cnt;
|
|
HAL_I2C_SENSOR_ENG_HANDLER_T handler;
|
|
};
|
|
|
|
struct HAL_GPIO_I2C_CONFIG_T {
|
|
enum HAL_GPIO_PIN_T scl;
|
|
enum HAL_GPIO_PIN_T sda;
|
|
uint32_t speed;
|
|
};
|
|
|
|
uint32_t hal_i2c_open(enum HAL_I2C_ID_T id, const struct HAL_I2C_CONFIG_T *cfg);
|
|
uint32_t hal_i2c_close(enum HAL_I2C_ID_T id);
|
|
|
|
/* for master task mode */
|
|
typedef void (*HAL_I2C_TRANSFER_HANDLER_T)(enum HAL_I2C_ID_T id, uint32_t transfer_id,
|
|
const uint8_t *tx_buf, uint32_t tx_len,
|
|
const uint8_t *rx_buf, uint32_t rx_len,
|
|
enum HAL_I2C_ERRCODE_T errcode);
|
|
uint32_t hal_i2c_send(enum HAL_I2C_ID_T id, uint32_t device_addr, uint8_t *buf, uint32_t reg_len, uint32_t value_len,
|
|
uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
uint32_t hal_i2c_recv(enum HAL_I2C_ID_T id, uint32_t device_addr, uint8_t *buf, uint32_t reg_len, uint32_t value_len,
|
|
uint8_t restart_after_write, uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
// New I2C task mode APIs
|
|
uint32_t hal_i2c_task_send(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_len,
|
|
uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
uint32_t hal_i2c_task_recv(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_len,
|
|
uint8_t *rx_buf, uint16_t rx_len,
|
|
uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
uint32_t hal_i2c_task_msend(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_item_len,
|
|
uint16_t item_cnt, uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
uint32_t hal_i2c_task_mrecv(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_item_len,
|
|
uint8_t *rx_buf, uint16_t rx_item_len, uint16_t item_cnt,
|
|
uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler);
|
|
/* for master task mode end */
|
|
|
|
/* for slave and simple master mode */
|
|
typedef void (*HAL_I2C_INT_HANDLER_T)(enum HAL_I2C_ID_T id, enum HAL_I2C_INT_STATUS_T status, uint32_t errocode);
|
|
uint32_t hal_i2c_slv_write(enum HAL_I2C_ID_T id, uint8_t *buf, uint32_t buf_len, uint32_t *act_len);
|
|
uint32_t hal_i2c_slv_read(enum HAL_I2C_ID_T id, uint8_t *buf, uint32_t buf_len, uint32_t *act_len);
|
|
uint32_t hal_i2c_set_interrupt_handler(enum HAL_I2C_ID_T id, HAL_I2C_INT_HANDLER_T handler);
|
|
uint32_t hal_i2c_mst_write(enum HAL_I2C_ID_T id, uint32_t device_addr, const uint8_t *buf, uint32_t buf_len, uint32_t *act_len, uint32_t restart, uint32_t stop, uint32_t yield);
|
|
uint32_t hal_i2c_mst_read(enum HAL_I2C_ID_T id, uint32_t device_addr, uint8_t *buf, uint32_t buf_len, uint32_t *act_len, uint32_t restart, uint32_t stop, uint32_t yield);
|
|
// New I2C simple mode APIs
|
|
uint32_t hal_i2c_simple_send(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_len);
|
|
uint32_t hal_i2c_simple_recv(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t *tx_buf, uint16_t tx_len, uint8_t *rx_buf, uint16_t rx_len);
|
|
/* for slave and simple master mode end */
|
|
|
|
/* sensor engine mode */
|
|
uint32_t hal_i2c_sensor_engine_start(enum HAL_I2C_ID_T id, const struct HAL_I2C_SENSOR_ENGINE_CONFIG_T *cfg);
|
|
uint32_t hal_i2c_sensor_engine_stop(enum HAL_I2C_ID_T id);
|
|
/* sensor engine end */
|
|
|
|
int hal_gpio_i2c_open(const struct HAL_GPIO_I2C_CONFIG_T *cfg);
|
|
int hal_gpio_i2c_close(void);
|
|
uint32_t hal_gpio_i2c_send(uint32_t device_addr, const uint8_t *buf, uint32_t reg_len, uint32_t value_len);
|
|
uint32_t hal_gpio_i2c_recv(uint32_t device_addr, uint8_t *buf, uint32_t reg_len, uint32_t value_len, uint8_t restart_after_write);
|
|
// New GPIO I2C APIs
|
|
uint32_t hal_gpio_i2c_simple_send(uint32_t device_addr, const uint8_t *tx_buf, uint16_t tx_len);
|
|
uint32_t hal_gpio_i2c_simple_recv(uint32_t device_addr, const uint8_t *tx_buf, uint16_t tx_len, uint8_t *rx_buf, uint16_t rx_len);
|
|
|
|
|
|
int app_i2c_demo_init(void);
|
|
unsigned char I2C_WriteByte(unsigned char reg, unsigned char data);
|
|
unsigned char I2C_ReadByte(unsigned char reg, unsigned char* data);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __HAL_I2C_H__ */
|