unsigned int mraa_get_platform_adc_raw_bits(uint8_t platform_offset) { if (platform_offset == MRAA_MAIN_PLATFORM_OFFSET) return mraa_adc_raw_bits(); else { if (!mraa_has_sub_platform()) return 0; if (plat->sub_platform->aio_count == 0) return 0; return plat->sub_platform->adc_raw; } }
mraa_aio_context mraa_aio_init(unsigned int aio) { if (plat == NULL) { syslog(LOG_ERR, "aio: Platform not initialised"); return NULL; } if (mraa_is_sub_platform_id(aio)) { syslog(LOG_NOTICE, "aio: Using sub platform is not supported"); return NULL; } // Create ADC device connected to specified channel mraa_aio_context dev = mraa_aio_init_internal(plat->adv_func); if (dev == NULL) { syslog(LOG_ERR, "aio: Insufficient memory for specified input channel %d", aio); return NULL; } int pin = aio + plat->gpio_count; dev->channel = plat->pins[pin].aio.pinmap; dev->value_bit = DEFAULT_BITS; if (IS_FUNC_DEFINED(dev, aio_init_pre)) { mraa_result_t pre_ret = (dev->advance_func->aio_init_pre(aio)); if (pre_ret != MRAA_SUCCESS) { free(dev); return NULL; } } if (aio > plat->aio_count) { syslog(LOG_ERR, "aio: requested channel out of range"); free(dev); return NULL; } if (plat->pins[pin].capabilites.aio != 1) { syslog(LOG_ERR, "aio: pin uncapable of aio"); free(dev); return NULL; } if (plat->pins[pin].aio.mux_total > 0) { if (mraa_setup_mux_mapped(plat->pins[pin].aio) != MRAA_SUCCESS) { free(dev); syslog(LOG_ERR, "aio: unable to setup multiplexers for pin"); return NULL; } } // Open valid analog input file and get the pointer. if (MRAA_SUCCESS != aio_get_valid_fp(dev)) { free(dev); return NULL; } raw_bits = mraa_adc_raw_bits(); if (IS_FUNC_DEFINED(dev, aio_init_post)) { mraa_result_t ret = dev->advance_func->aio_init_post(dev); if (ret != MRAA_SUCCESS) { free(dev); return NULL; } } return dev; }
mraa_aio_context mraa_aio_init(unsigned int aio) { mraa_board_t* board = plat; int pin; if (board == NULL) { syslog(LOG_ERR, "aio: Platform not initialised"); return NULL; } if (mraa_is_sub_platform_id(aio)) { syslog(LOG_NOTICE, "aio: Using sub platform"); board = board->sub_platform; if (board == NULL) { syslog(LOG_ERR, "aio: Sub platform Not Initialised"); return NULL; } aio = mraa_get_sub_platform_index(aio); } // Some boards, like the BBB, don't have sequential AIO pins // They will have their own specific mapping to map aio -> pin if((board->aio_non_seq) && (aio < board->aio_count)){ pin = board->aio_dev[aio].pin; } else { // aio are always past the gpio_count in the pin array pin = aio + board->gpio_count; } if (pin < 0 || pin >= board->phy_pin_count) { syslog(LOG_ERR, "aio: pin %i beyond platform definition", pin); return NULL; } if (aio >= board->aio_count) { syslog(LOG_ERR, "aio: requested channel out of range"); return NULL; } if (board->pins[pin].capabilities.aio != 1) { syslog(LOG_ERR, "aio: pin %i not capable of aio", pin); return NULL; } if (board->pins[pin].aio.mux_total > 0) { if (mraa_setup_mux_mapped(board->pins[pin].aio) != MRAA_SUCCESS) { syslog(LOG_ERR, "aio: unable to setup multiplexers for pin"); return NULL; } } // Create ADC device connected to specified channel mraa_aio_context dev = mraa_aio_init_internal(board->adv_func, aio, board->pins[pin].aio.pinmap); if (dev == NULL) { syslog(LOG_ERR, "aio: Insufficient memory for specified input channel %d", aio); return NULL; } dev->value_bit = DEFAULT_BITS; if (IS_FUNC_DEFINED(dev, aio_init_pre)) { mraa_result_t pre_ret = (dev->advance_func->aio_init_pre(aio)); if (pre_ret != MRAA_SUCCESS) { free(dev); return NULL; } } if (IS_FUNC_DEFINED(dev, aio_init_post)) { mraa_result_t ret = dev->advance_func->aio_init_post(dev); if (ret != MRAA_SUCCESS) { free(dev); return NULL; } } raw_bits = mraa_adc_raw_bits(); if (raw_bits < dev->value_bit) { shifter_value = dev->value_bit - raw_bits; max_analog_value = ((1 << raw_bits) - 1) << shifter_value; } else { shifter_value = raw_bits - dev->value_bit; max_analog_value = ((1 << raw_bits) - 1) >> shifter_value; } return dev; }
mraa_aio_context mraa_aio_init(unsigned int aio) { mraa_board_t* board = plat; int pin; if (board == NULL) { syslog(LOG_ERR, "aio: Platform not initialised"); return NULL; } if (mraa_is_sub_platform_id(aio)) { syslog(LOG_NOTICE, "aio: Using sub platform"); board = board->sub_platform; if (board == NULL) { syslog(LOG_ERR, "aio: Sub platform Not Initialised"); return NULL; } aio = mraa_get_sub_platform_index(aio); } // aio are always past the gpio_count in the pin array pin = aio + board->gpio_count; if (pin < 0 || pin >= board->phy_pin_count) { syslog(LOG_ERR, "aio: pin %i beyond platform definition", pin); return NULL; } if (aio >= board->aio_count) { syslog(LOG_ERR, "aio: requested channel out of range"); return NULL; } if (board->pins[pin].capabilites.aio != 1) { syslog(LOG_ERR, "aio: pin %i not capable of aio", pin); return NULL; } if (board->pins[pin].aio.mux_total > 0) { if (mraa_setup_mux_mapped(board->pins[pin].aio) != MRAA_SUCCESS) { syslog(LOG_ERR, "aio: unable to setup multiplexers for pin"); return NULL; } } // Create ADC device connected to specified channel mraa_aio_context dev = mraa_aio_init_internal(board->adv_func, aio); if (dev == NULL) { syslog(LOG_ERR, "aio: Insufficient memory for specified input channel %d", aio); return NULL; } dev->channel = board->pins[pin].aio.pinmap; dev->value_bit = DEFAULT_BITS; if (IS_FUNC_DEFINED(dev, aio_init_pre)) { mraa_result_t pre_ret = (dev->advance_func->aio_init_pre(aio)); if (pre_ret != MRAA_SUCCESS) { free(dev); return NULL; } } if (IS_FUNC_DEFINED(dev, aio_init_post)) { mraa_result_t ret = dev->advance_func->aio_init_post(dev); if (ret != MRAA_SUCCESS) { free(dev); return NULL; } } raw_bits = mraa_adc_raw_bits(); return dev; }
/** * Check the board's bit size when reading the value * * @return raw bits being read from kernel module. Zero if no ADC */ inline unsigned int adcRawBits() { return mraa_adc_raw_bits(); }