pinebuds/platform/hal/hal_i2c.h
2022-08-15 17:20:27 +08:00

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__ */