Newer
Older
mbed-os / connectivity / drivers / wifi / TARGET_STM / COMPONENT_EMW3080B / EMW3080B_SPI.h
@Jerome Coutant Jerome Coutant on 30 Sep 2021 2 KB STM32: new EMW3080B wifi driver
/*
 * Copyright (c) STMicroelectronics 2021
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


/* Includes ------------------------------------------------------------------*/
#include <inttypes.h>

/* Private includes ----------------------------------------------------------*/
#include "mbed.h"
#include "mbed_debug.h"
#include "mbed_error.h"
#include "mx_wifi.h"
#include "core/mx_wifi_hci.h"



class EMW3080B_SPI : public SPI {
public:
    EMW3080B_SPI(bool debug     = MBED_CONF_EMW3080B_WIFI_DEBUG,
                 PinName mosi   = MBED_CONF_EMW3080B_WIFI_MOSI,
                 PinName miso   = MBED_CONF_EMW3080B_WIFI_MISO,
                 PinName sclk   = MBED_CONF_EMW3080B_WIFI_SCLK,
                 PinName nss    = MBED_CONF_EMW3080B_WIFI_NSS,
                 PinName notify = MBED_CONF_EMW3080B_WIFI_NOTIFY,
                 PinName flow   = MBED_CONF_EMW3080B_WIFI_FLOW,
                 PinName reset  = MBED_CONF_EMW3080B_WIFI_RESET
                );

private:
    DigitalOut   _resetpin;
    DigitalOut   _nsspin;

    DigitalIn   _notifypin;
    DigitalIn   _flowpin;

    InterruptIn *_notify_irq;
    InterruptIn *_flow_irq;

    void    flow_rise(void);
    void    notify_rise(void);
    int8_t  wait_flow_high(uint32_t timeout);

    SEM_DECLARE(spi_txrx_sem);
    SEM_DECLARE(spi_flow_rise_sem);
    SEM_DECLARE(spi_transfer_done_sem);

    uint8_t *spi_tx_data = NULL;
    uint16_t spi_tx_len  = 0;

    int32_t TransmitReceive(uint8_t *txdata, uint8_t *rxdata, uint32_t datalen, uint32_t timeout);
    int32_t Transmit(uint8_t *txdata, uint32_t datalen, uint32_t timeout);
    int32_t Receive(uint8_t *rxdata, uint32_t datalen, uint32_t timeout);
    void    spi_handler(int event);

    int8_t mx_wifi_spi_txrx_start(void);
    int8_t mx_wifi_spi_txrx_stop(void);

    THREAD_DECLARE(MX_WIFI_TxRxThreadId);


public:

    int8_t   IO_Init(uint16_t mode);
    int8_t    IO_DeInit(void);
    void     IO_Delay(uint32_t delayms);
    uint16_t IO_Send(uint8_t *data, uint16_t len);
    uint16_t IO_Receive(uint8_t *buffer, uint16_t buff_size);
    void    process_txrx_poll(uint32_t timeout);

    uint8_t _debug_level;
};