182 {
185 }
186
187 if (!data || size == 0) {
189 }
190
191
192 if (
pImpl->async_state.active) {
194 }
195
196
198 if (!buffer.ok()) {
199 FL_WARN(
"SPI Device: Failed to acquire DMA buffer for async write");
201 }
202
203
204 fl::span<u8> buf_span = buffer.data();
205 if (buf_span.
size() < size) {
206 FL_WARN(
"SPI Device: Buffer size mismatch");
208 }
209
210 for (size_t i = 0; i < size; i++) {
211 buf_span[i] = data[i];
212 }
213
214
216 if (tx_result) {
217 FL_WARN(
"SPI Device: Failed to start async transmission");
219 }
220
221
222 pImpl->async_state.active =
true;
223 pImpl->async_state.tx_buffer = data;
224 pImpl->async_state.rx_buffer =
nullptr;
225 pImpl->async_state.size = size;
227
228
231 txn.pImpl->completed = false;
232
233 FL_LOG_SPI(
"SPI Device: Async write started (" << size <<
" bytes)");
235}
static expected failure(E err, const char *msg=nullptr) FL_NO_EXCEPT
Create error result.
static expected success(T value) FL_NO_EXCEPT
Create successful result.
constexpr fl::size size() const FL_NO_EXCEPT
bool isReady() const FL_NO_EXCEPT
Check if device is initialized and ready for use.
fl::unique_ptr< Impl > pImpl
DMABuffer acquireBuffer(size_t size) FL_NO_EXCEPT
Acquire DMA-capable buffer for zero-copy transmission.
fl::optional< fl::task::Error > transmit(DMABuffer &buffer, bool async=true) FL_NO_EXCEPT
Transmit from previously acquired DMA buffer.
#define FL_LOG_SPI(...)
Serial Peripheral Interface (SPI) logging Logs SPI configuration, initialization, and transfers.
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NO_EXCEPT
fl::u32 millis() FL_NO_EXCEPT
Universal millisecond timer - returns milliseconds since system startup.