bsp/atsam: Add SPI bus driver

This commit is contained in:
Alexander Krutwig
2016-09-16 10:07:03 +02:00
parent a42be52bbf
commit 0ab86d091a
6 changed files with 770 additions and 0 deletions
+6
View File
@@ -53,6 +53,8 @@ include_bsp_HEADERS += include/irq.h
include_bsp_HEADERS += include/pin-config.h
include_bsp_HEADERS += include/atsam-i2c.h
include_bsp_HEADERS += include/i2c.h
include_bsp_HEADERS += include/atsam-spi.h
include_bsp_HEADERS += include/spi.h
include_bsp_HEADERS += include/power.h
include_libchipdir = $(includedir)/libchip
@@ -437,6 +439,10 @@ endif
libbsp_a_SOURCES += i2c/atsam_i2c_bus.c
libbsp_a_SOURCES += i2c/atsam_i2c_init.c
# SPI
libbsp_a_SOURCES += spi/atsam_spi_bus.c
libbsp_a_SOURCES += spi/atsam_spi_init.c
# RTC
libbsp_a_SOURCES += ../../shared/tod.c
libbsp_a_SOURCES += rtc/rtc-config.c
@@ -0,0 +1,61 @@
/*
* Copyright (c) 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifndef LIBBSP_ARM_ATSAM_ATSAM_SPI_H
#define LIBBSP_ARM_ATSAM_ATSAM_SPI_H
#include <libchip/chip.h>
#include <libchip/include/pio.h>
#include <bsp.h>
#include <dev/spi/spi.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define DEFAULT_SPI0_CS 0
#define DEFAULT_SPI_CLOCK 500000
#define REGISTER_COMMAND_LENGTH 2
typedef struct {
spi_bus base;
Spi *regs;
rtems_vector_number irq;
uint32_t board_id;
uint32_t msg_todo;
const spi_ioc_transfer *msgs;
rtems_id task_id;
sXdmad Dma;
Spid SpiDma;
uint32_t dma_tx_channel;
uint32_t dma_rx_channel;
bool rx_transfer_done;
bool tx_transfer_done;
} atsam_spi_bus;
int spi_bus_register_atsam(
const char *bus_path,
Spi *register_base,
rtems_vector_number irq,
size_t pin_amount,
const Pin *pins
);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* LIBBSP_ARM_ATSAM_ATSAM_SPI_H */
+36
View File
@@ -0,0 +1,36 @@
/*
* Copyright (c) 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifndef LIBBSP_ARM_ATSAM_SPI_H
#define LIBBSP_ARM_ATSAM_SPI_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define ATSAM_SPI_0_BUS_PATH "/dev/spi-0"
#define ATSAM_SPI_1_BUS_PATH "/dev/spi-1"
#define ATSAM_SPI_2_BUS_PATH "/dev/spi-2"
int atsam_register_spi_0(void);
int atsam_register_spi_1(void);
int atsam_register_spi_2(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* LIBBSP_ARM_ATSAM_SPI_H */
+8
View File
@@ -141,6 +141,14 @@ $(PROJECT_INCLUDE)/bsp/i2c.h: include/i2c.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/i2c.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/i2c.h
$(PROJECT_INCLUDE)/bsp/atsam-spi.h: include/atsam-spi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/atsam-spi.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/atsam-spi.h
$(PROJECT_INCLUDE)/bsp/spi.h: include/spi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/spi.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/spi.h
$(PROJECT_INCLUDE)/bsp/power.h: include/power.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/power.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/power.h
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,83 @@
/*
* Copyright (c) 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#include <bsp/atsam-spi.h>
#include <bsp/spi.h>
/** SPI0 MISO pin */
#define PIN_SPI0_MISO {PIO_PD20B_SPI0_MISO, PIOD, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT}
/** SPI0 MOSI pin */
#define PIN_SPI0_MOSI {PIO_PD21B_SPI0_MOSI, PIOD, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT}
/** SPI0 CS0 pin */
#define PIN_SPI0_NPCS0 {PIO_PB2D_SPI0_NPCS0, PIOB, ID_PIOB, PIO_PERIPH_D, PIO_DEFAULT}
/** SPI0 CS1_1 pin */
#define PIN_SPI0_NPCS1_1 {PIO_PA31A_SPI0_NPCS1, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT}
/** SPI0 CS1_2 pin */
#define PIN_SPI0_NPCS1_2 {PIO_PD25B_SPI0_NPCS1, PIOD, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT}
/** SPI0 CS2 pin */
#define PIN_SPI0_NPCS2 {PIO_PD12C_SPI0_NPCS2, PIOD, ID_PIOD, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI0 CS3 pin */
#define PIN_SPI0_NPCS3 {PIO_PD27B_SPI0_NPCS3, PIOD, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT}
/** SPI0 Clock pin */
#define PIN_SPI0_CLOCK {PIO_PD22B_SPI0_SPCK, PIOD, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT}
/** SPI1 MISO pin */
#define PIN_SPI1_MISO {PIO_PC26C_SPI1_MISO, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 MOSI pin */
#define PIN_SPI1_MOSI {PIO_PC27C_SPI1_MOSI, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS0 pin */
#define PIN_SPI1_NPCS0 {PIO_PC25C_SPI1_NPCS0, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS1_1 pin */
#define PIN_SPI1_NPCS1_1 {PIO_PC28C_SPI1_NPCS1, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS1_2 pin */
#define PIN_SPI1_NPCS1_2 {PIO_PD0C_SPI1_NPCS1, PIOD, ID_PIOD, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS2_1 pin */
#define PIN_SPI1_NPCS2_1 {PIO_PC29C_SPI1_NPCS2, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS2_2 pin */
#define PIN_SPI1_NPCS2_2 {PIO_PD1C_SPI1_NPCS2, PIOD, ID_PIOD, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS3_1 pin */
#define PIN_SPI1_NPCS3_1 {PIO_PC30C_SPI1_NPCS3, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 CS3_2 pin */
#define PIN_SPI1_NPCS3_2 {PIO_PD2C_SPI1_NPCS3, PIOD, ID_PIOD, PIO_PERIPH_C, PIO_DEFAULT}
/** SPI1 Clock pin */
#define PIN_SPI1_CLOCK {PIO_PC24C_SPI1_SPCK, PIOC, ID_PIOC, PIO_PERIPH_C, PIO_DEFAULT}
int atsam_register_spi_0(void)
{
static const Pin pins[] = {PIN_SPI0_MISO, PIN_SPI0_MOSI, PIN_SPI0_NPCS0,
PIN_SPI0_NPCS1_1, PIN_SPI0_NPCS1_2, PIN_SPI0_NPCS2, PIN_SPI0_NPCS3,
PIN_SPI0_CLOCK};
return spi_bus_register_atsam(
ATSAM_SPI_0_BUS_PATH,
SPI0,
ID_SPI0,
8,
pins);
}
int atsam_register_spi_1(void)
{
static const Pin pins[] = {PIN_SPI1_MISO, PIN_SPI1_MOSI, PIN_SPI1_NPCS0,
PIN_SPI1_NPCS1_1, PIN_SPI1_NPCS1_2, PIN_SPI1_NPCS2_1,
PIN_SPI1_NPCS2_2, PIN_SPI1_NPCS3_1, PIN_SPI1_NPCS3_2,
PIN_SPI1_CLOCK};
return spi_bus_register_atsam(
ATSAM_SPI_1_BUS_PATH,
SPI1,
ID_SPI1,
10,
pins);
}