sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32\drivers\adc\d_adc.cpp sl@0: // Generic ADC driver sl@0: // sl@0: // sl@0: sl@0: sl@0: #include sl@0: sl@0: /****************************************************** sl@0: * ADC Channel sl@0: ******************************************************/ sl@0: EXPORT_C TAdcChannel::TAdcChannel(TInt anAdc) sl@0: : iChannelId(-1), iCommandCount(0), iCommandList(NULL), sl@0: iReadings(NULL) sl@0: { sl@0: iNext=NULL; sl@0: // iPriority=0; sl@0: if (anAdc>=0 && anAdcAdd(this); sl@0: } sl@0: NKern::RestoreInterrupts(irq); sl@0: } sl@0: sl@0: EXPORT_C void TAdcChannel::Preamble() sl@0: // sl@0: // Default preamble does nothing sl@0: // sl@0: { sl@0: } sl@0: sl@0: EXPORT_C void TAdcChannel::Postamble() sl@0: // sl@0: // Default postamble does nothing sl@0: // sl@0: { sl@0: } sl@0: sl@0: sl@0: /****************************************************** sl@0: * ADC Controller sl@0: ******************************************************/ sl@0: LOCAL_C void timerExpired(TAny* aPtr) sl@0: { sl@0: ((DAdc*)aPtr)->TimerExpired(); sl@0: } sl@0: sl@0: DAdc::DAdc() sl@0: : iTimer(timerExpired,this) sl@0: { sl@0: // iCurrentChannel=NULL; sl@0: // iCurrentCommand=0; sl@0: // iCommandPtr=0; sl@0: // iCommandCount=0; sl@0: // iMinPriority=0; sl@0: } sl@0: sl@0: DAdc::~DAdc() sl@0: { sl@0: } sl@0: sl@0: EXPORT_C TInt DAdc::SetMinPriority(TInt anAdc, TInt aPriority) sl@0: { sl@0: if (anAdc<0 || anAdc>=NumberOfAdcs) sl@0: return KErrArgument; sl@0: if (aPriority<0 || aPriority>KNumAdcChannelPriorities) sl@0: return KErrArgument; sl@0: return TheAdcs[anAdc]->DoSetMinPriority(aPriority); sl@0: } sl@0: sl@0: TInt DAdc::DoSetMinPriority(TInt aPriority) sl@0: { sl@0: TInt irq=NKern::DisableAllInterrupts(); sl@0: if (aPriorityiPriority>=aPriority) sl@0: { sl@0: iList.Remove(pN); sl@0: Execute(pN); sl@0: } sl@0: } sl@0: } sl@0: iMinPriority=aPriority; sl@0: NKern::RestoreInterrupts(irq); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void DAdc::Add(TAdcChannel* aChannel) sl@0: // sl@0: // Queue another ADC reading request sl@0: // sl@0: { sl@0: if (iCurrentChannel || (aChannel->iPriorityiNext=(TPriListLink*)1; // so channel will not be queued again sl@0: iCurrentChannel=aChannel; sl@0: iCommandPtr=aChannel->iCommandList; sl@0: iCommandCount=aChannel->iCommandCount; sl@0: NextCommand(); sl@0: } sl@0: sl@0: void DAdc::NextCommand() sl@0: // sl@0: // Perform the next command in the command list sl@0: // This runs in an ISR or with interrupts disabled sl@0: // sl@0: { sl@0: TBool wait=EFalse; sl@0: TAdcChannel* pC=iCurrentChannel; sl@0: if (iCommandCount) sl@0: { sl@0: TInt c=*iCommandPtr++; sl@0: iCurrentCommand=c; sl@0: iCommandCount--; sl@0: if (c & EAdcCmdPreamble) sl@0: pC->Preamble(); sl@0: if (c & EAdcCmdPostamble) sl@0: pC->Postamble(); sl@0: if (c & EAdcCmdWait) sl@0: { sl@0: iTimer.OneShot(c & 0xffff); sl@0: wait=ETrue; sl@0: } sl@0: else if (c & EAdcCmdReading) sl@0: { sl@0: StartConversion(pC->iChannelId); sl@0: wait=ETrue; sl@0: } sl@0: } sl@0: if (iCommandCount==0 && !wait) sl@0: { sl@0: iCurrentChannel=NULL; sl@0: pC->iNext=NULL; sl@0: if (iList.iPresent[0]) sl@0: { sl@0: TAdcChannel* pN=iList.First(); sl@0: if (pN->iPriority>=iMinPriority) sl@0: { sl@0: iList.Remove(pN); sl@0: Execute(pN); sl@0: } sl@0: } sl@0: pC->Complete(); sl@0: } sl@0: } sl@0: sl@0: void DAdc::Start() sl@0: // sl@0: // Called on completion of initialisation to start processing requests sl@0: // This runs in an ISR sl@0: // sl@0: { sl@0: iCurrentChannel=NULL; sl@0: if (iList.iPresent[0]) sl@0: { sl@0: TAdcChannel* pN=iList.First(); sl@0: iList.Remove(pN); sl@0: Execute(pN); sl@0: } sl@0: } sl@0: sl@0: void DAdc::ConversionComplete(TInt aValue) sl@0: // sl@0: // Called when a conversion has completed sl@0: // This runs in an ISR sl@0: // sl@0: { sl@0: if ((iCurrentCommand & EAdcCmdDiscard)==0) sl@0: *(iCurrentChannel->iReadings)++=aValue; sl@0: NextCommand(); sl@0: } sl@0: sl@0: void DAdc::TimerExpired() sl@0: // sl@0: // Called in ISR when timer expires sl@0: // sl@0: { sl@0: NextCommand(); sl@0: } sl@0: