TEMU  2
The Terma Emulator
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
Spacewire.h
Go to the documentation of this file.
1 //===------------------------------------------------------------*- C++ -*-===////
2 // T-EMU: The Terma Emulator
3 // (c) Terma 2016
4 // Authors: Alberto Ferrazzi <albf (at) terma.com>
5 // Mattias Holm <maho (at) terma.com>
6 //
7 //===----------------------------------------------------------------------===//
8 
17 #ifndef TEMU_SPACEWIRE_H
18 #define TEMU_SPACEWIRE_H
19 
20 
21 #include "temu-c/Support/Objsys.h"
22 #include "temu-c/Support/Buffer.h"
23 
24 #include <assert.h>
25 #include <stdbool.h>
26 #include <stdint.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 
33 typedef enum {
34  teSMT_Data = 1, // Normal data packet
35  teSMT_Err = 2, // EEP packet marker
36  teSMT_Time = 3, // Time code
38 
39 
40 typedef struct temu_SpwPacket {
43 
44  // Store Rmap crc fast value.
45  // Bit 1 signal an RMAP crc error in header.
46  // Bit 2 signal an RMAP crc error in data.
47  uint8_t Flags;
49 
50 #define TEMU_SPW_FLAG_RMAP_HCRC_ERROR 0x01
51 #define TEMU_SPW_FLAG_RMAP_DCRC_ERROR 0x02
52 
53 #define TEMU_SPW_PORT_IFACE_TYPE "SpwPortIface"
54 
56 TEMU_IFACE_REFERENCE_TYPE(temu_SpwPort);
57 
58 // Space wire link states.
59 typedef enum {
67 
78  void (*receive)(void *Device, void *Sender, temu_SpwPacket *Pkt);
79 
84  void (*signalLinkStateChange)(void* Device, temu_SpwLinkState LinkState);
85 
91 
95  void (*connect)(void *Device, temu_SpwPortIfaceRef Dest);
96 
100  void (*disconnect)(void *Device);
101 
106  uint64_t (*timeToSendPacketNs)(void* Device, uint64_t PacketLength);
107 };
108 
112 static inline void
113 temu_spwConnect(temu_SpwPortIfaceRef Dev1PortIface,
114  temu_SpwPortIfaceRef Dev2PortIface)
115 {
116  Dev1PortIface.Iface->connect(Dev1PortIface.Obj, Dev2PortIface);
117  Dev2PortIface.Iface->connect(Dev2PortIface.Obj, Dev1PortIface);
118 }
119 
120 
124 static inline void
125 temu_spwDisconnect(temu_SpwPortIfaceRef Dev1PortIface,
126  temu_SpwPortIfaceRef Dev2PortIface)
127 {
128  Dev1PortIface.Iface->disconnect(Dev1PortIface.Obj);
129  Dev2PortIface.Iface->disconnect(Dev2PortIface.Obj);
130 }
131 
135 void temu_spwLsmInit(temu_SpwLinkState *StatePtr);
136 
140 uint8_t temu_spwLsmUpdate(temu_SpwLinkState *StatePtr, uint8_t AS,
141  uint8_t LS, uint8_t LD, uint8_t PortConnect,
142  temu_SpwLinkState otherSideLinkState);
143 
147 const char * temu_spwLinkStateToStr(uint8_t linkState);
148 
149 #define TEMU_SPW_BITS_PER_DATA_CHAR 10
150 #define TEMU_SPW_BITS_PER_CTRL_CHAR 4
151 #define TEMU_SPW_EOP_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
152 #define TEMU_SPW_FCT_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
153 #define TEMU_SPW_EEP_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
154 #define TEMU_SPW_ESC_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
155 
156 static inline uint64_t
157 temu_spwBitsForData(uint64_t Bytes)
158 {
160 }
161 
162 // Standard protocol IDs
163 #define TEMU_SPW_PROT_EXT 0
164 #define TEMU_SPW_PROT_RMAP 1
165 #define TEMU_SPW_PROT_CCSDSPKT 2
166 #define TEMU_SPW_PROT_GOES_R 238
167 #define TEMU_SPW_PROT_STUP 239
168 
169 // Logical addresses
170 #define TEMU_SPW_LOGICAL_ADDRESS_DEFAULT 0xfe
171 
172 typedef struct {
174  uint8_t ProtocolId;
175  uint8_t Instruction;
176  uint8_t Key;
177  uint8_t ReplyAddresses[12];
180  uint16_t TransactionId;
181  uint64_t Address;
182  uint32_t DataLength;
184 
185 typedef struct {
187  uint8_t ProtocolId;
188  uint8_t Instruction;
189  uint8_t Status;
191  uint16_t TransactionId;
192  uint32_t DataLength;
194 
195 typedef struct {
197  uint8_t ProtocolId;
198  uint8_t Instruction;
199  uint8_t Status;
201  uint16_t TransactionId;
203 
204 typedef enum {
209 
210 typedef enum {
215 
216 typedef struct {
219 
220 typedef struct {
223  const uint8_t *Data;
227  uint8_t DataCrc;
229 
230 typedef struct {
233  uint8_t AccessSize;
235  const uint8_t *Data;
237  const uint8_t *Mask;
241  uint8_t DataCrc;
243 
244 typedef struct {
245  const uint8_t *Data;
246  uint32_t Length;
247  uint32_t Crc;
249 
250 typedef struct {
253  const uint8_t *Data;
257  uint8_t DataCrc;
259 
260 typedef struct {
263 
264 typedef struct {
267  const uint8_t *Data;
271  uint8_t DataCrc;
273 
274 typedef enum {
283 
284 typedef struct {
286  uint8_t Value;
287  uint8_t Write : 1;
288  uint8_t Verify : 1;
289  uint8_t Ack : 1;
290  uint8_t Inc : 1;
292 
293 typedef struct {
295  uint32_t TotalSize;
302 
303  // Decoded packet.
305  union {
312  };
314 
315 typedef enum {
320 
326  temu_SpwRmapDecodedPacket *PktDecoded);
331 temu_spwRmapDecodeBuffer(const temu_Buff *PktDataBuffer,
332  temu_SpwRmapDecodedPacket *PktDecoded);
333 
337 uint32_t
339 
343 uint32_t
345  const temu_SpwRmapDecodedPacket *DCmdPkt,
346  uint8_t *Data, uint32_t AllocatedDataSize,
347  uint8_t Status,
348  uint32_t DataLength);
349 
353 uint32_t
355  const temu_SpwRmapDecodedPacket *DCmdPkt,
356  uint8_t *Data, uint32_t AllocatedDataSize,
357  uint8_t Status,
358  uint32_t DataLength);
359 
363 uint32_t
365  const temu_SpwRmapDecodedPacket *DCmdPkt,
366  uint8_t *Data, uint32_t AllocatedDataSize,
367  uint8_t Status);
368 
373 uint8_t
374 temu_spwRmapCRCNextCode(uint8_t InCRC, uint8_t InByte);
375 
379 uint8_t
380 temu_spwRmapCRC(const uint8_t *Data, uint32_t DataSize);
381 
382 #define TEMU_SPW_RMAP_INST_CMD 0x40;
383 #define TEMU_SPW_RMAP_INST_WRITE 0x20;
384 #define TEMU_SPW_RMAP_INST_VERIFY 0x10;
385 #define TEMU_SPW_RMAP_INST_ACK 0x8;
386 #define TEMU_SPW_RMAP_INST_INC 0x4;
387 
388 #ifdef __cplusplus
389 }
390 #endif
391 
392 #endif /* ! TEMU_MIL_STD_1553_H */
temu_SpwRmapRmwCmdPacket RmwCmd
Definition: Spacewire.h:308
temu_SpwPacketType
Definition: Spacewire.h:33
#define TEMU_SPW_BITS_PER_DATA_CHAR
Definition: Spacewire.h:149
uint32_t temu_spwRmapEncodeRmwHeaderForPacket(const temu_SpwRmapDecodedPacket *DCmdPkt, uint8_t *Data, uint32_t AllocatedDataSize, uint8_t Status, uint32_t DataLength)
uint32_t TotalSize
Total size of the packet received.
Definition: Spacewire.h:295
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:255
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:267
#define TEMU_SPW_EOP_BITS
Definition: Spacewire.h:151
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:223
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:241
uint64_t(* timeToSendPacketNs)(void *Device, uint64_t PacketLength)
Definition: Spacewire.h:106
void(* signalLinkStateChange)(void *Device, temu_SpwLinkState LinkState)
Definition: Spacewire.h:84
temu_Buff PktData
Definition: Spacewire.h:42
temu_SpwRmapRawHeader RawHeader
Raw header data access.
Definition: Spacewire.h:301
void(* receive)(void *Device, void *Sender, temu_SpwPacket *Pkt)
Definition: Spacewire.h:78
temu_SpwPacketType MsgType
Definition: Spacewire.h:41
temu_SpwRmapDecodedPacketType DecodedPacketType
Definition: Spacewire.h:304
uint8_t temu_spwRmapCRCNextCode(uint8_t InCRC, uint8_t InByte)
void temu_spwLsmInit(temu_SpwLinkState *StatePtr)
void(* connect)(void *Device, temu_SpwPortIfaceRef Dest)
Definition: Spacewire.h:95
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:221
uint32_t temu_spwRmapEncodeReadReplyHeaderForPacket(const temu_SpwRmapDecodedPacket *DCmdPkt, uint8_t *Data, uint32_t AllocatedDataSize, uint8_t Status, uint32_t DataLength)
temu_SpwRmapDecodedWriteReply WriteReply
Definition: Spacewire.h:310
uint8_t temu_spwRmapCRC(const uint8_t *Data, uint32_t DataSize)
const uint8_t * Mask
Pointer to the first mask char.
Definition: Spacewire.h:237
temu_SpwLinkState(* getOtherSideLinkState)(void *Device)
Definition: Spacewire.h:90
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:227
struct temu_SpwPacket temu_SpwPacket
temu_SpwRmapDecodedReadReply ReadReply
Definition: Spacewire.h:309
void(* disconnect)(void *Device)
Definition: Spacewire.h:100
temu_SpwRmapDecodedWriteReplyHeader Header
Definition: Spacewire.h:261
const uint8_t * Data
Definition: Spacewire.h:245
uint32_t temu_spwRmapHeaderReplySize(const temu_SpwRmapDecodedPacket *DCmdPkt)
#define TEMU_IFACE_REFERENCE_TYPE(N)
Definition: Objsys.h:129
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:253
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:269
temu_SpwRmapCommandType CmdType
Definition: Spacewire.h:285
temu_SpwRmapPacketType
Definition: Spacewire.h:204
temu_SpwRmapDecodingOutcome temu_spwRmapDecodeBuffer(const temu_Buff *PktDataBuffer, temu_SpwRmapDecodedPacket *PktDecoded)
temu_SpwRmapDecodingOutcome temu_spwRmapDecodePacket(const temu_SpwPacket *Pkt, temu_SpwRmapDecodedPacket *PktDecoded)
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:239
uint8_t AccessSize
Size of the access.
Definition: Spacewire.h:233
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:271
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:217
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:231
temu_SpwRmapDecodingOutcome
Definition: Spacewire.h:315
temu_SpwRmapDecodedReadReplyHeader Header
Definition: Spacewire.h:251
temu_SpwRmapDecodedPacketType
Definition: Spacewire.h:274
temu_SpwRmapDecodedRmwReply RmwReply
Definition: Spacewire.h:311
temu_SpwLinkState
Definition: Spacewire.h:59
temu_SpwRmapReadCmdPacket ReadCmd
Definition: Spacewire.h:306
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:225
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:235
temu_SpwRmapPacketType PacketType
The packet type as identified by bits [7,6] in instruction.
Definition: Spacewire.h:297
temu_SpwRmapDecodedReadReplyHeader Header
Definition: Spacewire.h:265
temu_SpwRmapCommandType
Definition: Spacewire.h:210
uint8_t temu_spwLsmUpdate(temu_SpwLinkState *StatePtr, uint8_t AS, uint8_t LS, uint8_t LD, uint8_t PortConnect, temu_SpwLinkState otherSideLinkState)
temu_SpwRmapWriteCmdPacket WriteCmd
Definition: Spacewire.h:307
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:257
const char * temu_spwLinkStateToStr(uint8_t linkState)
uint8_t Flags
Definition: Spacewire.h:47
uint32_t temu_spwRmapEncodeWriteReplyHeaderForPacket(const temu_SpwRmapDecodedPacket *DCmdPkt, uint8_t *Data, uint32_t AllocatedDataSize, uint8_t Status)
temu_SpwRmapDecodedCmdField CmdField
The command field, bits [5,4,3,2] in instruction.
Definition: Spacewire.h:299