1
0
Эх сурвалжийг харах

[dirver/i2c] i2c driver support bus lock, STOP control

xieyangrun 4 жил өмнө
parent
commit
54c6e7d145

+ 1 - 1
components/drivers/Kconfig

@@ -97,7 +97,7 @@ if RT_USING_I2C
         default y
 
     if RT_USING_I2C_BITOPS
-	config RT_I2C_BITOPS_DEBUG
+        config RT_I2C_BITOPS_DEBUG
             bool "Use simulate I2C debug message"
             default n
     endif

+ 10 - 4
components/drivers/i2c/i2c-bit-ops.c

@@ -375,8 +375,6 @@ static rt_size_t i2c_bit_xfer(struct rt_i2c_bus_device *bus,
     rt_int32_t i, ret;
     rt_uint16_t ignore_nack;
 
-    LOG_D("send start condition");
-    i2c_start(ops);
     for (i = 0; i < num; i++)
     {
         msg = &msgs[i];
@@ -387,6 +385,11 @@ static rt_size_t i2c_bit_xfer(struct rt_i2c_bus_device *bus,
             {
                 i2c_restart(ops);
             }
+            else
+            {
+                LOG_D("send start condition");
+                i2c_start(ops);
+            }
             ret = i2c_bit_send_address(bus, msg);
             if ((ret != RT_EOK) && !ignore_nack)
             {
@@ -423,8 +426,11 @@ static rt_size_t i2c_bit_xfer(struct rt_i2c_bus_device *bus,
     ret = i;
 
 out:
-    LOG_D("send stop condition");
-    i2c_stop(ops);
+    if (!(msg->flags & RT_I2C_NO_STOP))
+    {
+        LOG_D("send stop condition");
+        i2c_stop(ops);
+    }
 
     return ret;
 }

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

@@ -23,6 +23,7 @@ extern "C" {
 #define RT_I2C_NO_START         (1u << 4)
 #define RT_I2C_IGNORE_NACK      (1u << 5)
 #define RT_I2C_NO_READ_ACK      (1u << 6)  /* when I2C reading, we do not ACK */
+#define RT_I2C_NO_STOP          (1u << 7)
 
 struct rt_i2c_msg
 {
@@ -83,6 +84,17 @@ rt_size_t rt_i2c_master_recv(struct rt_i2c_bus_device *bus,
                              rt_uint16_t               flags,
                              rt_uint8_t               *buf,
                              rt_uint32_t               count);
+
+rt_inline rt_err_t rt_i2c_bus_lock(struct rt_i2c_bus_device *bus, rt_tick_t timeout)
+{
+    return rt_mutex_take(&bus->lock, timeout);
+}
+
+rt_inline rt_err_t rt_i2c_bus_unlock(struct rt_i2c_bus_device *bus)
+{
+    return rt_mutex_release(&bus->lock);
+}
+
 int rt_i2c_core_init(void);
 
 #ifdef __cplusplus