REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
cblock.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#include <block/cblock.h>
6#include <chips/AD5452.h>
7#include <utils/logging.h>
8
9#include "teensy/cblock.h"
10
11FLASHMEM blocks::CBlock *blocks::CBlock::from_entity_classifier(entities::EntityClassifier classifier,
12 const bus::addr_t block_address) {
13 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
14 return nullptr;
15
16 if (classifier.version < entities::Version(1, 0))
17 return nullptr;
18 if (classifier.version < entities::Version(1, 1)) {
19 auto *new_block = new CBlock(new CBlockHAL_V_1_0_X(block_address));
20 new_block->classifier = classifier;
21 return new_block;
22 }
23 if (classifier.version < entities::Version(1, 2)) {
24 auto *new_block = new CBlock(new CBlockHAL_V_1_1_X(block_address));
25 new_block->classifier = classifier;
26 return new_block;
27 }
28
29 // Any unknown versuin results in a nullptr here.
30 return nullptr;
31}
32
33std::array<functions::AD5452, 32> FLASHMEM
34blocks::CBlockHAL_Common::make_f_coeffs(bus::addr_t block_address, std::array<const uint8_t, 32> f_coeffs_cs) {
35 return {functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[0])),
36 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[1])),
37 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[2])),
38 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[3])),
39 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[4])),
40 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[5])),
41 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[6])),
42 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[7])),
43 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[8])),
44 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[9])),
45 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[10])),
46 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[11])),
47 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[12])),
48 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[13])),
49 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[14])),
50 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[15])),
51 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[16])),
52 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[17])),
53 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[18])),
54 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[19])),
55 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[20])),
56 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[21])),
57 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[22])),
58 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[23])),
59 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[24])),
60 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[25])),
61 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[26])),
62 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[27])),
63 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[28])),
64 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[29])),
65 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[30])),
66 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[31]))};
67}
68
69FLASHMEM blocks::CBlockHAL_Common::CBlockHAL_Common(bus::addr_t block_address,
70 bus::addr_t temperature_sensor_address,
71 std::array<const uint8_t, 32> f_coeffs_cs)
72 : blocks::CBlockHAL_Parent(/*f_meta*/ block_address,
73 /*temperature_sensor*/ temperature_sensor_address),
74 f_coeffs(make_f_coeffs(block_address, f_coeffs_cs)) {}
75
76FLASHMEM bool blocks::CBlockHAL_Common::write_factor(uint8_t idx, float value) {
77 if (idx >= 32)
78 return false;
79 // NOTE: The current hardware does not allow any error detection here.
80 f_coeffs[idx].set_scale(value);
81 return true;
82}
83
84FLASHMEM blocks::CBlockHAL_V_1_1_X::CBlockHAL_V_1_1_X(bus::addr_t block_address)
85 /*
86 * Wrong oder of connection on IC2 was fixed, the addresses are
87 * - FADDR[0...35] = CS[0...35]
88 * - but also FADDR[32+4+0...32+4+3] = FADDR[32+8+0...32+8+3] = FADDR[32+8+4+0...32+8+4+3] = CS[32..35],
89 * because 2nd & 3rd bit of FADDR is not decoded
90 * - FADDR >= 48 are decoded correctly but not used
91 */
92 : CBlockHAL_Common(block_address, bus::replace_function_idx(block_address, 33),
93 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
94 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}) {}
95
96FLASHMEM blocks::CBlockHAL_V_1_0_X::CBlockHAL_V_1_0_X(bus::addr_t block_address)
97 /*
98 * Due to wrong order of connections on IC2, the addresses are mixed up
99 * - FADDR[0...15] = CS[0...15] = [EEPROM, Coeffs[0...14]]
100 * - FADDR[32+0...32+15] = CS[16...31] = Coeffs[15...30]
101 * - FADDR[16+0...16+3] = CS[32+0...32+3] = [Coeff31, TMP127, UNUSED, UNUSED]
102 * - but also FADDR[16+4+0...16+4+3] = FADDR[16+8+0...16+8+3] = FADDR[16+8+4+0...16+8+4+3],
103 * because 2nd & 3rd bit of FADDR is not decoded
104 * - FADDR >= 48 are decoded correctly but not used
105 */
106 : CBlockHAL_Common(block_address, bus::replace_function_idx(block_address, 17),
107 {1, 2, 3, 4, 5, 6, 7, 8,
108 9, 10, 11, 12, 13, 14, 15, 32 + 0,
109 32 + 1, 32 + 2, 32 + 3, 32 + 4, 32 + 5, 32 + 6, 32 + 7, 32 + 8,
110 32 + 9, 32 + 10, 32 + 11, 32 + 12, 32 + 13, 32 + 14, 32 + 15, 16}) {}
bool write_factor(uint8_t idx, float value) override
Definition cblock.cpp:76
CBlockHAL_Common(bus::addr_t block_address, bus::addr_t temperature_sensor_address, std::array< const uint8_t, 32 > f_coeffs_cs)
Definition cblock.cpp:69
static std::array< functions::AD5452, 32 > make_f_coeffs(bus::addr_t block_address, std::array< const uint8_t, 32 > f_coeffs_cs)
Definition cblock.cpp:34
CBlockHAL_V_1_0_X(bus::addr_t block_address)
Definition cblock.cpp:96
CBlockHAL_V_1_1_X(bus::addr_t block_address)
Definition cblock.cpp:84
The AD5452 is the 12-Bit Multiplying DAC, used in the C-Block (one AD5452 per lane).
Definition AD5452.h:16
Definition bus.h:21