blob: 40e4189635d71c362301a225553b941061be727c [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dmadrv.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_core.h"
#include "em_device.h"
#include "em_gpio.h"
#include "em_ldma.h"
#include "em_usart.h"
#include "gpiointerrupt.h"
#include "sl_device_init_clocks.h"
#include "sl_status.h"
#include "FreeRTOS.h"
#include "event_groups.h"
#include "task.h"
#include "wfx_host_events.h"
#include "wfx_rsi.h"
#include "rsi_board_configuration.h"
#include "rsi_driver.h"
typedef void (*UserIntCallBack_t)(void);
UserIntCallBack_t call_back, gpio_callback;
#ifdef LOGGING_STATS
uint8_t current_pin_set, prev_pin_set;
#endif /* LOGGING_STATS */
/* ARGSUSED */
void rsi_gpio_irq_cb(uint8_t irqnum)
{
// WFX_RSI_LOG ("RSI: Got Int=%d", irqnum)
if (irqnum != SL_WFX_HOST_PINOUT_SPI_IRQ)
return;
GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
// WFX_RSI_LOG ("Got SPI intr, cb=%x", (uint32_t)call_back);
if (call_back != NULL)
(*call_back)();
}
/*===================================================*/
/**
* @fn void rsi_hal_intr_config(void (* rsi_interrupt_handler)())
* @brief Starts and enables the SPI interrupt
* @param[in] rsi_interrupt_handler() ,call back function to handle interrupt
* @param[out] none
* @return none
* @description This HAL API should contain the code to initialize the register/pins
* related to interrupts and enable the interrupts.
*/
void rsi_hal_intr_config(void (*rsi_interrupt_handler)(void))
{
call_back = rsi_interrupt_handler;
WFX_RSI_LOG("RSI:Set SPI intr CB to=%x", (uint32_t) call_back);
}
/*===================================================*/
/**
* @fn void rsi_hal_log_stats_intr_config(void (* rsi_give_wakeup_indication)())
* @brief Checks the interrupt and map/set gpio callback function
* @param[in] rsi_give_wakeup_indication() ,gpio call back function to handle interrupt
* @param[out] none
* @return none
* @description This HAL API should contain the code
* related to mapping of gpio callback function.
*/
#ifdef LOGGING_STATS
void rsi_hal_log_stats_intr_config(void (*rsi_give_wakeup_indication)())
{
gpio_callback = rsi_give_wakeup_indication;
}
#endif
/*===================================================*/
/**
* @fn void rsi_hal_intr_mask(void)
* @brief Disables the SPI Interrupt
* @param[in] none
* @param[out] none
* @return none
* @description This HAL API should contain the code to mask/disable interrupts.
*/
void rsi_hal_intr_mask(void)
{
// WFX_RSI_LOG ("RSI:Disable IRQ");
// NVIC_DisableIRQ(GPIO_ODD_IRQn);
GPIO_IntDisable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
}
/*===================================================*/
/**
* @fn void rsi_hal_intr_unmask(void)
* @brief Enables the SPI interrupt
* @param[in] none
* @param[out] none
* @return none
* @description This HAL API should contain the code to enable interrupts.
*/
void rsi_hal_intr_unmask(void)
{
// Unmask/Enable the interrupt
NVIC_EnableIRQ(GPIO_ODD_IRQn);
NVIC_EnableIRQ(GPIO_EVEN_IRQn);
GPIO_IntEnable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
// WFX_RSI_LOG ("RSI:Enable IRQ (mask=%x)", GPIO_IntGetEnabled ());
}
/*===================================================*/
/**
* @fn void rsi_hal_intr_clear(void)
* @brief Clears the pending interrupt
* @param[in] none
* @param[out] none
* @return none
* @description This HAL API should contain the code to clear the handled interrupts.
*/
void rsi_hal_intr_clear(void)
{
GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
}
/*===================================================*/
/**
* @fn void rsi_hal_intr_pin_status(void)
* @brief Checks the SPI interrupt at pin level
* @param[in] none
* @param[out] uint8_t, interrupt status
* @return none
* @description This API is used to check interrupt pin status(pin level whether it is high/low).
*/
uint8_t rsi_hal_intr_pin_status(void)
{
uint32_t mask;
// Return interrupt pin status(high(1) /low (0))
mask = GPIO_PinInGet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin);
return !!mask;
}