nuttx/boards/arm/stm32/emw3162/src/stm32_wlan.c
2021-06-11 21:05:24 -05:00

165 lines
4.4 KiB
C

/****************************************************************************
* boards/arm/stm32/emw3162/src/stm32_wlan.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <debug.h>
#include <nuttx/wireless/ieee80211/bcmf_sdio.h>
#include <nuttx/wireless/ieee80211/bcmf_board.h>
#include <arch/board/board.h>
#include "stm32_gpio.h"
#include "stm32_sdio.h"
#include "emw3162.h"
/****************************************************************************
* Private Data
****************************************************************************/
static struct sdio_dev_s *g_sdio_dev;
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: bcmf_board_reset
****************************************************************************/
void bcmf_board_reset(int minor, bool reset)
{
if (minor != SDIO_WLAN0_MINOR)
{
return;
}
stm32_gpiowrite(GPIO_WLAN0_RESET, !reset);
}
/****************************************************************************
* Name: bcmf_board_power
****************************************************************************/
void bcmf_board_power(int minor, bool power)
{
if (minor != SDIO_WLAN0_MINOR)
{
return;
}
stm32_gpiowrite(GPIO_WLAN0_PWRDN, !power);
}
/****************************************************************************
* Name: bcmf_board_initialize
****************************************************************************/
void bcmf_board_initialize(int minor)
{
if (minor != SDIO_WLAN0_MINOR)
{
return;
}
/* Configure MCO1 output to drive EXT_SLEEP_CLK input pin of BCM43362 */
stm32_configgpio(GPIO_MCO1);
stm32_mco1config(RCC_CFGR_MCO1_LSE, RCC_CFGR_MCO1PRE_NONE);
/* Configure PowerDown pin */
stm32_configgpio(GPIO_WLAN0_PWRDN);
/* Shutdown wlan chip */
bcmf_board_power(minor, false);
/* Configure reset pin */
stm32_configgpio(GPIO_WLAN0_RESET);
/* Put wlan chip in reset state */
bcmf_board_reset(minor, true);
}
/****************************************************************************
* Name: bcmf_board_setup_oob_irq
****************************************************************************/
void bcmf_board_setup_oob_irq(int minor, int (*func)(void *), void *arg)
{
if (minor != SDIO_WLAN0_MINOR)
{
return;
}
/* Configure SDIO card in-band interrupt callback */
if (g_sdio_dev != NULL)
{
sdio_set_sdio_card_isr(g_sdio_dev, func, arg);
}
}
/****************************************************************************
* Name: emw3162_wlan_initialize
****************************************************************************/
int emw3162_wlan_initialize()
{
int ret;
/* Initialize sdio interface */
wlinfo("Initializing SDIO slot %d\n", SDIO_WLAN0_SLOTNO);
g_sdio_dev = sdio_initialize(SDIO_WLAN0_SLOTNO);
if (!g_sdio_dev)
{
wlerr("ERROR: Failed to initialize SDIO with slot %d\n",
SDIO_WLAN0_SLOTNO);
return ERROR;
}
/* Bind the SDIO interface to the bcmf driver */
ret = bcmf_sdio_initialize(SDIO_WLAN0_MINOR, g_sdio_dev);
if (ret != OK)
{
wlerr("ERROR: Failed to bind SDIO to bcmf driver\n");
/* FIXME deinitialize sdio device */
return ERROR;
}
return OK;
}