Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 36 additions & 9 deletions components/drivers/i2c/dev_i2c_core.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2012-04-25 weety first version
* 2021-04-20 RiceChen added support for bus control api
* 2024-06-23 wdfk-prog Add max_hz setting
*/

#include <rtdevice.h>
Expand Down Expand Up @@ -101,16 +102,42 @@ rt_err_t rt_i2c_control(struct rt_i2c_bus_device *bus,
{
rt_err_t ret;

if(bus->ops->i2c_bus_control)
switch (cmd)
{
ret = bus->ops->i2c_bus_control(bus, cmd, args);
return ret;
}
else
{
LOG_E("I2C bus operation not supported");
return -RT_EINVAL;
case RT_I2C_CTRL_SET_MAX_HZ:
{
if (args == RT_NULL)
{
return -RT_ERROR;
}

rt_uint32_t max_hz = *(rt_uint32_t *)args;
if(max_hz > 0)
{
bus->config.max_hz = max_hz;
}
else
{
return -RT_ERROR;
}
break;
}
default:
{
if(bus->ops->i2c_bus_control)
{
ret = bus->ops->i2c_bus_control(bus, cmd, args);
return ret;
}
else
{
LOG_E("I2C bus operation not supported");
return -RT_EINVAL;
}
break;
}
}
return RT_EOK;
}

rt_ssize_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
Expand Down
19 changes: 19 additions & 0 deletions components/drivers/include/drivers/dev_i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
* Date Author Notes
* 2012-04-25 weety first version
* 2021-04-20 RiceChen added support for bus control api
* 2024-06-23 wdfk-prog Add the config struct
*/

#ifndef __DEV_I2C_H__
Expand Down Expand Up @@ -185,6 +186,8 @@ extern "C" {
#define RT_I2C_NO_READ_ACK (1u << 6) /* when I2C reading, we do not ACK */
#define RT_I2C_NO_STOP (1u << 7) /*!< do not generate STOP condition */

#define RT_I2C_CTRL_SET_MAX_HZ 0x20

#define RT_I2C_DEV_CTRL_10BIT (RT_DEVICE_CTRL_BASE(I2CBUS) + 0x01)
#define RT_I2C_DEV_CTRL_ADDR (RT_DEVICE_CTRL_BASE(I2CBUS) + 0x02)
#define RT_I2C_DEV_CTRL_TIMEOUT (RT_DEVICE_CTRL_BASE(I2CBUS) + 0x03)
Expand Down Expand Up @@ -233,6 +236,21 @@ struct rt_i2c_bus_device_ops
void *args);
};

/**
* I2C configuration structure.
* mode : master: 0x00; slave: 0x01;
* max_hz: Maximum limit baud rate.
* usage_freq: Actual usage baud rate.
*/
struct rt_i2c_configuration
{
rt_uint8_t mode;
rt_uint8_t reserved[3];

rt_uint32_t max_hz;
rt_uint32_t usage_freq;
};

/**
* @brief I2C Bus Device
*/
Expand All @@ -244,6 +262,7 @@ struct rt_i2c_bus_device
struct rt_mutex lock;
rt_uint32_t timeout;
rt_uint32_t retries;
struct rt_i2c_configuration config;
void *priv;
};

Expand Down