Bläddra i källkod

add I2C bus control api

RiceChen 4 år sedan
förälder
incheckning
0b9e01cced

+ 21 - 0
components/drivers/i2c/i2c_core.c

@@ -6,6 +6,7 @@
  * Change Logs:
  * Date           Author        Notes
  * 2012-04-25     weety         first version
+ * 2021-04-20     RiceChen      added support for bus control api
  */
 
 #include <rtdevice.h>
@@ -81,6 +82,26 @@ rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
     }
 }
 
+rt_err_t rt_i2c_control(struct rt_i2c_bus_device *bus,
+                        rt_uint32_t               cmd,
+                        rt_uint32_t               arg)
+{
+    rt_err_t ret;
+
+    if(bus->ops->i2c_bus_control)
+    {
+        ret = bus->ops->i2c_bus_control(bus, cmd, arg);
+
+        return ret;
+    }
+    else
+    {
+        LOG_E("I2C bus operation not supported");
+
+        return 0;
+    }
+}
+
 rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
                              rt_uint16_t               addr,
                              rt_uint16_t               flags,

+ 10 - 0
components/drivers/i2c/i2c_dev.c

@@ -7,6 +7,7 @@
  * Date           Author        Notes
  * 2012-04-25     weety         first version
  * 2014-08-03     bernard       fix some compiling warning
+ * 2021-04-20     RiceChen      added support for bus clock control
  */
 
 #include <rtdevice.h>
@@ -66,6 +67,7 @@ static rt_err_t i2c_bus_device_control(rt_device_t dev,
     rt_err_t ret;
     struct rt_i2c_priv_data *priv_data;
     struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)dev->user_data;
+    rt_uint32_t bus_clock;
 
     RT_ASSERT(bus != RT_NULL);
 
@@ -89,6 +91,14 @@ static rt_err_t i2c_bus_device_control(rt_device_t dev,
             return -RT_EIO;
         }
         break;
+    case RT_I2C_DEV_CTRL_CLK:
+        bus_clock = *(rt_uint32_t *)args;
+        ret = rt_i2c_control(bus, cmd, bus_clock);
+        if (ret < 0)
+        {
+            return -RT_EIO;
+        }
+        break;
     default:
         break;
     }

+ 4 - 0
components/drivers/include/drivers/i2c.h

@@ -6,6 +6,7 @@
  * Change Logs:
  * Date           Author        Notes
  * 2012-04-25     weety         first version
+ * 2021-04-20     RiceChen      added support for bus control api
  */
 
 #ifndef __I2C_H__
@@ -74,6 +75,9 @@ struct rt_i2c_bus_device *rt_i2c_bus_device_find(const char *bus_name);
 rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
                           struct rt_i2c_msg         msgs[],
                           rt_uint32_t               num);
+rt_err_t rt_i2c_control(struct rt_i2c_bus_device *bus,
+                        rt_uint32_t               cmd,
+                        rt_uint32_t               arg);
 rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
                              rt_uint16_t               addr,
                              rt_uint16_t               flags,

+ 2 - 0
components/drivers/include/drivers/i2c_dev.h

@@ -6,6 +6,7 @@
  * Change Logs:
  * Date           Author        Notes
  * 2012-04-25     weety         first version
+ * 2021-04-20     RiceChen      added bus clock command
  */
 
 #ifndef __I2C_DEV_H__
@@ -21,6 +22,7 @@ extern "C" {
 #define RT_I2C_DEV_CTRL_ADDR         0x21
 #define RT_I2C_DEV_CTRL_TIMEOUT      0x22
 #define RT_I2C_DEV_CTRL_RW           0x23
+#define RT_I2C_DEV_CTRL_CLK          0x24
 
 struct rt_i2c_priv_data
 {