Browse Source

update for atmega32a

Jack Humbert 7 years ago
parent
commit
7289b847db
2 changed files with 13 additions and 12 deletions
  1. 2 3
      quantum/config_common.h
  2. 11 9
      quantum/quantum.h

+ 2 - 3
quantum/config_common.h

@@ -46,15 +46,14 @@
         #define PIND_ADDRESS 0x9
         #define PINE_ADDRESS 0xC
         #define PINF_ADDRESS 0xF
-    #elif defined(__AVR_ATmega32a__)
+    #elif defined(__AVR_ATmega32A__)
         #define ADDRESS_BASE 0x10
         #define PIND_ADDRESS 0x0
         #define PINC_ADDRESS 0x3
         #define PINB_ADDRESS 0x6
         #define PINA_ADDRESS 0x9
     #else
-        #define pin_t uint16_t
-        #define ADDRESS_BASE 0x0
+        #error "Pins are not defined"
     #endif
 
     /* I/O pins */

+ 11 - 9
quantum/quantum.h

@@ -138,26 +138,28 @@ extern uint32_t default_layer_state;
 
 //Function substitutions to ease GPIO manipulation
 #ifdef __AVR__
+    #define PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset)
+
     #define pin_t uint8_t
-    #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF)
+    #define setPinInput(pin) PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF)
     #define setPinInputHigh(pin) ({\
-            _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\
-            _SFR_IO8((pin >> 4) + 2) |=   _BV(pin & 0xF);\
+            PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF);\
+            PIN_ADDRESS(pin, 2) |=   _BV(pin & 0xF);\
             })
     #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low")
-    #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF)
+    #define setPinOutput(pin) PIN_ADDRESS(pin, 1) |= _BV(pin & 0xF)
 
-    #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF)
-    #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF)
+    #define writePinHigh(pin) PIN_ADDRESS(pin, 2) |=  _BV(pin & 0xF)
+    #define writePinLow(pin) PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF)
     static inline void writePin(pin_t pin, uint8_t level){
         if (level){
-            _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF);
+            PIN_ADDRESS(pin, 2) |=  _BV(pin & 0xF);
         } else {
-            _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF);
+            PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF);
         }
     }
 
-    #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF))
+    #define readPin(pin) (PIN_ADDRESS(pin, 0) & _BV(pin & 0xF))
 #elif defined(PROTOCOL_CHIBIOS)
     #define pin_t ioline_t
     #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT)