diff --git a/include/mraa_internal.h b/include/mraa_internal.h index 6c7bb99..20149b8 100644 --- a/include/mraa_internal.h +++ b/include/mraa_internal.h @@ -34,8 +34,10 @@ extern "C" { #include "mraa_internal_types.h" #include "mraa_adv_func.h" -extern mraa_adv_func_t* advance_func; extern mraa_board_t* plat; +// TODO: Remove global advance_func and use module context instead +extern mraa_adv_func_t* advance_func; + /** * Takes in pin information and sets up the multiplexors. diff --git a/include/mraa_internal_types.h b/include/mraa_internal_types.h index 155f147..0aa9868 100644 --- a/include/mraa_internal_types.h +++ b/include/mraa_internal_types.h @@ -247,7 +247,7 @@ typedef struct _board_t { int pwm_default_period; /**< The default PWM period is US */ int pwm_max_period; /**< Maximum period in us */ int pwm_min_period; /**< Minimum period in us */ - mraa_platform_t platform_type; + mraa_platform_t platform_type; /**< Platform type */ const char* platform_name; /**< Platform Name pointer */ mraa_pininfo_t* pins; /**< Pointer to pin array */ mraa_adv_func_t* adv_func; /**< Pointer to advanced function disptach table */ diff --git a/src/mraa.c b/src/mraa.c index 5f57147..b4c69a4 100644 --- a/src/mraa.c +++ b/src/mraa.c @@ -104,6 +104,9 @@ mraa_init() #if defined(X86PLAT) // Use runtime x86 platform detection platform_type = mraa_x86_platform(); + // x86 platforms have advanced_func stable in board config structure + free(advance_func); + advance_func = plat->adv_func; #elif defined(ARMPLAT) // Use runtime ARM platform detection platform_type = mraa_arm_platform(); diff --git a/src/x86/intel_de3815.c b/src/x86/intel_de3815.c index c6a05d8..83298d4 100644 --- a/src/x86/intel_de3815.c +++ b/src/x86/intel_de3815.c @@ -38,7 +38,7 @@ mraa_board_t* mraa_intel_de3815() { - mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t)); + mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t)); if (b == NULL) { return NULL; } diff --git a/src/x86/intel_galileo_rev_d.c b/src/x86/intel_galileo_rev_d.c index aa7bfde..28992a5 100644 --- a/src/x86/intel_galileo_rev_d.c +++ b/src/x86/intel_galileo_rev_d.c @@ -143,7 +143,7 @@ mraa_intel_galileo_g1_spi_lsbmode_replace(mraa_spi_context dev, mraa_boolean_t l mraa_board_t* mraa_intel_galileo_rev_d() { - mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t)); + mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t)); if (b == NULL) { return NULL; } @@ -160,8 +160,13 @@ mraa_intel_galileo_rev_d() b->pwm_max_period = 7968; b->pwm_min_period = 1; + mraa_adv_func_t* advance_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t)); + if (advance_func == NULL) { + return NULL; + } advance_func->gpio_mmap_setup = &mraa_intel_galileo_g1_mmap_setup; advance_func->spi_lsbmode_replace = &mraa_intel_galileo_g1_spi_lsbmode_replace; + b->adv_func = advance_func; b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * MRAA_INTEL_GALILEO_REV_D_PINCOUNT); if (b->pins == NULL) { diff --git a/src/x86/intel_galileo_rev_g.c b/src/x86/intel_galileo_rev_g.c index 83cb0de..e84d310 100644 --- a/src/x86/intel_galileo_rev_g.c +++ b/src/x86/intel_galileo_rev_g.c @@ -335,6 +335,10 @@ mraa_intel_galileo_gen2() b->pwm_max_period = 41666; b->pwm_min_period = 666; + mraa_adv_func_t* advance_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t)); + if (advance_func == NULL) { + return NULL; + } advance_func->gpio_close_pre = &mraa_intel_galileo_gen2_gpio_close_pre; advance_func->gpio_dir_pre = &mraa_intel_galileo_gen2_dir_pre; advance_func->i2c_init_pre = &mraa_intel_galileo_gen2_i2c_init_pre; @@ -342,6 +346,7 @@ mraa_intel_galileo_gen2() advance_func->gpio_mode_replace = &mraa_intel_galileo_gen2_gpio_mode_replace; advance_func->uart_init_pre = &mraa_intel_galileo_gen2_uart_init_pre; advance_func->gpio_mmap_setup = &mraa_intel_galileo_g2_mmap_setup; + b->adv_func = advance_func; b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * MRAA_INTEL_GALILEO_GEN_2_PINCOUNT); if (b->pins == NULL) { diff --git a/src/x86/intel_minnow_max.c b/src/x86/intel_minnow_max.c index 76608e3..c3ecda8 100644 --- a/src/x86/intel_minnow_max.c +++ b/src/x86/intel_minnow_max.c @@ -85,7 +85,7 @@ mraa_get_pin_index(mraa_board_t* board, char* name, int* pin_index) mraa_board_t* mraa_intel_minnow_max() { - mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t)); + mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t)); struct utsname running_uname; int uname_major, uname_minor, max_pins[27]; @@ -100,6 +100,7 @@ mraa_intel_minnow_max() b->aio_count = 0; b->adc_raw = 0; b->adc_supported = 0; + b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t)); b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * MRAA_INTEL_MINNOW_MAX_PINCOUNT); if (b->pins == NULL) {