The NPCX SMB modules provides full support for a two-wire SMBus/I2C synchronous serial interface. Each SMBus/I2C interface is a two-wire serial interface that is compatible with both Intel SMBus and Philips I2C physical layer. There are 8 SMBus modules and 10 buses in NPCX7 series. In NPCX7 series, the SMB5 and SMB6 modules contain a two-way switch to support two separate SMBus/I2C buses (ports) with one SMB module (controller) Please refer Section 4.7.2 in the datasheet. In order to support it, this CL seperates the i2c driver into port and controller drivers. The controller driver is in charge of i2c module operations and internal state machine. The port driver is in charge of pin-mux and connection between Zehpyr i2c api interface and controller driver. All of modules have separate 32-byte transmit FIFO and 32-byte receive FIFO buffers. These FIFO buffers reduce firmware overhead during long SMBus transactions by allowing the Core to write or read more than one data byte at a time to/from the SMB module. The CL also includes: — Add npcx i2c port/controller device tree declarations. — Zephyr i2c api implementation. — Add "i2c-0" aliases in npcx7m6fb.dts for i2c test suites. Signed-off-by: Mulin Chao <MLChao@nuvoton.com>
65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
/*
|
|
* Copyright (c) 2020 Nuvoton Technology Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_I2C_I2C_NPCX_CONTROLLER_H_
|
|
#define ZEPHYR_DRIVERS_I2C_I2C_NPCX_CONTROLLER_H_
|
|
|
|
#include <device.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Lock the mutex of npcx i2c controller.
|
|
*
|
|
* @param i2c_dev Pointer to the device structure for i2c controller instance.
|
|
*/
|
|
void npcx_i2c_ctrl_mutex_lock(const struct device *i2c_dev);
|
|
|
|
/**
|
|
* @brief Unlock the mutex of npcx i2c controller.
|
|
*
|
|
* @param i2c_dev Pointer to the device structure for i2c controller instance.
|
|
*/
|
|
void npcx_i2c_ctrl_mutex_unlock(const struct device *i2c_dev);
|
|
|
|
/**
|
|
* @brief Configure operation of a npcx i2c controller.
|
|
*
|
|
* @param i2c_dev Pointer to the device structure for i2c controller instance.
|
|
* @param dev_config Bit-packed 32-bit value to the device runtime configuration
|
|
* for the I2C controller.
|
|
*
|
|
* @retval 0 If successful.
|
|
* @retval -EIO General input / output error, failed to configure device.
|
|
* @retval -ERANGE Out of supported i2c frequency.
|
|
*/
|
|
int npcx_i2c_ctrl_configure(const struct device *i2c_dev, uint32_t dev_config);
|
|
|
|
|
|
/**
|
|
* @brief Perform data transfer to via npcx i2c controller.
|
|
*
|
|
* @param i2c_dev Pointer to the device structure for i2c controller instance.
|
|
* @param msgs Array of messages to transfer.
|
|
* @param num_msgs Number of messages to transfer.
|
|
* @param addr Address of the I2C target device.
|
|
* @param port Port index of selected i2c port.
|
|
*
|
|
* @retval 0 If successful.
|
|
* @retval -EIO General input / output error.
|
|
* @retval -ENXIO No slave address match.
|
|
* @retval -ETIMEDOUT Timeout occurred for a i2c transaction.
|
|
*/
|
|
int npcx_i2c_ctrl_transfer(const struct device *i2c_dev, struct i2c_msg *msgs,
|
|
uint8_t num_msgs, uint16_t addr, uint8_t port);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_DRIVERS_I2C_I2C_NPCX_CONTROLLER_H_ */
|