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