mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-08-18 11:53:05 +08:00
feat[i2c]: add bus configuration and max-hz control
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2024, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -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 max_hz setting
|
||||
*/
|
||||
|
||||
#include <rtdevice.h>
|
||||
@@ -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,
|
||||
|
||||
@@ -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__
|
||||
@@ -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)
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user