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