mbed-drivers
SPI.h
1 /*
2  * Copyright (c) 2006-2016, ARM Limited, All Rights Reserved
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License"); you may
6  * not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #ifndef MBED_SPI_H
18 #define MBED_SPI_H
19 
20 #include "platform.h"
21 
22 #if DEVICE_SPI
23 
24 #include "spi_api.h"
25 
26 #if DEVICE_SPI_ASYNCH
27 #include "CThunk.h"
28 #include "dma_api.h"
29 #include "CircularBuffer.h"
30 #include "core-util/FunctionPointer.h"
31 #include "Transaction.h"
32 
33 #ifndef YOTTA_CFG_MBED_DRIVERS_SPI_TRANSACTION_QUEUE
34 # define YOTTA_CFG_MBED_DRIVERS_SPI_TRANSACTION_QUEUE 16
35 #endif
36 // backwards compatible guard for definition in `mbed-hal-<chip>/target_config.h`
37 #ifndef TRANSACTION_QUEUE_SIZE_SPI
38 # define TRANSACTION_QUEUE_SIZE_SPI YOTTA_CFG_MBED_DRIVERS_SPI_TRANSACTION_QUEUE
39 #endif
40 
41 #endif
42 
43 namespace mbed {
44 
53 class SPI {
54 
55 #if DEVICE_SPI_ASYNCH
56 public:
62  typedef mbed::util::FunctionPointer3<void, Buffer, Buffer, int> event_callback_t;
63 private:
66 #endif
67 public:
79  SPI(PinName mosi, PinName miso, PinName sclk);
80 
96  void format(int bits, int mode = 0, spi_bitorder_t order = SPI_MSB);
97 
102  void frequency(int hz = 1000000);
103 
111  virtual int write(int value);
112 
113 #if DEVICE_SPI_ASYNCH
115  friend SPI;
116  private:
117  SPITransferAdder(SPI *owner);
118  const SPITransferAdder & operator =(const SPITransferAdder &a);
120  public:
130  SPITransferAdder & tx(void *txBuf, size_t txSize);
140  SPITransferAdder & rx(void *rxBuf, size_t rxSize);
152  SPITransferAdder & callback(const event_callback_t &cb, int event);
158  int apply();
159  ~SPITransferAdder();
160  private:
161  transaction_data_t _td;
162  bool _applied;
163  int _rc;
164  SPI * _owner;
165  };
176 
179  void abort_transfer();
180 
183  void clear_transfer_buffer();
184 
187  void abort_all_transfers();
188 
194  int set_dma_usage(DMAUsage usage);
195 
196 protected:
200  void irq_handler_asynch(void);
201 
206  int queue_transfer(const transaction_data_t &td);
207 
212  void start_transfer(const transaction_data_t &td);
213 
218  void start_transaction(transaction_data_t *data);
219 
223  void dequeue_transaction();
224 
229  int transfer(const SPITransferAdder &xfer);
230 #endif
231 
232 public:
233  virtual ~SPI() {
234  }
235 
236 protected:
237  spi_t _spi;
238 
239 #if DEVICE_SPI_ASYNCH
240 #if TRANSACTION_QUEUE_SIZE_SPI
242 #endif
243  CThunk<SPI> _irq;
244  transaction_data_t _current_transaction;
245  DMAUsage _usage;
246 #endif
247 
248  void aquire(void);
249  static SPI *_owner;
250  int _bits;
251  int _mode;
252  spi_bitorder_t _order;
253  int _hz;
254  bool _busy;
255 };
256 
257 } // namespace mbed
258 
259 #endif
260 
261 #endif
Definition: Transaction.h:48
virtual int write(int value)
Definition: SPI.cpp:71
void abort_transfer()
Definition: SPI.cpp:93
int set_dma_usage(DMAUsage usage)
Definition: SPI.cpp:115
Definition: CircularBuffer.h:25
SPITransferAdder & callback(const event_callback_t &cb, int event)
Definition: SPI.cpp:225
void start_transaction(transaction_data_t *data)
Definition: SPI.cpp:154
SPITransferAdder transfer()
Definition: SPI.cpp:245
void irq_handler_asynch(void)
Definition: SPI.cpp:178
SPITransferAdder & tx(void *txBuf, size_t txSize)
Definition: SPI.cpp:211
mbed::util::FunctionPointer3< void, Buffer, Buffer, int > event_callback_t
Definition: SPI.h:62
void clear_transfer_buffer()
Definition: SPI.cpp:102
int queue_transfer(const transaction_data_t &td)
Definition: SPI.cpp:124
SPI(PinName mosi, PinName miso, PinName sclk)
Definition: SPI.cpp:31
void start_transfer(const transaction_data_t &td)
Definition: SPI.cpp:143
void dequeue_transaction()
Definition: SPI.cpp:159
void abort_all_transfers()
Definition: SPI.cpp:109
Definition: SPI.h:53
Definition: CThunk.h:70
Definition: SPI.h:114
void frequency(int hz=1000000)
Definition: SPI.cpp:54
int apply()
Definition: SPI.cpp:232
void format(int bits, int mode=0, spi_bitorder_t order=SPI_MSB)
Definition: SPI.cpp:46
Definition: BusIn.cpp:19
SPITransferAdder & rx(void *rxBuf, size_t rxSize)
Definition: SPI.cpp:218