Leave parallel pins in HiZ until a command is issued.

This commit is contained in:
Jeremy Soller 2020-03-14 20:05:35 -06:00
parent 61c5ab1b3e
commit 8f3588ef6b
No known key found for this signature in database
GPG Key ID: E988B49EE78A7FB1

View File

@ -125,6 +125,12 @@ static struct Gpio GPIOS[24] = {
};
#endif // !defined(FLIP)
enum ParallelState {
PARALLEL_STATE_UNKNOWN,
PARALLEL_STATE_HIZ,
PARALLEL_STATE_HOST,
PARALLEL_STATE_PERIPHERAL,
};
// Parallel struct definition
// See http://efplus.com/techref/io/parallel/1284/eppmode.htm
@ -132,6 +138,7 @@ struct Parallel {
#define PIN(N, P) struct Gpio * N;
PINS
#undef PIN
enum ParallelState state;
};
// Parallel struct instance
@ -139,6 +146,7 @@ static struct Parallel PORT = {
#define PIN(N, P) .N = &GPIOS[P - 1],
PINS
#undef PIN
.state = PARALLEL_STATE_UNKNOWN,
};
// Set port to all high-impedance inputs
@ -206,6 +214,25 @@ void parallel_reset(struct Parallel * port, bool host) {
}
}
void parallel_state(struct Parallel * port, enum ParallelState state) {
if (port->state != state) {
switch (state) {
case PARALLEL_STATE_UNKNOWN:
return;
case PARALLEL_STATE_HIZ:
parallel_hiz(port);
break;
case PARALLEL_STATE_HOST:
parallel_reset(port, true);
break;
case PARALLEL_STATE_PERIPHERAL:
parallel_reset(port, false);
break;
}
port->state = state;
}
}
uint8_t parallel_read_data(struct Parallel * port) {
uint8_t byte = 0;
#define DATA_BIT(B) if (gpio_get(port->d ## B)) byte |= (1 << B);
@ -445,7 +472,7 @@ int parallel_main(void) {
int res = 0;
struct Parallel * port = &PORT;
parallel_reset(port, true);
parallel_state(port, PARALLEL_STATE_HIZ);
static uint8_t data[128];
char command;
@ -500,10 +527,9 @@ int parallel_main(void) {
// Debug console
case 'C':
serial_write(console_msg, sizeof(console_msg));
parallel_state(port, PARALLEL_STATE_PERIPHERAL);
// Reconfigure as a peripheral
parallel_reset(port, false);
serial_write(console_msg, sizeof(console_msg));
for (;;) {
bool read = false;
@ -532,6 +558,8 @@ int parallel_main(void) {
// Read data
case 'R':
parallel_state(port, PARALLEL_STATE_HOST);
// Update parallel address if necessary
if (set_address) {
res = parallel_set_address(port, &address, 1);
@ -551,6 +579,8 @@ int parallel_main(void) {
// Accelerated program function
case 'P':
parallel_state(port, PARALLEL_STATE_HOST);
// Read data from serial
res = serial_read(data, length);
if (res < 0) goto err;
@ -569,6 +599,8 @@ int parallel_main(void) {
// Write data
case 'W':
parallel_state(port, PARALLEL_STATE_HOST);
// Read data from serial
res = serial_read(data, length);
if (res < 0) goto err;
@ -594,7 +626,7 @@ int parallel_main(void) {
}
err:
parallel_hiz(port);
parallel_state(port, PARALLEL_STATE_HIZ);
return res;
}