aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/tools/tlv_eeprom/usrp_eeprom.h
diff options
context:
space:
mode:
authorMichael Auchter <michael.auchter@ni.com>2019-09-09 16:46:14 -0500
committerMartin Braun <martin@gnuradio.org>2021-05-31 05:28:47 -0700
commit530cb0a8aaaac906fe124086e780d6651241b0ad (patch)
tree8a5301163392b3d0c1642da0cb9ba2a9ea176401 /mpm/tools/tlv_eeprom/usrp_eeprom.h
parentfa997d52cc62c3c39f5b7560890e31d41e4eb9e9 (diff)
downloaduhd-530cb0a8aaaac906fe124086e780d6651241b0ad.tar.gz
uhd-530cb0a8aaaac906fe124086e780d6651241b0ad.tar.bz2
uhd-530cb0a8aaaac906fe124086e780d6651241b0ad.zip
mpm: add tlv_eeprom
Add support for parsing an eeprom that uses tag-length-value to store contents. Co-authored-by: Michael Auchter <michael.auchter@ni.com> Co-authored-by: Virendra Kakade <virendra.kakade@ni.com> Co-authored-by: Cristina Fuentes <cristina.fuentes@ni.com>
Diffstat (limited to 'mpm/tools/tlv_eeprom/usrp_eeprom.h')
-rw-r--r--mpm/tools/tlv_eeprom/usrp_eeprom.h206
1 files changed, 206 insertions, 0 deletions
diff --git a/mpm/tools/tlv_eeprom/usrp_eeprom.h b/mpm/tools/tlv_eeprom/usrp_eeprom.h
new file mode 100644
index 000000000..224ce8c1b
--- /dev/null
+++ b/mpm/tools/tlv_eeprom/usrp_eeprom.h
@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright 2019 Ettus Research, a National Instruments Brand
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+#define USRP_EEPROM_MAGIC 0x55535250
+
+/**
+ * struct usrp_eeprom_board_info - common board info
+ *
+ * @pid: product id for the board
+ * @rev: current hardware revision, starting at 1
+ * @compat_rev: last hardware revision this is compatible with
+ * @serial: NUL-terminated serial number string
+ */
+#define USRP_EEPROM_BOARD_INFO_TAG (0x10)
+struct usrp_eeprom_board_info {
+ uint16_t pid;
+ uint16_t rev;
+ uint16_t compat_rev;
+ char serial[8];
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_module_info - common module info
+ *
+ * @pid: product id for the module
+ * @rev: module revision, starting at 1
+ * @serial: NUL-terminated serial number string for the module
+ */
+#define USRP_EEPROM_MODULE_INFO_TAG (0x11)
+struct usrp_eeprom_module_info {
+ uint16_t pid;
+ uint16_t rev;
+ char serial[8];
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_mac_addr - mac address
+ *
+ * @addr: 6-byte MAC address
+ */
+
+/* tags 0xA0 through 0xAF are reserved for MAC addresses */
+#define USRP_EEPROM_MAX_MAC_ADDRS 0xF
+#define USRP_EEPROM_MAC_ADDR_TAG(x) (0xA0 + ((x) & USRP_EEPROM_MAX_MAC_ADDRS))
+#define USRP_EEPROM_ETH0_ADDR_TAG USRP_EEPROM_MAC_ADDR_TAG(0)
+#define USRP_EEPROM_QSFP0_ADDR_TAG USRP_EEPROM_MAC_ADDR_TAG(1)
+#define USRP_EEPROM_QSFP1_ADDR_TAG USRP_EEPROM_MAC_ADDR_TAG(2)
+struct usrp_eeprom_mac_addr {
+ uint8_t addr[6];
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_db_pwr_seq - daughterboard power sequence
+ *
+ * @nsteps: the number of steps in the sequence
+ * @steps.delay: delay in milliseconds to wait after enabling supplies
+ * @steps.supply_mask: bitmask of supplies to enable
+ * For X410: bit 0 = 1.8, bit 1 = 2.5, 3.3, 3.7, 12
+ */
+#define USRP_EEPROM_DB_PWR_SEQ_TAG (0x12)
+struct usrp_eeprom_db_pwr_seq {
+ uint8_t nsteps;
+ struct {
+ uint16_t delay;
+ uint8_t supply_mask;
+ } steps[8];
+};
+
+#define USRP_EEPROM_MCU_FLAGS (0x20)
+struct usrp_eeprom_mcu_flags {
+ uint8_t flags[6];
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_fan_limits - fan speed (rpm) limits
+ *
+ * @min: minimum configurable speed
+ * @start: necessary start speed
+ * @max: maximum configurable speed
+ */
+#define USRP_EEPROM_FAN_LIMITS (0x21)
+struct usrp_eeprom_fan_limits {
+ uint16_t min;
+ uint16_t start;
+ uint16_t max;
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_fan_fixed_capacity - fixed cooling capacity
+ *
+ * @capacity: fixed cooling capacity percentage. Range 0-100.
+ * @reserved: extra byte for alignment
+ */
+#define USRP_EEPROM_FAN_FIXED_CAPACITY (0x22)
+struct usrp_eeprom_fan_fixed_capacity {
+ uint8_t capacity;
+ uint8_t reserved; /* for natural alignment */
+} __attribute__((packed));
+
+/**
+ * struct usrp_eeprom_clkaux_tuning_word - clk aux dac tuning word
+ *
+ * @tuning_word: clocking aux board dac tuning word. Range 0-1023.
+ */
+#define USRP_EEPROM_CLKAUX_TUNING_WORD (0x23)
+struct usrp_eeprom_clkaux_tuning_word {
+ uint16_t tuning_word;
+} __attribute__((packed));
+
+#include <stdio.h>
+#include <assert.h>
+
+static void usrp_eeprom_trace(uint8_t tag, uint8_t len, const void *val)
+{
+ uint8_t i;
+
+ switch (tag) {
+ case USRP_EEPROM_BOARD_INFO_TAG:
+ {
+ const struct usrp_eeprom_board_info *v = val;
+ assert(sizeof(*v) == len);
+ printf("%s (0x%02x) ", "usrp_eeprom_board_info", tag);
+ printf("pid: 0x%04x, rev: 0x%04x, compat_rev: 0x%04x, serial: %s\n",
+ v->pid, v->rev, v->compat_rev, v->serial);
+ }
+ break;
+ case USRP_EEPROM_MODULE_INFO_TAG:
+ {
+ const struct usrp_eeprom_module_info *v = val;
+ assert(sizeof(*v) == len);
+ printf("%s (0x%02x) ", "usrp_eeprom_module_info", tag);
+ printf("pid: 0x%04x, rev: 0x%04x, serial: %s\n",
+ v->pid, v->rev, v->serial);
+ }
+ break;
+ case USRP_EEPROM_MAC_ADDR_TAG(0) ... USRP_EEPROM_MAC_ADDR_TAG(USRP_EEPROM_MAX_MAC_ADDRS):
+ {
+ const struct usrp_eeprom_mac_addr *v = val;
+ assert(sizeof(*v) == len);
+ printf("%s mac_addr_%d (0x%02x) ", "usrp_eeprom_mac_addr",
+ tag - USRP_EEPROM_MAC_ADDR_TAG(0), tag);
+ for (i = 0; i < 6; i++)
+ printf("%02x%c", v->addr[i], i == 5 ? ' ' : ':');
+ printf("\n");
+ }
+ break;
+ case USRP_EEPROM_DB_PWR_SEQ_TAG:
+ {
+ const struct usrp_eeprom_db_pwr_seq *v = val;
+ assert(sizeof(*v) == len);
+ printf("%s (0x%02x) ", "usrp_eeprom_db_pwr_seq", tag);
+ for (i = 0; i < 8; i++)
+ printf("(%u, 0x%02x) ", v->steps[i].delay, v->steps[i].supply_mask);
+ printf("\n");
+ }
+ break;
+ case USRP_EEPROM_MCU_FLAGS:
+ {
+ const struct usrp_eeprom_mcu_flags *v = val;
+ printf("%s (0x%02x) ", "usrp_eeprom_mcu_flags", tag);
+ for (i = 0; i < 6; i++)
+ printf("0x%02x ", v->flags[i]);
+ printf("\n");
+ }
+ break;
+ case USRP_EEPROM_FAN_LIMITS:
+ {
+ const struct usrp_eeprom_fan_limits *v = val;
+ printf("%s (0x%02x) ", "usrp_eeprom_fan_limits", tag);
+ printf("min: %d, start: %d, max: %d", v->min, v->start, v->max);
+ printf("\n");
+ }
+ break;
+ case USRP_EEPROM_FAN_FIXED_CAPACITY:
+ {
+ const struct usrp_eeprom_fan_fixed_capacity *v = val;
+ printf("%s (0x%02x) ", "usrp_eeprom_fan_fixed_capacity", tag);
+ printf("%d", v->capacity);
+ printf("\n");
+ }
+ break;
+ case USRP_EEPROM_CLKAUX_TUNING_WORD:
+ {
+ const struct usrp_eeprom_clkaux_tuning_word *v = val;
+ printf("%s (0x%02x) ", "usrp_eeprom_clkaux_tuning_word", tag);
+ printf("%d", v->tuning_word);
+ printf("\n");
+ }
+ break;
+ default:
+ {
+ const uint8_t *ptr = val;
+ printf("%s (0x%02x) len: %hhu, val: ", "unknown", tag, len);
+ for (i = 0; i < len; i++)
+ printf("%02x ", ptr[i]);
+ printf("\n");
+ break;
+ }
+ }
+}