Implement multi-byte read and write

This commit is contained in:
Jeremy Soller
2020-01-02 19:47:22 -07:00
parent 0a07213412
commit bd243a0700

View File

@ -7,6 +7,7 @@
#include <util/delay.h> #include <util/delay.h>
#include <arch/gpio.h> #include <arch/gpio.h>
#include <arch/uart.h>
// Mapping of 24-pin ribbon cable to parallel pins. See schematic // Mapping of 24-pin ribbon cable to parallel pins. See schematic
#define PINS \ #define PINS \
@ -420,58 +421,99 @@ void parallel_spy(void) {
} }
} }
int serial_transaction(uint8_t * data, int length, bool read) {
int i;
for (i = 0; i < length; i++) {
if (read) {
data[i] = (uint8_t)uart_read(uart_stdio);
} else {
uart_write(uart_stdio, (unsigned char)data[i]);
}
}
return i;
}
#define serial_read(D, L) serial_transaction(D, L, true)
#define serial_write(D, L) serial_transaction(D, L, false)
int parallel_main(void) { int parallel_main(void) {
int res = 0; int res = 0;
struct Parallel * port = &PORT; struct Parallel * port = &PORT;
parallel_reset(port); parallel_reset(port);
uint8_t b; static uint8_t data[256];
int c; char command;
int length;
for (;;) { for (;;) {
c = getchar(); // Read command and length
if (c < 0) goto err; res = serial_read(data, 2);
if (res < 0) goto err;
// Command is a character
command = (char)data[0];
// Length is received data + 1
length = (int)data[1] + 1;
// Truncate length to size of data
if (length > sizeof(data)) length = sizeof(data);
switch (c) { switch (command) {
// Echo // Echo
case 'E': case 'E':
// Read data from serial
res = serial_read(data, length);
if (res < 0) goto err;
// Write data to serial
res = serial_write(data, length);
if (res < 0) goto err;
break; break;
// Set address // Set address
case 'A': case 'A':
c = getchar(); // Read data from serial
if (c < 0) goto err; res = serial_read(data, length);
if (res < 0) goto err;
b = (uint8_t)c; // Write address to parallel
res = parallel_set_address(port, &b, 1); res = parallel_set_address(port, data, length);
if (res < 0) goto err; if (res < 0) goto err;
break; break;
// Read data // Read data
case 'R': case 'R':
res = parallel_read(port, &b, 1); // Read data from parallel
res = parallel_read(port, data, length);
if (res < 0) goto err; if (res < 0) goto err;
for (res = 0; res < length; res++) {
data[res] = (uint8_t)res;
}
c = putchar((int)b); // Write data to serial
if (c < 0) goto err; res = serial_write(data, length);
if (res < 0) goto err;
break; break;
// Write data // Write data
case 'W': case 'W':
c = getchar(); // Read data from serial
if (c < 0) goto err; res = serial_read(data, length);
if (res < 0) goto err;
b = (uint8_t)c; // Write data to parallel
res = parallel_write(port, &b, 1); res = parallel_write(port, data, length);
if (res < 0) goto err; if (res < 0) goto err;
break; break;
} }
c = putchar('\r'); // Send ACK
if (c < 0) goto err; data[0] = '\r';
res = serial_write(data, 1);
if (res < 0) goto err;
} }
err: err: