pw_spi: Introduce SPI HAL
This change introduces a new SPI HAL API, featuring abstractions
enabling a target device to communicate with SPI peripherals in
a portable and consistent fashion.
Change-Id: Idc085c4727abb9247732c40cc84d05ee4113bd78
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/70140
Reviewed-by: Ewout van Bekkum <ewout@google.com>
Reviewed-by: Keir Mierle <keir@google.com>
Commit-Queue: Mark Slevinsky <markslevinsky@google.com>
diff --git a/pw_spi/spi_test.cc b/pw_spi/spi_test.cc
new file mode 100644
index 0000000..21e5178
--- /dev/null
+++ b/pw_spi/spi_test.cc
@@ -0,0 +1,75 @@
+// Copyright 2021 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include <array>
+#include <optional>
+
+#include "gtest/gtest.h"
+#include "pw_spi/chip_selector.h"
+#include "pw_spi/device.h"
+#include "pw_spi/initiator.h"
+#include "pw_status/status.h"
+#include "pw_sync/borrow.h"
+#include "pw_sync/mutex.h"
+
+namespace pw::spi {
+namespace {
+
+const pw::spi::Config kConfig = {.polarity = ClockPolarity::kActiveHigh,
+ .phase = ClockPhase::kFallingEdge,
+ .bits_per_word = BitsPerWord(8),
+ .bit_order = BitOrder::kMsbFirst};
+
+class SpiTestDevice : public ::testing::Test {
+ public:
+ SpiTestDevice()
+ : initiator_(),
+ chip_selector_(),
+ initiator_lock_(),
+ borrowable_initiator_(initiator_, initiator_lock_),
+ device_(borrowable_initiator_, kConfig, chip_selector_) {}
+
+ private:
+ // Stub SPI Initiator/ChipSelect objects, used to exercise public API surface.
+ class TestInitiator : public Initiator {
+ public:
+ Status Configure(const Config& /*config */) override { return OkStatus(); };
+ Status WriteRead(ConstByteSpan /* write_buffer */,
+ ByteSpan /* read_buffer */) override {
+ return OkStatus();
+ };
+ };
+
+ class TestChipSelector : public ChipSelector {
+ public:
+ Status SetActive(bool /*active*/) override { return OkStatus(); }
+ };
+
+ TestInitiator initiator_;
+ TestChipSelector chip_selector_;
+ sync::VirtualMutex initiator_lock_;
+ sync::Borrowable<Initiator> borrowable_initiator_;
+ Device device_;
+};
+
+// Simple test ensuring the SPI HAL compiles
+TEST_F(SpiTestDevice, CompilationSucceeds) {
+ // arrange
+ // act
+ // assert
+ EXPECT_TRUE(true);
+}
+
+} // namespace
+} // namespace pw::spi