xref: /aosp_15_r20/external/pigweed/pw_i2c/register_device_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker #include "pw_i2c/register_device.h"
15*61c4878aSAndroid Build Coastguard Worker 
16*61c4878aSAndroid Build Coastguard Worker #include <cstring>
17*61c4878aSAndroid Build Coastguard Worker 
18*61c4878aSAndroid Build Coastguard Worker #include "pw_assert/check.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/byte_builder.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
21*61c4878aSAndroid Build Coastguard Worker 
22*61c4878aSAndroid Build Coastguard Worker namespace pw {
23*61c4878aSAndroid Build Coastguard Worker namespace i2c {
24*61c4878aSAndroid Build Coastguard Worker namespace {
25*61c4878aSAndroid Build Coastguard Worker 
26*61c4878aSAndroid Build Coastguard Worker using ::pw::Status;
27*61c4878aSAndroid Build Coastguard Worker using namespace std::literals::chrono_literals;
28*61c4878aSAndroid Build Coastguard Worker 
29*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t kErrorValue = 0x11;
30*61c4878aSAndroid Build Coastguard Worker constexpr Address kTestDeviceAddress = Address::SevenBit<0x3F>();
31*61c4878aSAndroid Build Coastguard Worker 
32*61c4878aSAndroid Build Coastguard Worker constexpr chrono::SystemClock::duration kTimeout =
33*61c4878aSAndroid Build Coastguard Worker     std::chrono::duration_cast<chrono::SystemClock::duration>(100ms);
34*61c4878aSAndroid Build Coastguard Worker 
35*61c4878aSAndroid Build Coastguard Worker // Default test object. Mimics closely to I2c devices.
36*61c4878aSAndroid Build Coastguard Worker class TestInitiator : public Initiator {
37*61c4878aSAndroid Build Coastguard Worker  public:
TestInitiator()38*61c4878aSAndroid Build Coastguard Worker   explicit TestInitiator() {}
39*61c4878aSAndroid Build Coastguard Worker 
GetWriteBuffer()40*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& GetWriteBuffer() { return write_buffer_; }
41*61c4878aSAndroid Build Coastguard Worker 
SetReadData(ByteSpan read_data)42*61c4878aSAndroid Build Coastguard Worker   void SetReadData(ByteSpan read_data) {
43*61c4878aSAndroid Build Coastguard Worker     read_buffer_.append(read_data.data(), read_data.size());
44*61c4878aSAndroid Build Coastguard Worker   }
45*61c4878aSAndroid Build Coastguard Worker 
46*61c4878aSAndroid Build Coastguard Worker  private:
DoWriteReadFor(Address,ConstByteSpan tx_data,ByteSpan rx_data,chrono::SystemClock::duration)47*61c4878aSAndroid Build Coastguard Worker   Status DoWriteReadFor(Address,
48*61c4878aSAndroid Build Coastguard Worker                         ConstByteSpan tx_data,
49*61c4878aSAndroid Build Coastguard Worker                         ByteSpan rx_data,
50*61c4878aSAndroid Build Coastguard Worker                         chrono::SystemClock::duration) override {
51*61c4878aSAndroid Build Coastguard Worker     // Write
52*61c4878aSAndroid Build Coastguard Worker     if (!tx_data.empty()) {
53*61c4878aSAndroid Build Coastguard Worker       write_buffer_.append(tx_data.data(), tx_data.size());
54*61c4878aSAndroid Build Coastguard Worker     }
55*61c4878aSAndroid Build Coastguard Worker 
56*61c4878aSAndroid Build Coastguard Worker     // Read
57*61c4878aSAndroid Build Coastguard Worker     if (!rx_data.empty()) {
58*61c4878aSAndroid Build Coastguard Worker       PW_CHECK_UINT_EQ(
59*61c4878aSAndroid Build Coastguard Worker           read_buffer_.size(), rx_data.size(), "Buffer to read is too big");
60*61c4878aSAndroid Build Coastguard Worker       for (uint32_t i = 0; i < rx_data.size(); i++) {
61*61c4878aSAndroid Build Coastguard Worker         rx_data[i] = read_buffer_.data()[i];
62*61c4878aSAndroid Build Coastguard Worker       }
63*61c4878aSAndroid Build Coastguard Worker     }
64*61c4878aSAndroid Build Coastguard Worker 
65*61c4878aSAndroid Build Coastguard Worker     return OkStatus();
66*61c4878aSAndroid Build Coastguard Worker   }
67*61c4878aSAndroid Build Coastguard Worker 
68*61c4878aSAndroid Build Coastguard Worker   ByteBuffer<10> write_buffer_;
69*61c4878aSAndroid Build Coastguard Worker   ByteBuffer<10> read_buffer_;
70*61c4878aSAndroid Build Coastguard Worker };
71*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,Construction)72*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, Construction) {
73*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
74*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
75*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
76*61c4878aSAndroid Build Coastguard Worker                         endian::little,
77*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
78*61c4878aSAndroid Build Coastguard Worker }
79*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegisters8With2RegistersAnd1ByteAddress)80*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegisters8With2RegistersAnd1ByteAddress) {
81*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
82*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
83*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
84*61c4878aSAndroid Build Coastguard Worker                         endian::little,
85*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
86*61c4878aSAndroid Build Coastguard Worker 
87*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0xCD}, std::byte{0xEF}};
88*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 3> builder;
89*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
90*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(
91*61c4878aSAndroid Build Coastguard Worker       device.WriteRegisters(kRegisterAddress, register_data, builder, kTimeout),
92*61c4878aSAndroid Build Coastguard Worker       pw::OkStatus());
93*61c4878aSAndroid Build Coastguard Worker 
94*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
95*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(builder), test_device_builder.size());
96*61c4878aSAndroid Build Coastguard Worker 
97*61c4878aSAndroid Build Coastguard Worker   // Check address.
98*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress,
99*61c4878aSAndroid Build Coastguard Worker             static_cast<uint32_t>(test_device_builder.data()[0]));
100*61c4878aSAndroid Build Coastguard Worker 
101*61c4878aSAndroid Build Coastguard Worker   // Check data.
102*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
103*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k1Byte);
104*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
105*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(register_data[i], test_device_builder.data()[i + kAddressSize]);
106*61c4878aSAndroid Build Coastguard Worker   }
107*61c4878aSAndroid Build Coastguard Worker }
108*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegisters8With2RegistersAnd2ByteAddress)109*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegisters8With2RegistersAnd2ByteAddress) {
110*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
111*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
112*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
113*61c4878aSAndroid Build Coastguard Worker                         endian::little,
114*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
115*61c4878aSAndroid Build Coastguard Worker 
116*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0x89AB;
117*61c4878aSAndroid Build Coastguard Worker   std::byte register_data[2] = {std::byte{0xCD}, std::byte{0xEF}};
118*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 4> builder;
119*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(
120*61c4878aSAndroid Build Coastguard Worker       device.WriteRegisters(kRegisterAddress, register_data, builder, kTimeout),
121*61c4878aSAndroid Build Coastguard Worker       pw::OkStatus());
122*61c4878aSAndroid Build Coastguard Worker 
123*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
124*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(builder), test_device_builder.size());
125*61c4878aSAndroid Build Coastguard Worker 
126*61c4878aSAndroid Build Coastguard Worker   // Check address.
127*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
128*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
129*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
130*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
131*61c4878aSAndroid Build Coastguard Worker 
132*61c4878aSAndroid Build Coastguard Worker   // Check data.
133*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
134*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
135*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
136*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(register_data[i], test_device_builder.data()[i + kAddressSize]);
137*61c4878aSAndroid Build Coastguard Worker   }
138*61c4878aSAndroid Build Coastguard Worker }
139*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegisters16With2RegistersAnd2ByteAddress)140*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegisters16With2RegistersAnd2ByteAddress) {
141*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
142*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
143*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
144*61c4878aSAndroid Build Coastguard Worker                         endian::little,
145*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
146*61c4878aSAndroid Build Coastguard Worker 
147*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0x89AB;
148*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> register_data = {0xCDEF, 0x1234};
149*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 6> builder;
150*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegisters16(
151*61c4878aSAndroid Build Coastguard Worker                 kRegisterAddress, register_data, builder, kTimeout),
152*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
153*61c4878aSAndroid Build Coastguard Worker 
154*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
155*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(builder), test_device_builder.size());
156*61c4878aSAndroid Build Coastguard Worker 
157*61c4878aSAndroid Build Coastguard Worker   // Check address.
158*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
159*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
160*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
161*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
162*61c4878aSAndroid Build Coastguard Worker 
163*61c4878aSAndroid Build Coastguard Worker   // Check data.
164*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
165*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
166*61c4878aSAndroid Build Coastguard Worker 
167*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = kAddressSize, j = 0; i < test_device_builder.size();
168*61c4878aSAndroid Build Coastguard Worker        i += kAddressSize, j++) {
169*61c4878aSAndroid Build Coastguard Worker     uint16_t actualData;
170*61c4878aSAndroid Build Coastguard Worker     std::memcpy(
171*61c4878aSAndroid Build Coastguard Worker         &actualData, &test_device_builder.data()[i], sizeof(actualData));
172*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(register_data[j], actualData);
173*61c4878aSAndroid Build Coastguard Worker   }
174*61c4878aSAndroid Build Coastguard Worker }
175*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegisters16With2RegistersAnd2ByteAddressBigEndian)176*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegisters16With2RegistersAnd2ByteAddressBigEndian) {
177*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
178*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
179*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k2Bytes);
180*61c4878aSAndroid Build Coastguard Worker 
181*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0x89AB;
182*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> register_data = {0xCDEF, 0x1234};
183*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 6> builder;
184*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegisters16(
185*61c4878aSAndroid Build Coastguard Worker                 kRegisterAddress, register_data, builder, kTimeout),
186*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
187*61c4878aSAndroid Build Coastguard Worker 
188*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
189*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(builder), test_device_builder.size());
190*61c4878aSAndroid Build Coastguard Worker 
191*61c4878aSAndroid Build Coastguard Worker   // Check address.
192*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
193*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
194*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
195*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
196*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
197*61c4878aSAndroid Build Coastguard Worker 
198*61c4878aSAndroid Build Coastguard Worker   // Check data.
199*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
200*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
201*61c4878aSAndroid Build Coastguard Worker 
202*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = kAddressSize, j = 0; i < test_device_builder.size();
203*61c4878aSAndroid Build Coastguard Worker        i += kAddressSize, j++) {
204*61c4878aSAndroid Build Coastguard Worker     uint16_t actualData;
205*61c4878aSAndroid Build Coastguard Worker     std::memcpy(
206*61c4878aSAndroid Build Coastguard Worker         &actualData, &test_device_builder.data()[i], sizeof(actualData));
207*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &register_data[j]),
208*61c4878aSAndroid Build Coastguard Worker               actualData);
209*61c4878aSAndroid Build Coastguard Worker   }
210*61c4878aSAndroid Build Coastguard Worker }
211*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegisters8BufferTooSmall)212*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegisters8BufferTooSmall) {
213*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
214*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
215*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
216*61c4878aSAndroid Build Coastguard Worker                         endian::little,
217*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
218*61c4878aSAndroid Build Coastguard Worker 
219*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0x89AB;
220*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0xCD}, std::byte{0xEF}};
221*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> builder;
222*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(
223*61c4878aSAndroid Build Coastguard Worker       device.WriteRegisters(kRegisterAddress, register_data, builder, kTimeout),
224*61c4878aSAndroid Build Coastguard Worker       pw::Status::OutOfRange());
225*61c4878aSAndroid Build Coastguard Worker }
226*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister16With1ByteAddress)227*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister16With1ByteAddress) {
228*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
229*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
230*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
231*61c4878aSAndroid Build Coastguard Worker                         endian::little,
232*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
233*61c4878aSAndroid Build Coastguard Worker 
234*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
235*61c4878aSAndroid Build Coastguard Worker   constexpr uint16_t kRegisterData = 0xBCDE;
236*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister16(kRegisterAddress, kRegisterData, kTimeout),
237*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
238*61c4878aSAndroid Build Coastguard Worker 
239*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
240*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k1Byte);
241*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
242*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
243*61c4878aSAndroid Build Coastguard Worker 
244*61c4878aSAndroid Build Coastguard Worker   // Check address.
245*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress,
246*61c4878aSAndroid Build Coastguard Worker             static_cast<uint32_t>(test_device_builder.data()[0]));
247*61c4878aSAndroid Build Coastguard Worker 
248*61c4878aSAndroid Build Coastguard Worker   // Check data.
249*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
250*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
251*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * i)) & 0xFF,
252*61c4878aSAndroid Build Coastguard Worker         static_cast<uint16_t>(test_device_builder.data()[i + kAddressSize]));
253*61c4878aSAndroid Build Coastguard Worker   }
254*61c4878aSAndroid Build Coastguard Worker }
255*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister32With1ByteAddress)256*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister32With1ByteAddress) {
257*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
258*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
259*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
260*61c4878aSAndroid Build Coastguard Worker                         endian::little,
261*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
262*61c4878aSAndroid Build Coastguard Worker 
263*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
264*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterData = 0xBCCDDEEF;
265*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister32(kRegisterAddress, kRegisterData, kTimeout),
266*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
267*61c4878aSAndroid Build Coastguard Worker 
268*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
269*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k1Byte);
270*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
271*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
272*61c4878aSAndroid Build Coastguard Worker 
273*61c4878aSAndroid Build Coastguard Worker   // Check address.
274*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress,
275*61c4878aSAndroid Build Coastguard Worker             static_cast<uint32_t>(test_device_builder.data()[0]));
276*61c4878aSAndroid Build Coastguard Worker 
277*61c4878aSAndroid Build Coastguard Worker   // Check data.
278*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
279*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
280*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * i)) & 0xFF,
281*61c4878aSAndroid Build Coastguard Worker         static_cast<uint32_t>(test_device_builder.data()[i + kAddressSize]));
282*61c4878aSAndroid Build Coastguard Worker   }
283*61c4878aSAndroid Build Coastguard Worker }
284*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister16with2ByteAddress)285*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister16with2ByteAddress) {
286*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
287*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
288*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
289*61c4878aSAndroid Build Coastguard Worker                         endian::little,
290*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
291*61c4878aSAndroid Build Coastguard Worker 
292*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB23;
293*61c4878aSAndroid Build Coastguard Worker   constexpr uint16_t kRegisterData = 0xBCDD;
294*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister16(kRegisterAddress, kRegisterData, kTimeout),
295*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
296*61c4878aSAndroid Build Coastguard Worker 
297*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
298*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
299*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
300*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
301*61c4878aSAndroid Build Coastguard Worker 
302*61c4878aSAndroid Build Coastguard Worker   // Check address.
303*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
304*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
305*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
306*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
307*61c4878aSAndroid Build Coastguard Worker 
308*61c4878aSAndroid Build Coastguard Worker   // Check data.
309*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
310*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
311*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * i)) & 0xFF,
312*61c4878aSAndroid Build Coastguard Worker         static_cast<uint16_t>(test_device_builder.data()[i + kAddressSize]));
313*61c4878aSAndroid Build Coastguard Worker   }
314*61c4878aSAndroid Build Coastguard Worker }
315*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister16With1ByteAddressAndBigEndian)316*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister16With1ByteAddressAndBigEndian) {
317*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
318*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
319*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k1Byte);
320*61c4878aSAndroid Build Coastguard Worker 
321*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
322*61c4878aSAndroid Build Coastguard Worker   constexpr uint16_t kRegisterData = 0xBCDE;
323*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister16(kRegisterAddress, kRegisterData, kTimeout),
324*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
325*61c4878aSAndroid Build Coastguard Worker 
326*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
327*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k1Byte);
328*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
329*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
330*61c4878aSAndroid Build Coastguard Worker 
331*61c4878aSAndroid Build Coastguard Worker   // Check address.
332*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress,
333*61c4878aSAndroid Build Coastguard Worker             static_cast<uint32_t>(test_device_builder.data()[0]));
334*61c4878aSAndroid Build Coastguard Worker 
335*61c4878aSAndroid Build Coastguard Worker   // Check data.
336*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
337*61c4878aSAndroid Build Coastguard Worker     const uint32_t shift = test_device_builder.size() - kAddressSize - (i + 1);
338*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
339*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * shift)) & 0xFF,
340*61c4878aSAndroid Build Coastguard Worker         static_cast<uint16_t>(test_device_builder.data()[i + kAddressSize]));
341*61c4878aSAndroid Build Coastguard Worker   }
342*61c4878aSAndroid Build Coastguard Worker }
343*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister32With1ByteAddressAndBigEndian)344*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister32With1ByteAddressAndBigEndian) {
345*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
346*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
347*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k1Byte);
348*61c4878aSAndroid Build Coastguard Worker 
349*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
350*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterData = 0xBCCDDEEF;
351*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister32(kRegisterAddress, kRegisterData, kTimeout),
352*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
353*61c4878aSAndroid Build Coastguard Worker 
354*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
355*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k1Byte);
356*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
357*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
358*61c4878aSAndroid Build Coastguard Worker 
359*61c4878aSAndroid Build Coastguard Worker   // Check address.
360*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress,
361*61c4878aSAndroid Build Coastguard Worker             static_cast<uint32_t>(test_device_builder.data()[0]));
362*61c4878aSAndroid Build Coastguard Worker 
363*61c4878aSAndroid Build Coastguard Worker   // Check data.
364*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
365*61c4878aSAndroid Build Coastguard Worker     const uint32_t shift = test_device_builder.size() - kAddressSize - (i + 1);
366*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
367*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * shift)) & 0xFF,
368*61c4878aSAndroid Build Coastguard Worker         static_cast<uint32_t>(test_device_builder.data()[i + kAddressSize]));
369*61c4878aSAndroid Build Coastguard Worker   }
370*61c4878aSAndroid Build Coastguard Worker }
371*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister16With2ByteAddressAndBigEndian)372*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister16With2ByteAddressAndBigEndian) {
373*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
374*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
375*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k2Bytes);
376*61c4878aSAndroid Build Coastguard Worker 
377*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB11;
378*61c4878aSAndroid Build Coastguard Worker   constexpr uint16_t kRegisterData = 0xBCDF;
379*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister16(kRegisterAddress, kRegisterData, kTimeout),
380*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
381*61c4878aSAndroid Build Coastguard Worker 
382*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
383*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
384*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
385*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
386*61c4878aSAndroid Build Coastguard Worker 
387*61c4878aSAndroid Build Coastguard Worker   // Check address.
388*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
389*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
390*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
391*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
392*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
393*61c4878aSAndroid Build Coastguard Worker 
394*61c4878aSAndroid Build Coastguard Worker   // Check data.
395*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
396*61c4878aSAndroid Build Coastguard Worker     const uint32_t shift = test_device_builder.size() - kAddressSize - (i + 1);
397*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
398*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * shift)) & 0xFF,
399*61c4878aSAndroid Build Coastguard Worker         static_cast<uint16_t>(test_device_builder.data()[i + kAddressSize]));
400*61c4878aSAndroid Build Coastguard Worker   }
401*61c4878aSAndroid Build Coastguard Worker }
402*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegisters8ByteWith2RegistersAnd1ByteAddress)403*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegisters8ByteWith2RegistersAnd1ByteAddress) {
404*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
405*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
406*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
407*61c4878aSAndroid Build Coastguard Worker                         endian::little,
408*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
409*61c4878aSAndroid Build Coastguard Worker 
410*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0xCD}, std::byte{0xEF}};
411*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
412*61c4878aSAndroid Build Coastguard Worker 
413*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> buffer;
414*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
415*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.ReadRegisters(kRegisterAddress, buffer, kTimeout),
416*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
417*61c4878aSAndroid Build Coastguard Worker 
418*61c4878aSAndroid Build Coastguard Worker   // Check address.
419*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
420*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
421*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
422*61c4878aSAndroid Build Coastguard Worker 
423*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
424*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
425*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
426*61c4878aSAndroid Build Coastguard Worker 
427*61c4878aSAndroid Build Coastguard Worker   // Check data.
428*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(buffer); i++) {
429*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(buffer[i], register_data[i]);
430*61c4878aSAndroid Build Coastguard Worker   }
431*61c4878aSAndroid Build Coastguard Worker }
432*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegisters8IntWith2RegistersAnd1ByteAddress)433*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegisters8IntWith2RegistersAnd1ByteAddress) {
434*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
435*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
436*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
437*61c4878aSAndroid Build Coastguard Worker                         endian::little,
438*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
439*61c4878aSAndroid Build Coastguard Worker 
440*61c4878aSAndroid Build Coastguard Worker   std::array<uint8_t, 2> register_data = {0xCD, 0xEF};
441*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(
442*61c4878aSAndroid Build Coastguard Worker       as_writable_bytes(span(register_data.data(), register_data.size())));
443*61c4878aSAndroid Build Coastguard Worker 
444*61c4878aSAndroid Build Coastguard Worker   std::array<uint8_t, 2> buffer;
445*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
446*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.ReadRegisters8(kRegisterAddress, buffer, kTimeout),
447*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
448*61c4878aSAndroid Build Coastguard Worker 
449*61c4878aSAndroid Build Coastguard Worker   // Check address.
450*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
451*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
452*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
453*61c4878aSAndroid Build Coastguard Worker 
454*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
455*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
456*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
457*61c4878aSAndroid Build Coastguard Worker 
458*61c4878aSAndroid Build Coastguard Worker   // Check data.
459*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(buffer); i++) {
460*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(buffer[i], register_data[i]);
461*61c4878aSAndroid Build Coastguard Worker   }
462*61c4878aSAndroid Build Coastguard Worker }
463*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegisters8ByteWith2RegistersAnd2ByteAddress)464*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegisters8ByteWith2RegistersAnd2ByteAddress) {
465*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
466*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
467*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
468*61c4878aSAndroid Build Coastguard Worker                         endian::little,
469*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
470*61c4878aSAndroid Build Coastguard Worker 
471*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0xCD}, std::byte{0xEF}};
472*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
473*61c4878aSAndroid Build Coastguard Worker 
474*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> buffer;
475*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xABBA;
476*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.ReadRegisters(kRegisterAddress, buffer, kTimeout),
477*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
478*61c4878aSAndroid Build Coastguard Worker 
479*61c4878aSAndroid Build Coastguard Worker   // Check address.
480*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
481*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
482*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
483*61c4878aSAndroid Build Coastguard Worker 
484*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
485*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
486*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
487*61c4878aSAndroid Build Coastguard Worker 
488*61c4878aSAndroid Build Coastguard Worker   // Check data.
489*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(buffer); i++) {
490*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(buffer[i], register_data[i]);
491*61c4878aSAndroid Build Coastguard Worker   }
492*61c4878aSAndroid Build Coastguard Worker }
493*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegisters16With2RegistersAnd2ByteAddress)494*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegisters16With2RegistersAnd2ByteAddress) {
495*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
496*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
497*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
498*61c4878aSAndroid Build Coastguard Worker                         endian::little,
499*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
500*61c4878aSAndroid Build Coastguard Worker 
501*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> register_data = {0xCDEF, 0x1234};
502*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(
503*61c4878aSAndroid Build Coastguard Worker       as_writable_bytes(span(register_data.data(), register_data.size())));
504*61c4878aSAndroid Build Coastguard Worker 
505*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> buffer;
506*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
507*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.ReadRegisters16(kRegisterAddress, buffer, kTimeout),
508*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
509*61c4878aSAndroid Build Coastguard Worker 
510*61c4878aSAndroid Build Coastguard Worker   // Check address.
511*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
512*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
513*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
514*61c4878aSAndroid Build Coastguard Worker 
515*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
516*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
517*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
518*61c4878aSAndroid Build Coastguard Worker 
519*61c4878aSAndroid Build Coastguard Worker   // Check data.
520*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < buffer.size(); i++) {
521*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(buffer[i], register_data[i]);
522*61c4878aSAndroid Build Coastguard Worker   }
523*61c4878aSAndroid Build Coastguard Worker }
524*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegisters16With2RegistersAnd2ByteAddressBigEndian)525*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegisters16With2RegistersAnd2ByteAddressBigEndian) {
526*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
527*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
528*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k2Bytes);
529*61c4878aSAndroid Build Coastguard Worker 
530*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> register_data = {0xCDEF, 0x1234};
531*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(
532*61c4878aSAndroid Build Coastguard Worker       as_writable_bytes(span(register_data.data(), register_data.size())));
533*61c4878aSAndroid Build Coastguard Worker 
534*61c4878aSAndroid Build Coastguard Worker   std::array<uint16_t, 2> buffer;
535*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
536*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.ReadRegisters16(kRegisterAddress, buffer, kTimeout),
537*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
538*61c4878aSAndroid Build Coastguard Worker 
539*61c4878aSAndroid Build Coastguard Worker   // Check address.
540*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
541*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
542*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
543*61c4878aSAndroid Build Coastguard Worker 
544*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
545*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
546*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
547*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
548*61c4878aSAndroid Build Coastguard Worker 
549*61c4878aSAndroid Build Coastguard Worker   // Check data.
550*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < buffer.size(); i++) {
551*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &register_data[i]),
552*61c4878aSAndroid Build Coastguard Worker               buffer[i]);
553*61c4878aSAndroid Build Coastguard Worker   }
554*61c4878aSAndroid Build Coastguard Worker }
555*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister16With1ByteAddress)556*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister16With1ByteAddress) {
557*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
558*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
559*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
560*61c4878aSAndroid Build Coastguard Worker                         endian::little,
561*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
562*61c4878aSAndroid Build Coastguard Worker 
563*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0xCD}, std::byte{0xEF}};
564*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
565*61c4878aSAndroid Build Coastguard Worker 
566*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
567*61c4878aSAndroid Build Coastguard Worker   Result<uint16_t> result = device.ReadRegister16(kRegisterAddress, kTimeout);
568*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
569*61c4878aSAndroid Build Coastguard Worker   uint16_t read_data = result.value_or(kErrorValue);
570*61c4878aSAndroid Build Coastguard Worker 
571*61c4878aSAndroid Build Coastguard Worker   // Check address.
572*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
573*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
574*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
575*61c4878aSAndroid Build Coastguard Worker 
576*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
577*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
578*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
579*61c4878aSAndroid Build Coastguard Worker 
580*61c4878aSAndroid Build Coastguard Worker   // Check data.
581*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
582*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
583*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[i], static_cast<uint8_t>(register_data[i]));
584*61c4878aSAndroid Build Coastguard Worker   }
585*61c4878aSAndroid Build Coastguard Worker }
586*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister32With1ByteAddress)587*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister32With1ByteAddress) {
588*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
589*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
590*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
591*61c4878aSAndroid Build Coastguard Worker                         endian::little,
592*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k1Byte);
593*61c4878aSAndroid Build Coastguard Worker 
594*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 4> register_data = {
595*61c4878aSAndroid Build Coastguard Worker       std::byte{0x98}, std::byte{0x76}, std::byte{0x54}, std::byte{0x32}};
596*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
597*61c4878aSAndroid Build Coastguard Worker 
598*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
599*61c4878aSAndroid Build Coastguard Worker   Result<uint32_t> result = device.ReadRegister32(kRegisterAddress, kTimeout);
600*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
601*61c4878aSAndroid Build Coastguard Worker   uint32_t read_data = result.value_or(kErrorValue);
602*61c4878aSAndroid Build Coastguard Worker 
603*61c4878aSAndroid Build Coastguard Worker   // Check address.
604*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
605*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
606*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
607*61c4878aSAndroid Build Coastguard Worker 
608*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
609*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
610*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
611*61c4878aSAndroid Build Coastguard Worker 
612*61c4878aSAndroid Build Coastguard Worker   // Check data.
613*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
614*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
615*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[i], static_cast<uint8_t>(register_data[i]));
616*61c4878aSAndroid Build Coastguard Worker   }
617*61c4878aSAndroid Build Coastguard Worker }
618*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister16With2ByteAddress)619*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister16With2ByteAddress) {
620*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
621*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
622*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
623*61c4878aSAndroid Build Coastguard Worker                         endian::little,
624*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
625*61c4878aSAndroid Build Coastguard Worker 
626*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0x98}, std::byte{0x76}};
627*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
628*61c4878aSAndroid Build Coastguard Worker 
629*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xA4AB;
630*61c4878aSAndroid Build Coastguard Worker   Result<uint16_t> result = device.ReadRegister16(kRegisterAddress, kTimeout);
631*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
632*61c4878aSAndroid Build Coastguard Worker   uint16_t read_data = result.value_or(kErrorValue);
633*61c4878aSAndroid Build Coastguard Worker 
634*61c4878aSAndroid Build Coastguard Worker   // Check address.
635*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
636*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
637*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
638*61c4878aSAndroid Build Coastguard Worker 
639*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
640*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
641*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
642*61c4878aSAndroid Build Coastguard Worker 
643*61c4878aSAndroid Build Coastguard Worker   // Check data.
644*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
645*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
646*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[i], static_cast<uint8_t>(register_data[i]));
647*61c4878aSAndroid Build Coastguard Worker   }
648*61c4878aSAndroid Build Coastguard Worker }
649*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister16With1ByteAddressAndBigEndian)650*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister16With1ByteAddressAndBigEndian) {
651*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
652*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
653*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k1Byte);
654*61c4878aSAndroid Build Coastguard Worker 
655*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0x98}, std::byte{0x76}};
656*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
657*61c4878aSAndroid Build Coastguard Worker 
658*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
659*61c4878aSAndroid Build Coastguard Worker   Result<uint16_t> result = device.ReadRegister16(kRegisterAddress, kTimeout);
660*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
661*61c4878aSAndroid Build Coastguard Worker   uint16_t read_data = result.value_or(kErrorValue);
662*61c4878aSAndroid Build Coastguard Worker 
663*61c4878aSAndroid Build Coastguard Worker   // Check address.
664*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
665*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
666*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
667*61c4878aSAndroid Build Coastguard Worker 
668*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
669*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
670*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
671*61c4878aSAndroid Build Coastguard Worker 
672*61c4878aSAndroid Build Coastguard Worker   // Check data.
673*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
674*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
675*61c4878aSAndroid Build Coastguard Worker     const uint32_t kReadPointerIndex = sizeof(read_data) - 1 - i;
676*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[kReadPointerIndex],
677*61c4878aSAndroid Build Coastguard Worker               static_cast<uint8_t>(register_data[i]));
678*61c4878aSAndroid Build Coastguard Worker   }
679*61c4878aSAndroid Build Coastguard Worker }
680*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister32With1ByteAddressAndBigEndian)681*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister32With1ByteAddressAndBigEndian) {
682*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
683*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
684*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k1Byte);
685*61c4878aSAndroid Build Coastguard Worker 
686*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 4> register_data = {
687*61c4878aSAndroid Build Coastguard Worker       std::byte{0x98}, std::byte{0x76}, std::byte{0x54}, std::byte{0x32}};
688*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
689*61c4878aSAndroid Build Coastguard Worker 
690*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB;
691*61c4878aSAndroid Build Coastguard Worker   Result<uint32_t> result = device.ReadRegister32(kRegisterAddress, kTimeout);
692*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
693*61c4878aSAndroid Build Coastguard Worker   uint32_t read_data = result.value_or(kErrorValue);
694*61c4878aSAndroid Build Coastguard Worker 
695*61c4878aSAndroid Build Coastguard Worker   // Check address.
696*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
697*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k1Byte),
698*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
699*61c4878aSAndroid Build Coastguard Worker 
700*61c4878aSAndroid Build Coastguard Worker   const uint8_t kActualAddress = *(reinterpret_cast<uint8_t*>(
701*61c4878aSAndroid Build Coastguard Worker       const_cast<std::byte*>(address_buffer.data())));
702*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(kRegisterAddress, kActualAddress);
703*61c4878aSAndroid Build Coastguard Worker 
704*61c4878aSAndroid Build Coastguard Worker   // Check data.
705*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
706*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
707*61c4878aSAndroid Build Coastguard Worker     const uint32_t kReadPointerIndex = sizeof(read_data) - 1 - i;
708*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[kReadPointerIndex],
709*61c4878aSAndroid Build Coastguard Worker               static_cast<uint8_t>(register_data[i]));
710*61c4878aSAndroid Build Coastguard Worker   }
711*61c4878aSAndroid Build Coastguard Worker }
712*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister16With2ByteAddressAndBigEndian)713*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister16With2ByteAddressAndBigEndian) {
714*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
715*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(
716*61c4878aSAndroid Build Coastguard Worker       initiator, kTestDeviceAddress, endian::big, RegisterAddressSize::k2Bytes);
717*61c4878aSAndroid Build Coastguard Worker 
718*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0x98}, std::byte{0x76}};
719*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
720*61c4878aSAndroid Build Coastguard Worker 
721*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xABEF;
722*61c4878aSAndroid Build Coastguard Worker   Result<uint16_t> result = device.ReadRegister16(kRegisterAddress, kTimeout);
723*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
724*61c4878aSAndroid Build Coastguard Worker   uint16_t read_data = result.value_or(kErrorValue);
725*61c4878aSAndroid Build Coastguard Worker 
726*61c4878aSAndroid Build Coastguard Worker   // Check address.
727*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
728*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
729*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
730*61c4878aSAndroid Build Coastguard Worker 
731*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
732*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
733*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
734*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
735*61c4878aSAndroid Build Coastguard Worker 
736*61c4878aSAndroid Build Coastguard Worker   // Check data.
737*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
738*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
739*61c4878aSAndroid Build Coastguard Worker     const uint32_t kReadPointerIndex = sizeof(read_data) - 1 - i;
740*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[kReadPointerIndex],
741*61c4878aSAndroid Build Coastguard Worker               static_cast<uint8_t>(register_data[i]));
742*61c4878aSAndroid Build Coastguard Worker   }
743*61c4878aSAndroid Build Coastguard Worker }
744*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,ReadRegister16With2ByteBigEndianAddress)745*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, ReadRegister16With2ByteBigEndianAddress) {
746*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
747*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
748*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
749*61c4878aSAndroid Build Coastguard Worker                         endian::big,
750*61c4878aSAndroid Build Coastguard Worker                         endian::little,
751*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
752*61c4878aSAndroid Build Coastguard Worker 
753*61c4878aSAndroid Build Coastguard Worker   std::array<std::byte, 2> register_data = {std::byte{0x98}, std::byte{0x76}};
754*61c4878aSAndroid Build Coastguard Worker   initiator.SetReadData(register_data);
755*61c4878aSAndroid Build Coastguard Worker 
756*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xABEF;
757*61c4878aSAndroid Build Coastguard Worker   Result<uint16_t> result = device.ReadRegister16(kRegisterAddress, kTimeout);
758*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(result.ok());
759*61c4878aSAndroid Build Coastguard Worker   uint16_t read_data = result.value_or(kErrorValue);
760*61c4878aSAndroid Build Coastguard Worker 
761*61c4878aSAndroid Build Coastguard Worker   // Check address.
762*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& address_buffer = initiator.GetWriteBuffer();
763*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<uint32_t>(RegisterAddressSize::k2Bytes),
764*61c4878aSAndroid Build Coastguard Worker             address_buffer.size());
765*61c4878aSAndroid Build Coastguard Worker 
766*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
767*61c4878aSAndroid Build Coastguard Worker   std::memcpy(&kActualAddress, address_buffer.data(), sizeof(kActualAddress));
768*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
769*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
770*61c4878aSAndroid Build Coastguard Worker 
771*61c4878aSAndroid Build Coastguard Worker   // Check data.
772*61c4878aSAndroid Build Coastguard Worker   uint8_t* read_pointer = reinterpret_cast<uint8_t*>(&read_data);
773*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < sizeof(read_data); i++) {
774*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(read_pointer[i], static_cast<uint8_t>(register_data[i]));
775*61c4878aSAndroid Build Coastguard Worker   }
776*61c4878aSAndroid Build Coastguard Worker }
777*61c4878aSAndroid Build Coastguard Worker 
TEST(RegisterDevice,WriteRegister16with2ByteBigEndianAddress)778*61c4878aSAndroid Build Coastguard Worker TEST(RegisterDevice, WriteRegister16with2ByteBigEndianAddress) {
779*61c4878aSAndroid Build Coastguard Worker   TestInitiator initiator;
780*61c4878aSAndroid Build Coastguard Worker   RegisterDevice device(initiator,
781*61c4878aSAndroid Build Coastguard Worker                         kTestDeviceAddress,
782*61c4878aSAndroid Build Coastguard Worker                         endian::big,
783*61c4878aSAndroid Build Coastguard Worker                         endian::little,
784*61c4878aSAndroid Build Coastguard Worker                         RegisterAddressSize::k2Bytes);
785*61c4878aSAndroid Build Coastguard Worker 
786*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kRegisterAddress = 0xAB11;
787*61c4878aSAndroid Build Coastguard Worker   constexpr uint16_t kRegisterData = 0xBCDF;
788*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(device.WriteRegister16(kRegisterAddress, kRegisterData, kTimeout),
789*61c4878aSAndroid Build Coastguard Worker             pw::OkStatus());
790*61c4878aSAndroid Build Coastguard Worker 
791*61c4878aSAndroid Build Coastguard Worker   constexpr uint32_t kAddressSize =
792*61c4878aSAndroid Build Coastguard Worker       static_cast<uint32_t>(RegisterAddressSize::k2Bytes);
793*61c4878aSAndroid Build Coastguard Worker   ByteBuilder& test_device_builder = initiator.GetWriteBuffer();
794*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(test_device_builder.size(), kAddressSize + sizeof(kRegisterData));
795*61c4878aSAndroid Build Coastguard Worker 
796*61c4878aSAndroid Build Coastguard Worker   // Check address.
797*61c4878aSAndroid Build Coastguard Worker   uint16_t kActualAddress;
798*61c4878aSAndroid Build Coastguard Worker   std::memcpy(
799*61c4878aSAndroid Build Coastguard Worker       &kActualAddress, test_device_builder.data(), sizeof(kActualAddress));
800*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(bytes::ReadInOrder<uint16_t>(endian::big, &kRegisterAddress),
801*61c4878aSAndroid Build Coastguard Worker             kActualAddress);
802*61c4878aSAndroid Build Coastguard Worker 
803*61c4878aSAndroid Build Coastguard Worker   // Check data.
804*61c4878aSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < test_device_builder.size() - kAddressSize; i++) {
805*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(
806*61c4878aSAndroid Build Coastguard Worker         (kRegisterData >> (8 * i)) & 0xFF,
807*61c4878aSAndroid Build Coastguard Worker         static_cast<uint16_t>(test_device_builder.data()[i + kAddressSize]));
808*61c4878aSAndroid Build Coastguard Worker   }
809*61c4878aSAndroid Build Coastguard Worker }
810*61c4878aSAndroid Build Coastguard Worker 
811*61c4878aSAndroid Build Coastguard Worker }  // namespace
812*61c4878aSAndroid Build Coastguard Worker }  // namespace i2c
813*61c4878aSAndroid Build Coastguard Worker }  // namespace pw
814