00001
00037 #include <arch/avr.h>
00038
00039 #include <stdlib.h>
00040 #include <string.h>
00041
00042 #include <dev/gpio.h>
00043
00044 int GpioPinGet(int bank, int bit)
00045 {
00046 switch(bank) {
00047 #ifdef PINA
00048 case AVRPORTA:
00049 return bit_is_set(PINA, bit) != 0;
00050 #endif
00051 #ifdef PINB
00052 case AVRPORTB:
00053 return bit_is_set(PINB, bit) != 0;
00054 #endif
00055 #ifdef PINC
00056 case AVRPORTC:
00057 return bit_is_set(PINC, bit) != 0;
00058 #endif
00059 #ifdef PIND
00060 case AVRPORTD:
00061 return bit_is_set(PIND, bit) != 0;
00062 #endif
00063 #ifdef PINE
00064 case AVRPORTE:
00065 return bit_is_set(PINE, bit) != 0;
00066 #endif
00067 #ifdef PINF
00068 case AVRPORTF:
00069 return bit_is_set(PINF, bit) != 0;
00070 #endif
00071 #ifdef PING
00072 case AVRPORTG:
00073 return bit_is_set(PING, bit) != 0;
00074 #endif
00075 #ifdef PINH
00076 case AVRPORTH:
00077 return bit_is_set(PINH, bit) != 0;
00078 #endif
00079 #ifdef PINI
00080 case AVRPORTI:
00081 return bit_is_set(PINI, bit) != 0;
00082 #endif
00083 #ifdef PINJ
00084 case AVRPORTJ:
00085 return bit_is_set(PINJ, bit) != 0;
00086 #endif
00087 #ifdef PINK
00088 case AVRPORTK:
00089 return bit_is_set(PINK, bit) != 0;
00090 #endif
00091 #ifdef PINL
00092 case AVRPORTL:
00093 return bit_is_set(PINL, bit) != 0;
00094 #endif
00095 }
00096 return 0;
00097 }
00098
00099 void GpioPinSetLow(int bank, int bit)
00100 {
00101 switch(bank) {
00102 #ifdef PORTA
00103 case AVRPORTA:
00104 cbi(PORTA, bit);
00105 break;
00106 #endif
00107 #ifdef PORTB
00108 case AVRPORTB:
00109 cbi(PORTB, bit);
00110 break;
00111 #endif
00112 #ifdef PORTC
00113 case AVRPORTC:
00114 cbi(PORTC, bit);
00115 break;
00116 #endif
00117 #ifdef PORTD
00118 case AVRPORTD:
00119 cbi(PORTD, bit);
00120 break;
00121 #endif
00122 #ifdef PORTE
00123 case AVRPORTE:
00124 cbi(PORTE, bit);
00125 break;
00126 #endif
00127 #ifdef PORTF
00128 case AVRPORTF:
00129 cbi(PORTF, bit);
00130 break;
00131 #endif
00132 #ifdef PORTG
00133 case AVRPORTG:
00134 cbi(PORTG, bit);
00135 break;
00136 #endif
00137 #ifdef PORTH
00138 case AVRPORTH:
00139 cbi(PORTH, bit);
00140 break;
00141 #endif
00142 #ifdef PORTI
00143 case AVRPORTI:
00144 cbi(PORTI, bit);
00145 break;
00146 #endif
00147 #ifdef PORTJ
00148 case AVRPORTJ:
00149 cbi(PORTJ, bit);
00150 break;
00151 #endif
00152 #ifdef PORTK
00153 case AVRPORTK:
00154 cbi(PORTK, bit);
00155 break;
00156 #endif
00157 #ifdef PORTL
00158 case AVRPORTL:
00159 cbi(PORTL, bit);
00160 break;
00161 #endif
00162 }
00163 }
00164
00165 void GpioPinSetHigh(int bank, int bit)
00166 {
00167 switch(bank) {
00168 #ifdef PORTA
00169 case AVRPORTA:
00170 sbi(PORTA, bit);
00171 break;
00172 #endif
00173 #ifdef PORTB
00174 case AVRPORTB:
00175 sbi(PORTB, bit);
00176 break;
00177 #endif
00178 #ifdef PORTC
00179 case AVRPORTC:
00180 sbi(PORTC, bit);
00181 break;
00182 #endif
00183 #ifdef PORTD
00184 case AVRPORTD:
00185 sbi(PORTD, bit);
00186 break;
00187 #endif
00188 #ifdef PORTE
00189 case AVRPORTE:
00190 sbi(PORTE, bit);
00191 break;
00192 #endif
00193 #ifdef PORTF
00194 case AVRPORTF:
00195 sbi(PORTF, bit);
00196 break;
00197 #endif
00198 #ifdef PORTG
00199 case AVRPORTG:
00200 sbi(PORTG, bit);
00201 break;
00202 #endif
00203 #ifdef PORTH
00204 case AVRPORTH:
00205 sbi(PORTH, bit);
00206 break;
00207 #endif
00208 #ifdef PORTI
00209 case AVRPORTI:
00210 sbi(PORTI, bit);
00211 break;
00212 #endif
00213 #ifdef PORTJ
00214 case AVRPORTJ:
00215 sbi(PORTJ, bit);
00216 break;
00217 #endif
00218 #ifdef PORTK
00219 case AVRPORTK:
00220 sbi(PORTK, bit);
00221 break;
00222 #endif
00223 #ifdef PORTL
00224 case AVRPORTL:
00225 sbi(PORTL, bit);
00226 break;
00227 #endif
00228 }
00229 }
00230
00231 void GpioPinSet(int bank, int bit, int value)
00232 {
00233 if (value) {
00234 GpioPinSetHigh(bank, bit);
00235 }
00236 else {
00237 GpioPinSetLow(bank, bit);
00238 }
00239 }
00240
00241 unsigned int GpioPortGet(int bank)
00242 {
00243 switch(bank) {
00244 #ifdef PINA
00245 case AVRPORTA:
00246 return inb(PINA);
00247 #endif
00248 #ifdef PINB
00249 case AVRPORTB:
00250 return inb(PINB);
00251 #endif
00252 #ifdef PINC
00253 case AVRPORTC:
00254 return inb(PINC);
00255 #endif
00256 #ifdef PIND
00257 case AVRPORTD:
00258 return inb(PIND);
00259 #endif
00260 #ifdef PINE
00261 case AVRPORTE:
00262 return inb(PINE);
00263 #endif
00264 #ifdef PINF
00265 case AVRPORTF:
00266 return inb(PINF);
00267 #endif
00268 #ifdef PING
00269 case AVRPORTG:
00270 return inb(PING);
00271 #endif
00272 #ifdef PINH
00273 case AVRPORTH:
00274 return inb(PINH);
00275 #endif
00276 #ifdef PINI
00277 case AVRPORTI:
00278 return inb(PINI);
00279 #endif
00280 #ifdef PINJ
00281 case AVRPORTJ:
00282 return inb(PINJ);
00283 #endif
00284 #ifdef PINK
00285 case AVRPORTK:
00286 return inb(PINK);
00287 #endif
00288 #ifdef PINL
00289 case AVRPORTL:
00290 return inb(PINL);
00291 #endif
00292 }
00293 return 0;
00294 }
00295
00296 void GpioPortSet(int bank, unsigned int value)
00297 {
00298 switch(bank) {
00299 #ifdef PORTA
00300 case AVRPORTA:
00301 outb(PORTA, (uint8_t)value);
00302 break;
00303 #endif
00304 #ifdef PORTB
00305 case AVRPORTB:
00306 outb(PORTB, (uint8_t)value);
00307 break;
00308 #endif
00309 #ifdef PORTC
00310 case AVRPORTC:
00311 outb(PORTC, (uint8_t)value);
00312 break;
00313 #endif
00314 #ifdef PORTD
00315 case AVRPORTD:
00316 outb(PORTD, (uint8_t)value);
00317 break;
00318 #endif
00319 #ifdef PORTE
00320 case AVRPORTE:
00321 outb(PORTE, (uint8_t)value);
00322 break;
00323 #endif
00324 #ifdef PORTF
00325 case AVRPORTF:
00326 outb(PORTF, (uint8_t)value);
00327 break;
00328 #endif
00329 #ifdef PORTG
00330 case AVRPORTG:
00331 outb(PORTG, (uint8_t)value);
00332 break;
00333 #endif
00334 #ifdef PORTH
00335 case AVRPORTH:
00336 outb(PORTH, (uint8_t)value);
00337 break;
00338 #endif
00339 #ifdef PORTI
00340 case AVRPORTI:
00341 outb(PORTI, (uint8_t)value);
00342 break;
00343 #endif
00344 #ifdef PORTJ
00345 case AVRPORTJ:
00346 outb(PORTJ, (uint8_t)value);
00347 break;
00348 #endif
00349 #ifdef PORTK
00350 case AVRPORTK:
00351 outb(PORTK, (uint8_t)value);
00352 break;
00353 #endif
00354 #ifdef PORTL
00355 case AVRPORTL:
00356 outb(PORTL, (uint8_t)value);
00357 break;
00358 #endif
00359 }
00360 }
00361
00362 void GpioPortSetLow(int bank, unsigned int mask)
00363 {
00364 GpioPortSet(bank, GpioPortGet(bank) & ~mask);
00365 }
00366
00367 void GpioPortSetHigh(int bank, unsigned int mask)
00368 {
00369 GpioPortSet(bank, GpioPortGet(bank) | mask);
00370 }
00371
00372 uint32_t GpioPinConfigGet(int bank, int bit)
00373 {
00374 uint32_t rc = 0;
00375
00376 switch(bank) {
00377 #ifdef DDRA
00378 case AVRPORTA:
00379 if (inb(DDRA) & _BV(bit)) {
00380 rc |= GPIO_CFG_OUTPUT;
00381 }
00382 else if (inb(PORTA) & _BV(bit)) {
00383 rc |= GPIO_CFG_PULLUP;
00384 }
00385 break;
00386 #endif
00387 #ifdef DDRB
00388 case AVRPORTB:
00389 if (inb(DDRB) & _BV(bit)) {
00390 rc |= GPIO_CFG_OUTPUT;
00391 }
00392 else if (inb(PORTB) & _BV(bit)) {
00393 rc |= GPIO_CFG_PULLUP;
00394 }
00395 break;
00396 #endif
00397 #ifdef DDRC
00398 case AVRPORTC:
00399 if (inb(DDRC) & _BV(bit)) {
00400 rc |= GPIO_CFG_OUTPUT;
00401 }
00402 else if (inb(PORTC) & _BV(bit)) {
00403 rc |= GPIO_CFG_PULLUP;
00404 }
00405 break;
00406 #endif
00407 #ifdef DDRD
00408 case AVRPORTD:
00409 if (inb(DDRD) & _BV(bit)) {
00410 rc |= GPIO_CFG_OUTPUT;
00411 }
00412 else if (inb(PORTD) & _BV(bit)) {
00413 rc |= GPIO_CFG_PULLUP;
00414 }
00415 break;
00416 #endif
00417 #ifdef DDRE
00418 case AVRPORTE:
00419 if (inb(DDRE) & _BV(bit)) {
00420 rc |= GPIO_CFG_OUTPUT;
00421 }
00422 else if (inb(PORTE) & _BV(bit)) {
00423 rc |= GPIO_CFG_PULLUP;
00424 }
00425 break;
00426 #endif
00427 #ifdef DDRF
00428 case AVRPORTF:
00429 if (inb(DDRF) & _BV(bit)) {
00430 rc |= GPIO_CFG_OUTPUT;
00431 }
00432 else if (inb(PORTF) & _BV(bit)) {
00433 rc |= GPIO_CFG_PULLUP;
00434 }
00435 break;
00436 #endif
00437 #ifdef DDRG
00438 case AVRPORTG:
00439 if (inb(DDRG) & _BV(bit)) {
00440 rc |= GPIO_CFG_OUTPUT;
00441 }
00442 else if (inb(PORTG) & _BV(bit)) {
00443 rc |= GPIO_CFG_PULLUP;
00444 }
00445 break;
00446 #endif
00447 #ifdef DDRH
00448 case AVRPORTH:
00449 if (inb(DDRH) & _BV(bit)) {
00450 rc |= GPIO_CFG_OUTPUT;
00451 }
00452 else if (inb(PORTH) & _BV(bit)) {
00453 rc |= GPIO_CFG_PULLUP;
00454 }
00455 break;
00456 #endif
00457 #ifdef DDRI
00458 case AVRPORTI:
00459 if (inb(DDRI) & _BV(bit)) {
00460 rc |= GPIO_CFG_OUTPUT;
00461 }
00462 else if (inb(PORTI) & _BV(bit)) {
00463 rc |= GPIO_CFG_PULLUP;
00464 }
00465 break;
00466 #endif
00467 #ifdef DDRJ
00468 case AVRPORTJ:
00469 if (inb(DDRJ) & _BV(bit)) {
00470 rc |= GPIO_CFG_OUTPUT;
00471 }
00472 else if (inb(PORTJ) & _BV(bit)) {
00473 rc |= GPIO_CFG_PULLUP;
00474 }
00475 break;
00476 #endif
00477 #ifdef DDRK
00478 case AVRPORTK:
00479 if (inb(DDRK) & _BV(bit)) {
00480 rc |= GPIO_CFG_OUTPUT;
00481 }
00482 else if (inb(PORTK) & _BV(bit)) {
00483 rc |= GPIO_CFG_PULLUP;
00484 }
00485 break;
00486 #endif
00487 #ifdef DDRL
00488 case AVRPORTL:
00489 if (inb(DDRL) & _BV(bit)) {
00490 rc |= GPIO_CFG_OUTPUT;
00491 }
00492 else if (inb(PORTL) & _BV(bit)) {
00493 rc |= GPIO_CFG_PULLUP;
00494 }
00495 break;
00496 #endif
00497 }
00498 return rc;
00499 }
00500
00501 int GpioPortConfigSet(int bank, unsigned int mask, uint32_t flags)
00502 {
00503 switch(bank) {
00504 #ifdef DDRA
00505 case AVRPORTA:
00506 if (flags & GPIO_CFG_PULLUP) {
00507 outb(PORTA, inb(PORTA) | mask);
00508 }
00509 else {
00510 outb(PORTA, inb(PORTA) & ~mask);
00511 }
00512 if (flags & GPIO_CFG_OUTPUT) {
00513 outb(DDRA, inb(DDRA) | mask);
00514 }
00515 else {
00516 outb(DDRA, inb(DDRA) & ~mask);
00517 }
00518 break;
00519 #endif
00520 #ifdef DDRB
00521 case AVRPORTB:
00522 if (flags & GPIO_CFG_PULLUP) {
00523 outb(PORTB, inb(PORTB) | mask);
00524 }
00525 else {
00526 outb(PORTB, inb(PORTB) & ~mask);
00527 }
00528 if (flags & GPIO_CFG_OUTPUT) {
00529 outb(DDRB, inb(DDRB) | mask);
00530 }
00531 else {
00532 outb(DDRB, inb(DDRB) & ~mask);
00533 }
00534 break;
00535 #endif
00536 #ifdef DDRC
00537 case AVRPORTC:
00538 if (flags & GPIO_CFG_PULLUP) {
00539 outb(PORTC, inb(PORTC) | mask);
00540 }
00541 else {
00542 outb(PORTC, inb(PORTC) & ~mask);
00543 }
00544 if (flags & GPIO_CFG_OUTPUT) {
00545 outb(DDRC, inb(DDRC) | mask);
00546 }
00547 else {
00548 outb(DDRC, inb(DDRC) & ~mask);
00549 }
00550 break;
00551 #endif
00552 #ifdef DDRD
00553 case AVRPORTD:
00554 if (flags & GPIO_CFG_PULLUP) {
00555 outb(PORTD, inb(PORTD) | mask);
00556 }
00557 else {
00558 outb(PORTD, inb(PORTD) & ~mask);
00559 }
00560 if (flags & GPIO_CFG_OUTPUT) {
00561 outb(DDRD, inb(DDRD) | mask);
00562 }
00563 else {
00564 outb(DDRD, inb(DDRD) & ~mask);
00565 }
00566 break;
00567 #endif
00568 #ifdef DDRE
00569 case AVRPORTE:
00570 if (flags & GPIO_CFG_PULLUP) {
00571 outb(PORTE, inb(PORTE) | mask);
00572 }
00573 else {
00574 outb(PORTE, inb(PORTE) & ~mask);
00575 }
00576 if (flags & GPIO_CFG_OUTPUT) {
00577 outb(DDRE, inb(DDRE) | mask);
00578 }
00579 else {
00580 outb(DDRE, inb(DDRE) & ~mask);
00581 }
00582 break;
00583 #endif
00584 #ifdef DDRF
00585 case AVRPORTF:
00586 if (flags & GPIO_CFG_PULLUP) {
00587 outb(PORTF, inb(PORTF) | mask);
00588 }
00589 else {
00590 outb(PORTF, inb(PORTF) & ~mask);
00591 }
00592 if (flags & GPIO_CFG_OUTPUT) {
00593 outb(DDRF, inb(DDRF) | mask);
00594 }
00595 else {
00596 outb(DDRF, inb(DDRF) & ~mask);
00597 }
00598 break;
00599 #endif
00600 #ifdef DDRG
00601 case AVRPORTG:
00602 if (flags & GPIO_CFG_PULLUP) {
00603 outb(PORTG, inb(PORTG) | mask);
00604 }
00605 else {
00606 outb(PORTG, inb(PORTG) & ~mask);
00607 }
00608 if (flags & GPIO_CFG_OUTPUT) {
00609 outb(DDRG, inb(DDRG) | mask);
00610 }
00611 else {
00612 outb(DDRG, inb(DDRG) & ~mask);
00613 }
00614 break;
00615 #endif
00616 #ifdef DDRH
00617 case AVRPORTH:
00618 if (flags & GPIO_CFG_PULLUP) {
00619 outb(PORTH, inb(PORTH) | mask);
00620 }
00621 else {
00622 outb(PORTH, inb(PORTH) & ~mask);
00623 }
00624 if (flags & GPIO_CFG_OUTPUT) {
00625 outb(DDRH, inb(DDRH) | mask);
00626 }
00627 else {
00628 outb(DDRH, inb(DDRH) & ~mask);
00629 }
00630 break;
00631 #endif
00632 #ifdef DDRI
00633 case AVRPORTI:
00634 if (flags & GPIO_CFG_PULLUP) {
00635 outb(PORTI, inb(PORTI) | mask);
00636 }
00637 else {
00638 outb(PORTI, inb(PORTI) & ~mask);
00639 }
00640 if (flags & GPIO_CFG_OUTPUT) {
00641 outb(DDRI, inb(DDRI) | mask);
00642 }
00643 else {
00644 outb(DDRI, inb(DDRI) & ~mask);
00645 }
00646 break;
00647 #endif
00648 #ifdef DDRJ
00649 case AVRPORTJ:
00650 if (flags & GPIO_CFG_PULLUP) {
00651 outb(PORTJ, inb(PORTJ) | mask);
00652 }
00653 else {
00654 outb(PORTJ, inb(PORTJ) & ~mask);
00655 }
00656 if (flags & GPIO_CFG_OUTPUT) {
00657 outb(DDRJ, inb(DDRJ) | mask);
00658 }
00659 else {
00660 outb(DDRJ, inb(DDRJ) & ~mask);
00661 }
00662 break;
00663 #endif
00664 #ifdef DDRK
00665 case AVRPORTK:
00666 if (flags & GPIO_CFG_PULLUP) {
00667 outb(PORTK, inb(PORTK) | mask);
00668 }
00669 else {
00670 outb(PORTK, inb(PORTK) & ~mask);
00671 }
00672 if (flags & GPIO_CFG_OUTPUT) {
00673 outb(DDRK, inb(DDRK) | mask);
00674 }
00675 else {
00676 outb(DDRK, inb(DDRK) & ~mask);
00677 }
00678 break;
00679 #endif
00680 #ifdef DDRL
00681 case AVRPORTL:
00682 if (flags & GPIO_CFG_PULLUP) {
00683 outb(PORTL, inb(PORTL) | mask);
00684 }
00685 else {
00686 outb(PORTL, inb(PORTL) & ~mask);
00687 }
00688 if (flags & GPIO_CFG_OUTPUT) {
00689 outb(DDRL, inb(DDRL) | mask);
00690 }
00691 else {
00692 outb(DDRL, inb(DDRL) & ~mask);
00693 }
00694 break;
00695 #endif
00696 }
00697 return 0;
00698 }
00699
00700 int GpioPinConfigSet(int bank, int bit, uint32_t flags)
00701 {
00702 switch(bank) {
00703 #ifdef DDRA
00704 case AVRPORTA:
00705 if (flags & GPIO_CFG_OUTPUT) {
00706 sbi(DDRA, bit);
00707 }
00708 else {
00709 if (flags & GPIO_CFG_PULLUP) {
00710 sbi(PORTA, bit);
00711 }
00712 else {
00713 cbi(PORTA, bit);
00714 }
00715 cbi(DDRA, bit);
00716 }
00717 break;
00718 #endif
00719 #ifdef DDRB
00720 case AVRPORTB:
00721 if (flags & GPIO_CFG_OUTPUT) {
00722 sbi(DDRB, bit);
00723 }
00724 else {
00725 if (flags & GPIO_CFG_PULLUP) {
00726 sbi(PORTB, bit);
00727 }
00728 else {
00729 cbi(PORTB, bit);
00730 }
00731 cbi(DDRB, bit);
00732 }
00733 break;
00734 #endif
00735 #ifdef DDRC
00736 case AVRPORTC:
00737 if (flags & GPIO_CFG_OUTPUT) {
00738 sbi(DDRC, bit);
00739 }
00740 else {
00741 if (flags & GPIO_CFG_PULLUP) {
00742 sbi(PORTC, bit);
00743 }
00744 else {
00745 cbi(PORTC, bit);
00746 }
00747 cbi(DDRC, bit);
00748 }
00749 break;
00750 #endif
00751 #ifdef DDRD
00752 case AVRPORTD:
00753 if (flags & GPIO_CFG_OUTPUT) {
00754 sbi(DDRD, bit);
00755 }
00756 else {
00757 if (flags & GPIO_CFG_PULLUP) {
00758 sbi(PORTD, bit);
00759 }
00760 else {
00761 cbi(PORTD, bit);
00762 }
00763 cbi(DDRD, bit);
00764 }
00765 break;
00766 #endif
00767 #ifdef DDRE
00768 case AVRPORTE:
00769 if (flags & GPIO_CFG_OUTPUT) {
00770 sbi(DDRE, bit);
00771 }
00772 else {
00773 if (flags & GPIO_CFG_PULLUP) {
00774 sbi(PORTE, bit);
00775 }
00776 else {
00777 cbi(PORTE, bit);
00778 }
00779 cbi(DDRE, bit);
00780 }
00781 break;
00782 #endif
00783 #ifdef DDRF
00784 case AVRPORTF:
00785 if (flags & GPIO_CFG_OUTPUT) {
00786 sbi(DDRF, bit);
00787 }
00788 else {
00789 if (flags & GPIO_CFG_PULLUP) {
00790 sbi(PORTF, bit);
00791 }
00792 else {
00793 cbi(PORTF, bit);
00794 }
00795 cbi(DDRF, bit);
00796 }
00797 break;
00798 #endif
00799 default:
00800
00801 GpioPortConfigSet(bank, _BV(bit), flags);
00802 break;
00803 }
00804
00805
00806 if (GpioPinConfigGet(bank, bit) != flags) {
00807 return -1;
00808 }
00809 return 0;
00810 }
00811
00812 int GpioRegisterIrqHandler(GPIO_SIGNAL * sig, int bit, void (*handler) (void *), void *arg)
00813 {
00814 return -1;
00815 }
00816
00817 int GpioIrqEnable(GPIO_SIGNAL * sig, int bit)
00818 {
00819 return -1;
00820 }
00821
00822 int GpioIrqDisable(GPIO_SIGNAL * sig, int bit)
00823 {
00824 return -1;
00825 }