From 5f90c141cbbfbc0167fc0fd7e4c9cebab76ec2ce Mon Sep 17 00:00:00 2001 From: Rui Azevedo Date: Fri, 20 Oct 2017 10:16:54 +0000 Subject: [PATCH] Virtual pins handlers https://github.com/arduino/ArduinoCore-avr/issues/1 defining alternative pin handling functions and respective triggers installed into pin functions all changes wraped by #defines alternative handlers require compilation with VIRTUAL_PINS defined digital pin functions triggers require both VIRTUAL_PINS and VPINS_TRIGGER defined eventually we can extend pin tables instead of installing the triggers --- cores/arduino/Arduino.h | 12 ++++++++++-- cores/arduino/wiring_digital.c | 36 +++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index 09c144895..5ffec5fc1 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -73,7 +73,7 @@ void yield(void); #define INTERNAL INTERNAL1V1 #define INTERNAL2V56 9 #define INTERNAL2V56_EXTCAP 13 -#else +#else #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) #define INTERNAL1V1 2 #define INTERNAL2V56 3 @@ -171,7 +171,7 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. -// +// // These perform slightly better as macros compared to inline functions // #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) @@ -256,4 +256,12 @@ long map(long, long, long, long, long); #include "pins_arduino.h" +// #define VIRTUAL_PINS +// #define VPINS_TRIGGER +#if defined(VIRTUAL_PINS) +extern void (*virtual_pinMode_handler)(uint8_t pin, uint8_t mode); +extern void (*virtual_digitalWrite_handler)(uint8_t pin, uint8_t val); +extern int (*virtual_digitalRead_handler)(uint8_t pin); +#endif + #endif diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 27a62fc6c..ded5ce609 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -28,6 +28,10 @@ void pinMode(uint8_t pin, uint8_t mode) { + #if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER) + if (pin>=NUM_DIGITAL_PINS) return (*virtual_pinMode_handler)(pin,mode); + #endif + uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *reg, *out; @@ -38,7 +42,7 @@ void pinMode(uint8_t pin, uint8_t mode) reg = portModeRegister(port); out = portOutputRegister(port); - if (mode == INPUT) { + if (mode == INPUT) { uint8_t oldSREG = SREG; cli(); *reg &= ~bit; @@ -85,15 +89,15 @@ static void turnOffPWM(uint8_t timer) #if defined(TCCR1A) && defined(COM1C1) case TIMER1C: cbi(TCCR1A, COM1C1); break; #endif - + #if defined(TCCR2) && defined(COM21) case TIMER2: cbi(TCCR2, COM21); break; #endif - + #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: cbi(TCCR0A, COM0A1); break; #endif - + #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: cbi(TCCR0A, COM0B1); break; #endif @@ -103,7 +107,7 @@ static void turnOffPWM(uint8_t timer) #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: cbi(TCCR2A, COM2B1); break; #endif - + #if defined(TCCR3A) && defined(COM3A1) case TIMER3A: cbi(TCCR3A, COM3A1); break; #endif @@ -116,17 +120,17 @@ static void turnOffPWM(uint8_t timer) #if defined(TCCR4A) && defined(COM4A1) case TIMER4A: cbi(TCCR4A, COM4A1); break; - #endif + #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: cbi(TCCR4A, COM4B1); break; #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: cbi(TCCR4A, COM4C1); break; - #endif + #endif #if defined(TCCR4C) && defined(COM4D1) case TIMER4D: cbi(TCCR4C, COM4D1); break; - #endif - + #endif + #if defined(TCCR5A) case TIMER5A: cbi(TCCR5A, COM5A1); break; case TIMER5B: cbi(TCCR5A, COM5B1); break; @@ -137,6 +141,9 @@ static void turnOffPWM(uint8_t timer) void digitalWrite(uint8_t pin, uint8_t val) { + #if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER) + if (pin>=NUM_DIGITAL_PINS) return (*virtual_digitalWrite_handler)(pin,val); + #endif uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); @@ -164,6 +171,9 @@ void digitalWrite(uint8_t pin, uint8_t val) int digitalRead(uint8_t pin) { + #if defined(VIRTUAL_PINS) && defined(VPINS_TRIGGER) + if (pin>=NUM_DIGITAL_PINS) return (*virtual_digitalRead_handler)(pin); + #endif uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); @@ -177,3 +187,11 @@ int digitalRead(uint8_t pin) if (*portInputRegister(port) & bit) return HIGH; return LOW; } + + #if defined(VIRTUAL_PINS) + void virtual_defaultHandler(uint8_t pin, uint8_t val) {} + int virtual_defaultRead_handler(uint8_t pin) {return LOW;} + void (*virtual_pinMode_handler)(uint8_t pin, uint8_t mode)=virtual_defaultHandler; + void (*virtual_digitalWrite_handler)(uint8_t pin, uint8_t val)=virtual_defaultHandler; + int (*virtual_digitalRead_handler)(uint8_t pin)=virtual_defaultRead_handler; + #endif