diff --git a/os/hal/platforms/AVR/adc_lld.c b/os/hal/platforms/AVR/adc_lld.c index ee4c8a173..13656cfdb 100644 --- a/os/hal/platforms/AVR/adc_lld.c +++ b/os/hal/platforms/AVR/adc_lld.c @@ -1,26 +1,22 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - This file is part of ChibiOS/RT. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - ChibiOS/RT is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. + http://www.apache.org/licenses/LICENSE-2.0 - ChibiOS/RT is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ /** - * @file templates/adc_lld.c - * @brief ADC Driver subsystem low level driver source template. + * @file AVR/adc_lld.c + * @brief ADC Driver subsystem low level driver source. * * @addtogroup ADC * @{ @@ -50,26 +46,26 @@ ADCDriver ADCD1; /* Driver local functions. */ /*===========================================================================*/ -static size_t getAdcChannelNumberFromMask(uint8_t mask, uint8_t currentChannel) -{ - for(uint8_t i = 0; mask>0; i++) - { - if(mask & 0x01) - { - if(!currentChannel) - return i; - currentChannel--; - } - mask >>= 1; +static size_t getAdcChannelNumberFromMask(uint8_t mask, uint8_t currentChannel) { + + for (uint8_t i = 0; mask > 0; i++) { + if (mask & 0x01) { + if (!currentChannel) + return i; + currentChannel--; } - - /* error, should never reach this line */ + mask >>= 1; + } + + /* error, should never reach this line */ } -static void setAdcChannel(uint8_t channelNum) -{ - ADMUX = (ADMUX & 0xf8) | (channelNum & 0x07); +static void setAdcChannel(uint8_t channelNum) { + + ADMUX = (ADMUX & 0xf8) | (channelNum & 0x07); + } + /*===========================================================================*/ /* Driver interrupt handlers. */ /*===========================================================================*/ @@ -77,35 +73,29 @@ static void setAdcChannel(uint8_t channelNum) #include CH_IRQ_HANDLER(ADC_vect) { - + CH_IRQ_PROLOGUE(); - uint8_t low = ADCL; - uint8_t high = ADCH; - uint16_t result = (high << 8) | low; - - ADCD1.samples[ADCD1.currentBufferPosition] = result; - ADCD1.currentBufferPosition++; - - size_t bufferSize = ADCD1.depth * ADCD1.grpp->num_channels; - size_t currentChannel = ADCD1.currentBufferPosition % ADCD1.grpp->num_channels; - size_t currentIteration = ADCD1.currentBufferPosition / ADCD1.grpp->num_channels; - if(ADCD1.grpp-> circular && currentChannel == 0 && currentIteration == ADCD1.depth/2) - { - _adc_isr_half_code(&ADCD1); - - } - - if(ADCD1.currentBufferPosition == bufferSize) - { - _adc_isr_full_code(&ADCD1); - } - else - { - - setAdcChannel(getAdcChannelNumberFromMask(ADCD1.grpp->channelsMask,currentChannel)); - ADCSRA |= 1<num_channels; + size_t currentChannel = ADCD1.currentBufferPosition % ADCD1.grpp->num_channels; + size_t currentIteration = ADCD1.currentBufferPosition / ADCD1.grpp->num_channels; + if (ADCD1.grpp->circular && currentChannel == 0 && currentIteration == ADCD1.depth/2) { + _adc_isr_half_code(&ADCD1); + } + + if (ADCD1.currentBufferPosition == bufferSize) { + _adc_isr_full_code(&ADCD1); + } else { + setAdcChannel(getAdcChannelNumberFromMask(ADCD1.grpp->channelsMask,currentChannel)); + ADCSRA |= 1 << ADSC; + } + CH_IRQ_EPILOGUE(); } @@ -119,12 +109,17 @@ CH_IRQ_HANDLER(ADC_vect) { * @notapi */ void adc_lld_init(void) { - adcObjectInit(&ADCD1); - ADCSRA =(1<state == ADC_STOP) { /* Clock activation.*/ - ADCSRA |= (1<config != NULL) - { - ADMUX = (adcp->config->analog_reference << REFS0); + + if (adcp->config != NULL) { + ADMUX = (adcp->config->analog_reference << REFS0); } } @@ -158,8 +152,9 @@ void adc_lld_stop(ADCDriver *adcp) { if (adcp->state == ADC_READY) { /* Clock de-activation.*/ - ADCSRA &= ~(1<currentBufferPosition=0; - - setAdcChannel(getAdcChannelNumberFromMask(adcp->grpp->channelsMask,0)); - ADCSRA |= 1<currentBufferPosition=0; + + setAdcChannel(getAdcChannelNumberFromMask(adcp->grpp->channelsMask,0)); + ADCSRA |= 1 << ADSC; + } /** @@ -184,7 +181,9 @@ void adc_lld_start_conversion(ADCDriver *adcp) { * @notapi */ void adc_lld_stop_conversion(ADCDriver *adcp) { - ADCSRA &= ~(1<. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ /** - * @file templates/adc_lld.h - * @brief ADC Driver subsystem low level driver header template. + * @file AVR/adc_lld.h + * @brief ADC Driver subsystem low level driver source. * * @addtogroup ADC * @{ @@ -35,12 +31,10 @@ /* Driver constants. */ /*===========================================================================*/ -#define ANALOG_REFERENCE_AREF 0 -#define ANALOG_REFERENCE_AVCC 1 -#define ANALOG_REFERENCE_1V1 2 -#define ANALOG_REFERENCE_2V56 3 - - +#define ANALOG_REFERENCE_AREF 0 +#define ANALOG_REFERENCE_AVCC 1 +#define ANALOG_REFERENCE_1V1 2 +#define ANALOG_REFERENCE_2V56 3 /*===========================================================================*/ /* Driver pre-compile time settings. */ @@ -104,9 +98,9 @@ typedef struct { */ adccallback_t end_cb; /* End of the mandatory fields.*/ - - uint8_t channelsMask; - + + uint8_t channelsMask; + } ADCConversionGroup; /** @@ -116,7 +110,9 @@ typedef struct { * @note It could be empty on some architectures. */ typedef struct { - uint8_t analog_reference; + + uint8_t analog_reference; + } ADCConfig; /** @@ -183,7 +179,6 @@ struct ADCDriver { extern ADCDriver ADCD1; #endif - #ifdef __cplusplus extern "C" { #endif @@ -196,8 +191,6 @@ extern "C" { } #endif - - #endif /* HAL_USE_ADC */ #endif /* _ADC_LLD_H_ */