REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
tblock.cpp
Go to the documentation of this file.
1#include "teensy/tblock.h"
2
3#include <bitset>
4
5using namespace blocks;
6
8 4'000'000, MSBFIRST, SPI_MODE2 /* Chip expects MODE0, CLK is inverted on the way, but MOSI is not, thus CLK must be shifted */};
9
10TBlockHAL_V_1_0_X::TBlockHAL_V_1_0_X(bus::addr_t block_address)
11 : TBlockHAL_Parent(block_address, 7), f_set_mux_disable{bus::replace_function_idx(block_address, 5)},
12 f_reset_mux_disable{bus::replace_function_idx(block_address, 6)}, f_reset_connections{bus::replace_function_idx(block_address, 4)},
13 f_connections{bus::replace_function_idx(block_address, 2), 7, F_CONNECTION_SPI_SETTINGS}, f_connections_sync{
14 bus::replace_function_idx(block_address, 3)} {}
15
17
19
20bool TBlockHAL_V_1_0_X::write_muxes(std::array<uint8_t, NUM_SWITCHES> muxes) {
21 // Order of muxes in function argument is sources for output [bpl_ch0, cl0_ch0, cl1_ch0, cl2_ch0, bpl_ch1,
22 // ... cl2_ch23]
23 std::array<uint8_t, NUM_REGISTERS> data{};
24 for (auto idx = 0u; idx < data.size(); idx++) {
25 // Fill up MOSI buffer in reverse because MSBFirst flag doesnt mirror the byte order but only the bytes
26 // alone
27 data[data.size() - 1 - idx] = (muxes[idx * 4 + 3] << 6) | (muxes[idx * 4 + 2] << 4) | (muxes[idx * 4 + 1] << 2) | muxes[idx * 4 + 0];
28 }
29
30 auto success = f_connections.transfer(data.data(), nullptr, data.size());
31 f_connections_sync.trigger();
32 return success;
33}
34
36 f_reset_connections.trigger();
37#ifdef ANABRID_PEDANTIC
38 std::array<uint8_t, 24> data{0};
39 f_connections.transfer(data.data(), data.data(), data.size());
40 return std::all_of(data.begin(), data.end(), [](auto value) { return value == 0; });
41#else
42 return true;
43#endif
44}
45
46TBlock *TBlock::from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address) {
47 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
48 return nullptr;
49
50 if (classifier.version < entities::Version(1, 0, 2))
51 // Version 1.0.1 was manufactured without any muxers on them :)
52 return nullptr;
53 if (classifier.version < entities::Version(1, 1)) {
54 auto *new_tblock = new TBlock(new TBlockHAL_V_1_0_X(block_address));
55 new_tblock->classifier = classifier;
56 return new_tblock;
57 }
58 return nullptr;
59}
60
61TBlockBackplane *TBlockBackplane::from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address) {
62 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
63 return nullptr;
64
65 if (classifier.version < entities::Version(1, 0, 0))
66 return nullptr;
67 if (classifier.version < entities::Version(1, 1)) {
68 auto *new_tblock = new TBlockBackplane(new TBlockBackplaneHAL_V_1_0_X(block_address));
69 new_tblock->classifier = classifier;
70 return new_tblock;
71 }
72 return nullptr;
73}
74
75// Backplane T Block
77 4'000'000, MSBFIRST, SPI_MODE2 /* Chip expects MODE0, CLK is inverted on the way, but MOSI is not, thus CLK must be shifted */};
78
80 : TBlockBackplaneHAL_Parent(block_address, 0xff), f_set_mux_disable{bus::replace_function_idx(block_address, 5)},
81 f_reset_mux_disable{bus::replace_function_idx(block_address, 6)}, f_connections{bus::replace_function_idx(block_address, 2), 0xff,
83 f_reset_connections{bus::replace_function_idx(block_address, 4)}, f_connections_sync{bus::replace_function_idx(block_address, 3)} {}
84
85template <size_t NumBits>
86constexpr auto bitset2array(const std::bitset<NumBits>& bits)
87 -> std::array<uint8_t, (NumBits + 7) / 8>
88{
89 constexpr size_t NumBytes = (NumBits + 7) / 8;
90 std::array<uint8_t, NumBytes> result{};
91
92 for (size_t i = 0; i < NumBits; ++i) {
93 if (bits[i]) {
94 result[i / 8] |= (1 << (7 - i % 8));
95 }
96 }
97
98 return result;
99}
100
101bool TBlockBackplaneHAL_V_1_0_X::write_muxes(std::array<uint8_t, NUM_SWITCHES> muxes) {
102 // Order of mux data is completly crazy, as we have 3 bits per mux. So each byte holds partial data for three muxes
103 // Fill up MOSI buffer in reverse because MSBFirst flag doesnt mirror the byte order but only the bytes
104 // alone
105
106 std::bitset<NUM_SWITCHES * 3> out_data;
107
108 for (uint16_t idx = 0; idx < muxes.size(); idx++) {
109 uint16_t rev_idx = muxes.size() - idx - 1;
110 uint16_t slot = rev_idx * 3;
111 out_data[slot + 0] = muxes[idx] & (1 << 2);
112 out_data[slot + 1] = muxes[idx] & (1 << 1);
113 out_data[slot + 2] = muxes[idx] & (1 << 0);
114 }
115
116 auto array = bitset2array(out_data);
117 auto success = f_connections.transfer(array.data(), nullptr, NUM_REGISTERS);
118 f_connections_sync.trigger();
119 return success;
120}
121
123 f_reset_connections.trigger();
124#ifdef ANABRID_PEDANTIC
125 std::array<uint8_t, NUM_REGISTERS> data{0};
126 f_connections.transfer(data.data(), data.data(), data.size());
127 return std::all_of(data.begin(), data.end(), [](auto value) { return value == 0; });
128#else
129 return true;
130#endif
131}
132
134
HAL class for TBlockBackplane version 1.0.1.
Definition tblock.h:45
const functions::TriggerFunction f_reset_connections
Definition tblock.h:51
const functions::TriggerFunction f_connections_sync
Definition tblock.h:52
const functions::SR74HCT595 f_connections
Definition tblock.h:50
const functions::TriggerFunction f_reset_mux_disable
Definition tblock.h:48
static const SPISettings F_CONNECTION_SPI_SETTINGS
Definition tblock.h:54
const functions::TriggerFunction f_set_mux_disable
Definition tblock.h:47
bool write_muxes(std::array< uint8_t, NUM_SWITCHES > muxes) override
Definition tblock.cpp:101
TBlockBackplaneHAL_V_1_0_X(bus::addr_t block_address)
Definition tblock.cpp:79
HAL class for TBlock version 1.0.1.
Definition tblock.h:19
const functions::TriggerFunction f_reset_mux_disable
Definition tblock.h:22
void reset_mux_disable() override
Definition tblock.cpp:18
bool write_muxes(std::array< uint8_t, NUM_SWITCHES > muxes) override
Definition tblock.cpp:20
static const SPISettings F_CONNECTION_SPI_SETTINGS
Definition tblock.h:27
TBlockHAL_V_1_0_X(bus::addr_t block_address)
Definition tblock.cpp:10
const functions::TriggerFunction f_set_mux_disable
Definition tblock.h:21
void set_mux_disable() override
Definition tblock.cpp:16
const functions::TriggerFunction f_connections_sync
Definition tblock.h:25
const functions::TriggerFunction f_reset_connections
Definition tblock.h:23
bool reset_muxes() override
Definition tblock.cpp:35
const functions::SR74HCT595 f_connections
Definition tblock.h:24
static constexpr int success
Definition flasher.cpp:275
constexpr auto bitset2array(const std::bitset< NumBits > &bits) -> std::array< uint8_t,(NumBits+7)/8 >
Definition tblock.cpp:86
entities::EntitySharedHardware< TBlockHAL > TBlockHAL_Parent
Definition tblock.h:14
entities::EntitySharedHardware< TBlockBackplaneHAL > TBlockBackplaneHAL_Parent
Definition tblock.h:40
Definition bus.h:21