You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2018/12/03 12:42:26 UTC

[mynewt-core] 15/15: hw/drivers: Add bus driver support to LP5523

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 56f33fb0f26df439a4c07d0f147eaf89cdb1be54
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Fri Nov 23 17:42:28 2018 +0100

    hw/drivers: Add bus driver support to LP5523
---
 hw/drivers/led/lp5523/include/lp5523/lp5523.h | 23 +++++++++++
 hw/drivers/led/lp5523/src/lp5523.c            | 58 +++++++++++++++++++++++----
 2 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/hw/drivers/led/lp5523/include/lp5523/lp5523.h b/hw/drivers/led/lp5523/include/lp5523/lp5523.h
index cd4f400..78e1c79 100644
--- a/hw/drivers/led/lp5523/include/lp5523/lp5523.h
+++ b/hw/drivers/led/lp5523/include/lp5523/lp5523.h
@@ -25,6 +25,10 @@ extern "C" {
 #endif
 
 #include <led/led_itf.h>
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include "bus/bus_driver.h"
+#include "bus/i2c.h"
+#endif
 
 #define LP5523_MAX_PAYLOAD   (10)
 
@@ -108,7 +112,11 @@ struct lp5523_cfg {
 };
 
 struct lp5523 {
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct bus_i2c_node i2c_node;
+#else
     struct os_dev dev;
+#endif
     struct lp5523_cfg cfg;
 };
 
@@ -1470,6 +1478,21 @@ int lp5523_shell_init(void);
 #define LP5523_INS_SUB(target_variable, variable1, variable2) \
     LP5523_INS_ARITH(0x9310, target_variable, variable1, variable2)
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+/**
+ * Create I2C bus node for LP5523
+ *
+ * @param node     Bus node
+ * @param name     Device name
+ * @param i2c_cfg  I2C node configuration
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_create_i2c_dev(struct bus_i2c_node *node, const char *name,
+                      const struct bus_i2c_node_cfg *i2c_cfg);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/hw/drivers/led/lp5523/src/lp5523.c b/hw/drivers/led/lp5523/src/lp5523.c
index 8ef7907..829cf81 100644
--- a/hw/drivers/led/lp5523/src/lp5523.c
+++ b/hw/drivers/led/lp5523/src/lp5523.c
@@ -52,6 +52,9 @@ lp5523_set_reg(struct led_itf *itf, enum lp5523_registers addr,
     int rc;
     uint8_t payload[2] = { addr, value };
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write(itf->li_dev, payload, sizeof(payload));
+#else
     struct hal_i2c_master_data data_struct = {
         .address = itf->li_addr,
         .len = 2,
@@ -75,6 +78,7 @@ lp5523_set_reg(struct led_itf *itf, enum lp5523_registers addr,
     }
 
     led_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -85,6 +89,9 @@ lp5523_get_reg(struct led_itf *itf, enum lp5523_registers addr,
 {
     int rc;
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->li_dev, &addr, 1, value, 1);
+#else
     struct hal_i2c_master_data data_struct = {
         .address = itf->li_addr,
         .len = 1,
@@ -120,6 +127,7 @@ lp5523_get_reg(struct led_itf *itf, enum lp5523_registers addr,
 
 err:
     led_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -131,12 +139,6 @@ lp5523_set_n_regs(struct led_itf *itf, enum lp5523_registers addr,
     int rc;
     uint8_t payload[LP5523_MAX_PAYLOAD] = {0};
 
-    struct hal_i2c_master_data data_struct = {
-        .address = itf->li_addr,
-        .len = len + 1,
-        .buffer = payload,
-    };
-
     if (len >= LP5523_MAX_PAYLOAD) {
         return -1;
     }
@@ -144,6 +146,15 @@ lp5523_set_n_regs(struct led_itf *itf, enum lp5523_registers addr,
     payload[0] = addr;
     memcpy(&payload[1], vals, len);
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write(itf->li_dev, payload, sizeof(payload));
+#else
+    struct hal_i2c_master_data data_struct = {
+        .address = itf->li_addr,
+        .len = len + 1,
+        .buffer = payload,
+    };
+
     rc = led_itf_lock(itf, MYNEWT_VAL(LP5523_ITF_LOCK_TMO));
     if (rc) {
         return rc;
@@ -159,6 +170,7 @@ lp5523_set_n_regs(struct led_itf *itf, enum lp5523_registers addr,
     }
 
     led_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -171,6 +183,9 @@ lp5523_get_n_regs(struct led_itf *itf, enum lp5523_registers addr,
     int rc;
     uint8_t addr_b = (uint8_t) addr;
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->li_dev, &addr_b, 1, vals, len);
+#else
     struct hal_i2c_master_data data_struct = {
         .address = itf->li_addr,
         .len = 1,
@@ -205,6 +220,7 @@ lp5523_get_n_regs(struct led_itf *itf, enum lp5523_registers addr,
 
 err:
     led_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -932,7 +948,7 @@ lp5523_init(struct os_dev *dev, void *arg)
 {
     int rc;
 
-    if (!arg || !dev) {
+    if (!dev) {
         return SYS_ENODEV;
     }
 
@@ -979,7 +995,9 @@ lp5523_config(struct led_itf *itf, struct lp5523_cfg *cfg)
     int i;
     uint8_t misc_val;
 
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
     itf->li_addr = LP5523_I2C_BASE_ADDR + cfg->asel;
+#endif
 
     if (cfg->prereset) {
         rc = lp5523_reset(itf);
@@ -1074,3 +1092,29 @@ lp5523_config(struct led_itf *itf, struct lp5523_cfg *cfg)
 err:
     return rc;
 }
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static void
+init_node_cb(struct bus_node *bnode, void *arg)
+{
+    assert(arg == NULL);
+
+    lp5523_init((struct os_dev *)bnode, NULL);
+}
+
+int
+lp5523_create_i2c_dev(struct bus_i2c_node *node, const char *name,
+                      const struct bus_i2c_node_cfg *i2c_cfg)
+{
+    struct bus_node_callbacks cbs = {
+        .init = init_node_cb,
+    };
+    int rc;
+
+    bus_node_set_callbacks((struct os_dev *)node, &cbs);
+
+    rc = bus_i2c_node_create(name, node, i2c_cfg, NULL);
+
+    return rc;
+}
+#endif