From: Kurt Eckhardt Date: Thu, 18 Dec 2014 16:03:46 +0000 (+0000) Subject: x86/edison: Speed up mraa_gpio_dir X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=455ab6f06307d011508fdde4211d784007f0ee1b;p=contrib%2Fmraa.git x86/edison: Speed up mraa_gpio_dir Reasonable speed up in the mraa_gpio_dir on the Edison Arduino board Signed-off-by: Kurt Eckhardt Signed-off-by: Brendan Le Foll --- diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index 721a5ca..8d50902 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -117,6 +117,7 @@ mraa_gpio_init_raw(int pin) dev->pin = pin; dev->phy_pin = -1; + // then check to make sure the pin is exported. char directory[MAX_SIZE]; snprintf(directory, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/", dev->pin); struct stat dir; diff --git a/src/x86/intel_edison_fab_c.c b/src/x86/intel_edison_fab_c.c index cd424d1..87c7edc 100644 --- a/src/x86/intel_edison_fab_c.c +++ b/src/x86/intel_edison_fab_c.c @@ -58,6 +58,8 @@ static mraa_gpio_context tristate; static mraa_intel_edison_pinmodes_t pinmodes[MRAA_INTEL_EDISON_PINCOUNT]; static unsigned int outputen[] = {248,249,250,251,252,253,254,255,256,257,258,259,260,261,232,233,234,235,236,237}; +static mraa_gpio_context agpioOutputen[sizeof(outputen)/sizeof(outputen[0])]; + static unsigned int pullup_map[] = {216,217,218,219,220,221,222,223,224,225,226,227,228,229,208,209,210,211,212,213}; static int miniboard = 0; @@ -105,24 +107,22 @@ mraa_intel_edison_gpio_dir_pre(mraa_gpio_context dev, gpio_dir_t dir) } int pin = dev->phy_pin; - mraa_gpio_context output_e; - output_e = mraa_gpio_init_raw(outputen[pin]); - if (output_e == NULL) { - return MRAA_ERROR_INVALID_RESOURCE; - } - if (mraa_gpio_dir(output_e, MRAA_GPIO_OUT) != MRAA_SUCCESS) { - mraa_gpio_close(output_e); - return MRAA_ERROR_INVALID_RESOURCE; + if (!agpioOutputen[pin]) { + agpioOutputen[pin] = mraa_gpio_init_raw(outputen[pin]); + if (agpioOutputen[pin] == NULL) { + return MRAA_ERROR_INVALID_RESOURCE; + } + if (mraa_gpio_dir(agpioOutputen[pin], MRAA_GPIO_OUT) != MRAA_SUCCESS) { + return MRAA_ERROR_INVALID_RESOURCE; + } } int output_val = 0; if (dir == MRAA_GPIO_OUT) { output_val = 1; } - if (mraa_gpio_write(output_e, output_val) != MRAA_SUCCESS) { - mraa_gpio_close(output_e); + if (mraa_gpio_write(agpioOutputen[pin], output_val) != MRAA_SUCCESS) { return MRAA_ERROR_INVALID_RESOURCE; } - mraa_gpio_close(output_e); } return MRAA_SUCCESS; @@ -157,6 +157,19 @@ mraa_intel_edison_gpio_init_post(mraa_gpio_context dev) } mraa_result_t +mraa_intel_edison_gpio_close_pre(mraa_gpio_context dev) +{ + if (dev->phy_pin >= 0) { + int pin = dev->phy_pin; + if (agpioOutputen[pin]) { + mraa_gpio_close(agpioOutputen[pin]); + agpioOutputen[pin] = NULL; + } + } + return MRAA_SUCCESS; +} + +mraa_result_t mraa_intel_edison_i2c_init_pre(unsigned int bus) { if (miniboard == 0) { @@ -674,6 +687,8 @@ mraa_intel_edison_miniboard(mraa_board_t* b) } advance_func->gpio_init_post = &mraa_intel_edison_gpio_init_post; + advance_func->gpio_close_pre = &mraa_intel_edison_gpio_close_pre; + advance_func->pwm_init_pre = &mraa_intel_edison_pwm_init_pre; advance_func->i2c_init_pre = &mraa_intel_edison_i2c_init_pre; advance_func->spi_init_pre = &mraa_intel_edison_spi_init_pre;