C/C++ API Reference
Loading...
Searching...
No Matches
register_device.h
1// Copyright 2021 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16#include "pw_bytes/endian.h"
17#include "pw_bytes/span.h"
18#include "pw_chrono/system_clock.h"
19#include "pw_i2c/address.h"
20#include "pw_i2c/device.h"
21#include "pw_i2c/initiator.h"
22#include "pw_result/result.h"
23#include "pw_status/status.h"
24#include "pw_status/try.h"
25
26namespace pw {
27namespace i2c {
28
30
31enum class RegisterAddressSize {
32 k1Byte = 1,
33 k2Bytes = 2,
34 k4Bytes = 4,
35};
36
42class RegisterDevice : public Device {
43 public:
59 constexpr RegisterDevice(Initiator& initiator,
60 Address address,
61 endian register_address_order,
62 endian data_order,
63 RegisterAddressSize register_address_size)
64 : Device(initiator, address),
65 register_address_order_(register_address_order),
66 data_order_(data_order),
67 register_address_size_(register_address_size) {}
68
83 constexpr RegisterDevice(Initiator& initiator,
84 Address address,
85 endian order,
86 RegisterAddressSize register_address_size)
87 : Device(initiator, address),
88 register_address_order_(order),
89 data_order_(order),
90 register_address_size_(register_address_size) {}
91
135 Status WriteRegisters(uint32_t register_address,
136 ConstByteSpan register_data,
137 ByteSpan buffer,
139
142 Status WriteRegisters8(uint32_t register_address,
143 span<const uint8_t> register_data,
144 ByteSpan buffer,
146
149 Status WriteRegisters16(uint32_t register_address,
150 span<const uint16_t> register_data,
151 ByteSpan buffer,
153
156 Status WriteRegisters32(uint32_t register_address,
157 span<const uint32_t> register_data,
158 ByteSpan buffer,
160
198 Status ReadRegisters(uint32_t register_address,
199 ByteSpan return_data,
201
204 Status ReadRegisters8(uint32_t register_address,
205 span<uint8_t> return_data,
207
210 Status ReadRegisters16(uint32_t register_address,
211 span<uint16_t> return_data,
213
216 Status ReadRegisters32(uint32_t register_address,
217 span<uint32_t> return_data,
219
255 Status WriteRegister(uint32_t register_address,
256 std::byte register_data,
258
261 Status WriteRegister8(uint32_t register_address,
262 uint8_t register_data,
264
267 Status WriteRegister16(uint32_t register_address,
268 uint16_t register_data,
270
273 Status WriteRegister32(uint32_t register_address,
274 uint32_t register_data,
276
309 Result<std::byte> ReadRegister(uint32_t register_address,
311
314 Result<uint8_t> ReadRegister8(uint32_t register_address,
316
319 Result<uint16_t> ReadRegister16(uint32_t register_address,
321
324 Result<uint32_t> ReadRegister32(uint32_t register_address,
326
327 private:
328 // Helper write registers.
329 Status WriteRegisters(uint32_t register_address,
330 ConstByteSpan register_data,
331 const size_t register_data_size,
332 ByteSpan buffer,
334
335 const endian register_address_order_;
336 const endian data_order_;
337 const RegisterAddressSize register_address_size_;
338};
339
341 uint32_t register_address,
342 ConstByteSpan register_data,
343 ByteSpan buffer,
345 return WriteRegisters(register_address,
346 register_data,
347 sizeof(decltype(register_data)::value_type),
348 buffer,
349 timeout);
350}
351
353 uint32_t register_address,
354 span<const uint8_t> register_data,
355 ByteSpan buffer,
357 return WriteRegisters(register_address,
358 as_bytes(register_data),
359 sizeof(decltype(register_data)::value_type),
360 buffer,
361 timeout);
362}
363
365 uint32_t register_address,
366 span<const uint16_t> register_data,
367 ByteSpan buffer,
369 return WriteRegisters(register_address,
370 as_bytes(register_data),
371 sizeof(decltype(register_data)::value_type),
372 buffer,
373 timeout);
374}
375
377 uint32_t register_address,
378 span<const uint32_t> register_data,
379 ByteSpan buffer,
381 return WriteRegisters(register_address,
382 as_bytes(register_data),
383 sizeof(decltype(register_data)::value_type),
384 buffer,
385 timeout);
386}
387
389 uint32_t register_address,
390 std::byte register_data,
392 std::array<std::byte, sizeof(register_data) + sizeof(register_address)>
393 byte_buffer;
394 return WriteRegisters(register_address,
395 span(&register_data, 1),
396 sizeof(register_data),
397 byte_buffer,
398 timeout);
399}
400
402 uint32_t register_address,
403 uint8_t register_data,
405 std::array<std::byte, sizeof(register_data) + sizeof(register_address)>
406 byte_buffer;
407 return WriteRegisters(register_address,
408 as_bytes(span(&register_data, 1)),
409 sizeof(register_data),
410 byte_buffer,
411 timeout);
412}
413
415 uint32_t register_address,
416 uint16_t register_data,
418 std::array<std::byte, sizeof(register_data) + sizeof(register_address)>
419 byte_buffer;
420 return WriteRegisters(register_address,
421 as_bytes(span(&register_data, 1)),
422 sizeof(register_data),
423 byte_buffer,
424 timeout);
425}
426
428 uint32_t register_address,
429 uint32_t register_data,
431 std::array<std::byte, sizeof(register_data) + sizeof(register_address)>
432 byte_buffer;
433 return WriteRegisters(register_address,
434 as_bytes(span(&register_data, 1)),
435 sizeof(register_data),
436 byte_buffer,
437 timeout);
438}
439
441 uint32_t register_address,
442 span<uint8_t> return_data,
444 // For a single byte, there's no endian data, and so we can return the
445 // data as is.
446 return ReadRegisters(
447 register_address, as_writable_bytes(return_data), timeout);
448}
449
451 uint32_t register_address,
452 span<uint16_t> return_data,
454 PW_TRY(
455 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
456
457 // Post process endian information.
458 for (uint16_t& register_value : return_data) {
459 register_value = bytes::ReadInOrder<uint16_t>(data_order_, &register_value);
460 }
461
462 return pw::OkStatus();
463}
464
466 uint32_t register_address,
467 span<uint32_t> return_data,
469 PW_TRY(
470 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
471
472 // TODO: b/185952662 - Extend endian in pw_byte to support this conversion
473 // as optimization.
474 // Post process endian information.
475 for (uint32_t& register_value : return_data) {
476 register_value = bytes::ReadInOrder<uint32_t>(data_order_, &register_value);
477 }
478
479 return pw::OkStatus();
480}
481
483 uint32_t register_address, chrono::SystemClock::duration timeout) {
484 std::byte data = {};
485 PW_TRY(ReadRegisters(register_address, span(&data, 1), timeout));
486 return data;
487}
488
490 uint32_t register_address, chrono::SystemClock::duration timeout) {
491 uint8_t data = 0;
492 PW_TRY(ReadRegisters8(register_address, span(&data, 1), timeout));
493 return data;
494}
495
497 uint32_t register_address, chrono::SystemClock::duration timeout) {
498 std::array<uint16_t, 1> data = {};
499 PW_TRY(ReadRegisters16(register_address, data, timeout));
500 return data[0];
501}
502
504 uint32_t register_address, chrono::SystemClock::duration timeout) {
505 std::array<uint32_t, 1> data = {};
506 PW_TRY(ReadRegisters32(register_address, data, timeout));
507 return data[0];
508}
509
510} // namespace i2c
511} // namespace pw
512
513// TODO (zengk): Register modification.
Definition: poll.h:25
Definition: status.h:86
Definition: address.h:42
Definition: device.h:38
The common, base driver interface for initiating thread-safe transactions with devices on an I2C bus....
Definition: initiator.h:52
Definition: register_device.h:42
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:90
Status WriteRegister8(uint32_t register_address, uint8_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:401
Result< std::byte > ReadRegister(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:482
Status WriteRegisters8(uint32_t register_address, span< const uint8_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:352
Status ReadRegisters(uint32_t register_address, ByteSpan return_data, chrono::SystemClock::duration timeout)
Result< uint16_t > ReadRegister16(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:496
Status WriteRegister(uint32_t register_address, std::byte register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:388
Status ReadRegisters8(uint32_t register_address, span< uint8_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:440
constexpr RegisterDevice(Initiator &initiator, Address address, endian register_address_order, endian data_order, RegisterAddressSize register_address_size)
Definition: register_device.h:59
Result< uint32_t > ReadRegister32(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:503
Result< uint8_t > ReadRegister8(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:489
Status ReadRegisters32(uint32_t register_address, span< uint32_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:465
Status WriteRegister16(uint32_t register_address, uint16_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:414
Status WriteRegisters16(uint32_t register_address, span< const uint16_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:364
Status WriteRegisters(uint32_t register_address, ConstByteSpan register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:340
Status WriteRegisters32(uint32_t register_address, span< const uint32_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:376
Status ReadRegisters16(uint32_t register_address, span< uint16_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:450
Status WriteRegister32(uint32_t register_address, uint32_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:427
constexpr RegisterDevice(Initiator &initiator, Address address, endian order, RegisterAddressSize register_address_size)
Definition: register_device.h:83
The Pigweed namespace.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:235