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 
54 TEMU_IFACE_REFERENCE_TYPE(temu_SpwPort);
55 
56 // Space wire link states.
57 typedef enum {
65 
76  void (*receive)(void *Device, void *Sender, temu_SpwPacket *Pkt);
77 
82  void (*signalLinkStateChange)(void* Device, temu_SpwLinkState LinkState);
83 
89 
93  void (*connect)(void *Device, temu_SpwPortIfaceRef Dest);
94 
98  void (*disconnect)(void *Device);
99 
104  uint64_t (*timeToSendPacketNs)(void* Device, uint64_t PacketLength);
105 };
106 
110 static inline void
111 temu_spwConnect(temu_SpwPortIfaceRef Dev1PortIface,
112  temu_SpwPortIfaceRef Dev2PortIface)
113 {
114  Dev1PortIface.Iface->connect(Dev1PortIface.Obj, Dev2PortIface);
115  Dev2PortIface.Iface->connect(Dev2PortIface.Obj, Dev1PortIface);
116 }
117 
118 
122 static inline void
123 temu_spwDisconnect(temu_SpwPortIfaceRef Dev1PortIface,
124  temu_SpwPortIfaceRef Dev2PortIface)
125 {
126  Dev1PortIface.Iface->disconnect(Dev1PortIface.Obj);
127  Dev2PortIface.Iface->disconnect(Dev2PortIface.Obj);
128 }
129 
133 void temu_spwLsmInit(temu_SpwLinkState *StatePtr);
134 
138 uint8_t temu_spwLsmUpdate(temu_SpwLinkState *StatePtr, uint8_t AS,
139  uint8_t LS, uint8_t LD, uint8_t PortConnect,
140  temu_SpwLinkState otherSideLinkState);
141 
145 const char * temu_spwLinkStateToStr(uint8_t linkState);
146 
147 #define TEMU_SPW_BITS_PER_DATA_CHAR 10
148 #define TEMU_SPW_BITS_PER_CTRL_CHAR 4
149 #define TEMU_SPW_EOP_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
150 #define TEMU_SPW_FCT_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
151 #define TEMU_SPW_EEP_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
152 #define TEMU_SPW_ESC_BITS TEMU_SPW_BITS_PER_CTRL_CHAR
153 
154 static inline uint64_t
155 temu_spwBitsForData(uint64_t Bytes)
156 {
158 }
159 
160 // Standard protocol IDs
161 #define TEMU_SPW_PROT_EXT 0
162 #define TEMU_SPW_PROT_RMAP 1
163 #define TEMU_SPW_PROT_CCSDSPKT 2
164 #define TEMU_SPW_PROT_GOES_R 238
165 #define TEMU_SPW_PROT_STUP 239
166 
167 // Logical addresses
168 #define TEMU_SPW_LOGICAL_ADDRESS_DEFAULT 0xfe
169 
170 typedef struct {
172  uint8_t ProtocolId;
173  uint8_t Instruction;
174  uint8_t Key;
175  uint8_t ReplyAddresses[12];
178  uint16_t TransactionId;
179  uint64_t Address;
180  uint32_t DataLength;
182 
183 typedef struct {
185  uint8_t ProtocolId;
186  uint8_t Instruction;
187  uint8_t Status;
189  uint16_t TransactionId;
190  uint32_t DataLength;
192 
193 typedef struct {
195  uint8_t ProtocolId;
196  uint8_t Instruction;
197  uint8_t Status;
199  uint16_t TransactionId;
201 
202 typedef enum {
207 
208 typedef enum {
213 
214 typedef struct {
217 
218 typedef struct {
221  const uint8_t *Data;
225  uint8_t DataCrc;
227 
228 typedef struct {
231  uint8_t AccessSize;
233  const uint8_t *Data;
235  const uint8_t *Mask;
239  uint8_t DataCrc;
241 
242 typedef struct {
243  const uint8_t *Data;
244  uint32_t Length;
245  uint32_t Crc;
247 
248 typedef struct {
251  const uint8_t *Data;
255  uint8_t DataCrc;
257 
258 typedef struct {
261 
262 typedef struct {
265  const uint8_t *Data;
269  uint8_t DataCrc;
271 
272 typedef enum {
281 
282 typedef struct {
284  uint8_t Value;
285  uint8_t Write : 1;
286  uint8_t Verify : 1;
287  uint8_t Ack : 1;
288  uint8_t Inc : 1;
290 
291 typedef struct {
293  uint32_t TotalSize;
300 
301  // Decoded packet.
303  union {
310  };
312 
313 typedef enum {
318 
324  temu_SpwRmapDecodedPacket *PktDecoded);
329 temu_spwRmapDecodeBuffer(const temu_Buff *PktDataBuffer,
330  temu_SpwRmapDecodedPacket *PktDecoded);
331 
335 uint32_t
337 
341 uint32_t
343  const temu_SpwRmapDecodedPacket *DCmdPkt,
344  uint8_t *Data, uint32_t AllocatedDataSize,
345  uint8_t Status,
346  uint32_t DataLength);
347 
351 uint32_t
353  const temu_SpwRmapDecodedPacket *DCmdPkt,
354  uint8_t *Data, uint32_t AllocatedDataSize,
355  uint8_t Status,
356  uint32_t DataLength);
357 
361 uint32_t
363  const temu_SpwRmapDecodedPacket *DCmdPkt,
364  uint8_t *Data, uint32_t AllocatedDataSize,
365  uint8_t Status);
366 
371 uint8_t
372 temu_spwRmapCRCNextCode(uint8_t InCRC, uint8_t InByte);
373 
377 uint8_t
378 temu_spwRmapCRC(const uint8_t *Data, uint32_t DataSize);
379 
380 #define TEMU_SPW_RMAP_INST_CMD 0x40;
381 #define TEMU_SPW_RMAP_INST_WRITE 0x20;
382 #define TEMU_SPW_RMAP_INST_VERIFY 0x10;
383 #define TEMU_SPW_RMAP_INST_ACK 0x8;
384 #define TEMU_SPW_RMAP_INST_INC 0x4;
385 
386 #ifdef __cplusplus
387 }
388 #endif
389 
390 #endif /* ! TEMU_MIL_STD_1553_H */
temu_SpwRmapRmwCmdPacket RmwCmd
Definition: Spacewire.h:306
temu_SpwPacketType
Definition: Spacewire.h:33
#define TEMU_SPW_BITS_PER_DATA_CHAR
Definition: Spacewire.h:147
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:293
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:253
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:265
#define TEMU_SPW_EOP_BITS
Definition: Spacewire.h:149
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:221
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:239
uint64_t(* timeToSendPacketNs)(void *Device, uint64_t PacketLength)
Definition: Spacewire.h:104
void(* signalLinkStateChange)(void *Device, temu_SpwLinkState LinkState)
Definition: Spacewire.h:82
temu_Buff PktData
Definition: Spacewire.h:42
temu_SpwRmapRawHeader RawHeader
Raw header data access.
Definition: Spacewire.h:299
void(* receive)(void *Device, void *Sender, temu_SpwPacket *Pkt)
Definition: Spacewire.h:76
temu_SpwPacketType MsgType
Definition: Spacewire.h:41
temu_SpwRmapDecodedPacketType DecodedPacketType
Definition: Spacewire.h:302
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:93
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:219
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:308
uint8_t temu_spwRmapCRC(const uint8_t *Data, uint32_t DataSize)
const uint8_t * Mask
Pointer to the first mask char.
Definition: Spacewire.h:235
temu_SpwLinkState(* getOtherSideLinkState)(void *Device)
Definition: Spacewire.h:88
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:225
struct temu_SpwPacket temu_SpwPacket
temu_SpwRmapDecodedReadReply ReadReply
Definition: Spacewire.h:307
void(* disconnect)(void *Device)
Definition: Spacewire.h:98
temu_SpwRmapDecodedWriteReplyHeader Header
Definition: Spacewire.h:259
const uint8_t * Data
Definition: Spacewire.h:243
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:251
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:267
temu_SpwRmapCommandType CmdType
Definition: Spacewire.h:283
temu_SpwRmapPacketType
Definition: Spacewire.h:202
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:237
uint8_t AccessSize
Size of the access.
Definition: Spacewire.h:231
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:269
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:215
temu_SpwRmapDecodedCommandHeader Header
Definition: Spacewire.h:229
temu_SpwRmapDecodingOutcome
Definition: Spacewire.h:313
temu_SpwRmapDecodedReadReplyHeader Header
Definition: Spacewire.h:249
temu_SpwRmapDecodedPacketType
Definition: Spacewire.h:272
temu_SpwRmapDecodedRmwReply RmwReply
Definition: Spacewire.h:309
temu_SpwLinkState
Definition: Spacewire.h:57
temu_SpwRmapReadCmdPacket ReadCmd
Definition: Spacewire.h:304
uint32_t AvailableDataLength
The amount of data available.
Definition: Spacewire.h:223
const uint8_t * Data
Pointer to the first data char.
Definition: Spacewire.h:233
temu_SpwRmapPacketType PacketType
The packet type as identified by bits [7,6] in instruction.
Definition: Spacewire.h:295
temu_SpwRmapDecodedReadReplyHeader Header
Definition: Spacewire.h:263
temu_SpwRmapCommandType
Definition: Spacewire.h:208
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:305
uint8_t DataCrc
Data crc. Valid only if AvailableDataLength &gt; Header.DataLength.
Definition: Spacewire.h:255
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:297