REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
redac.h
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#pragma once
7
8#include "block/teensy/icmd.h"
9#include "redac/redac.h"
10#include "tblock.h"
11
12namespace platform {
13
15
16
18 static constexpr uint8_t ADC_PRG_FADDR = 0;
19 static constexpr uint8_t ADC_RESET_FADDR = 1;
20 static constexpr uint8_t ADC_STROBE_FADDR = 2;
21
22 static const SPISettings F_ADC_SWITCHER_PRG_SPI_SETTINGS;
23
24 const functions::ICommandRegisterFunction f_switcher_prg;
25 const functions::TriggerFunction f_switcher_reset;
26 const functions::TriggerFunction f_switcher_sync;
27
28public:
29 explicit ADCFunction_V_1_0_X(uint8_t cluster_idx):
30 f_switcher_prg(bus::idx_to_addr(cluster_idx, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_PRG_FADDR), 15, F_ADC_SWITCHER_PRG_SPI_SETTINGS),
31 f_switcher_reset(bus::idx_to_addr(cluster_idx, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_RESET_FADDR)),
32 f_switcher_sync(bus::idx_to_addr(cluster_idx, bus::REDAC_ADC_PSEUDO_BLOCK_IDX, ADC_STROBE_FADDR)) {}
33
34 [[nodiscard]] bool write(uint8_t channel, uint8_t output_idx) const {
35 auto cmd = decltype(f_switcher_prg)::chip_cmd_word(channel, output_idx);
36
37 if (!f_switcher_prg.transfer8(cmd))
38 return false;
39
40 f_switcher_sync.trigger();
41 return true;
42 }
43
44 void trigger() {
45 f_switcher_reset.trigger();
46 }
47};
48
50public:
52
53 uint16_t read_backplane_and_slot_id() const override;
54
55 bool write_adc_bus_mux(const std::array<carrier::ADCChannel, 8> &channels) override;
56 void reset_adc_bus_mux() override;
57
58private:
59 void set_standby(bool enabled) override;
60
61public:
62 // Function addresses
63 static constexpr uint8_t METADATA_FADDR = bus::METADATA_FUNC_IDX;
64 static constexpr uint8_t TEMPERATURE_FADDR = 1;
65 static constexpr uint8_t STANDBY_SET_FADDR = 3;
66 static constexpr uint8_t STANDBY_UNSET_FADDR = 2;
67
68 static const SPISettings BP_REDAC_ID_SPI_SETTINGS;
69 static constexpr uint8_t BP_REDAC_ID_FADDR = 2;
70
71protected:
73
74 // Functions to configure ADC signal switching matrices
77
79};
80
82public:
84
85 static constexpr uint8_t FP_SR_CLR = 4;
86 static constexpr uint8_t FP_SR_STO = 5;
87 static constexpr uint8_t FP_SR = 6;
88
89 bool write_fp_control_register(uint16_t state);
90
91protected:
92 const functions::SR74HCT595 fp_control; // Shift register for controlling mRedac front panel I/Os
95};
96
97class REDAC_V_1_1_X : public REDAC {
98public:
100
101 enum FrontPanelIOMode : uint8_t { ANALOG_OUT = 0b00000, ANALOG_IN = 0b00001, DIGITAL_OUT = 0b10000, DIGITAL_IN = 0b10001 };
102
103 // Sets to mode of the four I/O connections on the mREDAC front.
104 // Be aware that only IO0 can be configured as digital in and only IO1-IO3 can be configured as digital out.
105 //
106 // Available mapping:
107 // Analog signals:
108 // IO0: Analog in/out cluster 0, lane 28
109 // IO1: Analog in/out cluster 0, lane 29
110 // IO2: Analog in/out cluster 0, lane 30
111 // IO3: Analog in/out cluster 0, lane 31
112 //
113 // Digital signals:
114 // IO0: Digital in, EXTHALT
115 // IO1: Digital out PIN_DIO_6 (custom)
116 // IO2: Digital out ModeIC
117 // IO3: Digital out ModeOP
118 bool set_io_mode(uint8_t io_number, FrontPanelIOMode mode);
119 FrontPanelIOMode get_io_mode(uint8_t io_number) const;
120
121 // Sets the direction of the bidirectional DIO lines available on this board.
122 // Possible dio lines are 12, 13, 28 and 7.
123 // This feature doesn't get used right now.
124 bool set_DIO_direction(uint8_t dio_number, bool input_from_ctrl_block);
125 // Returns true if the designated line is an input viewed from the ctrl block side.
126 // Possible dio lines are 12, 13, 28 and 7.
127 bool get_DIO_direction(uint8_t dio_number) const;
128
129 UnitResult write_to_hardware() override;
130
131protected:
133
135};
136
137} // namespace platform
A DataFunction class wraps SPI communication over the digital bus.
Definition functions.h:47
DataFunction to transfer 32bit of data to the I-Block matrix command registry.
Definition icmd.h:19
The SR74HCT595 is an 8-Bit Shift Register with 3-State Output Registers.
Definition SR74HCT595.h:15
A trigger function exploits the fact that setting an address on the bus triggers an action.
Definition functions.h:33
ADCFunction_V_1_0_X(uint8_t cluster_idx)
Definition redac.h:29
bool write(uint8_t channel, uint8_t output_idx) const
Definition redac.h:34
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
static constexpr uint8_t TEMPERATURE_FADDR
Definition redac.h:64
static constexpr uint8_t METADATA_FADDR
Definition redac.h:63
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
Definition bus.h:21
Definition mode.h:14
entities::EntitySharedHardware< REDAC_HAL > REDAC_HAL_Parent
Definition redac.h:14