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