00001
00038 #ifndef SPI_SPI_MEGA_XMEGA_H_INCLUDED
00039 #define SPI_SPI_MEGA_XMEGA_H_INCLUDED
00040
00041 #include <assert.h>
00042 #include <stdbool.h>
00043 #include <buffer.h>
00044 #include <board/spi.h>
00045
00181 void spi_priv_master_init(spi_id_t spi_id, struct spi_master *master);
00182
00192 void spi_priv_master_setup_device(spi_id_t spi_id, struct spi_device *device,
00193 spi_flags_t flags, unsigned long baud_rate,
00194 board_spi_select_id_t sel_id);
00195
00202 void spi_priv_select_device(struct spi_master *master,
00203 struct spi_device *device);
00204
00211 void spi_priv_deselect_device(struct spi_master *master,
00212 struct spi_device *device);
00213
00232 #define spi_id_is_valid(spi_id) (spi_id <= SPI_ID_LAST)
00233
00249 #define SPI_MASTER_TYPE_NAME(spi_id) spi_master_type##spi_id
00250
00257 #define DECLARE_SPI_MASTER(spi_id, varname) \
00258 struct SPI_MASTER_TYPE_NAME(spi_id) varname
00259
00274 #if SPI_ID_NATIVE_IS_ENABLED && !SPI_ID_UART_IS_ENABLED
00275 # define SPI_MUX(spi_id, native, uart) native
00276 #elif SPI_ID_UART_IS_ENABLED && !SPI_ID_NATIVE_IS_ENABLED
00277 # define SPI_MUX(spi_id, native, uart) uart
00278 #elif SPI_ID_NATIVE_IS_ENABLED && SPI_ID_UART_IS_ENABLED
00279 # define SPI_MUX(spi_id, native, uart) \
00280 if (spi_id < SPI_ID_UART_FIRST) \
00281 native; \
00282 else \
00283 uart
00284 #else
00285 # error No SPI ID enabled!
00286 #endif
00287
00294 static inline struct spi_master *spi_master_get_base(spi_id_t spi_id,
00295 void *priv)
00296 {
00297 assert(spi_id_is_valid(spi_id));
00298
00299 SPI_MUX(spi_id,
00300 return SPI_MASTER_NATIVE_GET_BASE(priv),
00301 return NULL);
00302 }
00303
00309 static inline size_t spi_master_get_size(spi_id_t spi_id)
00310 {
00311 assert(spi_id_is_valid(spi_id));
00312
00313 SPI_MUX(spi_id,
00314 return sizeof(struct SPI_MASTER_NATIVE_TYPE),
00315 return 0);
00316 }
00317
00323 #define SPI_DEVICE_TYPE_NAME(spi_id) spi_device_type##spi_id
00324
00331 #define DECLARE_SPI_DEVICE(spi_id, varname) \
00332 struct SPI_DEVICE_TYPE_NAME(spi_id) varname
00333
00340 static inline struct spi_device *spi_device_get_base(spi_id_t spi_id,
00341 void *priv)
00342 {
00343 assert(spi_id_is_valid(spi_id));
00344
00345 SPI_MUX(spi_id,
00346 return SPI_DEVICE_NATIVE_GET_BASE(priv),
00347 return NULL);
00348 }
00349
00355 static inline size_t spi_device_get_size(spi_id_t spi_id)
00356 {
00357 assert(spi_id_is_valid(spi_id));
00358
00359 SPI_MUX(spi_id,
00360 return sizeof(struct SPI_DEVICE_NATIVE_TYPE),
00361 return 0);
00362 }
00363
00364 static inline void spi_enable(spi_id_t spi_id)
00365 {
00366 assert(spi_id_is_valid(spi_id));
00367
00368 SPI_MUX(spi_id,
00369 spi_priv_enable(spi_id),
00370 do {} while (0));
00371 }
00372
00373 static inline void spi_disable(spi_id_t spi_id)
00374 {
00375 assert(spi_id_is_valid(spi_id));
00376
00377 SPI_MUX(spi_id,
00378 spi_priv_disable(spi_id),
00379 do {} while (0));
00380 }
00381
00382 static inline bool spi_is_enabled(spi_id_t spi_id)
00383 {
00384 assert(spi_id_is_valid(spi_id));
00385
00386 SPI_MUX(spi_id,
00387 return spi_priv_is_enabled(spi_id),
00388 return false);
00389 }
00390
00391 static inline void spi_master_init(spi_id_t spi_id,
00392 struct spi_master *spi_master)
00393 {
00394 SPI_MUX(spi_id,
00395 spi_priv_master_init(spi_id, spi_master),
00396 do {} while (0));
00397 }
00398
00399 static inline void spi_master_setup_device(spi_id_t spi_id,
00400 struct spi_master *spi_master, struct spi_device *spi_device,
00401 spi_flags_t flags, unsigned long baud_rate,
00402 board_spi_select_id_t sel_id)
00403 {
00404 SPI_MUX(spi_id,
00405 spi_priv_master_setup_device(spi_id, spi_device, flags,
00406 baud_rate, sel_id),
00407 do {} while (0));
00408 }
00409
00410 static inline void spi_select_device(spi_id_t spi_id,
00411 struct spi_master *master, struct spi_device *device)
00412 {
00413 SPI_MUX(spi_id,
00414 spi_priv_select_device(master, device),
00415 do {} while (0));
00416 }
00417
00418 static inline void spi_deselect_device(spi_id_t spi_id,
00419 struct spi_master *master, struct spi_device *device)
00420 {
00421 SPI_MUX(spi_id,
00422 spi_priv_deselect_device(master, device),
00423 do {} while (0));
00424 }
00425
00426 static inline void spi_write(spi_id_t spi_id, struct spi_master *master,
00427 const uint8_t *data, size_t len)
00428 {
00429 spi_polled_write(master, data, len);
00430 }
00431
00432 static inline void spi_read(spi_id_t spi_id, struct spi_master *master,
00433 uint8_t *data, size_t len)
00434 {
00435 spi_polled_read(master, data, len);
00436 }
00437
00438 static inline void spi_exchange(spi_id_t spi_id, struct spi_master *master,
00439 const uint8_t *write, uint8_t *read, size_t len)
00440 {
00441 spi_polled_exchange(master, write, read, len);
00442 }
00443
00444 static inline void spi_write_buf_list(spi_id_t spi_id,
00445 struct spi_master *master, struct slist *buf_list)
00446 {
00447 spi_polled_write_buf_list(master, buf_list);
00448 }
00449
00450 static inline void spi_read_buf_list(spi_id_t spi_id,
00451 struct spi_master *master, struct slist *buf_list)
00452 {
00453 spi_polled_read_buf_list(master, buf_list);
00454 }
00455
00456 static inline void spi_exchange_buf_list(spi_id_t spi_id,
00457 struct spi_master *master, struct slist *write_buf_list,
00458 struct slist *read_buf_list)
00459 {
00460 spi_polled_exchange_buf_list(master, write_buf_list, read_buf_list);
00461 }
00462
00464 #endif