[PATCH 0/4] dev/io: Add packet processor
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Jan 15 09:45:58 UTC 2024
The I/O packet processor provides a simple mechanism to exchange
reliable and in-order data through transmitting and receiving one
character at a time.
The I/O packet processor does not buffer data. The processor uses a
stop-and-wait automatic repeat request method. There is at most one packet
in transmission. The data transfer is done using a single character input
and output method. The protocol uses 12-bit sequence numbers, so a host
could use a sliding window method to increase throughput. All integers and
data are base64url encoded. A 24-bit CRC is used to ensure the data
integrity. The '{' character starts a packet. The '}' character terminates
a packet. The '#' character prefixes a 24-bit CRC value. The ':' character
separates fields. The '+' character prefixes data fields. The following
packets are defined:
* hello: {<12-bit seq><12-bit ack>:H#<24-bit CRC>}
* acknowledge: {<12-bit seq><12-bit ack>:A#<24-bit CRC>}
* reject: {<12-bit seq><12-bit ack>
:R:<12-bit seq of rejected packet>#<24-bit CRC>}
* jump: {<12-bit seq><12-bit ack>:J:<64-bit address>#<24-bit CRC>}
* load: {<12-bit seq><12-bit ack>:L:<64-bit load address>
<64-bit load size in bytes>#<24-bit CRC>+<data to load>#<24-bit CRC>}
* signal: {<12-bit seq><12-bit ack>:S:<64-bit signal number>:
<64-bit signal value>#<24-bit CRC>}
* channel: {<12-bit seq><12-bit ack>:C:<64-bit channel number>
<64-bit data size in bytes>#<24-bit CRC>+<channel data>#<24-bit CRC>}
The intended use case are boot loaders and test runners. For example, test
runners may interface with an external test server performing equipment
handling on request using the I/O packet processor.
Use _IO_Packet_initialize() to initialize the I/O packet processor. Use
_IO_Packet_process() to drive the packet processing. You can enqueue
packets for transmission with _IO_Packet_enqueue(). You can reliably send
signals with _IO_Packet_send(). You can reliably transmit and receive
channel data with _IO_Packet_channel_push() and
_IO_Packet_channel_exchange().
A simple boot loader could be implemented like this:
#include <bsp.h>
#include <rtems/bspIo.h>
#include <rtems/counter.h>
#include <rtems/dev/io.h>
static void output_char( IO_Packet_control *self, uint8_t ch )
{
(void) self;
rtems_putc( ch );
}
static IO_Packet_status event_handler(
IO_Packet_control *self,
IO_Packet_event_control *ctrl,
IO_Packet_event evt
)
{
(void) ctrl;
switch ( evt ) {
case IO_PACKET_EVENT_JUMP:
_IO_Packet_send_acknowledge( self );
bsp_restart( _IO_Packet_get_jump_address( self ) );
break;
case IO_PACKET_EVENT_LOAD_END:
_IO_Packet_send_acknowledge( self );
break;
case IO_PACKET_EVENT_OUTPUT_END:
rtems_putc( '\n' );
break;
default:
break;
}
return IO_PACKET_SUCCESSFUL;
}
static uint32_t clock_monotonic( IO_Packet_control *self )
{
(void) self;
return rtems_counter_read();
}
static void Init( rtems_task_argument arg )
{
IO_Packet_control self;
IO_Packet_event_control event;
(void) arg;
_IO_Packet_initialize( &self, 0, NULL, output_char, clock_monotonic );
_IO_Packet_prepend_event_handler( &self, &event, event_handler );
while ( true ) {
_IO_Packet_process( &self, getchark() );
}
}
Matthew Joyce (1):
dev/io: Add base64 decoder
Sebastian Huber (3):
dev/io: Make base64 encoding tables public
dev/io: Add a CRC-24Q implementation
dev/io: Add packet processor
cpukit/dev/iobase64.c | 24 +-
cpukit/dev/iobase64decode.c | 166 +++
cpukit/dev/iocrc24q.c | 148 +++
cpukit/dev/iopacket.c | 837 ++++++++++++++++
cpukit/include/rtems/dev/io.h | 941 ++++++++++++++++++
spec/build/cpukit/librtemscpu.yml | 3 +
.../build/testsuites/unit/unit-no-clock-0.yml | 3 +
testsuites/unit/tc-io-base64-decode.c | 180 ++++
testsuites/unit/tc-io-packet.c | 617 ++++++++++++
9 files changed, 2912 insertions(+), 7 deletions(-)
create mode 100644 cpukit/dev/iobase64decode.c
create mode 100644 cpukit/dev/iocrc24q.c
create mode 100644 cpukit/dev/iopacket.c
create mode 100644 testsuites/unit/tc-io-base64-decode.c
create mode 100644 testsuites/unit/tc-io-packet.c
--
2.35.3
More information about the devel
mailing list