From: Thomas Ingleby Date: Fri, 11 Jul 2014 10:56:45 +0000 (+0100) Subject: Merge branch 'hook' X-Git-Tag: v0.4.2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9bacfcff5fdebebca5f306ce7fbd4cc0a70f7e65;hp=9f2f5be20ad6419467e653d933a124f3bb9234aa;p=contrib%2Fmraa.git Merge branch 'hook' Conflicts: include/intel_galileo_rev_d.h include/intel_galileo_rev_g.h include/mraa_adv_func.h include/mraa_internal.h src/gpio/gpio.c src/mraa.c --- diff --git a/CMakeLists.txt b/CMakeLists.txt index a91cda4..96cf067 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ project (mraa) FIND_PACKAGE (Threads) -set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") +set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -fno-omit-frame-pointer") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall") # Appends the cmake/modules path to MAKE_MODULE_PATH variable. diff --git a/include/intel_galileo_rev_d.h b/include/intel_galileo_rev_d.h index fda8629..72f27bf 100644 --- a/include/intel_galileo_rev_d.h +++ b/include/intel_galileo_rev_d.h @@ -24,7 +24,17 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + +#include "mraa_internal.h" + #define MRAA_INTEL_GALILEO_REV_D_PINCOUNT 25 mraa_board_t* -mraa_intel_galileo_rev_d(); +mraa_intel_galileo_rev_d(mraa_adv_func* adv); + +#ifdef __cplusplus +} +#endif diff --git a/include/intel_galileo_rev_g.h b/include/intel_galileo_rev_g.h index 2550beb..d439010 100644 --- a/include/intel_galileo_rev_g.h +++ b/include/intel_galileo_rev_g.h @@ -24,7 +24,17 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + +#include "mraa_internal.h" + #define MRAA_INTEL_GALILEO_GEN_2_PINCOUNT 25 mraa_board_t* -mraa_intel_galileo_gen2(); +mraa_intel_galileo_gen2(mraa_adv_func* adv); + +#ifdef __cplusplus +} +#endif diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h new file mode 100644 index 0000000..6dd45ce --- /dev/null +++ b/include/mraa_adv_func.h @@ -0,0 +1,49 @@ +/* + * Author: Thomas Ingleby + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once + +#include "common.h" +#include "mraa.h" +#include "types.h" + +typedef struct { + mraa_result_t (*gpio_init_pre) (int pin); + mraa_result_t (*gpio_init_post) (mraa_gpio_context dev); + + mraa_result_t (*gpio_mode_replace) (mraa_gpio_context dev, gpio_mode_t mode); + mraa_result_t (*gpio_mode_pre) (mraa_gpio_context dev, gpio_mode_t mode); + mraa_result_t (*gpio_mode_post) (mraa_gpio_context dev, gpio_mode_t mode); + + mraa_result_t (*gpio_dir_replace) (mraa_gpio_context dev, gpio_dir_t dir); + mraa_result_t (*gpio_dir_pre) (mraa_gpio_context dev, gpio_dir_t dir); + mraa_result_t (*gpio_dir_post) (mraa_gpio_context dev, gpio_dir_t dir); + + mraa_result_t (*gpio_write_pre) (mraa_gpio_context dev, int value); + mraa_result_t (*gpio_write_post) (mraa_gpio_context dev, int value); + + 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_adv_func; diff --git a/include/mraa_internal.h b/include/mraa_internal.h index a8abf6a..8872a58 100644 --- a/include/mraa_internal.h +++ b/include/mraa_internal.h @@ -24,9 +24,15 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + #include "common.h" #include "mraa_internal_types.h" +extern mraa_adv_func advance_func; + /** Setup gpio * * Will check input is valid for gpio and will also setup required multiplexers. @@ -84,3 +90,7 @@ mraa_result_t mraa_swap_complex_gpio(int pin, int out); * @return mraa_result_t of operation */ mraa_result_t mraa_setup_uart(int index); + +#ifdef __cplusplus +} +#endif diff --git a/include/smbus.h b/include/smbus.h index 469f0f9..740256e 100644 --- a/include/smbus.h +++ b/include/smbus.h @@ -30,6 +30,10 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + #include #include #include @@ -91,3 +95,7 @@ extern int i2c_smbus_write_i2c_block_data(int fd, uint8_t command, uint8_t lengt extern int i2c_smbus_block_process_call(int fd, uint8_t command, uint8_t length, uint8_t *values); + +#ifdef __cplusplus +} +#endif diff --git a/include/version.h b/include/version.h index eeff667..d60f189 100644 --- a/include/version.h +++ b/include/version.h @@ -24,5 +24,13 @@ #pragma once +#ifdef __cplusplus +extern "C" { +#endif + const char* gVERSION; const char* gVERSION_SHORT; + +#ifdef __cplusplus +} +#endif diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index 05993f4..338ad09 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -67,6 +67,12 @@ mraa_gpio_init(int pin) mraa_gpio_context mraa_gpio_init_raw(int pin) { + if (advance_func.gpio_init_pre != NULL) { + printf("Actually entering\n"); + if (advance_func.gpio_init_pre(pin) != MRAA_SUCCESS) + return NULL; + } + if (pin < 0) return NULL; @@ -102,18 +108,31 @@ mraa_gpio_init_raw(int pin) close(export); } + if (advance_func.gpio_init_post != NULL) { + free(dev); + return NULL; + } return dev; } static mraa_result_t mraa_gpio_write_register(mraa_gpio_context dev,int value) { - if (value == 1) { + if (advance_func.gpio_mmaped_write_replace != NULL) + return advance_func.gpio_mmaped_write_replace(dev,value); + if (advance_func.gpio_mmaped_write_pre != NULL) { + mraa_result_t pre_ret = (advance_func.gpio_mmaped_write_pre(dev,value)); + if(pre_ret != MRAA_SUCCESS) + return pre_ret; + } + if (value == 1) { *((unsigned *)dev->reg) |= (1<reg_bit_pos); return MRAA_SUCCESS; } *((unsigned *)dev->reg) &= ~(1<reg_bit_pos); + if (advance_func.gpio_mmaped_write_post != NULL) + return advance_func.gpio_mmaped_write_post(dev,value); return MRAA_SUCCESS; } @@ -293,13 +312,21 @@ mraa_gpio_isr_exit(mraa_gpio_context dev) // assume our thread will exit either way we just lost it's handle dev->thread_id = 0; dev->isr_value_fp = -1; - return ret; } mraa_result_t mraa_gpio_mode(mraa_gpio_context dev, gpio_mode_t mode) { + if (advance_func.gpio_mode_replace != NULL) + return advance_func.gpio_mode_replace(dev,mode); + + if (advance_func.gpio_mode_pre != NULL) { + mraa_result_t pre_ret = (advance_func.gpio_mode_pre(dev,mode)); + if(pre_ret != MRAA_SUCCESS) + return pre_ret; + } + if (dev->value_fp != -1) { close(dev->value_fp); dev->value_fp = -1; @@ -341,12 +368,22 @@ mraa_gpio_mode(mraa_gpio_context dev, gpio_mode_t mode) } close(drive); + if (advance_func.gpio_mode_post != NULL) + return advance_func.gpio_mode_post(dev,mode); return MRAA_SUCCESS; } mraa_result_t mraa_gpio_dir(mraa_gpio_context dev, gpio_dir_t dir) { + if (advance_func.gpio_dir_replace != NULL) + return advance_func.gpio_dir_replace(dev,dir); + if (advance_func.gpio_dir_pre != NULL) { + mraa_result_t pre_ret = (advance_func.gpio_dir_pre(dev,dir)); + if(pre_ret != MRAA_SUCCESS) + return pre_ret; + } + if (dev == NULL) { return MRAA_ERROR_INVALID_HANDLE; } @@ -391,6 +428,8 @@ mraa_gpio_dir(mraa_gpio_context dev, gpio_dir_t dir) } close(direction); + if (advance_func.gpio_dir_post != NULL) + return advance_func.gpio_dir_post(dev,dir); return MRAA_SUCCESS; } @@ -414,6 +453,7 @@ mraa_gpio_read(mraa_gpio_context dev) int ret = strtol(bu, NULL, 10); return ret; + return 0; } mraa_result_t @@ -422,6 +462,12 @@ mraa_gpio_write(mraa_gpio_context dev, int value) if (dev->mmap == 1) return mraa_gpio_write_register(dev,value); + if (advance_func.gpio_write_pre != NULL) { + mraa_result_t pre_ret = (advance_func.gpio_write_pre(dev,value)); + if(pre_ret != MRAA_SUCCESS) + return pre_ret; + } + if (dev->value_fp == -1) { mraa_gpio_get_valfp(dev); } @@ -435,6 +481,8 @@ mraa_gpio_write(mraa_gpio_context dev, int value) return MRAA_ERROR_INVALID_HANDLE; } + if (advance_func.gpio_write_post != NULL) + return advance_func.gpio_write_post(dev,value); return MRAA_SUCCESS; } diff --git a/src/mraa.c b/src/mraa.c index d8e8940..27f1bbf 100644 --- a/src/mraa.c +++ b/src/mraa.c @@ -37,6 +37,7 @@ //static mraa_pininfo_t* pindata; static mraa_board_t* plat = NULL; static mraa_platform_t platform_type = MRAA_UNKNOWN_PLATFORM; +mraa_adv_func advance_func; const char * mraa_get_version() @@ -44,15 +45,7 @@ mraa_get_version() return gVERSION; } -#if 0 -const mraa_adv_func* -mraa_get_advance() -{ - return (const mraa_adv_func*) advance; -} -#endif - -mraa_result_t +mraa_result_t __attribute__((constructor)) mraa_init() { /** Once more board definitions have been added, @@ -84,15 +77,16 @@ mraa_init() free(line); fclose(fh); + memset(&advance_func, 0, sizeof(mraa_adv_func)); switch(platform_type) { case MRAA_INTEL_GALILEO_GEN2: - plat = mraa_intel_galileo_gen2(); + plat = mraa_intel_galileo_gen2(&advance_func); break; case MRAA_INTEL_GALILEO_GEN1: - plat = mraa_intel_galileo_rev_d(); + plat = mraa_intel_galileo_rev_d(&advance_func); break; default: - plat = mraa_intel_galileo_rev_d(); + plat = mraa_intel_galileo_rev_d(&advance_func); fprintf(stderr, "Platform not found, initialising MRAA_INTEL_GALILEO_GEN1\n"); }