Bluetooth: controller: corrected time stamps for unframed RX
Corrected an omission in the ISO-AL that required an SDU interval to be added to the reconstructed RX time stamps for each SDU after the first. Signed-off-by: Nirosharn Amarasinghe <niag@demant.com>
This commit is contained in:
parent
b196edf55d
commit
8510ecf6e3
2 changed files with 36 additions and 1 deletions
|
@ -208,6 +208,7 @@ isoal_status_t isoal_sink_create(
|
||||||
session->handle = handle;
|
session->handle = handle;
|
||||||
session->framed = framed;
|
session->framed = framed;
|
||||||
session->sdu_interval = sdu_interval;
|
session->sdu_interval = sdu_interval;
|
||||||
|
session->burst_number = burst_number;
|
||||||
|
|
||||||
/* Todo: Next section computing various constants, should potentially be a
|
/* Todo: Next section computing various constants, should potentially be a
|
||||||
* function in itself as a number of the dependencies could be changed while
|
* function in itself as a number of the dependencies could be changed while
|
||||||
|
@ -703,6 +704,7 @@ static isoal_status_t isoal_rx_unframed_consume(struct isoal_sink *sink,
|
||||||
if (sp->fsm == ISOAL_START) {
|
if (sp->fsm == ISOAL_START) {
|
||||||
struct isoal_sdu_produced *sdu;
|
struct isoal_sdu_produced *sdu;
|
||||||
uint32_t anchorpoint;
|
uint32_t anchorpoint;
|
||||||
|
uint16_t sdu_offset;
|
||||||
int32_t latency;
|
int32_t latency;
|
||||||
|
|
||||||
sp->sdu_status = ISOAL_SDU_STATUS_VALID;
|
sp->sdu_status = ISOAL_SDU_STATUS_VALID;
|
||||||
|
@ -711,11 +713,43 @@ static isoal_status_t isoal_rx_unframed_consume(struct isoal_sink *sink,
|
||||||
session->seqn++;
|
session->seqn++;
|
||||||
seq_err = false;
|
seq_err = false;
|
||||||
|
|
||||||
/* Todo: anchorpoint must be reference anchor point, should be fixed in LL */
|
/* The incoming time stamp for each PDU is expected to be the
|
||||||
|
* CIS / BIS reference anchor point. SDU reference point is
|
||||||
|
* reconstructed by adding the precalculated latency constant.
|
||||||
|
*
|
||||||
|
* BT Core V5.3 : Vol 6 Low Energy Controller : Part G IS0-AL:
|
||||||
|
* 3.2.2 SDU synchronization reference using unframed PDUs:
|
||||||
|
*
|
||||||
|
* The CIS reference anchor point is computed excluding any
|
||||||
|
* retransmissions or missed subevents and shall be set to the
|
||||||
|
* start of the isochronous event in which the first PDU
|
||||||
|
* containing the SDU could have been transferred.
|
||||||
|
*
|
||||||
|
* The BIG reference anchor point is the anchor point of the BIG
|
||||||
|
* event that the PDU is associated with.
|
||||||
|
*/
|
||||||
anchorpoint = meta->timestamp;
|
anchorpoint = meta->timestamp;
|
||||||
latency = session->latency_unframed;
|
latency = session->latency_unframed;
|
||||||
sdu = &sp->sdu;
|
sdu = &sp->sdu;
|
||||||
sdu->timestamp = isoal_get_wrapped_time_us(anchorpoint, latency);
|
sdu->timestamp = isoal_get_wrapped_time_us(anchorpoint, latency);
|
||||||
|
|
||||||
|
/* If there are multiple SDUs in an ISO interval
|
||||||
|
* (SDU interval < ISO Interval) every SDU after the first
|
||||||
|
* should add an SDU interval to the time stamp.
|
||||||
|
*
|
||||||
|
* BT Core V5.3 : Vol 6 Low Energy Controller : Part G IS0-AL:
|
||||||
|
* 3.2.2 SDU synchronization reference using unframed PDUs:
|
||||||
|
*
|
||||||
|
* All PDUs belonging to a burst as defined by the configuration
|
||||||
|
* of BN have the same reference anchor point. When multiple
|
||||||
|
* SDUs have the same reference anchor point, the first SDU uses
|
||||||
|
* the reference anchor point timing. Each subsequent SDU
|
||||||
|
* increases the SDU synchronization reference timing with one
|
||||||
|
* SDU interval.
|
||||||
|
*/
|
||||||
|
sdu_offset = (meta->payload_number % session->burst_number) / session->pdus_per_sdu;
|
||||||
|
sdu->timestamp = isoal_get_wrapped_time_us(sdu->timestamp,
|
||||||
|
sdu_offset * session->sdu_interval);
|
||||||
} else {
|
} else {
|
||||||
sp->pdu_cnt++;
|
sp->pdu_cnt++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,6 +262,7 @@ struct isoal_sink_session {
|
||||||
uint16_t handle;
|
uint16_t handle;
|
||||||
uint8_t pdus_per_sdu;
|
uint8_t pdus_per_sdu;
|
||||||
uint8_t framed;
|
uint8_t framed;
|
||||||
|
uint8_t burst_number;
|
||||||
uint32_t sdu_interval;
|
uint32_t sdu_interval;
|
||||||
uint32_t latency_unframed;
|
uint32_t latency_unframed;
|
||||||
uint32_t latency_framed;
|
uint32_t latency_framed;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue