// Copyright 2011 Olivier Gillet.
//
// Author: Olivier Gillet (ol.gillet@gmail.com)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// -----------------------------------------------------------------------------
//
// Templates for using a range of bits from a port for parallel IO.
#ifndef AVRLIBX_IO_PARALLEL_H_
#define AVRLIBX_IO_PARALLEL_H_
#include
#include "avrlibx/io/gpio.h"
namespace avrlibx {
template
struct ParallelPort {
enum Masks {
mask = ((1L << (last - first + 1)) - 1) << first,
shift = first
};
static inline void set_direction(PortDirection direction) {
if (direction == INPUT) {
Port::dir_clr(mask);
} else {
Port::dir_set(mask);
}
}
static inline void set_mode(PortMode mode) {
PORTCFG.MPCMASK = mask;
Gpio::set_mode(mode);
}
static inline void High() {
Port::out_set(mask);
}
static inline void Low() {
Port::out_clr(mask);
}
static inline void Toggle() {
Port::out_tgl(mask);
}
static inline void set_value(uint8_t value) {
uint8_t preserve = Port::out() & ~mask;
Port::out(preserve | (value << shift));
}
static inline uint8_t value() {
return (Port::in() & mask) >> shift;
}
static inline void Write(uint8_t value) { set_value(value); }
static inline uint8_t Read() { return value(); }
};
} // namespace avrlibx
#endif // AVRLIBX_IO_PARALLEL_H_