00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "chip.h"
00039
00040 #include <assert.h>
00041
00042
00043
00044
00045
00046
00047
00048
00049 #define MAX_INTERRUPT_SOURCES 7
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 typedef struct _InterruptSource
00060 {
00061
00062 const Pin *pPin;
00063
00064
00065 void (*handler)( const Pin* ) ;
00066 } InterruptSource ;
00067
00068
00069
00070
00071
00072
00073 static InterruptSource _aIntSources[MAX_INTERRUPT_SOURCES] ;
00074
00075
00076 static uint32_t _dwNumSources = 0;
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 extern void PioInterruptHandler( uint32_t id, Pio *pPio )
00088 {
00089 uint32_t status;
00090 uint32_t i;
00091
00092
00093 status = pPio->PIO_ISR;
00094 status &= pPio->PIO_IMR;
00095
00096
00097 if ( status != 0 ) {
00098 TRACE_DEBUG( "PIO interrupt on PIO controller #%d\n\r", id ) ;
00099
00100
00101 i = 0;
00102 while ( status != 0 ) {
00103
00104 assert(i < _dwNumSources);
00105
00106
00107 if (_aIntSources[i].pPin->id == id) {
00108
00109 if ( (status & _aIntSources[i].pPin->mask) != 0 ) {
00110 TRACE_DEBUG( "Interrupt source #%d triggered\n\r", i ) ;
00111 _aIntSources[i].handler(_aIntSources[i].pPin);
00112 status &= ~(_aIntSources[i].pPin->mask);
00113 }
00114 }
00115 i++;
00116 }
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 extern void PIOA_Handler( void )
00129 {
00130 PioInterruptHandler( ID_PIOA, PIOA ) ;
00131 }
00132
00133
00134
00135
00136
00137 extern void PIOB_Handler( void )
00138 {
00139 PioInterruptHandler( ID_PIOB, PIOB ) ;
00140 }
00141
00142
00143
00144
00145
00146 extern void PIOC_Handler( void )
00147 {
00148 PioInterruptHandler( ID_PIOC, PIOC ) ;
00149 }
00150
00151
00152
00153
00154
00155
00156 extern void PIOD_Handler( void )
00157 {
00158 PioInterruptHandler( ID_PIOD, PIOD ) ;
00159 }
00160
00161
00162
00163
00164
00165 extern void PIOE_Handler( void )
00166 {
00167 PioInterruptHandler( ID_PIOE, PIOE ) ;
00168 }
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 extern void PIO_InitializeInterrupts( uint32_t dwPriority )
00180 {
00181 TRACE_DEBUG( "PIO_Initialize()\n\r" ) ;
00182
00183
00184 _dwNumSources = 0 ;
00185
00186
00187 TRACE_DEBUG( "PIO_Initialize: Configuring PIOA\n\r" ) ;
00188 PMC_EnablePeripheral( ID_PIOA ) ;
00189 PIOA->PIO_ISR ;
00190 PIOA->PIO_IDR = 0xFFFFFFFF ;
00191 NVIC_DisableIRQ( PIOA_IRQn ) ;
00192 NVIC_ClearPendingIRQ( PIOA_IRQn ) ;
00193 NVIC_SetPriority( PIOA_IRQn, dwPriority ) ;
00194 NVIC_EnableIRQ( PIOA_IRQn ) ;
00195
00196 TRACE_DEBUG( "PIO_Initialize: Configuring PIOB\n\r" ) ;
00197 PMC_EnablePeripheral( ID_PIOB ) ;
00198 PIOB->PIO_ISR ;
00199 PIOB->PIO_IDR = 0xFFFFFFFF ;
00200 NVIC_DisableIRQ( PIOB_IRQn ) ;
00201 NVIC_ClearPendingIRQ( PIOB_IRQn ) ;
00202 NVIC_SetPriority( PIOB_IRQn, dwPriority ) ;
00203 NVIC_EnableIRQ( PIOB_IRQn ) ;
00204
00205 TRACE_DEBUG( "PIO_Initialize: Configuring PIOC\n\r" ) ;
00206 PMC_EnablePeripheral( ID_PIOC ) ;
00207 PIOC->PIO_ISR ;
00208 PIOC->PIO_IDR = 0xFFFFFFFF ;
00209 NVIC_DisableIRQ( PIOC_IRQn ) ;
00210 NVIC_ClearPendingIRQ( PIOC_IRQn ) ;
00211 NVIC_SetPriority( PIOC_IRQn, dwPriority ) ;
00212 NVIC_EnableIRQ( PIOC_IRQn ) ;
00213
00214 TRACE_DEBUG( "PIO_Initialize: Configuring PIOD\n\r" ) ;
00215 PMC_EnablePeripheral( ID_PIOD ) ;
00216 PIOD->PIO_ISR ;
00217 PIOD->PIO_IDR = 0xFFFFFFFF ;
00218 NVIC_DisableIRQ( PIOD_IRQn ) ;
00219 NVIC_ClearPendingIRQ( PIOD_IRQn ) ;
00220 NVIC_SetPriority( PIOD_IRQn, dwPriority ) ;
00221 NVIC_EnableIRQ( PIOD_IRQn ) ;
00222
00223 TRACE_DEBUG( "PIO_Initialize: Configuring PIOE\n\r" ) ;
00224 PMC_EnablePeripheral( ID_PIOE ) ;
00225 PIOE->PIO_ISR ;
00226 PIOE->PIO_IDR = 0xFFFFFFFF ;
00227 NVIC_DisableIRQ( PIOE_IRQn ) ;
00228 NVIC_ClearPendingIRQ( PIOE_IRQn ) ;
00229 NVIC_SetPriority( PIOE_IRQn, dwPriority ) ;
00230 NVIC_EnableIRQ( PIOE_IRQn ) ;
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 extern void PIO_ConfigureIt( const Pin *pPin, void (*handler)( const Pin* ) )
00242 {
00243 Pio* pio ;
00244 InterruptSource* pSource ;
00245
00246 TRACE_DEBUG( "PIO_ConfigureIt()\n\r" ) ;
00247
00248 assert( pPin ) ;
00249 pio = pPin->pio ;
00250 assert( _dwNumSources < MAX_INTERRUPT_SOURCES ) ;
00251
00252
00253 TRACE_DEBUG( "PIO_ConfigureIt: Defining new source #%d.\n\r", _dwNumSources ) ;
00254
00255 pSource = &(_aIntSources[_dwNumSources]) ;
00256 pSource->pPin = pPin ;
00257 pSource->handler = handler ;
00258 _dwNumSources++ ;
00259
00260
00261
00262 if ( pPin->attribute & PIO_IT_AIME ) {
00263
00264 pio->PIO_AIMER = pPin->mask ;
00265
00266
00267 if ( pPin->attribute & PIO_IT_RE_OR_HL ) {
00268 pio->PIO_REHLSR = pPin->mask ;
00269 } else {
00270 pio->PIO_FELLSR = pPin->mask;
00271 }
00272
00273
00274 if (pPin->attribute & PIO_IT_EDGE)
00275 pio->PIO_ESR = pPin->mask;
00276 else
00277 pio->PIO_LSR = pPin->mask;
00278 } else {
00279
00280 pio->PIO_AIMDR = pPin->mask;
00281 }
00282 }
00283
00284
00285
00286
00287
00288
00289
00290 extern void PIO_EnableIt( const Pin *pPin )
00291 {
00292 uint32_t i = 0;
00293 uint32_t dwFound = 0;
00294
00295 TRACE_DEBUG( "PIO_EnableIt()\n\r" ) ;
00296
00297 assert( pPin != NULL ) ;
00298
00299 #ifndef NOASSERT
00300
00301 while ( (i < _dwNumSources) && !dwFound ) {
00302 if ( _aIntSources[i].pPin == pPin ) {
00303 dwFound = 1 ;
00304 }
00305 i++ ;
00306 }
00307 assert( dwFound != 0 ) ;
00308 #endif
00309
00310 pPin->pio->PIO_ISR;
00311 pPin->pio->PIO_IER = pPin->mask ;
00312 }
00313
00314
00315
00316
00317
00318
00319 extern void PIO_DisableIt( const Pin *pPin )
00320 {
00321 assert( pPin != NULL ) ;
00322
00323 TRACE_DEBUG( "PIO_DisableIt()\n\r" ) ;
00324
00325 pPin->pio->PIO_IDR = pPin->mask;
00326 }
00327