aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-10-12 17:59:47 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-10-12 17:59:47 +0000
commiteaaf043cdab72623a15c957f44496b7bd0bd9873 (patch)
treecf7509640c9f62e6423cea9220f336ed1a99fd1a
parent935e2fb27f56a3b81d4161d65e116e9da4fe441c (diff)
downloadChibiOS-eaaf043cdab72623a15c957f44496b7bd0bd9873.tar.gz
ChibiOS-eaaf043cdab72623a15c957f44496b7bd0bd9873.tar.bz2
ChibiOS-eaaf043cdab72623a15c957f44496b7bd0bd9873.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2251 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/hal/platforms/STM32/adc_lld.c17
-rw-r--r--os/hal/src/adc.c3
-rw-r--r--testhal/STM32/ADC/main.c23
3 files changed, 17 insertions, 26 deletions
diff --git a/os/hal/platforms/STM32/adc_lld.c b/os/hal/platforms/STM32/adc_lld.c
index c6db10346..cbb206a2e 100644
--- a/os/hal/platforms/STM32/adc_lld.c
+++ b/os/hal/platforms/STM32/adc_lld.c
@@ -66,9 +66,9 @@ CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) {
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_1);
if ((isr & DMA_ISR_HTIF1) != 0) {
/* Half transfer processing.*/
- if (ADCD1.ad_grpp->acg_callback != NULL) {
+ if (ADCD1.ad_grpp->acg_endcb != NULL) {
/* Invokes the callback passing the 1st half of the buffer.*/
- ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth / 2);
+ ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth / 2);
}
}
if ((isr & DMA_ISR_TCIF1) != 0) {
@@ -80,20 +80,25 @@ CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) {
ADCD1.ad_state = ADC_COMPLETE;
#if ADC_USE_WAIT
chSysLockFromIsr();
- chSemResetI(&ADCD1.ad_sem, 0);
+ if (ADCD1.ad_thread != NULL) {
+ Thread *tp = ADCD1.ad_thread;
+ ADCD1.ad_thread = NULL;
+ tp->p_u.rdymsg = RDY_OK;
+ chSchReadyI(tp);
+ }
chSysUnlockFromIsr();
#endif
}
/* Callback handling.*/
- if (ADCD1.ad_grpp->acg_callback != NULL) {
+ if (ADCD1.ad_grpp->acg_endcb != NULL) {
if (ADCD1.ad_depth > 1) {
/* Invokes the callback passing the 2nd half of the buffer.*/
size_t half = ADCD1.ad_depth / 2;
- ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples + half, half);
+ ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples + half, half);
}
else {
/* Invokes the callback passing the whole buffer.*/
- ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth);
+ ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth);
}
}
}
diff --git a/os/hal/src/adc.c b/os/hal/src/adc.c
index 0d33cde4e..c6968f11b 100644
--- a/os/hal/src/adc.c
+++ b/os/hal/src/adc.c
@@ -268,8 +268,7 @@ msg_t adcConvert(ADCDriver *adcp,
msg_t msg;
chSysLock();
- chDbgAssert(adcp->ad_config->ac_endcb == NULL,
- "adcConvert(), #1", "has callback");
+ chDbgAssert(grpp->acg_endcb == NULL, "adcConvert(), #1", "has callback");
adcStartConversionI(adcp, grpp, samples, depth);
(adcp)->ad_thread = chThdSelf();
chSchGoSleepS(THD_STATE_SUSPENDED);
diff --git a/testhal/STM32/ADC/main.c b/testhal/STM32/ADC/main.c
index 11931b05b..00c82b9fd 100644
--- a/testhal/STM32/ADC/main.c
+++ b/testhal/STM32/ADC/main.c
@@ -29,7 +29,6 @@
static const ADCConfig adccfg = {};
static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
-static Thread *adctp;
/*
* ADC streaming callback.
@@ -67,20 +66,6 @@ static const ADCConversionGroup adcgrpcfg = {
};
/*
- * ADC continuous conversion thread.
- */
-static WORKING_AREA(adc_continuous_wa, 256);
-static msg_t adc_continuous_thread(void *p){
-
- (void)p;
- adcStart(&ADCD1, &adccfg);
- adcStartConversion(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH);
- adcWaitConversion(&ADCD1, TIME_INFINITE);
- adcStop(&ADCD1);
- return 0;
-}
-
-/*
* Red LEDs blinker thread, times are in milliseconds.
*/
static WORKING_AREA(waThread1, 128);
@@ -118,15 +103,17 @@ int main(int argc, char **argv) {
chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
/*
- * Creates the ADC continuous conversion test thread.
+ * Starts an ADC continuous conversion.
*/
- adctp = chThdCreateStatic(adc_continuous_wa, sizeof(adc_continuous_wa),
- NORMALPRIO + 10, adc_continuous_thread, NULL);
+ adcStart(&ADCD1, &adccfg);
+ adcStartConversion(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH);
/*
* Normal main() thread activity, in this demo it does nothing.
*/
while (TRUE) {
+ if (palReadPad(IOPORT1, GPIOA_BUTTON))
+ adcStopConversion(&ADCD1);
chThdSleepMilliseconds(500);
}
return 0;