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
00063
00064 #ifdef PIOA_PDSR
00065 case NUTGPIO_PORTA:
00066 rc = (inr(PIOA_PDSR) & _BV(bit)) != 0;
00067 break;
00068 #endif
00069
00070 #ifdef PIOB_PDSR
00071 case NUTGPIO_PORTB:
00072 rc = (inr(PIOB_PDSR) & _BV(bit)) != 0;
00073 break;
00074 #endif
00075
00076 #ifdef PIOC_PDSR
00077 case NUTGPIO_PORTC:
00078 rc = (inr(PIOC_PDSR) & _BV(bit)) != 0;
00079 break;
00080 #endif
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
00101
00102 #ifdef PIOA_CODR
00103 case NUTGPIO_PORTA:
00104 outr(PIOA_CODR, _BV(bit));
00105 break;
00106 #endif
00107
00108 #ifdef PIOB_CODR
00109 case NUTGPIO_PORTB:
00110 outr(PIOB_CODR, _BV(bit));
00111 break;
00112 #endif
00113
00114 #ifdef PIOC_CODR
00115 case NUTGPIO_PORTC:
00116 outr(PIOC_CODR, _BV(bit));
00117 break;
00118 #endif
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
00138
00139 #ifdef PIOA_SODR
00140 case NUTGPIO_PORTA:
00141 outr(PIOA_SODR, _BV(bit));
00142 break;
00143 #endif
00144
00145 #ifdef PIOB_SODR
00146 case NUTGPIO_PORTB:
00147 outr(PIOB_SODR, _BV(bit));
00148 break;
00149 #endif
00150
00151 #ifdef PIOC_SODR
00152 case NUTGPIO_PORTC:
00153 outr(PIOC_SODR, _BV(bit));
00154 break;
00155 #endif
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
00195
00196 #ifdef PIOA_PDSR
00197 case NUTGPIO_PORTA:
00198 rc = inr(PIOA_PDSR);
00199 break;
00200 #endif
00201
00202 #ifdef PIOB_PDSR
00203 case NUTGPIO_PORTB:
00204 rc = inr(PIOB_PDSR);
00205 break;
00206 #endif
00207
00208 #ifdef PIOC_PDSR
00209 case NUTGPIO_PORTC:
00210 rc = inr(PIOC_PDSR);
00211 break;
00212 #endif
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
00234
00235 #ifdef PIOA_CODR
00236 case NUTGPIO_PORTA:
00237 outr(PIOA_CODR, mask);
00238 break;
00239 #endif
00240
00241 #ifdef PIOB_CODR
00242 case NUTGPIO_PORTB:
00243 outr(PIOB_CODR, mask);
00244 break;
00245 #endif
00246
00247 #ifdef PIOC_CODR
00248 case NUTGPIO_PORTC:
00249 outr(PIOC_CODR, mask);
00250 break;
00251 #endif
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
00272
00273 #ifdef PIOA_SODR
00274 case NUTGPIO_PORTA:
00275 outr(PIOA_SODR, mask);
00276 break;
00277 #endif
00278
00279 #ifdef PIOB_SODR
00280 case NUTGPIO_PORTB:
00281 outr(PIOB_SODR, mask);
00282 break;
00283 #endif
00284
00285 #ifdef PIOC_SODR
00286 case NUTGPIO_PORTC:
00287 outr(PIOC_SODR, mask);
00288 break;
00289 #endif
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
00336
00337 #ifdef PIO_OSR
00338 if (inr(PIO_OSR) & _BV(bit)) {
00339 rc |= GPIO_CFG_OUTPUT;
00340 }
00341 #endif
00342
00343 #ifdef PIO_IFSR
00344 if (inr(PIO_IFSR) & _BV(bit)) {
00345 rc |= GPIO_CFG_DEBOUNCE;
00346 }
00347 #endif
00348
00349 #ifdef PIO_MDSR
00350 if (inr(PIO_MDSR) & _BV(bit)) {
00351 rc |= GPIO_CFG_MULTIDRIVE;
00352 }
00353 #endif
00354
00355 #ifdef PIO_PUSR
00356 if ((inr(PIO_PUSR) & _BV(bit)) == 0) {
00357 rc |= GPIO_CFG_PULLUP;
00358 }
00359 #endif
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
00368
00369 #ifdef PIOA_OSR
00370 if (inr(PIOA_OSR) & _BV(bit)) {
00371 rc |= GPIO_CFG_OUTPUT;
00372 }
00373 #endif
00374
00375 #ifdef PIOA_IFSR
00376 if (inr(PIOA_IFSR) & _BV(bit)) {
00377 rc |= GPIO_CFG_DEBOUNCE;
00378 }
00379 #endif
00380
00381 #ifdef PIOA_MDSR
00382 if (inr(PIOA_MDSR) & _BV(bit)) {
00383 rc |= GPIO_CFG_MULTIDRIVE;
00384 }
00385 #endif
00386
00387 #ifdef PIOA_PUSR
00388 if ((inr(PIOA_PUSR) & _BV(bit)) == 0) {
00389 rc |= GPIO_CFG_PULLUP;
00390 }
00391 #endif
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
00400
00401 #ifdef PIOB_OSR
00402 if (inr(PIOB_OSR) & _BV(bit)) {
00403 rc |= GPIO_CFG_OUTPUT;
00404 }
00405 #endif
00406
00407 #ifdef PIOB_IFSR
00408 if (inr(PIOB_IFSR) & _BV(bit)) {
00409 rc |= GPIO_CFG_DEBOUNCE;
00410 }
00411 #endif
00412
00413 #ifdef PIOB_MDSR
00414 if (inr(PIOB_MDSR) & _BV(bit)) {
00415 rc |= GPIO_CFG_MULTIDRIVE;
00416 }
00417 #endif
00418
00419 #ifdef PIOB_PUSR
00420 if ((inr(PIOB_PUSR) & _BV(bit)) == 0) {
00421 rc |= GPIO_CFG_PULLUP;
00422 }
00423 #endif
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
00432
00433 #ifdef PIOC_OSR
00434 if (inr(PIOC_OSR) & _BV(bit)) {
00435 rc |= GPIO_CFG_OUTPUT;
00436 }
00437 #endif
00438
00439 #ifdef PIOC_IFSR
00440 if (inr(PIOC_IFSR) & _BV(bit)) {
00441 rc |= GPIO_CFG_DEBOUNCE;
00442 }
00443 #endif
00444
00445 #ifdef PIOC_MDSR
00446 if (inr(PIOC_MDSR) & _BV(bit)) {
00447 rc |= GPIO_CFG_MULTIDRIVE;
00448 }
00449 #endif
00450
00451 #ifdef PIOC_PUSR
00452 if ((inr(PIOC_PUSR) & _BV(bit)) == 0) {
00453 rc |= GPIO_CFG_PULLUP;
00454 }
00455 #endif
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
00488 }
00489 #endif
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
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
00508
00509 #ifdef PIO_ODR
00510 if ((flags & GPIO_CFG_OUTPUT) == 0) {
00511 outr(PIO_ODR, mask);
00512 }
00513 #endif
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
00523
00524 #ifdef PIO_OER
00525 if (flags & GPIO_CFG_OUTPUT) {
00526 outr(PIO_OER, mask);
00527 }
00528 #endif
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
00541 }
00542 #endif
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
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
00561
00562 #ifdef PIOA_ODR
00563 if ((flags & GPIO_CFG_OUTPUT) == 0) {
00564 outr(PIOA_ODR, mask);
00565 }
00566 #endif
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
00576
00577 #ifdef PIOA_OER
00578 if (flags & GPIO_CFG_OUTPUT) {
00579 outr(PIOA_OER, mask);
00580 }
00581 #endif
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
00594 }
00595 #endif
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
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
00614
00615 #ifdef PIOB_ODR
00616 if ((flags & GPIO_CFG_OUTPUT) == 0) {
00617 outr(PIOB_ODR, mask);
00618 }
00619 #endif
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
00629
00630 #ifdef PIOB_OER
00631 if (flags & GPIO_CFG_OUTPUT) {
00632 outr(PIOB_OER, mask);
00633 }
00634 #endif
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
00647 }
00648 #endif
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
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
00667
00668 #ifdef PIOC_ODR
00669 if ((flags & GPIO_CFG_OUTPUT) == 0) {
00670 outr(PIOC_ODR, mask);
00671 }
00672 #endif
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
00682
00683 #ifdef PIOC_OER
00684 if (flags & GPIO_CFG_OUTPUT) {
00685 outr(PIOC_OER, mask);
00686 }
00687 #endif
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
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
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
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 }