Add parallel port comms to arduino
This commit is contained in:
95
arduino/kbd/parallel.cc
Normal file
95
arduino/kbd/parallel.cc
Normal file
@@ -0,0 +1,95 @@
|
||||
#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);
|
||||
}
|
Reference in New Issue
Block a user