1 //
2 // Copyright 2017 Ettus Research, a National Instruments Company
3 //
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 //
6
7 #include "ad937x_gain_ctrl_config.hpp"
8
9 using namespace mpm::ad937x::gpio;
10 using namespace mpm::ad937x::device;
11 using namespace uhd;
12
13 const uint8_t ad937x_gain_ctrl_channel_t::DEFAULT_GAIN_STEP = 1;
14 const bool ad937x_gain_ctrl_channel_t::DEFAULT_ENABLE = 0;
15
16 // rx uses gain, tx uses attenuation
17 enum class pin_direction_t {
18 INCREASE,
19 DECREASE,
20 };
21
_convert_gain_pin(gain_pin_t pin)22 mykonosGpioSelect_t _convert_gain_pin(gain_pin_t pin)
23 {
24 switch (pin) {
25 case gain_pin_t::PIN0:
26 return MYKGPIO0;
27 case gain_pin_t::PIN1:
28 return MYKGPIO1;
29 case gain_pin_t::PIN2:
30 return MYKGPIO2;
31 case gain_pin_t::PIN3:
32 return MYKGPIO3;
33 case gain_pin_t::PIN4:
34 return MYKGPIO4;
35 case gain_pin_t::PIN5:
36 return MYKGPIO5;
37 case gain_pin_t::PIN6:
38 return MYKGPIO6;
39 case gain_pin_t::PIN7:
40 return MYKGPIO7;
41 case gain_pin_t::PIN8:
42 return MYKGPIO8;
43 case gain_pin_t::PIN9:
44 return MYKGPIO9;
45 case gain_pin_t::PIN10:
46 return MYKGPIO10;
47 case gain_pin_t::PIN11:
48 return MYKGPIO11;
49 case gain_pin_t::PIN12:
50 return MYKGPIO12;
51 case gain_pin_t::PIN13:
52 return MYKGPIO13;
53 case gain_pin_t::PIN14:
54 return MYKGPIO14;
55 case gain_pin_t::PIN15:
56 return MYKGPIO15;
57 case gain_pin_t::PIN16:
58 return MYKGPIO16;
59 case gain_pin_t::PIN17:
60 return MYKGPIO17;
61 case gain_pin_t::PIN18:
62 return MYKGPIO18;
63 default:
64 return MYKGPIONAN;
65 }
66 }
67
ad937x_gain_ctrl_channel_t(mykonosGpioSelect_t inc_pin,mykonosGpioSelect_t dec_pin)68 ad937x_gain_ctrl_channel_t::ad937x_gain_ctrl_channel_t(
69 mykonosGpioSelect_t inc_pin, mykonosGpioSelect_t dec_pin)
70 : enable(DEFAULT_ENABLE)
71 , inc_step(DEFAULT_GAIN_STEP)
72 , dec_step(DEFAULT_GAIN_STEP)
73 , inc_pin(inc_pin)
74 , dec_pin(dec_pin)
75 {
76 }
77
_get_gain_pin(direction_t direction,chain_t chain,pin_direction_t pin_direction,const gain_pins_t & gain_pins)78 mykonosGpioSelect_t _get_gain_pin(direction_t direction,
79 chain_t chain,
80 pin_direction_t pin_direction,
81 const gain_pins_t& gain_pins)
82 {
83 switch (direction) {
84 case RX_DIRECTION:
85 switch (chain) {
86 case chain_t::ONE:
87 switch (pin_direction) {
88 case pin_direction_t::INCREASE:
89 return _convert_gain_pin(gain_pins.rx1_inc_gain_pin);
90 case pin_direction_t::DECREASE:
91 return _convert_gain_pin(gain_pins.rx1_dec_gain_pin);
92 }
93 case chain_t::TWO:
94 switch (pin_direction) {
95 case pin_direction_t::INCREASE:
96 return _convert_gain_pin(gain_pins.rx2_inc_gain_pin);
97 case pin_direction_t::DECREASE:
98 return _convert_gain_pin(gain_pins.rx2_dec_gain_pin);
99 }
100 }
101
102 // !!! TX is attenuation direction, so the pins are flipped !!!
103 case TX_DIRECTION:
104 switch (chain) {
105 case chain_t::ONE:
106 switch (pin_direction) {
107 case pin_direction_t::INCREASE:
108 return _convert_gain_pin(gain_pins.tx1_dec_gain_pin);
109 case pin_direction_t::DECREASE:
110 return _convert_gain_pin(gain_pins.tx1_inc_gain_pin);
111 }
112 case chain_t::TWO:
113 switch (pin_direction) {
114 case pin_direction_t::INCREASE:
115 return _convert_gain_pin(gain_pins.tx2_dec_gain_pin);
116 case pin_direction_t::DECREASE:
117 return _convert_gain_pin(gain_pins.tx2_inc_gain_pin);
118 }
119 }
120
121 default:
122 return MYKGPIONAN;
123 }
124 }
125
ad937x_gain_ctrl_config_t(gain_pins_t gain_pins)126 ad937x_gain_ctrl_config_t::ad937x_gain_ctrl_config_t(gain_pins_t gain_pins)
127 {
128 config.emplace(std::piecewise_construct,
129 std::forward_as_tuple(RX_DIRECTION),
130 std::forward_as_tuple());
131 config.emplace(std::piecewise_construct,
132 std::forward_as_tuple(TX_DIRECTION),
133 std::forward_as_tuple());
134
135 config.at(RX_DIRECTION)
136 .emplace(std::piecewise_construct,
137 std::forward_as_tuple(chain_t::ONE),
138 std::forward_as_tuple(
139 _get_gain_pin(
140 RX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
141 _get_gain_pin(
142 RX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
143 config.at(RX_DIRECTION)
144 .emplace(std::piecewise_construct,
145 std::forward_as_tuple(chain_t::TWO),
146 std::forward_as_tuple(
147 _get_gain_pin(
148 RX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
149 _get_gain_pin(
150 RX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
151
152 config.at(TX_DIRECTION)
153 .emplace(std::piecewise_construct,
154 std::forward_as_tuple(chain_t::ONE),
155 std::forward_as_tuple(
156 _get_gain_pin(
157 TX_DIRECTION, chain_t::ONE, pin_direction_t::INCREASE, gain_pins),
158 _get_gain_pin(
159 TX_DIRECTION, chain_t::ONE, pin_direction_t::DECREASE, gain_pins)));
160 config.at(TX_DIRECTION)
161 .emplace(std::piecewise_construct,
162 std::forward_as_tuple(chain_t::TWO),
163 std::forward_as_tuple(
164 _get_gain_pin(
165 TX_DIRECTION, chain_t::TWO, pin_direction_t::INCREASE, gain_pins),
166 _get_gain_pin(
167 TX_DIRECTION, chain_t::TWO, pin_direction_t::DECREASE, gain_pins)));
168 }
169