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
11std::array<functions::AD5452, 32> FLASHMEM
12blocks::CBlockHAL_Common::make_f_coeffs(bus::addr_t block_address, std::array<const uint8_t, 32> f_coeffs_cs) {
13 return {functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[0])),
14 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[1])),
15 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[2])),
16 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[3])),
17 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[4])),
18 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[5])),
19 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[6])),
20 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[7])),
21 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[8])),
22 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[9])),
23 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[10])),
24 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[11])),
25 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[12])),
26 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[13])),
27 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[14])),
28 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[15])),
29 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[16])),
30 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[17])),
31 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[18])),
32 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[19])),
33 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[20])),
34 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[21])),
35 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[22])),
36 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[23])),
37 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[24])),
38 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[25])),
39 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[26])),
40 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[27])),
41 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[28])),
42 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[29])),
43 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[30])),
44 functions::AD5452(bus::replace_function_idx(block_address, f_coeffs_cs[31]))};
45}
46
47FLASHMEM blocks::CBlockHAL_Common::CBlockHAL_Common(bus::addr_t block_address,
48 std::array<const uint8_t, 32> f_coeffs_cs)
49 : f_meta(block_address), f_coeffs(make_f_coeffs(block_address, f_coeffs_cs)) {}
50
51FLASHMEM bool blocks::CBlockHAL_Common::write_factor(uint8_t idx, float value) {
52 if (idx >= 32)
53 return false;
54 // NOTE: The current hardware does not allow any error detection here.
55 f_coeffs[idx].set_scale(value);
56 return true;
57}
58
59FLASHMEM blocks::CBlockHAL_V_1_1_X::CBlockHAL_V_1_1_X(bus::addr_t block_address)
60 /*
61 * Wrong oder of connection on IC2 was fixed, the addresses are
62 * - FADDR[0...35] = CS[0...35]
63 * - 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],
64 * because 2nd & 3rd bit of FADDR is not decoded
65 * - FADDR >= 48 are decoded correctly but not used
66 */
67 : CBlockHAL_Common(block_address, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
68 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}) {}
69
70FLASHMEM blocks::CBlockHAL_V_1_0_X::CBlockHAL_V_1_0_X(bus::addr_t block_address)
71 /*
72 * Due to wrong order of connections on IC2, the addresses are mixed up
73 * - FADDR[0...15] = CS[0...15] = [EEPROM, Coeffs[0...14]]
74 * - FADDR[32+0...32+15] = CS[16...31] = Coeffs[15...30]
75 * - FADDR[16+0...16+3] = CS[32+0...32+3] = [Coeff31, TMP127, UNUSED, UNUSED]
76 * - 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],
77 * because 2nd & 3rd bit of FADDR is not decoded
78 * - FADDR >= 48 are decoded correctly but not used
79 */
80 : CBlockHAL_Common(block_address, {1, 2, 3, 4, 5, 6, 7, 8,
81 9, 10, 11, 12, 13, 14, 15, 32 + 0,
82 32 + 1, 32 + 2, 32 + 3, 32 + 4, 32 + 5, 32 + 6, 32 + 7, 32 + 8,
83 32 + 9, 32 + 10, 32 + 11, 32 + 12, 32 + 13, 32 + 14, 32 + 15, 16}) {}
CBlockHAL_Common(bus::addr_t block_address, std::array< const uint8_t, 32 > f_coeffs_cs)
Definition cblock.cpp:47
bool write_factor(uint8_t idx, float value) override
Definition cblock.cpp:51
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:12
CBlockHAL_V_1_0_X(bus::addr_t block_address)
Definition cblock.cpp:70
CBlockHAL_V_1_1_X(bus::addr_t block_address)
Definition cblock.cpp:59
The AD5452 is the 12-Bit Multiplying DAC, used in the C-Block (one AD5452 per lane).
Definition AD5452.h:16