blob: a249537cdeb644ab4484d5dc4bc70479edf5ab54 [file] [log] [blame]
Harald Welte9469e042020-12-15 23:09:40 +01001/*
2 * ice1usb_proto.h
3 *
4 * Copyright (C) 2020 Harald Welte <laforge@osmocom.org>
5 * SPDX-License-Identifier: MIT
6 *
7 * Header file describing the USB protocol between the icE1usb firmware and the host
8 * software (currently really only osmo-e1d)
9 */
10
11#pragma once
12
13/***********************************************************************
14 * Control Endpoint / Device Requests
15 ***********************************************************************/
16
17/*! returns a bit-mask of optional device capabilities (see enum e1usb_dev_capability) */
18#define ICE1USB_DEV_GET_CAPABILITIES 0x01
19#define ICE1USB_DEV_GET_FW_BUILD 0x02
Sylvain Munautc3083342022-01-13 00:50:10 +010020#define ICE1USB_DEV_GET_GPSDO_STATUS 0x10
21#define ICE1USB_DEV_GET_GPSDO_MODE 0x12 /*!< uint8_t */
22#define ICE1USB_DEV_SET_GPSDO_MODE 0x13 /*!< wValue = mode */
23#define ICE1USB_DEV_GET_GPSDO_TUNE 0x14 /*!< data = struct e1usb_gpsdo_tune */
24#define ICE1USB_DEV_SET_GPSDO_TUNE 0x15 /*!< data = struct e1usb_gpsdo_tune */
Harald Welte9469e042020-12-15 23:09:40 +010025
26enum e1usb_dev_capability {
27 /*! Does this board have a GPS-DO */
28 ICE1USB_DEV_CAP_GPSDO,
29};
30
Sylvain Munautc3083342022-01-13 00:50:10 +010031enum ice1usb_gpsdo_mode {
32 ICE1USB_GPSDO_MODE_DISABLED = 0,
33 ICE1USB_GPSDO_MODE_AUTO = 1,
34};
35
36enum ice1usb_gpsdo_antenna_state {
37 ICE1USB_GPSDO_ANT_UNKNOWN = 0,
38 ICE1USB_GPSDO_ANT_OK = 1,
39 ICE1USB_GPSDO_ANT_OPEN = 2,
40 ICE1USB_GPSDO_ANT_SHORT = 3,
41};
42
43enum ice1usb_gpsdo_state {
44 ICE1USB_GPSDO_STATE_DISABLED = 0,
45 ICE1USB_GPSDO_STATE_CALIBRATE = 1,
46 ICE1USB_GPSDO_STATE_HOLD_OVER = 2,
47 ICE1USB_GPSDO_STATE_TUNE_COARSE = 3,
48 ICE1USB_GPSDO_STATE_TUNE_FINE = 4,
49};
50
51struct e1usb_gpsdo_tune {
52 uint16_t coarse;
53 uint16_t fine;
54} __attribute__((packed));
55
56struct e1usb_gpsdo_status {
57 uint8_t state;
58 uint8_t antenna_status; /*!< Antenna status */
59 uint8_t valid_fix; /*!< Valid GPS Fix (0/1) */
60 uint8_t mode; /*!< Current configured operating mode */
61 struct e1usb_gpsdo_tune tune; /*!< Current VCXO tuning values */
62 uint32_t freq_est; /*!< Latest frequency estimate measurement */
63} __attribute__((packed));
64
Harald Welte9469e042020-12-15 23:09:40 +010065
66/* Interface Requests */
67
68/*! returns a bit-mask of optional device capabilities (see enum e1usb_intf_capability) */
69#define ICE1USB_INTF_GET_CAPABILITIES 0x01
70#define ICE1USB_INTF_SET_TX_CFG 0x02 /*!< struct ice1usb_tx_config */
71#define ICE1USB_INTF_GET_TX_CFG 0x03 /*!< struct ice1usb_tx_config */
72#define ICE1USB_INTF_SET_RX_CFG 0x04 /*!< struct ice1usb_rx_config */
73#define ICE1USB_INTF_GET_RX_CFG 0x05 /*!< struct ice1usb_rx_config */
Harald Welte1b89f3b2022-01-13 10:03:42 +010074#define ICE1USB_INTF_GET_ERRORS 0x06 /*!< struct ice1usb_irq_err */
Harald Welte9469e042020-12-15 23:09:40 +010075
76//enum e1usb_intf_capability { };
77
78enum ice1usb_tx_mode {
79 ICE1USB_TX_MODE_TRANSP = 0,
80 ICE1USB_TX_MODE_TS0 = 1,
81 ICE1USB_TX_MODE_TS0_CRC4 = 2,
82 ICE1USB_TX_MODE_TS0_CRC4_E = 3,
83};
84
85enum ice1usb_tx_timing {
86 ICE1USB_TX_TIME_SRC_LOCAL = 0,
87 ICE1USB_TX_TIME_SRC_REMOTE = 1,
88};
89
90enum ice1usb_tx_ext_loopback {
91 ICE1USB_TX_EXT_LOOPBACK_OFF = 0,
92 ICE1USB_TX_EXT_LOOPBACK_SAME = 1,
93 ICE1USB_TX_EXT_LOOPBACK_CROSS = 2,
94};
95
96/* ICE1USB_INTF_{GET,SET}_TX_CFG */
97struct ice1usb_tx_config {
98 uint8_t mode; /*!< enum ice1usb_tx_mode */
99 uint8_t timing; /*!< enum ice1usb_tx_timing */
100 uint8_t ext_loopback; /*!< enum ice1usb_tx_ext_loopback */
101 uint8_t alarm; /*!< 1 = transmit alarm; 0 = don't */
102} __attribute__((packed));
103
104
105enum ice1usb_rx_mode {
106 /*! transparent, unaligned bitstream */
107 ICE1USB_RX_MODE_TRANSP = 0,
108 /*! alignment to E1 frame */
109 ICE1USB_RX_MODE_FRAME = 2,
110 /*! alignment to E1 multiframe */
111 ICE1USB_RX_MODE_MULTIFRAME = 3,
112};
113
114/* ICE1USB_INTF_{GET,SET}_RX_CFG */
115struct ice1usb_rx_config {
116 uint8_t mode; /*!< enum ice1usb_rx_mode */
117} __attribute__((packed));
Harald Welte805f2cf2020-12-14 17:31:03 +0100118
119
120/***********************************************************************
121 * Interrupt Endpoint
122 ***********************************************************************/
123
124enum ice1usb_irq_type {
125 ICE1USB_IRQ_T_ERRCNT = 1,
126};
127
Harald Welte51baa362022-01-01 15:22:25 +0100128/* Ensue to keep those in sync with e1.h */
Harald Welte805f2cf2020-12-14 17:31:03 +0100129#define ICE1USB_ERR_F_ALIGN_ERR 0x01
130#define ICE1USB_ERR_F_LOS 0x02
Harald Welte51baa362022-01-01 15:22:25 +0100131#define ICE1USB_ERR_F_RAI 0x04
Harald Welte805f2cf2020-12-14 17:31:03 +0100132
133struct ice1usb_irq_err {
134 /* 16-bit little-endian counters */
135 uint16_t crc;
136 uint16_t align;
137 uint16_t ovfl;
138 uint16_t unfl;
139 uint8_t flags;
140} __attribute__((packed));
141
142struct ice1usb_irq {
143 uint8_t type; /*!< enum ice1usb_irq_type */
144 union {
145 struct ice1usb_irq_err errors;
146 } u;
147} __attribute__((packed));