summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorxieyangrun <[email protected]>2020-09-23 17:17:20 +0800
committerxieyangrun <[email protected]>2020-09-23 17:17:20 +0800
commit54c6e7d1459c2e4e6e4e6249e1700837c3d863a3 (patch)
tree395aef985b25f406449088ccd2bdf8446d97bd94 /components
parentd92fbba3c1dfd304b377da2d6d48e317c10fc3c4 (diff)
[dirver/i2c] i2c driver support bus lock, STOP control
Diffstat (limited to 'components')
-rwxr-xr-xcomponents/drivers/Kconfig2
-rw-r--r--components/drivers/i2c/i2c-bit-ops.c14
-rw-r--r--components/drivers/include/drivers/i2c.h12
3 files changed, 23 insertions, 5 deletions
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index 457b8751fe..77c853367f 100755
--- a/components/drivers/Kconfig
+++ b/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
diff --git a/components/drivers/i2c/i2c-bit-ops.c b/components/drivers/i2c/i2c-bit-ops.c
index 99338eef54..96af567a1e 100644
--- a/components/drivers/i2c/i2c-bit-ops.c
+++ b/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;
}
diff --git a/components/drivers/include/drivers/i2c.h b/components/drivers/include/drivers/i2c.h
index 17d57288cd..d93e82fc2b 100644
--- a/components/drivers/include/drivers/i2c.h
+++ b/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