Protocols

From Ninerpedia
Revision as of 21:58, 7 May 2011 by Mizapf (talk | contribs)
Jump to navigation Jump to search

Communication with devices

Here is a commented log when formatting a SSSD floppy disk with the TI disk controller. Actually, this dump was achieved using MESS and putting in some printf lines.


XModem protocol

The XModem protocol transmits data in a sequence of blocks. Each block contains a part of the file to be transmitted.

Block Block Block ... Block

The last block may require padding if the number of remaining bytes does not suffice to fill the block.

Each block contains a sequence number. When a block with the same number as the previous one is received, the receiver ignores the block.

Sender sending Block Block ... Block EOT
Receiver sending NAK ACK ACK ... ACK ACK

The receiver has a timeout of 10 seconds, after which it transmits a NAK. The message sequence starts with the receiver sending the first timeout NAK to the sender, which may be sent immediately. All errors are retried for at most 10 times.

A NAK must be sent by the receiver if the block data are invalid. If the block number is not the expected next one or a repetition of the recent one, the sequence is out of sync, and the receiver shall send a CAN.

Standard XModem

Each block is defined in this way (numbers tell the number of bytes for each field):

1 1 1 128 1
SOH Number /Number Data bytes Checksum

The number is a sequence number which increases by one for each successive block. The first block starts at 1. The /Number field is the one's complement of the Number field and calculates as 255-Number. When the number reaches 256 it is reset to 0.

The checksum field contains the least significant byte of the sum of the data bytes of this block.

XModem-1K

XModem-1K is a variation of XModem with 1K (1024) bytes for each data block.

1 1 1 1024 1
STX Number /Number Data bytes Checksum

The sender may switch between 128-byte and 1024-byte blocks after receiving an ACK from the receiver. The sender should start with 1K blocks and check for the receiver's response, either as NAK or ACK.

XModem/CRC

In this variant, a more powerful checksum algorithm is used, the CRC16 algorithm. In order to negotiate this variant for both sender and receiver, the receiver sends a "C" as the first message instead of the NAK.

Sender sending Block Block ... Block EOT
Receiver sending "C" ACK ACK ... ACK ACK

If the sender does not support XModem/CRC it keeps silent, and the receiver shall retry for some time. After that it sends a NAK to switch back to normal XModem.

The blocks have this layout:

1 1 1 128 2
SOH Number /Number Data bytes CRC16

In general it is reasonable to have the sender start in CRC mode and wait for the receiver's first message.