REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
redac.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include "teensy/redac.h"
7
8platform::REDAC *platform::REDAC::from_entity_classifier(entities::EntityClassifier classifier,
9 __attribute__((__unused__)) const bus::addr_t block_address) {
10 if (!classifier or classifier.type != static_cast<uint8_t>(TYPES::mREDAC))
11 return nullptr;
12
13 if (classifier.version < entities::Version(1))
14 return nullptr;
15 if (classifier.version < entities::Version(1, 1)) {
16 auto *new_carrier = new REDAC(new REDAC_HAL_V_1_0_X);
17 new_carrier->classifier = classifier;
18 return new_carrier;
19 }
20 if (classifier.version < entities::Version(1, 2)) {
21 auto *new_carrier = new REDAC_V_1_1_X(new REDAC_HAL_V_1_1_X);
22 new_carrier->classifier = classifier;
23 return new_carrier;
24 }
25 return nullptr;
26}
27
28const SPISettings platform::REDAC_HAL_V_1_0_X::BP_REDAC_ID_SPI_SETTINGS{4'000'000, LSBFIRST,
29 SPI_MODE2 /* Chip expects MODE0, CLK is inverted on the way */};
30
32 4'000'000, MSBFIRST, SPI_MODE2 /* chip expects SPI MODE0, but CLK is inverted on the way */};
33
35 : REDAC_HAL_Parent(bus::CARRIER_BADDR, 15),
36
37 bp_redac_id(bus::address_from_tuple(bus::BACKPLANE_BADDR, BP_REDAC_ID_FADDR), 3, BP_REDAC_ID_SPI_SETTINGS),
38
39 f_set_standby(bus::address_from_tuple(bus::CARRIER_BADDR, STANDBY_SET_FADDR)),
40 f_unset_standby(bus::address_from_tuple(bus::CARRIER_BADDR, STANDBY_UNSET_FADDR)),
41 f_adc0_switcher_prg(bus::idx_to_addr(0, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_PRG_FADDR), 15, F_ADC_SWITCHER_PRG_SPI_SETTINGS),
42 f_adc0_switcher_reset(bus::idx_to_addr(0, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_RESET_FADDR)),
43 f_adc0_switcher_sync(bus::idx_to_addr(0, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_STROBE_FADDR)),
44 f_adc1_switcher_prg(bus::idx_to_addr(1, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_PRG_FADDR), 15, F_ADC_SWITCHER_PRG_SPI_SETTINGS),
45 f_adc1_switcher_reset(bus::idx_to_addr(1, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_RESET_FADDR)),
46 f_adc1_switcher_sync(bus::idx_to_addr(1, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_STROBE_FADDR)),
47 f_adc2_switcher_prg(bus::idx_to_addr(2, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_PRG_FADDR), 15, F_ADC_SWITCHER_PRG_SPI_SETTINGS),
48 f_adc2_switcher_reset(bus::idx_to_addr(2, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_RESET_FADDR)),
49 f_adc2_switcher_sync(bus::idx_to_addr(2, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_STROBE_FADDR)) {}
50
52
53bool platform::REDAC_HAL_V_1_0_X::write_adc_bus_mux(const std::array<int8_t, 8> &channels) {
54 // Reset previous connections
55 // It's easier to do a full reset then to remember all previous connections
57 delayNanoseconds(420);
58
59 // Write cluster 0 data to chip
60 for (uint8_t output_idx = 0; output_idx < channels.size(); output_idx++) {
61 if (channels[output_idx] >= 0 && channels[output_idx] < 16) {
62 auto cmd = f_adc0_switcher_prg.chip_cmd_word(channels[output_idx], output_idx);
63
64 if (!f_adc0_switcher_prg.transfer8(cmd))
65 return false;
66
67 f_adc0_switcher_sync.trigger();
68 }
69 }
70
71 // Write cluster 1 data to chip
72 for (uint8_t output_idx = 0; output_idx < channels.size(); output_idx++) {
73 if (channels[output_idx] >= 16 && channels[output_idx] < 32) {
74 auto cmd = f_adc1_switcher_prg.chip_cmd_word(channels[output_idx] - 16, output_idx);
75
76 if (!f_adc1_switcher_prg.transfer8(cmd))
77 return false;
78
79 f_adc1_switcher_sync.trigger();
80 }
81 }
82
83 // Write cluster 2 data to chip
84 for (uint8_t output_idx = 0; output_idx < channels.size(); output_idx++) {
85 if (channels[output_idx] >= 32 && channels[output_idx] < 48) {
86 auto cmd = f_adc2_switcher_prg.chip_cmd_word(channels[output_idx] - 32, output_idx);
87
88 if (!f_adc2_switcher_prg.transfer8(cmd))
89 return false;
90
91 f_adc2_switcher_sync.trigger();
92 }
93 }
94
95 return true;
96}
97
103
104void platform::REDAC_HAL_V_1_0_X::set_standby(bool enabled) {
105 if (enabled)
106 f_set_standby.trigger(10000);
107 else
108 f_unset_standby.trigger(10000);
109}
110
112 : fp_control(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR), 15, true),
113 fp_control_reset(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR_CLR)),
114 fp_control_sync(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR_STO)) {}
115
117 bool success = fp_control.transfer16(state);
118 fp_control_sync.trigger();
119 return success;
120}
121
123 auto stat = REDAC::write_to_hardware();
124 stat.attach(status(hardware->write_fp_control_register(fp_control_sr_state)));
125 return stat;
126}
127
129
131 if (mode == FrontPanelIOMode::DIGITAL_IN && io_number != 0)
132 return false;
133
134 if (mode == FrontPanelIOMode::DIGITAL_OUT && io_number == 0)
135 return false;
136
137 fp_control_sr_state &= ~(0b10001 << (3 - io_number));
138 fp_control_sr_state |= mode << (3 - io_number);
139
140 return true;
141}
142
144 return static_cast<FrontPanelIOMode>(fp_control_sr_state & (0b10001 << (3 - io_number)) >> (3 - io_number));
145}
146
147bool platform::REDAC_V_1_1_X::set_DIO_direction(uint8_t dio_number, bool input_from_ctrl_block) {
148 uint8_t bit_number = 0;
149 if (dio_number == 12)
150 bit_number = 8;
151 else if (dio_number == 13)
152 bit_number = 9;
153 else if (dio_number == 28)
154 bit_number = 10;
155 else if (dio_number == 7)
156 bit_number = 11;
157 else
158 return false;
159
160 fp_control_sr_state &= ~(1 << bit_number);
161 fp_control_sr_state |= input_from_ctrl_block << bit_number;
162
163 return true;
164}
165
166bool platform::REDAC_V_1_1_X::get_DIO_direction(uint8_t dio_number) const {
167 if (dio_number == 12)
168 return fp_control_sr_state & (1 << 8);
169 if (dio_number == 13)
170 return fp_control_sr_state & (1 << 9);
171 if (dio_number == 28)
172 return fp_control_sr_state & (1 << 10);
173 if (dio_number == 7)
174 return fp_control_sr_state & (1 << 11);
175 return false;
176}
void reset_adc_bus_mux() override
Definition redac.cpp:98
static const SPISettings BP_REDAC_ID_SPI_SETTINGS
Definition redac.h:28
static constexpr uint8_t ADC_STROBE_FADDR
Definition redac.h:34
static constexpr uint8_t BP_REDAC_ID_FADDR
Definition redac.h:39
bool write_adc_bus_mux(const std::array< int8_t, 8 > &channels) override
Definition redac.cpp:53
const functions::TriggerFunction f_adc2_switcher_reset
Definition redac.h:58
const functions::TriggerFunction f_adc2_switcher_sync
Definition redac.h:59
const functions::ICommandRegisterFunction f_adc2_switcher_prg
Definition redac.h:57
const functions::TriggerFunction f_adc1_switcher_reset
Definition redac.h:54
const functions::TriggerFunction f_adc0_switcher_reset
Definition redac.h:50
const functions::TriggerFunction f_unset_standby
Definition redac.h:47
const functions::TriggerFunction f_adc0_switcher_sync
Definition redac.h:51
static const SPISettings F_ADC_SWITCHER_PRG_SPI_SETTINGS
Definition redac.h:31
uint16_t read_backplane_and_slot_id() const override
Definition redac.cpp:51
const functions::ICommandRegisterFunction f_adc0_switcher_prg
Definition redac.h:49
static constexpr uint8_t ADC_RESET_FADDR
Definition redac.h:33
static constexpr uint8_t STANDBY_UNSET_FADDR
Definition redac.h:36
static constexpr uint8_t STANDBY_SET_FADDR
Definition redac.h:35
const functions::TriggerFunction f_adc1_switcher_sync
Definition redac.h:55
const functions::TriggerFunction f_set_standby
Definition redac.h:46
const functions::ICommandRegisterFunction f_adc1_switcher_prg
Definition redac.h:53
static constexpr uint8_t ADC_PRG_FADDR
Definition redac.h:32
const functions::DataFunction bp_redac_id
Definition redac.h:42
const functions::TriggerFunction fp_control_reset
Definition redac.h:74
static constexpr uint8_t FP_SR
Definition redac.h:68
bool write_fp_control_register(uint16_t state)
Definition redac.cpp:116
static constexpr uint8_t FP_SR_CLR
Definition redac.h:66
const functions::SR74HCT595 fp_control
Definition redac.h:73
const functions::TriggerFunction fp_control_sync
Definition redac.h:75
static constexpr uint8_t FP_SR_STO
Definition redac.h:67
bool get_DIO_direction(uint8_t dio_number) const
Definition redac.cpp:166
uint16_t fp_control_sr_state
Definition redac.h:113
FrontPanelIOMode get_io_mode(uint8_t io_number) const
Definition redac.cpp:143
status write_to_hardware() override
Definition redac.cpp:122
bool set_io_mode(uint8_t io_number, FrontPanelIOMode mode)
Definition redac.cpp:130
bool set_DIO_direction(uint8_t dio_number, bool input_from_ctrl_block)
Definition redac.cpp:147
REDAC_HAL_V_1_1_X * hardware
Definition redac.h:115
REDAC_V_1_1_X(REDAC_HAL_V_1_1_X *hardware)
Definition redac.cpp:128
utils::status status
Definition daq.h:21
static constexpr int success
Definition flasher.cpp:275
__attribute__((section(".fastrun"), noinline, noclone, optimize("Os"))) int flash_sector_not_erased(uint32_t address)
Definition flasher.cpp:114
Definition bus.h:21
Definition mode.h:14
entities::EntitySharedHardware< REDAC_HAL > REDAC_HAL_Parent
Definition redac.h:14