1## Introduction
2
3This library extends the common libPhyComv1 providing the low level
4communications mechanism between the devices and the 2G4 phy
5
6Note that this Phy only supports BLE or 2006 802.15.4 DSS like modulations,
7or interferers.
8So it cannot be used for WLAN (or other OFDMA like)
9
10## 2G4 IPC protocol
11
12You can find the sequence diagrams here:
13[2G4 IPC sequence diagrams](2G4_libPhyComv1_protocol.svg)
14
15![2G4 IPC sequence diagrams (for GitHub web rendering)](https://raw.githubusercontent.com/BabbleSim/ext_2G4_libPhyComv1/master/docs/2G4_libPhyComv1_protocol.svg?sanitize=true)
16<!--The ?sanitize=true is an ugly thing for GitHub to enable the svg to be
17rendered into the markdown preview-->
18
19The content of these structures, which are sent between the devices and phy,
20can be found in [bs_pc_2G4_types.h](../src/bs_pc_2G4_types.h)
21
22### v2 API Updates
23
24Note: The old API is still supported, and remains ABI compatible
25The v2 API is a superset of the old API aiming at providing support for
26different protocols, and more features.
27
28If desired, devices which supported the old API can be mapped to the new API
29without loss of functionality (see instructions on each structure in the header
30file). But at this point it is not recommended to do this, as the new API is
31still in alpha state.
32
33#### Txv2:
34A p2G4_txv2_t structure from the device, is followed by a byte array of
35packet_size bytes.
36A p2G4_txv2_t is followed by a p2G4_tx_done_t from the Phy.
37
38#### Rxv2:
39A p2G4_rxv2_t structure from the device is followed by a p2G4_rxv2_addr_t,
40containing p2G4_rxv2_t.n_addr elements.
41
42When p2G4_rxv2_t.resp_type = 0, the Phy responds with a p2G4_rx_done_t,
43and depending on status, a bytearray of p2G4_rx_done_t.packet_size bytes
44with the possibly received packet.
45
46#### RSSI measurements during abort reevaluations
47During an Rx abort reevaluation, the device may now both send back a new abort
48structure (after a RERESP_ABORTREEVAL) or also request an immediate RSSI
49measurement (and follow it with another abort structure)
50
51#### CCA procedure
52To better support systems with CCA, a new API is introduced.
53The device may do a search for compatible modulations and/or an (average) energy
54measurement.
55This is done periodically by looking for a compatible transmitter
56and simultaneously measuring the RRSI level.
57The device may also select to stop the measurement as soon as either the RSSI
58measurement is over a predefined threshold, or, the RSSI measurement is over
59another threshold and a compatible modulation is found in the air.
60
61#### Coded Phy and other multi-modulation and/or multi-payload packets
62Coded Phy packets shall be handled as two back to back transmissions.
63Where the 1st transmission covers the {preamble + address + CI + term}
64and the 2nd transmissions covers the {PDU (header + payload + ..) + header + CRC}.
65For each consecutive transmission the following must be true:
66
67* {1st tx}.end_tx_time = {1st tx}.end_packet_time
68* {2nd tx}.start_tx_time = {1st tx}.end_tx_time + 1
69* {2nd tx}.start_tx_time = {2nd tx}.start_packet_time
70
71In the receive side, similarly 2 receptions will be performed.
72Where the 1st reception will attempt to receive only the 1st transmission,
73and the 2nd reception must be configured with prelocked_tx set to true.
74In this case, the receiver will continue automatically with the same
75transmitter it sync'ed to last time.
76It is the responsibility of the device to properly set the coding_rate of the
772nd reception to match the transmitter 2nd transmission.
78
79The first transmission payload shall contain at least 1 byte, in which the
80lowest 2 bits are the CI.
81The FEC2 transmission address should be an invalid one (for ex. 0x0), to ensure
82no other Receiver matches it as if it were a FEC1.
83The FEC2 reception:
84 * should be set to be piggybacking, and should preferably have n_addr = 0
85   (to ensure nothing else is locked if the Tx FEC2 disapears).
86 * pream_and_addr_duration should be set to 0, acceptable_pre_truncation = 0, scan_duration = 1,
87   sync_threshold = UINT16_MAX.
88
89This can be expanded to any number of sub-payloads with the same or different
90modulations.
91
92## API
93
94A description of the library API can be found in
95[bs_pc_2G4.h](../src/bs_pc_2G4.h)
96