diff --git a/drivers/avr/pio.c b/drivers/avr/pio.c index cde2a3c..d83f71f 100644 --- a/drivers/avr/pio.c +++ b/drivers/avr/pio.c @@ -2,8 +2,122 @@ @author M. P. Hayes, UCECE @date 11 Jan 2006 @brief PIO hardware abstraction for AVR microcontroller. - @note This implementation is empty; inline functions are used - in pio.h instead for performance. + @note Inline functions are used in pio.h instead for performance. */ #include "system.h" #include "pio.h" + +#ifdef __NO_INLINE__ + +/** Configure pio. + @param pio PIO to configure + @param config PIO configuration type + @return non-zero for success. */ +bool pio_config_set (pio_t pio, pio_config_t config) +{ + switch (config) + { + case PIO_OUTPUT_LOW: + PIO_DATA_ (pio) &= ~PIO_BITMASK_ (pio); + PIO_DDR_ (pio) |= PIO_BITMASK_ (pio); + return 1; + + case PIO_OUTPUT_HIGH: + PIO_DATA_ (pio) |= PIO_BITMASK_ (pio); + PIO_DDR_ (pio) |= PIO_BITMASK_ (pio); + return 1; + + case PIO_INPUT: + PIO_DDR_ (pio) &= ~PIO_BITMASK_ (pio); + PIO_DATA_ (pio) &= ~PIO_BITMASK_ (pio); + return 1; + + case PIO_PULLUP: + PIO_DDR_ (pio) &= ~PIO_BITMASK_ (pio); + PIO_DATA_ (pio) |= PIO_BITMASK_ (pio); + return 1; + + default: + return 0; + } +} + + +/** Return pio configuration + @param pio + @return config */ +pio_config_t pio_config_get (pio_t pio) +{ + bool ddr; + bool port; + + ddr = PIO_DDR_ (pio) & PIO_BITMASK_ (pio); + port = PIO_DATA_ (pio) & PIO_BITMASK_ (pio); + + if (ddr) + { + if (port) + return PIO_OUTPUT_HIGH; + else + return PIO_OUTPUT_LOW; + } + + if (port) + return PIO_PULLUP; + + return PIO_INPUT; +} + + + +/** Set pio high. + @param pio */ +void pio_output_high (pio_t pio) +{ + PIO_DATA_ (pio) |= PIO_BITMASK_ (pio); +} + + +/** Set pio low. + @param pio */ +void pio_output_low (pio_t pio) +{ + PIO_DATA_ (pio) &= ~PIO_BITMASK_ (pio); +} + + +/** Toggle pio. + @param pio */ +void pio_output_toggle (pio_t pio) +{ + PIO_DATA_ (pio) ^= PIO_BITMASK_ (pio); +} + + +/** Read input state from pio. + @param pio + @return input state of pio */ +bool pio_input_get (pio_t pio) +{ + return (PIO_PIN_ (pio) & PIO_BITMASK_ (pio)) != 0; +} + + +/** Get output state of pio. + @param pio + @return output state of pio */ +bool pio_output_get (pio_t pio) +{ + return (PIO_DATA_ (pio) & PIO_BITMASK_ (pio)) != 0; +} + + +/** Set pio to desired state. + @param pio + @param state value to write pio */ +void pio_output_set (pio_t pio, bool state) +{ + state ? pio_output_high (pio) : pio_output_low (pio); +} + +#endif diff --git a/drivers/avr/pio.h b/drivers/avr/pio.h index 131713f..45579ab 100644 --- a/drivers/avr/pio.h +++ b/drivers/avr/pio.h @@ -130,6 +130,53 @@ typedef enum pio_config_enum #define PIO_DATA_(pio) (*PIO_PORT_ (pio)) +#ifdef __NO_INLINE__ +/** Configure pio. + @param pio PIO to configure + @param config PIO configuration type + @return non-zero for success. */ +bool pio_config_set (pio_t pio, pio_config_t config); + + +/** Return pio configuration + @param pio + @return config */ +pio_config_t pio_config_get (pio_t pio); + + +/** Set pio high. + @param pio */ +void pio_output_high (pio_t pio); + + +/** Set pio low. + @param pio */ +void pio_output_low (pio_t pio); + + +/** Toggle pio. + @param pio */ +void pio_output_toggle (pio_t pio); + + +/** Read input state from pio. + @param pio + @return input state of pio */ +bool pio_input_get (pio_t pio); + + +/** Get output state of pio. + @param pio + @return output state of pio */ +bool pio_output_get (pio_t pio); + + +/** Set pio to desired state. + @param pio + @param state value to write pio */ +void pio_output_set (pio_t pio, bool state); + +#else /** Configure pio. @param pio PIO to configure @@ -249,5 +296,6 @@ void pio_output_set (pio_t pio, bool state) { state ? pio_output_high (pio) : pio_output_low (pio); } +#endif #endif