From cc9a4f59b5f560ecff3fcd4f1e2f985a7ff60c29 Mon Sep 17 00:00:00 2001 From: Brendan Le Foll Date: Wed, 10 Dec 2014 00:27:04 +0000 Subject: [PATCH] edison: add mraa_i2c_frequency replace hook for i2c-6 Signed-off-by: Brendan Le Foll --- include/mraa_adv_func.h | 1 + src/i2c/i2c.c | 3 +++ src/x86/intel_edison_fab_c.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index cdc625d..552ebff 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -48,6 +48,7 @@ typedef struct { mraa_result_t (*i2c_init_pre) (unsigned int bus); mraa_result_t (*i2c_init_post) (mraa_i2c_context dev); + mraa_result_t (*i2c_set_frequency_replace) (mraa_i2c_context dev, mraa_i2c_mode_t mode); mraa_result_t (*aio_get_valid_fp) (mraa_aio_context dev); mraa_result_t (*aio_init_pre) (unsigned int aio); diff --git a/src/i2c/i2c.c b/src/i2c/i2c.c index b44e41f..da9da0d 100644 --- a/src/i2c/i2c.c +++ b/src/i2c/i2c.c @@ -138,6 +138,9 @@ mraa_i2c_init_raw(unsigned int bus) mraa_result_t mraa_i2c_frequency(mraa_i2c_context dev, mraa_i2c_mode_t mode) { + if (advance_func->i2c_set_frequency_replace != NULL) { + return advance_func->i2c_set_frequency_replace(dev, mode); + } return MRAA_ERROR_FEATURE_NOT_SUPPORTED; } diff --git a/src/x86/intel_edison_fab_c.c b/src/x86/intel_edison_fab_c.c index 87c7edc..f8e54ac 100644 --- a/src/x86/intel_edison_fab_c.c +++ b/src/x86/intel_edison_fab_c.c @@ -670,6 +670,38 @@ mraa_intel_edison_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en) return MRAA_SUCCESS; } +mraa_result_t +mraa_intel_edison_i2c_freq(mraa_i2c_context dev, mraa_i2c_mode_t mode) +{ + if (dev->busnum == 6) { + int sysnode = open("/sys/devices/pci0000:00/0000:00:09.1/i2c_dw_sysnode", O_RDWR); + if (sysnode == -1) { + return MRAA_ERROR_INVALID_RESOURCE; + } + + char bu[5]; + int length; + switch (mode) { + case MRAA_I2C_STD: + length = snprintf(bu, sizeof(bu), "std"); + break; + case MRAA_I2C_FAST: + length = snprintf(bu, sizeof(bu), "fast"); + break; + case MRAA_I2C_HIGH: + length = snprintf(bu, sizeof(bu), "high"); + break; + } + if (write(sysnode, bu, length*sizeof(char)) == -1) { + close(sysnode); + return MRAA_ERROR_INVALID_RESOURCE; + } + close(sysnode); + return MRAA_SUCCESS; + } + return MRAA_ERROR_FEATURE_NOT_SUPPORTED; +} + mraa_result_t mraa_intel_edison_miniboard(mraa_board_t* b) { @@ -691,6 +723,7 @@ mraa_intel_edison_miniboard(mraa_board_t* b) advance_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre; advance_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre; + advance_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq; advance_func->spi_init_pre = &mraa_intel_edison_spi_init_pre; advance_func->gpio_mode_replace = &mraa_intel_edsion_mb_gpio_mode; advance_func->uart_init_pre = &mraa_intel_edison_uart_init_pre; @@ -1072,6 +1105,7 @@ mraa_intel_edison_fab_c() advance_func->gpio_init_post = &mraa_intel_edison_gpio_init_post; advance_func->gpio_dir_post = &mraa_intel_edison_gpio_dir_post; advance_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre; + advance_func->i2c_set_frequency_replace = &mraa_intel_edison_i2c_freq; advance_func->aio_get_valid_fp = &mraa_intel_edison_aio_get_fp; advance_func->aio_init_pre = &mraa_intel_edison_aio_init_pre; advance_func->aio_init_post = &mraa_intel_edison_aio_init_post;