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