31 #include <string_view>
35 #include <sys/ioctl.h>
36 #include <linux/types.h>
46 template<auto Context>
55 SPI::s_device = open((
"/dev/spidev" + std::to_string(Context[0]) +
"." + std::to_string(Context[1])).c_str(), O_RDWR);
56 if (SPI::s_device == -1)
61 u32 speed = 1
'000'000;
64 if (ioctl(SPI::s_device, SPI_IOC_WR_MODE, &mode) < 0)
67 if (ioctl(SPI::s_device, SPI_IOC_WR_BITS_PER_WORD, &bitsPerWord) < 0)
70 if (ioctl(SPI::s_device, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0)
73 SPI::s_transfer.bits_per_word = bitsPerWord;
74 SPI::s_transfer.cs_change = 0;
75 SPI::s_transfer.delay_usecs = 0;
76 SPI::s_transfer.speed_hz = speed;
98 static void read(std::array<u8, N> &data) {
99 std::array<u8, N> dummyData;
101 SPI::s_transfer.tx_buf =
reinterpret_cast<u64>(dummyData.data());
102 SPI::s_transfer.rx_buf =
reinterpret_cast<u64>(data.data());
103 SPI::s_transfer.len = data.size();
105 ioctl(SPI::s_device, SPI_IOC_MESSAGE(1), &SPI::s_transfer);
115 static void write(
const std::array<u8, N> &data) {
116 std::array<u8, N> dummyData;
117 SPI::s_transfer.tx_buf =
reinterpret_cast<u64>(data.data());
118 SPI::s_transfer.tx_buf =
reinterpret_cast<u64>(dummyData.data());
119 SPI::s_transfer.len = data.size();
121 ioctl(SPI::s_device, SPI_IOC_MESSAGE(1), &SPI::s_transfer);
132 if (ioctl(SPI::s_device, SPI_IOC_RD_MODE, &value) < 0)
135 value &= ~SPI_MODE_3;
138 case bsp::drv::SPIMode::_0:
141 case bsp::drv::SPIMode::_1:
144 case bsp::drv::SPIMode::_2:
152 ioctl(SPI::s_device, SPI_IOC_WR_MODE, &value);
156 static inline int s_device = -1;
157 static inline spi_ioc_transfer s_transfer;