diff --git a/docs/platform-hooks.md b/docs/platform-hooks.md index 2b920c6..adb5e65 100644 --- a/docs/platform-hooks.md +++ b/docs/platform-hooks.md @@ -19,3 +19,6 @@ Any functionality perfomed here is done just before the normal function returns. * dir (replace-pre-post) * write (pre-post) * use-mmaped (replace-pre-post) + +### I2C + * init (pre-post) - On RAW diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 02c2352..ab265af 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -46,4 +46,7 @@ typedef struct { mraa_result_t (*gpio_mmaped_write_replace) (mraa_gpio_context dev, int value); mraa_result_t (*gpio_mmaped_write_pre) (mraa_gpio_context dev, int value); mraa_result_t (*gpio_mmaped_write_post) (mraa_gpio_context dev, int value); + + mraa_result_t (*i2c_init_pre) (unsigned int bus); + mraa_result_t (*i2c_init_post) (mraa_i2c_context dev); } mraa_adv_func_t; diff --git a/src/i2c/i2c.c b/src/i2c/i2c.c index 26c686b..7a0724b 100644 --- a/src/i2c/i2c.c +++ b/src/i2c/i2c.c @@ -50,6 +50,10 @@ mraa_i2c_init(int bus) mraa_i2c_context mraa_i2c_init_raw(unsigned int bus) { + if (advance_func->i2c_init_pre != NULL) { + if (advance_func->i2c_init_pre(bus) != MRAA_SUCCESS) + return NULL; + } mraa_i2c_context dev = (mraa_i2c_context) malloc(sizeof(struct _i2c)); if (dev == NULL) return NULL; @@ -59,6 +63,14 @@ mraa_i2c_init_raw(unsigned int bus) if ((dev->fh = open(filepath, O_RDWR)) < 1) { fprintf(stderr, "Failed to open requested i2c port %s\n", filepath); } + + if (advance_func->i2c_init_post != NULL) { + mraa_result_t ret = advance_func->i2c_init_post(dev); + if (ret != MRAA_SUCCESS) { + free(dev); + return NULL; + } + } return dev; }