roo_display
API Documentation for roo_display
Loading...
Searching...
No Matches
spi.h
Go to the documentation of this file.
1#pragma once
2
3#include "roo_backport.h"
4#include "roo_backport/byte.h"
9
10namespace roo_display {
11
12template <int pinCS, typename SpiDevice, typename Gpio>
14 public:
15 SpiReadWriteTransaction(SpiDevice& device) : device_(device) {
16 device_.beginReadWriteTransaction();
17 Gpio::template setLow<pinCS>();
18 }
20 Gpio::template setHigh<pinCS>();
21 device_.endTransaction();
22 }
23
24 private:
25 SpiDevice& device_;
26};
27
28// Convenience helper class for device drivers that use 'chip select',
29// 'data/command', and optionally, 'reset' pins to control the underlying
30// transport such as SPI.
31// If pinRST is negative, it is ignored. Otherwise, it is set to HIGH.
32// If pinDC is negative, the methods cmdBegin() and cmdEnd() should not be
33// called.
34//
35// NOTE(dawidk): force-inlining the methods doesn't seem to do anything; they
36// are inlined already.
37template <int pinCS, int pinDC, int pinRST, typename SpiSettings,
38 typename Spi = DefaultSpi, typename Gpio = DefaultGpio>
40 public:
41 template <typename... Args>
43 : spi_(std::forward<Args>(args)...), device_(spi_) {
44 Gpio::setOutput(pinCS);
45 cs_h();
46
47 if (pinDC >= 0) {
48 Gpio::setOutput(pinDC);
49 dc_d();
50 }
51
52 if (pinRST >= 0) {
53 Gpio::setOutput(pinRST);
54 // Make sure that RESET is unclicked
55 Gpio::template setHigh<pinRST>();
56 }
57 }
58
59 void begin() __attribute__((always_inline)) { cs_l(); }
60
61 void end() __attribute__((always_inline)) {
62 device_.flush();
63 cs_h();
64 }
65
66 void cmdBegin() __attribute__((always_inline)) {
67 device_.flush();
68 dc_c();
69 }
70
71 void cmdEnd() __attribute__((always_inline)) {
72 device_.flush();
73 dc_d();
74 }
75
76 void init() { device_.init(); }
77
78 void beginReadWriteTransaction() { device_.beginReadWriteTransaction(); }
79
80 void beginWriteOnlyTransaction() { device_.beginWriteOnlyTransaction(); }
81
82 void endTransaction() { device_.endTransaction(); }
83
84 void flush() __attribute__((always_inline)) { device_.flush(); }
85
86 void write(uint8_t data) __attribute__((always_inline)) {
87 device_.write(data);
88 }
89
90 void write16(uint16_t data) __attribute__((always_inline)) {
91 device_.write16(data);
92 }
93
94 void write16x2(uint16_t a, uint16_t b) __attribute__((always_inline)) {
95 device_.write16x2(a, b);
96 }
97
98 void writeBytes(const roo::byte* data, uint32_t len) {
99 device_.writeBytes(data, len);
100 }
101
102 void fill16(const roo::byte* data, uint32_t repetitions) {
103 device_.fill16(data, repetitions);
104 }
105
106 void fill24(const roo::byte* data, uint32_t repetitions) {
107 device_.fill24(data, repetitions);
108 }
109
110 void async_blit(const roo::byte* data, size_t row_stride_bytes,
111 size_t row_bytes, size_t row_count) {
112 device_.async_blit(data, row_stride_bytes, row_bytes, row_count);
113 }
114
115 roo::byte transfer(roo::byte data) __attribute__((always_inline)) {
116 return device_.transfer(data);
117 }
118
119 uint16_t transfer16(uint16_t data) __attribute__((always_inline)) {
120 return device_.transfer16(data);
121 }
122
123 private:
124 Spi spi_;
125 typename Spi::Device<SpiSettings> device_;
126
127 void dc_c() { Gpio::template setLow<pinDC>(); }
128 void dc_d() { Gpio::template setHigh<pinDC>(); }
129 void cs_l() { Gpio::template setLow<pinCS>(); }
130 void cs_h() { Gpio::template setHigh<pinCS>(); }
131};
132
133} // namespace roo_display
SpiReadWriteTransaction(SpiDevice &device)
Definition spi.h:15
void writeBytes(const roo::byte *data, uint32_t len)
Definition spi.h:98
void end() __attribute__((always_inline))
Definition spi.h:61
void write16(uint16_t data) __attribute__((always_inline))
Definition spi.h:90
void cmdBegin() __attribute__((always_inline))
Definition spi.h:66
void beginReadWriteTransaction()
Definition spi.h:78
SpiTransport(Args &&... args)
Definition spi.h:42
void cmdEnd() __attribute__((always_inline))
Definition spi.h:71
void beginWriteOnlyTransaction()
Definition spi.h:80
void flush() __attribute__((always_inline))
Definition spi.h:84
uint16_t transfer16(uint16_t data) __attribute__((always_inline))
Definition spi.h:119
void fill24(const roo::byte *data, uint32_t repetitions)
Definition spi.h:106
roo::byte transfer(roo::byte data) __attribute__((always_inline))
Definition spi.h:115
void write16x2(uint16_t a, uint16_t b) __attribute__((always_inline))
Definition spi.h:94
void begin() __attribute__((always_inline))
Definition spi.h:59
void fill16(const roo::byte *data, uint32_t repetitions)
Definition spi.h:102
void write(uint8_t data) __attribute__((always_inline))
Definition spi.h:86
void async_blit(const roo::byte *data, size_t row_stride_bytes, size_t row_bytes, size_t row_count)
Definition spi.h:110
Defines 140 opaque HTML named colors.
esp32::Gpio DefaultGpio
Definition gpio.h:94