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