ProtoCore v0.0.2
Deterministic, zero-heap network stack for embedded targets
Loading...
Searching...
No Matches
ad9238.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file ad9238.cpp
6 * @brief AD9238 SPI configuration-port codec - implementation.
7 */
8
10
11#if PC_ENABLE_AD9238
12
13bool pc_ad9238_build_instruction(bool read, uint16_t reg_addr, uint8_t nbytes, uint8_t out2[2])
14{
15 if (!out2 || nbytes == 0 || nbytes > 4 || reg_addr > 0x1FFF)
16 {
17 return false;
18 }
19 uint16_t w1w0 = (uint16_t)(nbytes - 1) & 0x3;
20 uint16_t word = (uint16_t)((read ? 0x8000u : 0x0000u) | (w1w0 << 13) | (reg_addr & 0x1FFFu));
21 out2[0] = (uint8_t)(word >> 8);
22 out2[1] = (uint8_t)(word & 0xFF);
23 return true;
24}
25
26size_t pc_ad9238_build_write(uint16_t reg_addr, uint8_t value, uint8_t *out, size_t cap)
27{
28 if (!out || cap < 3)
29 {
30 return 0;
31 }
32 uint8_t hdr[2];
33 if (!pc_ad9238_build_instruction(false, reg_addr, 1, hdr))
34 {
35 return 0;
36 }
37 out[0] = hdr[0];
38 out[1] = hdr[1];
39 out[2] = value;
40 return 3;
41}
42
43size_t pc_ad9238_build_read(uint16_t reg_addr, uint8_t *out, size_t cap)
44{
45 if (!out || cap < 2)
46 {
47 return 0;
48 }
49 uint8_t hdr[2];
50 if (!pc_ad9238_build_instruction(true, reg_addr, 1, hdr))
51 {
52 return 0;
53 }
54 out[0] = hdr[0];
55 out[1] = hdr[1];
56 return 2;
57}
58
59size_t pc_ad9238_build_transfer(uint8_t *out, size_t cap)
60{
61 return pc_ad9238_build_write((uint16_t)Ad9238Reg::AD9238_REG_DEVICE_UPDATE, 0x01, out, cap);
62}
63
64#endif // PC_ENABLE_AD9238
SPI configuration-port codec for the AD9238 (and the shared ADI high-speed-ADC SPI map it belongs to)...