Files
5150/arduino/kbd/parallel.cc

96 lines
2.1 KiB
C++

#include "parallel.h"
#include <stdint.h>
#include "Arduino.h"
namespace {
constexpr int kParallelDataPins[] = {
D9, D8, D7, D6, D5, D4, D3, D2,
};
constexpr int kParallelBusyPin = D14;
constexpr int kParallelAckPin = D15;
constexpr int kParallelPaperoutPin = D12;
constexpr int kParallelSelectPin = D11;
constexpr int kParallelNibblePins[] = {
kParallelSelectPin,
kParallelPaperoutPin,
kParallelAckPin,
kParallelBusyPin,
};
constexpr bool kParallelNibbleInverted[] = {
false,
false,
false,
true,
};
constexpr int kParallelStrobePin = D10;
volatile bool strobe_pending = false;
volatile uint8_t strobe_byte = 0;
void strobeIsr() {
strobe_pending = true;
strobe_byte = readParallel();
}
} // namespace
uint8_t readParallel() {
uint8_t out = 0;
for (int i = 0; i < 8; i++) {
if (digitalReadFast(digitalPinToPinName(kParallelDataPins[i])) ==
HIGH) {
out |= (1 << i);
}
}
if (digitalReadFast(digitalPinToPinName(kParallelStrobePin)) == HIGH) {
out |= (1 << 8);
}
return out;
}
#define BIT(x, n) ((x & (1 << n)) ? HIGH : LOW)
void writeParallel(uint8_t nibble) {
for (int i = 0; i < 4; i++) {
int lvl = BIT(nibble, i);
if (kParallelNibbleInverted[i]) {
lvl = lvl == HIGH ? LOW : HIGH;
}
digitalWriteFast(digitalPinToPinName(kParallelNibblePins[i]), lvl);
}
}
bool strobeOccurred(uint8_t &byte) {
bool pending;
{
noInterrupts();
pending = strobe_pending;
byte = strobe_byte;
strobe_pending = false;
interrupts();
}
return pending;
}
void setupParallel() {
for (int i = 0; i < sizeof(kParallelDataPins) / sizeof(int); i++) {
pinMode(kParallelDataPins[i], INPUT);
}
for (int i = 0; i < sizeof(kParallelNibblePins) / sizeof(int); i++) {
pinMode(kParallelNibblePins[i], OUTPUT);
digitalWrite(kParallelNibblePins[i], HIGH);
}
pinMode(kParallelStrobePin, INPUT);
attachInterrupt(digitalPinToInterrupt(kParallelStrobePin), strobeIsr,
FALLING);
}