9 #pragma GCC optimize ("O2") 61 spi_trans SPIDevice::spi_trans_array[SPI_LOG_SIZE]
IN_CCM;
62 uint8_t SPIDevice::spi_trans_ptr=0;
66 #ifdef BOARD_SOFTWARE_SPI 69 #define SCK_H {sck_port->BSRRL = sck_pin; } 70 #define SCK_L {sck_port->BSRRH = sck_pin; } 72 #define MOSI_H {mosi_port->BSRRL = mosi_pin; } 73 #define MOSI_L {mosi_port->BSRRH = mosi_pin; } 75 #define MISO_read ((miso_port->IDR & miso_pin)!=0) 78 static void dly_spi() {
83 uint8_t SPIDevice::_transfer_s(uint8_t bt) {
85 for(
int ii = 0; ii < 8; ++ii) {
106 void SPIDevice::spi_soft_set_speed(){
147 #ifdef BOARD_SOFTWARE_SPI 149 return _transfer_s(out);
203 #ifdef BOARD_SOFTWARE_SPI 208 spi_soft_set_speed();
213 if (out !=
NULL && send_len) {
214 for (uint16_t i = 0; i < send_len; i++) {
219 if(recv !=
NULL && recv_len) {
220 for (uint16_t i = 0; i < recv_len; i++) {
221 recv[i] = _transfer_s(0xff);
257 #define MIN_DMA_BYTES 1 // 4 // write to 2-byte register not uses DMA, 4-byte command to DataFlash will 267 bool can_dma =
false;
292 memmove(
buffer[nb],out,send_len);
382 #ifdef BOARD_SOFTWARE_SPI 385 spi_soft_set_speed();
387 if (out !=
NULL && recv !=
NULL && len) {
388 for (uint16_t i = 0; i < len; i++) {
389 recv[i] = _transfer_s(out[i]);
415 if (out !=
NULL && recv !=
NULL && len) {
416 for (uint16_t i = 0; i < len; i++) {
435 if (!strcmp(spi_device_table[i].name, name)) {
436 desc = &spi_device_table[i];
466 if ( dev->
SPIx == SPI1)
467 return &board_spi_pins[0];
468 else if (dev->
SPIx == SPI2)
469 return &board_spi_pins[1];
470 else if (dev->
SPIx == SPI3)
471 return &board_spi_pins[2];
636 bool can_dma =
false;
681 #ifdef BOARD_SOFTWARE_SPI 695 sck_port = sck_dev->
GPIOx;
696 sck_pin = 1<<sck_bit;
708 mosi_port = mosi_dev->
GPIOx;
709 mosi_pin = 1<<mosi_bit;
720 miso_port = miso_dev->
GPIOx;
721 miso_pin = 1<<miso_bit;
777 spi_trans &p = spi_trans_array[spi_trans_ptr];
791 if(spi_trans_ptr>=SPI_LOG_SIZE) spi_trans_ptr=0;
804 uint32_t timeout = nbytes * 16;
940 spi_trans &p = spi_trans_array[spi_trans_ptr];
953 if(spi_trans_ptr>=SPI_LOG_SIZE) spi_trans_ptr=0;
1089 bool can_dma =
false;
static Handler get_handler(AP_HAL::MemberProc proc)
static uint32_t rw_workbyte[]
void mode(uint8_t output)
static void spi_disable_dma_req(const spi_dev *dev, uint16_t SPI_DMAReq)
#define BOARD_SPI3_MISO_PIN
const spi_pins * dev_to_spi_pins(const spi_dev *dev)
static void * owner[MAX_BUS_NUM]
F4Light::Semaphore SPIDevice::_semaphores [MAX_BUS_NUM] IN_CCM
#define LeaveCriticalSection
uint16_t send_strobe(const uint8_t *buffer, uint16_t len)
uint32_t DMA_PeripheralBaseAddr
#define assert_param(expr)
#define BOARD_SPI1_MOSI_PIN
#define DMA_CR_MSIZE_8BITS
void setup_isr_transfer()
void spi_set_speed(const spi_dev *dev, uint16_t baudPrescaler)
const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]
static void spi_attach_interrupt(const spi_dev *dev, Handler handler)
void setup_dma_transfer(const uint8_t *send, const uint8_t *recv, uint32_t btr)
static void spi_wait_busy(const spi_dev *dev)
static void * get_current_task()
static void task_resume(void *h)
void dma_clear_isr_bits(dma_stream stream)
Clear the ISR status bits for a given DMA stream.
static F4Light::Semaphore _semaphores[MAX_BUS_NUM]
static void spi_enable_dma_req(const spi_dev *dev, uint16_t SPI_DMAReq)
static AP_HAL::OwnPtr< F4Light::SPIDevice > _get_device(const char *name)
void spi_init(const spi_dev *dev)
Initialize and reset a SPI device.
uint8_t(* spi_WaitFunc)(uint8_t b)
void isr_transfer_finish()
-*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
void gpio_set_mode(const gpio_dev *const dev, uint8_t pin, gpio_pin_mode mode)
const uint8_t * _send_address
static uint8_t * buffer[MAX_BUS_NUM]
#define DMA_FIFOMode_Disable
void start_dma_transfer()
#define BOARD_SPI2_MISO_PIN
static uint8_t spi_rx_reg(const spi_dev *dev)
uint8_t do_transfer(bool is_DMA, uint32_t nbytes)
#define BOARD_SPI3_MOSI_PIN
int spimaster_transfer(const spi_dev *dev, const uint8_t *txbuf, uint16_t txcount, uint8_t *rxbuf, uint16_t rxcount)
const SPIDesc spi_device_table[]
static void spi_detach_interrupt(const spi_dev *dev)
bool set_speed(AP_HAL::Device::Speed speed) override
uint8_t dma_is_stream_enabled(dma_stream stream)
Check if a DMA stream is enabled.
#define BOARD_SPI2_MOSI_PIN
static AP_HAL::OwnPtr< AP_HAL::Device > dev
static void spi_disable_irq(const spi_dev *dev, spi_interrupt interrupt_flags)
#define DMA_FIFOThreshold_Full
static uint8_t spi_is_busy(const spi_dev *dev)
#define BOARD_SPI2_SCK_PIN
static const spi_pins board_spi_pins[]
static void spi_master_enable(const spi_dev *dev, spi_baud_rate baudPrescaler, spi_mode mode, uint16_t bitorder)
Configure GPIO bit modes for use as a SPI port's pins.
void dma_detach_interrupt(dma_stream stream)
Detach a DMA transfer interrupt handler.
static bool spi_is_irq_enabled(const spi_dev *dev, uint32_t interrupt_flags)
bool transfer(const uint8_t *send, uint32_t send_len, uint8_t *recv, uint32_t recv_len) override
static uint8_t spi_is_tx_empty(const spi_dev *dev)
#define BOARD_NR_GPIO_PINS
void * malloc(size_t size)
static void spi_tx_reg(const spi_dev *dev, uint8_t val)
Board-specific pin information.
#define BOARD_SPI1_MISO_PIN
void dma_disable(dma_stream stream)
#define BOARD_SPI1_SCK_PIN
uint8_t _transfer(uint8_t data)
void dma_init_transfer(dma_stream stream, DMA_InitType *v)
void dma_attach_interrupt(dma_stream stream, Handler handler, uint8_t flag)
Attach an interrupt to a DMA transfer.
bool transfer_fullduplex(const uint8_t *send, uint8_t *recv, uint32_t len) override
void _write(uint8_t value)
uint32_t DMA_Memory0BaseAddr
spi_baud_rate
SPI baud rate configuration, as a divisor of f_PCLK, the PCLK clock frequency.
static void gpio_set_speed(const gpio_dev *const dev, uint8_t pin, GPIOSpeed_t gpio_speed)
void register_completion_callback(Handler h)
void dma_init(dma_stream stream)
Initialize a DMA device.
spi_baud_rate determine_baud_rate(SPIFrequency freq)
#define BOARD_SPI3_SCK_PIN
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
static void task_pause(uint32_t t)
static void delay_ns100(uint32_t us)
void panic(const char *errormsg,...) FMT_PRINTF(1
static DigitalSource * get_channel(uint16_t pin)
void revo_call_handler(Handler h, uint32_t arg)
#define EnterCriticalSection
static uint8_t spi_is_rx_nonempty(const spi_dev *dev)
#define ADDRESS_IN_RAM(a)
#define DMA_CR_PSIZE_8BITS
Stores STM32-specific information related to a given Maple pin.
uint8_t wait_for(uint8_t out, spi_WaitFunc cb, uint32_t dly)
const gpio_dev *const gpio_device
void dma_enable(dma_stream stream)
void hal_yield(uint16_t ttw)
void spi_gpio_master_cfg(const spi_dev *dev, const gpio_dev *comm_dev, uint8_t sck_bit, uint8_t miso_bit, uint8_t mosi_bit)
Configure and enable a SPI device as bus master.
const uint8_t F4Light_SPI_DEVICE_NUM_DEVICES
static INLINE void gpio_write_bit(const gpio_dev *const dev, uint8_t pin, uint8_t val)
static void spi_enable_irq(const spi_dev *dev, spi_interrupt interrupt_flags)