12
#include "stm32_spi_l0x0.h"
14
#include <drivers/spi.h>
15
#include <kernel/irq.h>
17
#include <drivers/gpio/gpio.h>
19
static struct stm32_spi stm32_spi1 = {0};
21
static int stm32_spi_setup(struct stm32_spi *dev, bool is_master) {
22
dev->is_master = is_master;
24
if (!dev->is_master) {
25
log_error("SPI slave mode is not supported!");
32
static const uint32_t br =
33
#if OPTION_GET(NUMBER,dev) == 2
35
#elif OPTION_GET(NUMBER,dev) == 4
37
#elif OPTION_GET(NUMBER,dev) == 8
39
#elif OPTION_GET(NUMBER,dev) == 16
41
#elif OPTION_GET(NUMBER,dev) == 32
43
#elif OPTION_GET(NUMBER,dev) == 64
45
#elif OPTION_GET(NUMBER,dev) == 128
47
#elif OPTION_GET(NUMBER,dev) == 256
50
#error "SPI param <<dev>> has not set!"
54
SPI1->CR1 = (OPTION_GET(NUMBER,spha) << 0) |
55
(OPTION_GET(NUMBER,spol) << 1) |
58
SPI1->CR1 |= (1 << 6);
63
int stm32_spi_init(struct stm32_spi *dev) {
64
return stm32_spi_setup(dev, true);
67
static int stm32_spi_select(struct spi_device *dev, int cs) {
71
static int stm32_spi_set_mode(struct spi_device *dev, bool is_master) {
72
struct stm32_spi *s = dev->priv;
73
return stm32_spi_setup(s, is_master);
76
static int stm32_spi_transfer(struct spi_device *dev, uint8_t *inbuf,
77
uint8_t *outbuf, int count) {
78
uint32_t tx_byte = count;
79
uint32_t rx_bute = count;
82
if (SPI1->SR & (1 << 0)) {
88
while(!(SPI1->SR & (1 << 1))) {};
95
while (!(SPI1->SR & (1 << 0)));
104
struct spi_ops stm32_spi_ops = {
105
.select = stm32_spi_select,
106
.set_mode = stm32_spi_set_mode,
107
.transfer = stm32_spi_transfer
110
static int stm32_spi1_init(void) {
111
gpio_setup_mode(OPTION_GET(NUMBER,port_mosi), 1 << OPTION_GET(NUMBER,pin_mosi), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
112
gpio_setup_mode(OPTION_GET(NUMBER,port_miso), 1 << OPTION_GET(NUMBER,pin_miso), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
113
gpio_setup_mode(OPTION_GET(NUMBER,port_sck), 1 << OPTION_GET(NUMBER,pin_sck), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
115
stm32_spi_init(&stm32_spi1);
119
#define SPI_DEV_NAME stm32_spi_1
121
SPI_DEV_DEF(SPI_DEV_NAME, &stm32_spi_ops, &stm32_spi1, 1);
122
EMBOX_UNIT_INIT(stm32_spi1_init);