Nut/OS  4.10.3
API Reference
gpio_at91.c
Go to the documentation of this file.
00001 
00037 #include <arch/arm.h>
00038 
00039 #include <stdlib.h>
00040 #include <string.h>
00041 
00042 #include <dev/gpio.h>
00043 
00053 int GpioPinGet(int bank, int bit)
00054 {
00055     int rc = 0;
00056 
00057     switch(bank) {
00058 #ifdef PIO_PDSR
00059     case NUTGPIO_PORT:
00060         rc = (inr(PIO_PDSR) & _BV(bit)) != 0;
00061         break;
00062 #endif /* PIO_PDSR */
00063 
00064 #ifdef PIOA_PDSR
00065     case NUTGPIO_PORTA:
00066         rc = (inr(PIOA_PDSR) & _BV(bit)) != 0;
00067         break;
00068 #endif /* PIOA_PDSR */
00069 
00070 #ifdef PIOB_PDSR
00071     case NUTGPIO_PORTB:
00072         rc = (inr(PIOB_PDSR) & _BV(bit)) != 0;
00073         break;
00074 #endif /* PIOB_PDSR */
00075 
00076 #ifdef PIOC_PDSR
00077     case NUTGPIO_PORTC:
00078         rc = (inr(PIOC_PDSR) & _BV(bit)) != 0;
00079         break;
00080 #endif /* PIOC_PDSR */
00081     }
00082     return rc;
00083 }
00084 
00093 void GpioPinSetLow(int bank, int bit)
00094 {
00095     switch(bank) {
00096 #ifdef PIO_CODR
00097     case NUTGPIO_PORT:
00098         outr(PIO_CODR, _BV(bit));
00099         break;
00100 #endif /* PIO_CODR */
00101 
00102 #ifdef PIOA_CODR
00103     case NUTGPIO_PORTA:
00104         outr(PIOA_CODR, _BV(bit));
00105         break;
00106 #endif /* PIOA_CODR */
00107 
00108 #ifdef PIOB_CODR
00109     case NUTGPIO_PORTB:
00110         outr(PIOB_CODR, _BV(bit));
00111         break;
00112 #endif /* PIOB_CODR */
00113 
00114 #ifdef PIOC_CODR
00115     case NUTGPIO_PORTC:
00116         outr(PIOC_CODR, _BV(bit));
00117         break;
00118 #endif /* PIOC_CODR */
00119     }
00120 }
00121 
00130 void GpioPinSetHigh(int bank, int bit)
00131 {
00132     switch(bank) {
00133 #ifdef PIO_SODR
00134     case NUTGPIO_PORT:
00135         outr(PIO_SODR, _BV(bit));
00136         break;
00137 #endif /* PIO_SODR */
00138 
00139 #ifdef PIOA_SODR
00140     case NUTGPIO_PORTA:
00141         outr(PIOA_SODR, _BV(bit));
00142         break;
00143 #endif /* PIOA_SODR */
00144 
00145 #ifdef PIOB_SODR
00146     case NUTGPIO_PORTB:
00147         outr(PIOB_SODR, _BV(bit));
00148         break;
00149 #endif /* PIOB_SODR */
00150 
00151 #ifdef PIOC_SODR
00152     case NUTGPIO_PORTC:
00153         outr(PIOC_SODR, _BV(bit));
00154         break;
00155 #endif /* PIOC_SODR */
00156     }
00157 }
00158 
00168 void GpioPinSet(int bank, int bit, int value)
00169 {
00170     if (value) {
00171         GpioPinSetHigh(bank, bit);
00172     }
00173     else {
00174         GpioPinSetLow(bank, bit);
00175     }
00176 }
00177 
00185 unsigned int GpioPortGet(int bank)
00186 {
00187     unsigned int rc = 0;
00188 
00189     switch(bank) {
00190 #ifdef PIO_PDSR
00191     case NUTGPIO_PORT:
00192         rc = inr(PIO_PDSR);
00193         break;
00194 #endif /* PIO_PDSR */
00195 
00196 #ifdef PIOA_PDSR
00197     case NUTGPIO_PORTA:
00198         rc = inr(PIOA_PDSR);
00199         break;
00200 #endif /* PIO_PDSR */
00201 
00202 #ifdef PIOB_PDSR
00203     case NUTGPIO_PORTB:
00204         rc = inr(PIOB_PDSR);
00205         break;
00206 #endif /* PIOB_PDSR */
00207 
00208 #ifdef PIOC_PDSR
00209     case NUTGPIO_PORTC:
00210         rc = inr(PIOC_PDSR);
00211         break;
00212 #endif /* PIOC_PDSR */
00213     }
00214     return rc;
00215 }
00216 
00226 void GpioPortSetLow(int bank, unsigned int mask)
00227 {
00228     switch(bank) {
00229 #ifdef PIO_CODR
00230     case NUTGPIO_PORT:
00231         outr(PIO_CODR, mask);
00232         break;
00233 #endif /* PIO_CODR */
00234 
00235 #ifdef PIOA_CODR
00236     case NUTGPIO_PORTA:
00237         outr(PIOA_CODR, mask);
00238         break;
00239 #endif /* PIOA_CODR */
00240 
00241 #ifdef PIOB_CODR
00242     case NUTGPIO_PORTB:
00243         outr(PIOB_CODR, mask);
00244         break;
00245 #endif /* PIOB_CODR */
00246 
00247 #ifdef PIOC_CODR
00248     case NUTGPIO_PORTC:
00249         outr(PIOC_CODR, mask);
00250         break;
00251 #endif /* PIOC_CODR */
00252     }
00253 }
00254 
00264 void GpioPortSetHigh(int bank, unsigned int mask)
00265 {
00266     switch(bank) {
00267 #ifdef PIO_SODR
00268     case NUTGPIO_PORT:
00269         outr(PIO_SODR, mask);
00270         break;
00271 #endif /* PIO_SODR */
00272 
00273 #ifdef PIOA_SODR
00274     case NUTGPIO_PORTA:
00275         outr(PIOA_SODR, mask);
00276         break;
00277 #endif /* PIOA_SODR */
00278 
00279 #ifdef PIOB_SODR
00280     case NUTGPIO_PORTB:
00281         outr(PIOB_SODR, mask);
00282         break;
00283 #endif /* PIOB_SODR */
00284 
00285 #ifdef PIOC_SODR
00286     case NUTGPIO_PORTC:
00287         outr(PIOC_SODR, mask);
00288         break;
00289 #endif /* PIOC_SODR */
00290     }
00291 }
00292 
00306 void GpioPortSet(int bank, unsigned int value)
00307 {
00308     if (value) {
00309         GpioPortSetHigh(bank, value);
00310     }
00311     value = ~value;
00312     if (value) {
00313         GpioPortSetLow(bank, value);
00314     }
00315 }
00316 
00325 uint32_t GpioPinConfigGet(int bank, int bit)
00326 {
00327     uint32_t rc = 0;
00328 
00329     switch(bank) {
00330     case NUTGPIO_PORT:
00331 #ifdef PIO_PSR
00332         if ((inr(PIO_PSR) & _BV(bit)) == 0) {
00333             rc |= GPIO_CFG_DISABLED;
00334         }
00335 #endif /* PIO_PSR */
00336 
00337 #ifdef PIO_OSR
00338         if (inr(PIO_OSR) & _BV(bit)) {
00339             rc |= GPIO_CFG_OUTPUT;
00340         }
00341 #endif /* PIO_OSR */
00342 
00343 #ifdef PIO_IFSR
00344         if (inr(PIO_IFSR) & _BV(bit)) {
00345             rc |= GPIO_CFG_DEBOUNCE;
00346         }
00347 #endif /* PIO_IFSR */
00348 
00349 #ifdef PIO_MDSR
00350         if (inr(PIO_MDSR) & _BV(bit)) {
00351             rc |= GPIO_CFG_MULTIDRIVE;
00352         }
00353 #endif /* PIO_MDSR */
00354 
00355 #ifdef PIO_PUSR
00356         if ((inr(PIO_PUSR) & _BV(bit)) == 0) {
00357             rc |= GPIO_CFG_PULLUP;
00358         }
00359 #endif /* PIO_PUSR */
00360         break;
00361 
00362     case NUTGPIO_PORTA:
00363 #ifdef PIOA_PSR
00364         if ((inr(PIOA_PSR) & _BV(bit)) == 0) {
00365             rc |= GPIO_CFG_DISABLED;
00366         }
00367 #endif /* PIOA_PSR */
00368 
00369 #ifdef PIOA_OSR
00370         if (inr(PIOA_OSR) & _BV(bit)) {
00371             rc |= GPIO_CFG_OUTPUT;
00372         }
00373 #endif /* PIOA_OSR */
00374 
00375 #ifdef PIOA_IFSR
00376         if (inr(PIOA_IFSR) & _BV(bit)) {
00377             rc |= GPIO_CFG_DEBOUNCE;
00378         }
00379 #endif /* PIOA_IFSR */
00380 
00381 #ifdef PIOA_MDSR
00382         if (inr(PIOA_MDSR) & _BV(bit)) {
00383             rc |= GPIO_CFG_MULTIDRIVE;
00384         }
00385 #endif /* PIOA_MDSR */
00386 
00387 #ifdef PIOA_PUSR
00388         if ((inr(PIOA_PUSR) & _BV(bit)) == 0) {
00389             rc |= GPIO_CFG_PULLUP;
00390         }
00391 #endif /* PIOA_PUSR */
00392         break;
00393 
00394     case NUTGPIO_PORTB:
00395 #ifdef PIOB_PSR
00396         if ((inr(PIOB_PSR) & _BV(bit)) == 0) {
00397             rc |= GPIO_CFG_DISABLED;
00398         }
00399 #endif /* PIOB_PSR */
00400 
00401 #ifdef PIOB_OSR
00402         if (inr(PIOB_OSR) & _BV(bit)) {
00403             rc |= GPIO_CFG_OUTPUT;
00404         }
00405 #endif /* PIOB_OSR */
00406 
00407 #ifdef PIOB_IFSR
00408         if (inr(PIOB_IFSR) & _BV(bit)) {
00409             rc |= GPIO_CFG_DEBOUNCE;
00410         }
00411 #endif /* PIOB_IFSR */
00412 
00413 #ifdef PIOB_MDSR
00414         if (inr(PIOB_MDSR) & _BV(bit)) {
00415             rc |= GPIO_CFG_MULTIDRIVE;
00416         }
00417 #endif /* PIOB_MDSR */
00418 
00419 #ifdef PIOB_PUSR
00420         if ((inr(PIOB_PUSR) & _BV(bit)) == 0) {
00421             rc |= GPIO_CFG_PULLUP;
00422         }
00423 #endif /* PIOB_PUSR */
00424         break;
00425 
00426     case NUTGPIO_PORTC:
00427 #ifdef PIOC_PSR
00428         if ((inr(PIOC_PSR) & _BV(bit)) == 0) {
00429             rc |= GPIO_CFG_DISABLED;
00430         }
00431 #endif /* PIOC_PSR */
00432 
00433 #ifdef PIOC_OSR
00434         if (inr(PIOC_OSR) & _BV(bit)) {
00435             rc |= GPIO_CFG_OUTPUT;
00436         }
00437 #endif /* PIOC_OSR */
00438 
00439 #ifdef PIOC_IFSR
00440         if (inr(PIOC_IFSR) & _BV(bit)) {
00441             rc |= GPIO_CFG_DEBOUNCE;
00442         }
00443 #endif /* PIOC_IFSR */
00444 
00445 #ifdef PIOC_MDSR
00446         if (inr(PIOC_MDSR) & _BV(bit)) {
00447             rc |= GPIO_CFG_MULTIDRIVE;
00448         }
00449 #endif /* PIOC_MDSR */
00450 
00451 #ifdef PIOC_PUSR
00452         if ((inr(PIOC_PUSR) & _BV(bit)) == 0) {
00453             rc |= GPIO_CFG_PULLUP;
00454         }
00455 #endif /* PIOC_PUSR */
00456         break;
00457 
00458     }
00459     return rc;
00460 }
00461 
00475 int GpioPortConfigSet(int bank, unsigned int mask, uint32_t flags)
00476 {
00477     switch(bank) {
00478     case NUTGPIO_PORT:
00479 #ifdef PIO_PDR
00480         if (flags & GPIO_CFG_DISABLED) {
00481             outr(PIO_PDR, mask);
00482         }
00483         else {
00484             outr(PIO_PER, mask);
00485 #ifdef PMC_PCER
00486             outr(PMC_PCER, _BV(PIO_ID));
00487 #endif /* PMC_PCER */
00488         }
00489 #endif /* PIO_PDR */
00490 
00491 #ifdef PIO_PUER
00492         if (flags & GPIO_CFG_PULLUP) {
00493             outr(PIO_PUER, mask);
00494         }
00495         else {
00496             outr(PIO_PUDR, mask);
00497         }
00498 #endif /* PIO_PUER */
00499 
00500 #ifdef PIO_IFER
00501         if (flags & GPIO_CFG_DEBOUNCE) {
00502             outr(PIO_IFER, mask);
00503         }
00504         else {
00505             outr(PIO_IFDR, mask);
00506         }
00507 #endif /* PIO_IFER */
00508 
00509 #ifdef PIO_ODR
00510         if ((flags & GPIO_CFG_OUTPUT) == 0) {
00511             outr(PIO_ODR, mask);
00512         }
00513 #endif /* PIO_ODR */
00514 
00515 #ifdef PIO_MDER
00516         if (flags & GPIO_CFG_MULTIDRIVE) {
00517             outr(PIO_MDER, mask);
00518         }
00519         else {
00520             outr(PIO_MDDR, mask);
00521         }
00522 #endif /* PIO_MDER */
00523 
00524 #ifdef PIO_OER
00525         if (flags & GPIO_CFG_OUTPUT) {
00526             outr(PIO_OER, mask);
00527         }
00528 #endif /* PIO_OER */
00529         break;
00530 
00531     case NUTGPIO_PORTA:
00532 #ifdef PIOA_PDR
00533         if (flags & GPIO_CFG_DISABLED) {
00534             outr(PIOA_PDR, mask);
00535         }
00536         else {
00537             outr(PIOA_PER, mask);
00538 #ifdef PMC_PCER
00539             outr(PMC_PCER, _BV(PIOA_ID));
00540 #endif /* PMC_PCER */
00541         }
00542 #endif /* PIOA_PDR */
00543 
00544 #ifdef PIOA_PUER
00545         if (flags & GPIO_CFG_PULLUP) {
00546             outr(PIOA_PUER, mask);
00547         }
00548         else {
00549             outr(PIOA_PUDR, mask);
00550         }
00551 #endif /* PIOA_PUER */
00552 
00553 #ifdef PIOA_IFER
00554         if (flags & GPIO_CFG_DEBOUNCE) {
00555             outr(PIOA_IFER, mask);
00556         }
00557         else {
00558             outr(PIOA_IFDR, mask);
00559         }
00560 #endif /* PIOA_IFER */
00561 
00562 #ifdef PIOA_ODR
00563         if ((flags & GPIO_CFG_OUTPUT) == 0) {
00564             outr(PIOA_ODR, mask);
00565         }
00566 #endif /* PIOA_ODR */
00567 
00568 #ifdef PIOA_MDER
00569         if (flags & GPIO_CFG_MULTIDRIVE) {
00570             outr(PIOA_MDER, mask);
00571         }
00572         else {
00573             outr(PIOA_MDDR, mask);
00574         }
00575 #endif /* PIOA_MDER */
00576 
00577 #ifdef PIOA_OER
00578         if (flags & GPIO_CFG_OUTPUT) {
00579             outr(PIOA_OER, mask);
00580         }
00581 #endif /* PIOA_OER */
00582         break;
00583 
00584     case NUTGPIO_PORTB:
00585 #ifdef PIOB_PDR
00586         if (flags & GPIO_CFG_DISABLED) {
00587             outr(PIOB_PDR, mask);
00588         }
00589         else {
00590             outr(PIOB_PER, mask);
00591 #ifdef PMC_PCER
00592             outr(PMC_PCER, _BV(PIOB_ID));
00593 #endif /* PMC_PCER */
00594         }
00595 #endif /* PIOB_PDR */
00596 
00597 #ifdef PIOB_PUER
00598         if (flags & GPIO_CFG_PULLUP) {
00599             outr(PIOB_PUER, mask);
00600         }
00601         else {
00602             outr(PIOB_PUDR, mask);
00603         }
00604 #endif /* PIOB_PUER */
00605 
00606 #ifdef PIOB_IFER
00607         if (flags & GPIO_CFG_DEBOUNCE) {
00608             outr(PIOB_IFER, mask);
00609         }
00610         else {
00611             outr(PIOB_IFDR, mask);
00612         }
00613 #endif /* PIOB_IFER */
00614 
00615 #ifdef PIOB_ODR
00616         if ((flags & GPIO_CFG_OUTPUT) == 0) {
00617             outr(PIOB_ODR, mask);
00618         }
00619 #endif /* PIOB_ODR */
00620 
00621 #ifdef PIOB_MDER
00622         if (flags & GPIO_CFG_MULTIDRIVE) {
00623             outr(PIOB_MDER, mask);
00624         }
00625         else {
00626             outr(PIOB_MDDR, mask);
00627         }
00628 #endif /* PIOB_MDER */
00629 
00630 #ifdef PIOB_OER
00631         if (flags & GPIO_CFG_OUTPUT) {
00632             outr(PIOB_OER, mask);
00633         }
00634 #endif /* PIOB_OER */
00635         break;
00636 
00637     case NUTGPIO_PORTC:
00638 #ifdef PIOC_PDR
00639         if (flags & GPIO_CFG_DISABLED) {
00640             outr(PIOC_PDR, mask);
00641         }
00642         else {
00643             outr(PIOC_PER, mask);
00644 #ifdef PMC_PCER
00645             outr(PMC_PCER, _BV(PIOC_ID));
00646 #endif /* PMC_PCER */
00647         }
00648 #endif /* PIOC_PDR */
00649 
00650 #ifdef PIOC_PUER
00651         if (flags & GPIO_CFG_PULLUP) {
00652             outr(PIOC_PUER, mask);
00653         }
00654         else {
00655             outr(PIOC_PUDR, mask);
00656         }
00657 #endif /* PIOC_PUER */
00658 
00659 #ifdef PIOC_IFER
00660         if (flags & GPIO_CFG_DEBOUNCE) {
00661             outr(PIOC_IFER, mask);
00662         }
00663         else {
00664             outr(PIOC_IFDR, mask);
00665         }
00666 #endif /* PIOC_IFER */
00667 
00668 #ifdef PIOC_ODR
00669         if ((flags & GPIO_CFG_OUTPUT) == 0) {
00670             outr(PIOC_ODR, mask);
00671         }
00672 #endif /* PIOC_ODR */
00673 
00674 #ifdef PIOC_MDER
00675         if (flags & GPIO_CFG_MULTIDRIVE) {
00676             outr(PIOC_MDER, mask);
00677         }
00678         else {
00679             outr(PIOC_MDDR, mask);
00680         }
00681 #endif /* PIOC_MDER */
00682 
00683 #ifdef PIOC_OER
00684         if (flags & GPIO_CFG_OUTPUT) {
00685             outr(PIOC_OER, mask);
00686         }
00687 #endif /* PIOC_OER */
00688         break;
00689     }
00690     return 0;
00691 }
00692 
00710 int GpioPinConfigSet(int bank, int bit, uint32_t flags)
00711 {
00712     GpioPortConfigSet(bank, _BV(bit), flags);
00713 
00714     /* Check the result. */
00715     if (GpioPinConfigGet(bank, bit) != flags) {
00716         return -1;
00717     }
00718     return 0;
00719 }
00720 
00761 int GpioRegisterIrqHandler(GPIO_SIGNAL * sig, int bit, void (*handler) (void *), void *arg)
00762 {
00763     int rc = 0;
00764 
00765     if (sig->ios_vector == 0) {
00766         /* This is the first call. Allocate the vector table. */
00767         sig->ios_vector = malloc(sizeof(GPIO_VECTOR) * 32);
00768         if (sig->ios_vector) {
00769             memset(sig->ios_vector, 0, sizeof(GPIO_VECTOR) * 32);
00770             /* Register our internal PIO interrupt service. */
00771             rc = NutRegisterIrqHandler(sig->ios_sig, sig->ios_handler, sig->ios_vector);
00772             if (rc == 0) {
00773                 rc = NutIrqEnable(sig->ios_sig);
00774             }
00775         }
00776         else {
00777             rc = -1;
00778         }
00779     }
00780     sig->ios_vector[bit].iov_handler = handler;
00781     sig->ios_vector[bit].iov_arg = arg;
00782 
00783     return rc;
00784 }
00785 
00797 int GpioIrqEnable(GPIO_SIGNAL * sig, int bit)
00798 {
00799     return (sig->ios_ctl) (NUT_IRQCTL_ENABLE, NULL, bit);
00800 }
00801 
00810 int GpioIrqDisable(GPIO_SIGNAL * sig, int bit)
00811 {
00812     return (sig->ios_ctl) (NUT_IRQCTL_DISABLE, NULL, bit);
00813 }