laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-e1d/+/29618 )
Change subject: usb: Add support for new GPSDO status field "Accumulated error" ......................................................................
usb: Add support for new GPSDO status field "Accumulated error"
Because we want to handle older firmwares too, we need to excepect we might get a smaller structure !
(We can't get a larger one since the wLength we send is limited to the structure we know)
Signed-off-by: Sylvain Munaut tnt@246tNt.com Change-Id: I4222bf22267f8343abf1e97546111ceb1c299846 --- M src/e1d.h M src/ice1usb_proto.h M src/intf_line.c M src/usb.c 4 files changed, 23 insertions(+), 4 deletions(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved
diff --git a/src/e1d.h b/src/e1d.h index 42be1b4..ff34800 100644 --- a/src/e1d.h +++ b/src/e1d.h @@ -67,6 +67,7 @@ LINE_GPSDO_TUNE_COARSE, LINE_GPSDO_TUNE_FINE, LINE_GPSDO_FREQ_EST, + LINE_GPSDO_ERR_ACC, };
enum e1_ts_mode { diff --git a/src/ice1usb_proto.h b/src/ice1usb_proto.h index 3170d55..54b91ab 100644 --- a/src/ice1usb_proto.h +++ b/src/ice1usb_proto.h @@ -65,6 +65,7 @@ uint8_t mode; /*!< Current configured operating mode */ struct e1usb_gpsdo_tune tune; /*!< Current VCXO tuning values */ uint32_t freq_est; /*!< Latest frequency estimate measurement */ + int16_t err_acc; /*!< Accumulated error (since fw icE1usb-fw-0.3 commit cfb8b0b7) */ } __attribute__((packed));
diff --git a/src/intf_line.c b/src/intf_line.c index a645cd3..811b8fe 100644 --- a/src/intf_line.c +++ b/src/intf_line.c @@ -75,6 +75,7 @@ [LINE_GPSDO_TUNE_COARSE]= { "gpsdo:tune:coarse", "GSPDO Coarse Tuning" }, [LINE_GPSDO_TUNE_FINE] = { "gpsdo:tune:fine", "GSPDO Fine Tuning" }, [LINE_GPSDO_FREQ_EST] = { "gpsdo:freq_est", "GSPDO Frequency Estimate" }, + [LINE_GPSDO_ERR_ACC] = { "gpsdo:err_acc", "GPSDO Accumulated Error" }, };
static const struct osmo_stat_item_group_desc line_stats_desc = { diff --git a/src/usb.c b/src/usb.c index fa6ddee..a60ea99 100644 --- a/src/usb.c +++ b/src/usb.c @@ -706,14 +706,29 @@ { struct e1_usb_intf_data *id = intf->drv_data; struct e1usb_gpsdo_status *last_st = &id->gpsdo.last_status; - const struct e1usb_gpsdo_status *st; + struct e1usb_gpsdo_status _st, *st = &_st; struct e1_line *line;
if (len < sizeof(*st)) { - LOGPIF(intf, DE1D, LOGL_ERROR, "GPSDO status %zu < %zu!\n", len, sizeof(*st)); - return; + /* + * Because some fields can be added to the structure by newer + * firmware revisions, this means we can potentially get a shorter + * struct than what we asked for. We simply set those fields to + * zero. + * + * The opposite case (newer firmware than e1d) means the structure + * could be larger, but because we limit the wLength to the struct + * we know, we can't receive a larger one and the new fields are + * just ignored by this e1d version + */ + LOGPIF(intf, DE1D, LOGL_DEBUG, + "GPSDO status %zu < %zu ! Firmware probably outdated. " + "Some values will be zeroed\n", + len, sizeof(*st)); } - st = (const struct e1usb_gpsdo_status *) data; + + memset(st, 0x00, sizeof(*st)); + memcpy(st, data, len);
if (st->state != last_st->state) { LOGPIF(intf, DE1D, LOGL_NOTICE, "GPSDO state change: %s -> %s\n", @@ -750,6 +765,7 @@ line_stat_set(line, LINE_GPSDO_TUNE_COARSE, libusb_le16_to_cpu(st->tune.coarse)); line_stat_set(line, LINE_GPSDO_TUNE_FINE, libusb_le16_to_cpu(st->tune.fine)); line_stat_set(line, LINE_GPSDO_FREQ_EST, osmo_load32le(&st->freq_est)); + line_stat_set(line, LINE_GPSDO_ERR_ACC, (int16_t)libusb_le16_to_cpu(st->err_acc)); }
/* update our state */