0
+ − 1
// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+ − 2
// All rights reserved.
+ − 3
// This component and the accompanying materials are made available
+ − 4
// under the terms of the License "Eclipse Public License v1.0"
+ − 5
// which accompanies this distribution, and is available
+ − 6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ − 7
//
+ − 8
// Initial Contributors:
+ − 9
// Nokia Corporation - initial contribution.
+ − 10
//
+ − 11
// Contributors:
+ − 12
//
+ − 13
// Description:
+ − 14
// omap3530/omap3530_drivers/gpio/gpio.cpp
+ − 15
//
+ − 16
+ − 17
#include <kern_priv.h>
+ − 18
#include <assp/omap3530_assp/omap3530_gpio.h>
+ − 19
#include <assp/omap3530_assp/omap3530_hardware_base.h>
+ − 20
#include <assp/omap3530_assp/omap3530_irqmap.h>
+ − 21
+ − 22
#include <assp.h>
+ − 23
//#include <nkern.h>
+ − 24
#include <assp/omap3530_assp/gpio.h>
+ − 25
+ − 26
GLREF_C TInt InitGpioInterrupts();
+ − 27
+ − 28
+ − 29
TSpinLock GPIOModeLock(/*TSpinLock::EOrderNone*/);
+ − 30
TSpinLock GPIOWakeLock(/*TSpinLock::EOrderNone*/);
+ − 31
TSpinLock GPIOLevelLock(/*TSpinLock::EOrderNone*/);
+ − 32
+ − 33
GPIO::TGpioMode ThePinMode[ KHwGpioPinMax ];
+ − 34
TUint32 ThePinIsEnabled[ KHwGpioBanks ];
+ − 35
__ASSERT_COMPILE( KHwGpioPinsPerBank <= 32 );
+ − 36
+ − 37
#if 0
+ − 38
static void dumpGpioBank(TUint aBankAddr)
+ − 39
{
+ − 40
Kern::Printf("GPIO_SYSCONFIG at %x is %x",aBankAddr +KGPIO_SYSCONFIG,AsspRegister::Read32(aBankAddr +KGPIO_SYSCONFIG) );
+ − 41
Kern::Printf("GPIO_SYSSTATUS at %x is %x",aBankAddr +KGPIO_SYSSTATUS,AsspRegister::Read32(aBankAddr +KGPIO_SYSSTATUS));
+ − 42
Kern::Printf("GPIO_IRQSTATUS1 at %x is %x",aBankAddr +KGPIO_IRQSTATUS1,AsspRegister::Read32(aBankAddr +KGPIO_IRQSTATUS1) );
+ − 43
Kern::Printf("GPIO_IRQENABLE1 at %x is %x",aBankAddr +KGPIO_IRQENABLE1,AsspRegister::Read32(aBankAddr +KGPIO_IRQENABLE1) );
+ − 44
Kern::Printf("GPIO_WAKEUPENABLE at %x is %x",aBankAddr +KGPIO_WAKEUPENABLE,AsspRegister::Read32(aBankAddr +KGPIO_WAKEUPENABLE) );
+ − 45
Kern::Printf("GPIO_CTRL at %x is %x",aBankAddr +KGPIO_CTRL,AsspRegister::Read32(aBankAddr +KGPIO_CTRL) );
+ − 46
Kern::Printf("GPIO_OE at %x is %x",aBankAddr +KGPIO_CTRL,AsspRegister::Read32(aBankAddr +KGPIO_OE) );
+ − 47
}
+ − 48
#endif
+ − 49
+ − 50
+ − 51
EXPORT_C TInt GPIO::SetPinMode(TInt aId, TGpioMode aMode)
+ − 52
{
+ − 53
TInt irq = __SPIN_LOCK_IRQSAVE(GPIOModeLock);
+ − 54
if(ThePinMode[ aId ] != aMode)
+ − 55
{
+ − 56
ThePinMode[ aId ] = aMode;
+ − 57
TUint bank = GPIO_PIN_BANK( aId );
+ − 58
TUint pinMask = 1 << GPIO_PIN_OFFSET( aId );
+ − 59
+ − 60
if( aMode == GPIO::EEnabled)
+ − 61
{
+ − 62
if( 0 == ThePinIsEnabled[ bank ] )
+ − 63
{
+ − 64
// First enabled pin in bank
+ − 65
AsspRegister::Modify32(GPIO_BASE_ADDRESS( aId ) +KGPIO_CTRL,KClearNone,0x1);
+ − 66
}
+ − 67
+ − 68
ThePinIsEnabled[ bank ] |= pinMask;
+ − 69
}
+ − 70
else
+ − 71
{
+ − 72
ThePinIsEnabled[ bank ] &= ~pinMask;
+ − 73
+ − 74
if( 0 == ThePinIsEnabled[ bank ] )
+ − 75
{
+ − 76
// Bank can be disabled
+ − 77
AsspRegister::Modify32(GPIO_BASE_ADDRESS( aId ) +KGPIO_CTRL,0x1, KSetNone);
+ − 78
}
+ − 79
}
+ − 80
}
+ − 81
__SPIN_UNLOCK_IRQRESTORE(GPIOModeLock,irq);
+ − 82
return KErrNone;
+ − 83
}
+ − 84
+ − 85
EXPORT_C TInt GPIO::GetPinMode(TInt aId, TGpioMode & aMode)
+ − 86
{
+ − 87
aMode = ThePinMode[ aId ];
+ − 88
return KErrNone;
+ − 89
}
+ − 90
+ − 91
EXPORT_C TInt GPIO::SetPinDirection(TInt aId, TGpioDirection aDirection)
+ − 92
{
+ − 93
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::SetPinBias OOB ",KErrArgument));
+ − 94
+ − 95
if (aDirection == ETriStated)
+ − 96
{
+ − 97
return KErrNotSupported;
+ − 98
}
+ − 99
+ − 100
if (aDirection == EInput)
+ − 101
{
+ − 102
AsspRegister::Modify32(GPIO_BASE_ADDRESS(aId)+KGPIO_OE, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 103
}
+ − 104
else
+ − 105
{
+ − 106
AsspRegister::Modify32(GPIO_BASE_ADDRESS(aId)+KGPIO_OE, GPIO_PIN_OFFSET(aId), KSetNone);
+ − 107
}
+ − 108
return KErrNone;
+ − 109
}
+ − 110
+ − 111
EXPORT_C TInt GPIO::GetPinDirection(TInt aId, TGpioDirection& aDirection)
+ − 112
{
+ − 113
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetPinDirection OOB ",KErrArgument));
+ − 114
+ − 115
if(AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_OE) & GPIO_PIN_OFFSET(aId))
+ − 116
aDirection=EInput;
+ − 117
else
+ − 118
aDirection=EOutput;
+ − 119
+ − 120
return KErrNone;
+ − 121
}
+ − 122
+ − 123
EXPORT_C TInt GPIO::SetPinBias(TInt aId, TGpioBias aBias)
+ − 124
{
+ − 125
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::SetPinBias OOB ",KErrArgument));
+ − 126
return KErrNotSupported;
+ − 127
}
+ − 128
+ − 129
EXPORT_C TInt GPIO::GetPinBias(TInt aId, TGpioBias& aBias)
+ − 130
{
+ − 131
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetPinBias OOB ",KErrArgument));
+ − 132
return KErrNotSupported;
+ − 133
}
+ − 134
+ − 135
EXPORT_C TInt GPIO::SetPinIdleConfigurationAndState(TInt aId, TInt /*aConf*/)
+ − 136
{
+ − 137
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::SetPinIdleConfigurationAndState OOB ",KErrArgument));
+ − 138
return KErrNotSupported;
+ − 139
}
+ − 140
+ − 141
EXPORT_C TInt GPIO::GetPinIdleConfigurationAndState(TInt aId, TInt& aBias)
+ − 142
{
+ − 143
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetPinIdleConfigurationAndState OOB ",KErrArgument));
+ − 144
return KErrNotSupported;
+ − 145
}
+ − 146
+ − 147
EXPORT_C TInt GPIO::BindInterrupt(TInt aId, TGpioIsr aIsr, TAny* aPtr)
+ − 148
{
+ − 149
return Interrupt::Bind( EGPIOIRQ_FIRST + aId,aIsr,aPtr);
+ − 150
}
+ − 151
+ − 152
EXPORT_C TInt GPIO::UnbindInterrupt(TInt aId)
+ − 153
{
+ − 154
return Interrupt::Unbind( EGPIOIRQ_FIRST + aId );
+ − 155
}
+ − 156
+ − 157
EXPORT_C TInt GPIO::EnableInterrupt(TInt aId)
+ − 158
{
+ − 159
return Interrupt::Enable( EGPIOIRQ_FIRST + aId );
+ − 160
}
+ − 161
+ − 162
EXPORT_C TInt GPIO::DisableInterrupt(TInt aId)
+ − 163
{
+ − 164
return Interrupt::Disable( EGPIOIRQ_FIRST + aId );
+ − 165
}
+ − 166
+ − 167
EXPORT_C TInt GPIO::ClearInterrupt(TInt aId)
+ − 168
{
+ − 169
return Interrupt::Clear( EGPIOIRQ_FIRST + aId );
+ − 170
}
+ − 171
+ − 172
EXPORT_C TInt GPIO::IsInterruptEnabled(TInt aId, TBool& aEnable)
+ − 173
{
+ − 174
aEnable = AsspRegister::Read32(GPIO_BASE_ADDRESS( aId ) + KGPIO_IRQENABLE1) & GPIO_PIN_OFFSET(aId);
+ − 175
return KErrNone;
+ − 176
}
+ − 177
+ − 178
EXPORT_C TInt GPIO::GetMaskedInterruptState(TInt aId, TBool& aActive)
+ − 179
{
+ − 180
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetMaskedInterruptState OOB ",KErrArgument));
+ − 181
aActive = AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_IRQSTATUS1) & GPIO_PIN_OFFSET(aId);
+ − 182
+ − 183
return KErrNone;
+ − 184
}
+ − 185
+ − 186
EXPORT_C TInt GPIO::GetRawInterruptState(TInt aId, TBool& aActive)
+ − 187
{
+ − 188
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetRawInterruptState OOB ",KErrArgument));
+ − 189
+ − 190
aActive = AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_IRQSTATUS1) & GPIO_PIN_OFFSET(aId);
+ − 191
+ − 192
return KErrNone;
+ − 193
}
+ − 194
+ − 195
EXPORT_C TInt GPIO::SetInterruptTrigger(TInt aId, TGpioDetectionTrigger aTrigger)
+ − 196
{
+ − 197
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::SetInterruptTrigger OOB ",KErrArgument));
+ − 198
+ − 199
TInt baseAddr = GPIO_BASE_ADDRESS(aId);
+ − 200
TUint irqFlags=0;
+ − 201
//first we clear the current trigger(s)
+ − 202
//then set the new for each case
+ − 203
switch (aTrigger)
+ − 204
{
+ − 205
case ELevelLow:
+ − 206
+ − 207
irqFlags = NKern::DisableAllInterrupts();//__SPIN_LOCK_IRQSAVE_W(GPIOLevelSpinLock);
+ − 208
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT1, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 209
AsspRegister::Modify32(baseAddr+KGPIO_FALLINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 210
AsspRegister::Modify32(baseAddr+KGPIO_RISINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 211
+ − 212
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT0, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 213
NKern::RestoreInterrupts(irqFlags);//__SPIN_UNLOCK_IRQRESTORE_W(GPIOLevelSpinLock,irqFlags);
+ − 214
break;
+ − 215
case ELevelHigh:
+ − 216
+ − 217
irqFlags = NKern::DisableAllInterrupts();//__SPIN_LOCK_IRQSAVE_W(GPIOLevelSpinLock);
+ − 218
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT0, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 219
AsspRegister::Modify32(baseAddr+KGPIO_FALLINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 220
AsspRegister::Modify32(baseAddr+KGPIO_RISINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 221
+ − 222
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT1, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 223
NKern::RestoreInterrupts(irqFlags);//__SPIN_UNLOCK_IRQRESTORE_W(GPIOLevelSpinLock,irqFlags);
+ − 224
+ − 225
break;
+ − 226
case EEdgeFalling:
+ − 227
+ − 228
irqFlags = NKern::DisableAllInterrupts();//__SPIN_LOCK_IRQSAVE_W(GPIOLevelSpinLock);
+ − 229
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT0, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 230
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT1, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 231
AsspRegister::Modify32(baseAddr+KGPIO_RISINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 232
+ − 233
AsspRegister::Modify32(baseAddr+KGPIO_FALLINGDETECT, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 234
NKern::RestoreInterrupts(irqFlags);//__SPIN_UNLOCK_IRQRESTORE_W(GPIOLevelSpinLock,irqFlags);
+ − 235
break;
+ − 236
case EEdgeRising:
+ − 237
+ − 238
irqFlags = NKern::DisableAllInterrupts();//__SPIN_LOCK_IRQSAVE_W(GPIOLevelSpinLock);
+ − 239
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT0, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 240
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT1, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 241
AsspRegister::Modify32(baseAddr+KGPIO_FALLINGDETECT, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 242
+ − 243
AsspRegister::Modify32(baseAddr+KGPIO_RISINGDETECT, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 244
NKern::RestoreInterrupts(irqFlags);//__SPIN_UNLOCK_IRQRESTORE_W(GPIOLevelSpinLock,irqFlags);
+ − 245
break;
+ − 246
case EEdgeBoth:
+ − 247
+ − 248
irqFlags = NKern::DisableAllInterrupts();//__SPIN_LOCK_IRQSAVE_W(GPIOLevelSpinLock);
+ − 249
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT0, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 250
AsspRegister::Modify32(baseAddr+KGPIO_LEVELDETECT1, GPIO_PIN_OFFSET(aId),KSetNone);
+ − 251
+ − 252
AsspRegister::Modify32(baseAddr+KGPIO_FALLINGDETECT, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 253
AsspRegister::Modify32(baseAddr+KGPIO_RISINGDETECT, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 254
NKern::RestoreInterrupts(irqFlags);//__SPIN_UNLOCK_IRQRESTORE_W(GPIOLevelSpinLock,irqFlags);
+ − 255
+ − 256
break;
+ − 257
default:
+ − 258
return KErrArgument;
+ − 259
}
+ − 260
+ − 261
return KErrNone;
+ − 262
}
+ − 263
+ − 264
+ − 265
EXPORT_C TInt GPIO::EnableWakeup(TInt aId)
+ − 266
{
+ − 267
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::EnableWakeup OOB ",KErrArgument));
+ − 268
+ − 269
TInt baseAddr = GPIO_BASE_ADDRESS(aId);
+ − 270
+ − 271
TInt irq = __SPIN_LOCK_IRQSAVE(GPIOWakeLock);
+ − 272
AsspRegister::Modify32(baseAddr+KGPIO_SYSCONFIG,KClearNone, 1 << 2 );
+ − 273
AsspRegister::Modify32(baseAddr+KGPIO_SETWKUENA,KClearNone ,GPIO_PIN_OFFSET(aId));
+ − 274
__SPIN_UNLOCK_IRQRESTORE(GPIOWakeLock,irq);
+ − 275
+ − 276
return KErrNone;
+ − 277
}
+ − 278
+ − 279
EXPORT_C TInt GPIO::DisableWakeup(TInt aId)
+ − 280
{
+ − 281
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::DisableWakeup OOB ",KErrArgument));
+ − 282
+ − 283
TInt baseAddr = GPIO_BASE_ADDRESS(aId);
+ − 284
+ − 285
TInt irq = __SPIN_LOCK_IRQSAVE(GPIOWakeLock);
+ − 286
AsspRegister::Modify32(baseAddr+KGPIO_SYSCONFIG,1 << 2 ,KSetNone);
+ − 287
AsspRegister::Modify32(baseAddr+KGPIO_CLEARWKUENA,KClearNone,GPIO_PIN_OFFSET(aId));
+ − 288
__SPIN_UNLOCK_IRQRESTORE(GPIOWakeLock,irq);
+ − 289
return KErrNone;
+ − 290
}
+ − 291
+ − 292
EXPORT_C TInt GPIO::IsWakeupEnabled(TInt aId, TBool& aEnable)
+ − 293
{
+ − 294
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::IsWakeupEnabled OOB ",KErrArgument));
+ − 295
+ − 296
aEnable = AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_WAKEUPENABLE) & GPIO_PIN_OFFSET(aId);
+ − 297
return KErrNone;
+ − 298
}
+ − 299
+ − 300
EXPORT_C TInt GPIO::SetWakeupTrigger(TInt aId, TGpioDetectionTrigger aTrigger)
+ − 301
{
+ − 302
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::SetWakeupTrigger OOB ",KErrArgument));
+ − 303
return KErrNotSupported;
+ − 304
}
+ − 305
+ − 306
// WARNING: Changing debouncing time will change it for all pins in the bank
+ − 307
EXPORT_C TInt GPIO::SetDebounceTime(TInt aId, TInt aTime)
+ − 308
{
+ − 309
TGpioDirection direction;
+ − 310
GetPinDirection(aId, direction);
+ − 311
+ − 312
if(direction==EOutput)
+ − 313
{
+ − 314
// The pin must be configured as input.
+ − 315
return KErrNotSupported;
+ − 316
}
+ − 317
+ − 318
//convert the Ms input time into units of 31us
+ − 319
TInt timeSteps = aTime / 31;
+ − 320
if(timeSteps>127)
+ − 321
{
+ − 322
#ifdef _DEBUG
+ − 323
Kern::Printf("Warning: Tried to set the GPIO debounce time to %dus, \
+ − 324
which is greater than the maximum supported 3937us.", aTime);
+ − 325
#endif
+ − 326
timeSteps=127; // The maximum debounce value.
+ − 327
}
+ − 328
+ − 329
TInt baseAddr = GPIO_BASE_ADDRESS(aId);
+ − 330
+ − 331
TUint irqFlags = __SPIN_LOCK_IRQSAVE(gpio::GPIODebounceSpinLock);
+ − 332
AsspRegister::Write32(baseAddr+KGPIO_DEBOUNCINGTIME, timeSteps & KGPIO_DEBOUNCE_TIME_MASK);
+ − 333
AsspRegister::Modify32(baseAddr+KGPIO_DEBOUNCENABLE, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 334
__SPIN_UNLOCK_IRQRESTORE(gpio::GPIODebounceSpinLock,irqFlags);
+ − 335
+ − 336
return KErrNone;
+ − 337
}
+ − 338
+ − 339
EXPORT_C TInt GPIO::GetDebounceTime(TInt aId, TInt& aTime)
+ − 340
{
+ − 341
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetDebounceTime OOB ",KErrArgument));
+ − 342
aTime=AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_DEBOUNCINGTIME); // The time in in multiples of 31 microseconds. We should probably use a nicer unit..
+ − 343
+ − 344
return KErrNone;
+ − 345
}
+ − 346
+ − 347
EXPORT_C TInt GPIO::SetOutputState(TInt aId, TGpioState aState)
+ − 348
{
+ − 349
if(aState==GPIO::ELow)
+ − 350
{
+ − 351
AsspRegister::Modify32(GPIO_BASE_ADDRESS(aId) + KGPIO_DATAOUT, GPIO_PIN_OFFSET(aId), KSetNone);
+ − 352
}
+ − 353
else
+ − 354
{
+ − 355
AsspRegister::Modify32(GPIO_BASE_ADDRESS(aId) + KGPIO_DATAOUT, KClearNone, GPIO_PIN_OFFSET(aId));
+ − 356
}
+ − 357
return KErrNone;
+ − 358
}
+ − 359
+ − 360
EXPORT_C TInt GPIO::GetInputState(TInt aId, TGpioState& aState)
+ − 361
{
+ − 362
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetInputState OOB ",KErrArgument));
+ − 363
+ − 364
aState= ( AsspRegister::Read32(GPIO_BASE_ADDRESS(aId) + KGPIO_DATAIN) & GPIO_PIN_OFFSET(aId) ?
+ − 365
GPIO::EHigh:
+ − 366
GPIO::ELow);
+ − 367
+ − 368
return KErrNone;
+ − 369
}
+ − 370
+ − 371
EXPORT_C TInt GPIO::GetOutputState(TInt aId, TGpioState& aState)
+ − 372
{
+ − 373
__ASSERT_ALWAYS(GPIO_PIN_BOUNDS(aId),Kern::Fault(" GPIO::GetOutputState OOB ",KErrArgument));
+ − 374
+ − 375
aState = (AsspRegister::Read32(GPIO_BASE_ADDRESS(aId)+KGPIO_DATAOUT)& GPIO_PIN_OFFSET(aId) ?
+ − 376
aState=GPIO::EHigh:
+ − 377
aState=GPIO::ELow);
+ − 378
return KErrNone;
+ − 379
}
+ − 380
+ − 381
EXPORT_C TInt GPIO::GetInputState(TInt aId, TGpioCallback* /*aCb*/)
+ − 382
{
+ − 383
return KErrNotSupported;
+ − 384
}
+ − 385
+ − 386
EXPORT_C TInt GPIO::SetOutputState(TInt aId, TGpioState aState, TGpioCallback* /*aCb*/)
+ − 387
{
+ − 388
return KErrNotSupported;
+ − 389
}
+ − 390
+ − 391
+ − 392
DECLARE_STANDARD_EXTENSION()
+ − 393
{
+ − 394
+ − 395
TInt i=0;
+ − 396
for(;i<KHwGpioBanks;i++)
+ − 397
{
+ − 398
//spins here
+ − 399
AsspRegister::Write32(GPIO_BASE_ADDRESS(i*KHwGpioPinsPerBank)+KGPIO_SYSCONFIG,0x01 | 1 <<2);
+ − 400
AsspRegister::Write32(GPIO_BASE_ADDRESS(i*KHwGpioPinsPerBank)+KGPIO_CTRL,0x00);
+ − 401
ThePinIsEnabled[i]=0;
+ − 402
}
+ − 403
+ − 404
for(i=0; i<KHwGpioPinMax; i++)
+ − 405
{
+ − 406
//ThePinMode[ i ]=GPIO::EIdle;
+ − 407
}
+ − 408
return InitGpioInterrupts();
+ − 409
}