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
31const SPISettings platform::ADCFunction_V_1_0_X::F_ADC_SWITCHER_PRG_SPI_SETTINGS{
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)),
42
44
45bool platform::REDAC_HAL_V_1_0_X::write_adc_bus_mux(const std::array<carrier::ADCChannel, 8> &channels) {
46 // Reset previous connections
47 // It's easier to do a full reset then to remember all previous connections
49 delayNanoseconds(420);
50
51 // Write data to chip
52 for (auto output_idx = 0; output_idx < channels.size(); output_idx++) {
53 auto& channel = channels[output_idx];
54 if (channel.idx < 0) continue;
55 auto cluster_idx = channel.idx / 16;
56 auto cluster_channel_idx = channel.idx % 16;
57 if (!adc_functions[cluster_idx].write(cluster_channel_idx, output_idx))
58 return false;
59 }
60
61 return true;
62}
63
65 for (auto& adc_function : adc_functions)
66 adc_function.trigger();
67}
68
69void platform::REDAC_HAL_V_1_0_X::set_standby(bool enabled) {
70 if (enabled)
71 f_set_standby.trigger(10000);
72 else
73 f_unset_standby.trigger(10000);
74}
75
77 : fp_control(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR), 15, true),
78 fp_control_reset(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR_CLR)),
79 fp_control_sync(bus::address_from_tuple(bus::CARRIER_BADDR, FP_SR_STO)) {}
80
82 bool success = fp_control.transfer16(state);
83 fp_control_sync.trigger();
84 return success;
85}
86
88 TRY(REDAC::write_to_hardware());
89 if (!hardware->write_fp_control_register(fp_control_sr_state))
90 return UnitResult::err("Failes writing fp control register");
91 return UnitResult::ok();
92}
93
95
97 if (mode == FrontPanelIOMode::DIGITAL_IN && io_number != 0)
98 return false;
99
100 if (mode == FrontPanelIOMode::DIGITAL_OUT && io_number == 0)
101 return false;
102
103 fp_control_sr_state &= ~(0b10001 << (3 - io_number));
104 fp_control_sr_state |= mode << (3 - io_number);
105
106 return true;
107}
108
110 return static_cast<FrontPanelIOMode>(fp_control_sr_state & (0b10001 << (3 - io_number)) >> (3 - io_number));
111}
112
113bool platform::REDAC_V_1_1_X::set_DIO_direction(uint8_t dio_number, bool input_from_ctrl_block) {
114 uint8_t bit_number = 0;
115 if (dio_number == 12)
116 bit_number = 8;
117 else if (dio_number == 13)
118 bit_number = 9;
119 else if (dio_number == 28)
120 bit_number = 10;
121 else if (dio_number == 7)
122 bit_number = 11;
123 else
124 return false;
125
126 fp_control_sr_state &= ~(1 << bit_number);
127 fp_control_sr_state |= input_from_ctrl_block << bit_number;
128
129 return true;
130}
131
132bool platform::REDAC_V_1_1_X::get_DIO_direction(uint8_t dio_number) const {
133 if (dio_number == 12)
134 return fp_control_sr_state & (1 << 8);
135 if (dio_number == 13)
136 return fp_control_sr_state & (1 << 9);
137 if (dio_number == 28)
138 return fp_control_sr_state & (1 << 10);
139 if (dio_number == 7)
140 return fp_control_sr_state & (1 << 11);
141 return false;
142}
void reset_adc_bus_mux() override
Definition redac.cpp:64
static const SPISettings BP_REDAC_ID_SPI_SETTINGS
Definition redac.h:28
static constexpr uint8_t BP_REDAC_ID_FADDR
Definition redac.h:69
bool write_adc_bus_mux(const std::array< carrier::ADCChannel, 8 > &channels) override
Definition redac.cpp:45
const functions::TriggerFunction f_unset_standby
Definition redac.h:76
uint16_t read_backplane_and_slot_id() const override
Definition redac.cpp:43
static constexpr uint8_t STANDBY_UNSET_FADDR
Definition redac.h:66
ADCFunction_V_1_0_X adc_functions[3]
Definition redac.h:78
static constexpr uint8_t STANDBY_SET_FADDR
Definition redac.h:65
const functions::TriggerFunction f_set_standby
Definition redac.h:75
const functions::DataFunction bp_redac_id
Definition redac.h:72
const functions::TriggerFunction fp_control_reset
Definition redac.h:93
static constexpr uint8_t FP_SR
Definition redac.h:87
bool write_fp_control_register(uint16_t state)
Definition redac.cpp:81
static constexpr uint8_t FP_SR_CLR
Definition redac.h:85
const functions::SR74HCT595 fp_control
Definition redac.h:92
const functions::TriggerFunction fp_control_sync
Definition redac.h:94
static constexpr uint8_t FP_SR_STO
Definition redac.h:86
bool get_DIO_direction(uint8_t dio_number) const
Definition redac.cpp:132
uint16_t fp_control_sr_state
Definition redac.h:132
FrontPanelIOMode get_io_mode(uint8_t io_number) const
Definition redac.cpp:109
bool set_io_mode(uint8_t io_number, FrontPanelIOMode mode)
Definition redac.cpp:96
bool set_DIO_direction(uint8_t dio_number, bool input_from_ctrl_block)
Definition redac.cpp:113
REDAC_HAL_V_1_1_X * hardware
Definition redac.h:134
UnitResult write_to_hardware() override
Definition redac.cpp:87
REDAC_V_1_1_X(REDAC_HAL_V_1_1_X *hardware)
Definition redac.cpp:94
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