[bsp][stm32/pandora]增加AP6181移植文件
This commit is contained in:
parent
dae2d1e8fe
commit
9b889944ba
|
@ -0,0 +1,12 @@
|
||||||
|
import os
|
||||||
|
from building import *
|
||||||
|
|
||||||
|
objs = []
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
list = os.listdir(cwd)
|
||||||
|
|
||||||
|
for item in list:
|
||||||
|
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
|
||||||
|
objs = objs + SConscript(os.path.join(item, 'SConscript'))
|
||||||
|
|
||||||
|
Return('objs')
|
|
@ -0,0 +1,194 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <rthw.h>
|
||||||
|
#include <drivers/mmcsd_core.h>
|
||||||
|
#include <drivers/sdio.h>
|
||||||
|
|
||||||
|
#include "stm32l4xx.h"
|
||||||
|
|
||||||
|
#ifdef BSP_USING_STM32_SDIO
|
||||||
|
|
||||||
|
#include <stm32_sdio.h>
|
||||||
|
|
||||||
|
static DMA_HandleTypeDef SDTxDMAHandler;
|
||||||
|
static DMA_HandleTypeDef SDRxDMAHandler;
|
||||||
|
|
||||||
|
static struct rt_mmcsd_host *host;
|
||||||
|
|
||||||
|
void SDMMC1_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
|
||||||
|
/* Process All SDIO Interrupt Sources */
|
||||||
|
rthw_sdio_irq_process(host);
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the DMA2 Channel4 for SDIO Tx request.
|
||||||
|
* @param BufferSRC: pointer to the source buffer
|
||||||
|
* @param BufferSize: buffer size
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_DMA_TxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize)
|
||||||
|
{
|
||||||
|
DMA2_Channel4->CCR &= ~0x00000001;
|
||||||
|
|
||||||
|
DMA2->IFCR = DMA_ISR_GIF1 << 4;
|
||||||
|
|
||||||
|
DMA2_CSELR->CSELR &= ~(0xf << (3 * 4)); // channel 4
|
||||||
|
DMA2_CSELR->CSELR |= (uint32_t) (0x07 << (3 * 4));
|
||||||
|
|
||||||
|
DMA2_Channel4->CCR = DMA_MEMORY_TO_PERIPH | DMA_PINC_DISABLE | DMA_MINC_ENABLE | \
|
||||||
|
DMA_PDATAALIGN_WORD | DMA_MDATAALIGN_WORD | DMA_NORMAL | DMA_PRIORITY_MEDIUM;
|
||||||
|
DMA2_Channel4->CNDTR = BufferSize;
|
||||||
|
DMA2_Channel4->CPAR = (uint32_t)dst;
|
||||||
|
DMA2_Channel4->CMAR = (uint32_t)src;
|
||||||
|
|
||||||
|
DMA2_Channel4->CCR |= 0x00000001;
|
||||||
|
|
||||||
|
// HAL_DMA_Start(&SDTxDMAHandler, (uint32_t)src, (uint32_t)dst, BufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configures the DMA2 Channel4 for SDIO Rx request.
|
||||||
|
* @param BufferDST: pointer to the destination buffer
|
||||||
|
* @param BufferSize: buffer size
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void SD_LowLevel_DMA_RxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
DMA2_Channel4->CCR &= ~0x00000001;
|
||||||
|
|
||||||
|
DMA2->IFCR = DMA_ISR_GIF1 << 4;
|
||||||
|
|
||||||
|
DMA2_CSELR->CSELR &= ~(0xf << (3 * 4)); // channel 4
|
||||||
|
DMA2_CSELR->CSELR |= (uint32_t) (0x07 << (3 * 4));
|
||||||
|
|
||||||
|
DMA2_Channel4->CCR = DMA_PERIPH_TO_MEMORY | DMA_PINC_DISABLE | DMA_MINC_ENABLE | \
|
||||||
|
DMA_PDATAALIGN_WORD | DMA_MDATAALIGN_WORD | DMA_NORMAL | DMA_PRIORITY_MEDIUM;
|
||||||
|
DMA2_Channel4->CNDTR = BufferSize;
|
||||||
|
DMA2_Channel4->CPAR = (uint32_t)src;
|
||||||
|
DMA2_Channel4->CMAR = (uint32_t)dst;
|
||||||
|
|
||||||
|
DMA2_Channel4->CCR |= 0x00000001;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SD_LowLevel_Init(void)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
// clock enable
|
||||||
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
|
__HAL_RCC_DMA2_CLK_ENABLE();
|
||||||
|
__HAL_RCC_SDMMC1_CLK_ENABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// init sdio hardware
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
|
||||||
|
/*Configure GPIO pin Output Level */
|
||||||
|
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_1;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||||
|
rt_thread_delay(1);
|
||||||
|
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
/* Setup GPIO pins for SDIO data & clock */
|
||||||
|
/**SDMMC1 GPIO Configuration
|
||||||
|
PC8 ------> SDMMC1_D0
|
||||||
|
PC9 ------> SDMMC1_D1
|
||||||
|
PC10 ------> SDMMC1_D2
|
||||||
|
PC11 ------> SDMMC1_D3
|
||||||
|
PC12 ------> SDMMC1_CK
|
||||||
|
PD2 ------> SDMMC1_CMD
|
||||||
|
*/
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_9;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
|
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11
|
||||||
|
| GPIO_PIN_12;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
|
||||||
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_2;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||||
|
GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
|
||||||
|
|
||||||
|
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_uint32_t stm32_sdio_clock_get(struct stm32_sdio *hw_sdio)
|
||||||
|
{
|
||||||
|
return HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t DMA_TxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size)
|
||||||
|
{
|
||||||
|
SD_LowLevel_DMA_TxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4);
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t DMA_RxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size)
|
||||||
|
{
|
||||||
|
SD_LowLevel_DMA_RxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4);
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int stm32f4xx_sdio_init(void)
|
||||||
|
{
|
||||||
|
struct stm32_sdio_des sdio_des;
|
||||||
|
|
||||||
|
SD_LowLevel_Init();
|
||||||
|
|
||||||
|
sdio_des.clk_get = stm32_sdio_clock_get;
|
||||||
|
sdio_des.hw_sdio = (struct stm32_sdio *)0x40012800U;
|
||||||
|
sdio_des.rxconfig = DMA_RxConfig;
|
||||||
|
sdio_des.txconfig = DMA_TxConfig;
|
||||||
|
|
||||||
|
host = sdio_host_create(&sdio_des);
|
||||||
|
if (host == RT_NULL)
|
||||||
|
{
|
||||||
|
rt_kprintf("%s host create fail\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
INIT_DEVICE_EXPORT(stm32f4xx_sdio_init);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
from building import *
|
||||||
|
import rtconfig
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
|
||||||
|
src = []
|
||||||
|
|
||||||
|
src += Glob('*.c')
|
||||||
|
CPPPATH = [cwd]
|
||||||
|
|
||||||
|
group = DefineGroup('EasyFlash', src, depend = ['PKG_USING_EASYFLASH'], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <easyflash.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <sfud.h>
|
||||||
|
#include <rthw.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <fal.h>
|
||||||
|
|
||||||
|
/* EasyFlash partition name on FAL partition table */
|
||||||
|
#define FAL_EF_PART_NAME "easyflash"
|
||||||
|
|
||||||
|
/* default ENV set for user */
|
||||||
|
static const ef_env default_env_set[] = {
|
||||||
|
{"boot_times", "0"}
|
||||||
|
};
|
||||||
|
|
||||||
|
static char log_buf[RT_CONSOLEBUF_SIZE];
|
||||||
|
static struct rt_semaphore env_cache_lock;
|
||||||
|
static const struct fal_partition *part = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flash port for hardware initialize.
|
||||||
|
*
|
||||||
|
* @param default_env default ENV set for user
|
||||||
|
* @param default_env_size default ENV size
|
||||||
|
*
|
||||||
|
* @return result
|
||||||
|
*/
|
||||||
|
EfErrCode ef_port_init(ef_env const **default_env, size_t *default_env_size) {
|
||||||
|
EfErrCode result = EF_NO_ERR;
|
||||||
|
|
||||||
|
*default_env = default_env_set;
|
||||||
|
*default_env_size = sizeof(default_env_set) / sizeof(default_env_set[0]);
|
||||||
|
|
||||||
|
rt_sem_init(&env_cache_lock, "env lock", 1, RT_IPC_FLAG_PRIO);
|
||||||
|
|
||||||
|
part = fal_partition_find(FAL_EF_PART_NAME);
|
||||||
|
EF_ASSERT(part);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read data from flash.
|
||||||
|
* @note This operation's units is word.
|
||||||
|
*
|
||||||
|
* @param addr flash address
|
||||||
|
* @param buf buffer to store read data
|
||||||
|
* @param size read bytes size
|
||||||
|
*
|
||||||
|
* @return result
|
||||||
|
*/
|
||||||
|
EfErrCode ef_port_read(uint32_t addr, uint32_t *buf, size_t size) {
|
||||||
|
EfErrCode result = EF_NO_ERR;
|
||||||
|
|
||||||
|
fal_partition_read(part, addr, (uint8_t *)buf, size);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erase data on flash.
|
||||||
|
* @note This operation is irreversible.
|
||||||
|
* @note This operation's units is different which on many chips.
|
||||||
|
*
|
||||||
|
* @param addr flash address
|
||||||
|
* @param size erase bytes size
|
||||||
|
*
|
||||||
|
* @return result
|
||||||
|
*/
|
||||||
|
EfErrCode ef_port_erase(uint32_t addr, size_t size) {
|
||||||
|
EfErrCode result = EF_NO_ERR;
|
||||||
|
|
||||||
|
/* make sure the start address is a multiple of FLASH_ERASE_MIN_SIZE */
|
||||||
|
EF_ASSERT(addr % EF_ERASE_MIN_SIZE == 0);
|
||||||
|
|
||||||
|
if (fal_partition_erase(part, addr, size) < 0)
|
||||||
|
{
|
||||||
|
result = EF_ERASE_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Write data to flash.
|
||||||
|
* @note This operation's units is word.
|
||||||
|
* @note This operation must after erase. @see flash_erase.
|
||||||
|
*
|
||||||
|
* @param addr flash address
|
||||||
|
* @param buf the write data buffer
|
||||||
|
* @param size write bytes size
|
||||||
|
*
|
||||||
|
* @return result
|
||||||
|
*/
|
||||||
|
EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
|
||||||
|
EfErrCode result = EF_NO_ERR;
|
||||||
|
|
||||||
|
if (fal_partition_write(part, addr, (uint8_t *)buf, size) < 0)
|
||||||
|
{
|
||||||
|
result = EF_WRITE_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lock the ENV ram cache
|
||||||
|
*/
|
||||||
|
void ef_port_env_lock(void) {
|
||||||
|
rt_sem_take(&env_cache_lock, RT_WAITING_FOREVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unlock the ENV ram cache
|
||||||
|
*/
|
||||||
|
void ef_port_env_unlock(void) {
|
||||||
|
rt_sem_release(&env_cache_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is print flash debug info.
|
||||||
|
*
|
||||||
|
* @param file the file which has call this function
|
||||||
|
* @param line the line number which has call this function
|
||||||
|
* @param format output format
|
||||||
|
* @param ... args
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void ef_log_debug(const char *file, const long line, const char *format, ...) {
|
||||||
|
|
||||||
|
#ifdef PRINT_DEBUG
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
/* args point to the first variable parameter */
|
||||||
|
va_start(args, format);
|
||||||
|
ef_print("[Flash] (%s:%ld) ", file, line);
|
||||||
|
/* must use vprintf to print */
|
||||||
|
rt_vsprintf(log_buf, format, args);
|
||||||
|
ef_print("%s", log_buf);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is print flash routine info.
|
||||||
|
*
|
||||||
|
* @param format output format
|
||||||
|
* @param ... args
|
||||||
|
*/
|
||||||
|
void ef_log_info(const char *format, ...) {
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
/* args point to the first variable parameter */
|
||||||
|
va_start(args, format);
|
||||||
|
ef_print("[Flash] ");
|
||||||
|
/* must use vprintf to print */
|
||||||
|
rt_vsprintf(log_buf, format, args);
|
||||||
|
ef_print("%s", log_buf);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This function is print flash non-package info.
|
||||||
|
*
|
||||||
|
* @param format output format
|
||||||
|
* @param ... args
|
||||||
|
*/
|
||||||
|
void ef_print(const char *format, ...) {
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
/* args point to the first variable parameter */
|
||||||
|
va_start(args, format);
|
||||||
|
/* must use vprintf to print */
|
||||||
|
rt_vsprintf(log_buf, format, args);
|
||||||
|
rt_kprintf("%s", log_buf);
|
||||||
|
va_end(args);
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
from building import *
|
||||||
|
import rtconfig
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
|
||||||
|
src = []
|
||||||
|
|
||||||
|
src += Glob('*.c')
|
||||||
|
CPPPATH = [cwd]
|
||||||
|
LOCAL_CCFLAGS = ''
|
||||||
|
|
||||||
|
if rtconfig.CROSS_TOOL == 'gcc':
|
||||||
|
LOCAL_CCFLAGS += ' -std=c99'
|
||||||
|
elif rtconfig.CROSS_TOOL == 'keil':
|
||||||
|
LOCAL_CCFLAGS += ' --c99'
|
||||||
|
|
||||||
|
group = DefineGroup('fal', src, depend = ['PKG_USING_FAL'], CPPPATH = CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-08-21 MurphyZhao the first version
|
||||||
|
*/
|
||||||
|
#ifndef _FAL_CFG_H_
|
||||||
|
#define _FAL_CFG_H_
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <board.h>
|
||||||
|
|
||||||
|
/* enable stm32l4 onchip flash driver sample */
|
||||||
|
#define FAL_FLASH_PORT_DRIVER_STM32L4
|
||||||
|
/* enable SFUD flash driver sample */
|
||||||
|
#define FAL_FLASH_PORT_DRIVER_SFUD
|
||||||
|
|
||||||
|
extern const struct fal_flash_dev stm32_onchip_flash;
|
||||||
|
extern const struct fal_flash_dev nor_flash0;
|
||||||
|
|
||||||
|
/* flash device table */
|
||||||
|
#define FAL_FLASH_DEV_TABLE \
|
||||||
|
{ \
|
||||||
|
&stm32_onchip_flash, \
|
||||||
|
&nor_flash0, \
|
||||||
|
}
|
||||||
|
/* ====================== Partition Configuration ========================== */
|
||||||
|
#ifdef FAL_PART_HAS_TABLE_CFG
|
||||||
|
/* partition table */
|
||||||
|
#define FAL_PART_TABLE \
|
||||||
|
{ \
|
||||||
|
{FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 384 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "param", "onchip_flash", 384 * 1024, 128 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "easyflash", "nor_flash", 0, 512 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "download", "nor_flash", 512 * 1024, 1024 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "wifi_image", "nor_flash", (512 + 1024) * 1024, 512 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "font", "nor_flash", (512 + 1024 + 512) * 1024, 7 * 1024 * 1024, 0}, \
|
||||||
|
{FAL_PART_MAGIC_WROD, "filesystem", "nor_flash", (512 + 1024 + 512 + 7 * 1024) * 1024, 7 * 1024 * 1024, 0}, \
|
||||||
|
}
|
||||||
|
#endif /* FAL_PART_HAS_TABLE_CFG */
|
||||||
|
#endif /* _FAL_CFG_H_ */
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-01-26 armink the first version
|
||||||
|
* 2018-08-21 MurphyZhao update to stm32l4xx
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <fal.h>
|
||||||
|
|
||||||
|
#include <sfud.h>
|
||||||
|
#include <spi_flash_sfud.h>
|
||||||
|
|
||||||
|
sfud_flash sfud_norflash0;
|
||||||
|
|
||||||
|
static int fal_sfud_init(void)
|
||||||
|
{
|
||||||
|
sfud_flash_t sfud_flash0 = NULL;
|
||||||
|
sfud_flash0 = (sfud_flash_t)rt_sfud_flash_find("qspi10");
|
||||||
|
if (NULL == sfud_flash0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sfud_norflash0 = *sfud_flash0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read(long offset, uint8_t *buf, size_t size)
|
||||||
|
{
|
||||||
|
sfud_read(&sfud_norflash0, nor_flash0.addr + offset, size, buf);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write(long offset, const uint8_t *buf, size_t size)
|
||||||
|
{
|
||||||
|
if (sfud_write(&sfud_norflash0, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int erase(long offset, size_t size)
|
||||||
|
{
|
||||||
|
if (sfud_erase(&sfud_norflash0, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
const struct fal_flash_dev nor_flash0 = { "nor_flash", 0, (16 * 1024 * 1024), 4096, {fal_sfud_init, read, write, erase} };
|
|
@ -1,69 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2018-12-5 SummerGift first version
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _FAL_CFG_H_
|
|
||||||
#define _FAL_CFG_H_
|
|
||||||
|
|
||||||
#include <rtthread.h>
|
|
||||||
#include <board.h>
|
|
||||||
|
|
||||||
#if defined(BSP_USING_ON_CHIP_FLASH)
|
|
||||||
extern const struct fal_flash_dev stm32_onchip_flash;
|
|
||||||
#endif /* BSP_USING_ON_CHIP_FLASH */
|
|
||||||
|
|
||||||
#if defined(BSP_USING_QSPI_FLASH)
|
|
||||||
extern struct fal_flash_dev nor_flash0;
|
|
||||||
#endif /* BSP_USING_QSPI_FLASH */
|
|
||||||
|
|
||||||
/* ========================= Device Configuration ========================== */
|
|
||||||
#ifdef BSP_USING_ON_CHIP_FLASH
|
|
||||||
#define ONCHIP_FLASH_DEV &stm32_onchip_flash,
|
|
||||||
#else
|
|
||||||
#define ONCHIP_FLASH_DEV
|
|
||||||
#endif /* BSP_USING_ON_CHIP_FLASH */
|
|
||||||
|
|
||||||
#ifdef BSP_USING_QSPI_FLASH
|
|
||||||
#define SPI_FLASH_DEV &nor_flash0,
|
|
||||||
#else
|
|
||||||
#define SPI_FLASH_DEV
|
|
||||||
#endif /* BSP_USING_QSPI_FLASH */
|
|
||||||
|
|
||||||
/* flash device table */
|
|
||||||
#define FAL_FLASH_DEV_TABLE \
|
|
||||||
{ \
|
|
||||||
ONCHIP_FLASH_DEV \
|
|
||||||
SPI_FLASH_DEV \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ====================== Partition Configuration ========================== */
|
|
||||||
#ifdef FAL_PART_HAS_TABLE_CFG
|
|
||||||
|
|
||||||
#ifdef BSP_USING_ON_CHIP_FLASH
|
|
||||||
#define ONCHIP_FLASH_PATITION {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 496 * 1024, 0}, \
|
|
||||||
{FAL_PART_MAGIC_WROD, "param", "onchip_flash", 496* 1024, 16 * 1024, 0},
|
|
||||||
#else
|
|
||||||
#define ONCHIP_FLASH_PATITION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BSP_USING_QSPI_FLASH
|
|
||||||
#define SPI_FLASH_PARTITION {FAL_PART_MAGIC_WROD, "filesystem", "W25Q128", 9 * 1024 * 1024, 16 * 1024 * 1024, 0},
|
|
||||||
#else
|
|
||||||
#define SPI_FLASH_PARTITION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* partition table */
|
|
||||||
#define FAL_PART_TABLE \
|
|
||||||
{ \
|
|
||||||
ONCHIP_FLASH_PATITION \
|
|
||||||
SPI_FLASH_PARTITION \
|
|
||||||
}
|
|
||||||
#endif /* FAL_PART_HAS_TABLE_CFG */
|
|
||||||
|
|
||||||
#endif /* _FAL_CFG_H_ */
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
from building import *
|
||||||
|
import rtconfig
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
|
||||||
|
src = []
|
||||||
|
|
||||||
|
src += Glob('*.c')
|
||||||
|
CPPPATH = [cwd]
|
||||||
|
|
||||||
|
group = DefineGroup('wifi', src, depend = ['BSP_USING_WIFI'], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-09-04 ZeroFree first implementation
|
||||||
|
* 2019-06-14 armink add easyflash v4.0 support
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
#ifdef BSP_USING_WIFI
|
||||||
|
|
||||||
|
#include <wlan_mgnt.h>
|
||||||
|
#include <wlan_cfg.h>
|
||||||
|
#include <wlan_prot.h>
|
||||||
|
|
||||||
|
#include <easyflash.h>
|
||||||
|
#include <fal.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if (EF_SW_VERSION_NUM < 0x40000)
|
||||||
|
|
||||||
|
static char *str_base64_encode_len(const void *src, char *out, int input_length);
|
||||||
|
static int str_base64_decode(const char *data, int input_length, char *decoded_data);
|
||||||
|
|
||||||
|
static const unsigned char base64_table[65] =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
|
static const char base64_decode_table[256] =
|
||||||
|
{
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3F,
|
||||||
|
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
|
||||||
|
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
|
||||||
|
0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *str_base64_encode_len(const void *src, char *out, int len)
|
||||||
|
{
|
||||||
|
unsigned char *pos;
|
||||||
|
const unsigned char *end, *in;
|
||||||
|
size_t olen;
|
||||||
|
|
||||||
|
olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
|
||||||
|
olen += olen / 72; /* line feeds */
|
||||||
|
olen++; /* nul termination */
|
||||||
|
|
||||||
|
end = (const unsigned char *)src + len;
|
||||||
|
in = (const unsigned char *)src;
|
||||||
|
pos = (unsigned char *)out;
|
||||||
|
while (end - in >= 3)
|
||||||
|
{
|
||||||
|
*pos++ = base64_table[in[0] >> 2];
|
||||||
|
*pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
|
||||||
|
*pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
|
||||||
|
*pos++ = base64_table[in[2] & 0x3f];
|
||||||
|
in += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end - in)
|
||||||
|
{
|
||||||
|
*pos++ = base64_table[in[0] >> 2];
|
||||||
|
|
||||||
|
if (end - in == 1)
|
||||||
|
{
|
||||||
|
*pos++ = base64_table[(in[0] & 0x03) << 4];
|
||||||
|
*pos++ = '=';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*pos++ = base64_table[((in[0] & 0x03) << 4) |
|
||||||
|
(in[1] >> 4)];
|
||||||
|
*pos++ = base64_table[(in[1] & 0x0f) << 2];
|
||||||
|
}
|
||||||
|
*pos++ = '=';
|
||||||
|
}
|
||||||
|
|
||||||
|
*pos = '\0';
|
||||||
|
return (char *)out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return: length, 0 is error.
|
||||||
|
*/
|
||||||
|
static int str_base64_decode(const char *data, int input_length, char *decoded_data)
|
||||||
|
{
|
||||||
|
int out_len;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (input_length % 4 != 0) return 0;
|
||||||
|
|
||||||
|
out_len = input_length / 4 * 3;
|
||||||
|
|
||||||
|
if (data[input_length - 1] == '=') out_len--;
|
||||||
|
if (data[input_length - 2] == '=') out_len--;
|
||||||
|
|
||||||
|
for (i = 0, j = 0; i < input_length;)
|
||||||
|
{
|
||||||
|
uint32_t sextet_a = data[i] == '=' ? 0 & i++ : base64_decode_table[data[i++]];
|
||||||
|
uint32_t sextet_b = data[i] == '=' ? 0 & i++ : base64_decode_table[data[i++]];
|
||||||
|
uint32_t sextet_c = data[i] == '=' ? 0 & i++ : base64_decode_table[data[i++]];
|
||||||
|
uint32_t sextet_d = data[i] == '=' ? 0 & i++ : base64_decode_table[data[i++]];
|
||||||
|
|
||||||
|
uint32_t triple = (sextet_a << 3 * 6)
|
||||||
|
+ (sextet_b << 2 * 6)
|
||||||
|
+ (sextet_c << 1 * 6)
|
||||||
|
+ (sextet_d << 0 * 6);
|
||||||
|
|
||||||
|
if (j < out_len) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
|
||||||
|
if (j < out_len) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
|
||||||
|
if (j < out_len) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_cfg(void *buff, int len)
|
||||||
|
{
|
||||||
|
char *wlan_cfg_info = RT_NULL;
|
||||||
|
|
||||||
|
wlan_cfg_info = ef_get_env("wlan_cfg_info");
|
||||||
|
if (wlan_cfg_info != RT_NULL)
|
||||||
|
{
|
||||||
|
str_base64_decode(wlan_cfg_info, rt_strlen(wlan_cfg_info), buff);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get_len(void)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *wlan_cfg_len = RT_NULL;
|
||||||
|
|
||||||
|
wlan_cfg_len = ef_get_env("wlan_cfg_len");
|
||||||
|
if (wlan_cfg_len == RT_NULL)
|
||||||
|
{
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = atoi(wlan_cfg_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_cfg(void *buff, int len)
|
||||||
|
{
|
||||||
|
char wlan_cfg_len[12] = {0};
|
||||||
|
char *base64_buf = RT_NULL;
|
||||||
|
|
||||||
|
base64_buf = rt_malloc(len * 4 / 3 + 4); /* 3-byte blocks to 4-byte, and the end. */
|
||||||
|
if (base64_buf == RT_NULL)
|
||||||
|
{
|
||||||
|
return -RT_ENOMEM;
|
||||||
|
}
|
||||||
|
rt_memset(base64_buf, 0, len);
|
||||||
|
|
||||||
|
/* interger to string */
|
||||||
|
sprintf(wlan_cfg_len, "%d", len);
|
||||||
|
/* set and store the wlan config lengths to Env */
|
||||||
|
ef_set_env("wlan_cfg_len", wlan_cfg_len);
|
||||||
|
str_base64_encode_len(buff, base64_buf, len);
|
||||||
|
/* set and store the wlan config information to Env */
|
||||||
|
ef_set_env("wlan_cfg_info", base64_buf);
|
||||||
|
ef_save_env();
|
||||||
|
rt_free(base64_buf);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static int read_cfg(void *buff, int len)
|
||||||
|
{
|
||||||
|
size_t saved_len;
|
||||||
|
|
||||||
|
ef_get_env_blob("wlan_cfg_info", buff, len, &saved_len);
|
||||||
|
if (saved_len == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get_len(void)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
size_t saved_len;
|
||||||
|
|
||||||
|
ef_get_env_blob("wlan_cfg_len", &len, sizeof(len), &saved_len);
|
||||||
|
if (saved_len == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_cfg(void *buff, int len)
|
||||||
|
{
|
||||||
|
/* set and store the wlan config lengths to Env */
|
||||||
|
ef_set_env_blob("wlan_cfg_len", &len, sizeof(len));
|
||||||
|
|
||||||
|
/* set and store the wlan config information to Env */
|
||||||
|
ef_set_env_blob("wlan_cfg_info", buff, len);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (EF_SW_VERSION_NUM < 0x40000) */
|
||||||
|
|
||||||
|
static const struct rt_wlan_cfg_ops ops =
|
||||||
|
{
|
||||||
|
read_cfg,
|
||||||
|
get_len,
|
||||||
|
write_cfg
|
||||||
|
};
|
||||||
|
|
||||||
|
void wlan_autoconnect_init(void)
|
||||||
|
{
|
||||||
|
fal_init();
|
||||||
|
easyflash_init();
|
||||||
|
|
||||||
|
rt_wlan_cfg_set_ops(&ops);
|
||||||
|
rt_wlan_cfg_cache_refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-09-04 ZeroFree first implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
void wlan_autoconnect_init(void);
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
from building import *
|
||||||
|
import rtconfig
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
|
||||||
|
src = []
|
||||||
|
|
||||||
|
src += Glob('*.c')
|
||||||
|
CPPPATH = [cwd]
|
||||||
|
|
||||||
|
group = DefineGroup('Drivers', src, depend = ['BSP_USING_WIFI'], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-08-30 ZeroFree the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <rtdevice.h>
|
||||||
|
#include <wlan_mgnt.h>
|
||||||
|
#include <wlan_prot.h>
|
||||||
|
#include <wlan_cfg.h>
|
||||||
|
#include <fal.h>
|
||||||
|
|
||||||
|
#include "drv_wlan.h"
|
||||||
|
#include "drv_gpio.h"
|
||||||
|
|
||||||
|
#define DBG_ENABLE
|
||||||
|
#define DBG_SECTION_NAME "WLAN"
|
||||||
|
#define DBG_COLOR
|
||||||
|
#define DBG_LEVEL DBG_LOG
|
||||||
|
#include <rtdbg.h>
|
||||||
|
|
||||||
|
#ifdef BSP_USING_WIFI
|
||||||
|
|
||||||
|
#define WIFI_IMAGE_PARTITION_NAME "wifi_image"
|
||||||
|
#define WIFI_INIT_THREAD_STACK_SIZE (1024 * 4)
|
||||||
|
#define WIFI_INIT_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX/2)
|
||||||
|
#define WIFI_INIT_WAIT_TIME (rt_tick_from_millisecond(100))
|
||||||
|
#define WIFI_IRQ_PIN GET_PIN(C, 5)
|
||||||
|
|
||||||
|
extern int wifi_hw_init(void);
|
||||||
|
extern void wwd_thread_notify_irq(void);
|
||||||
|
|
||||||
|
static const struct fal_partition *partition = RT_NULL;
|
||||||
|
static rt_uint32_t init_flag = 0;
|
||||||
|
|
||||||
|
struct rt_wlan_device *bcm_hw_wlan_dev_alloc(void)
|
||||||
|
{
|
||||||
|
struct rt_wlan_device *wlan;
|
||||||
|
|
||||||
|
wlan = rt_malloc(sizeof(struct rt_wlan_device));
|
||||||
|
|
||||||
|
return wlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RT_USING_PM
|
||||||
|
void wiced_platform_keep_awake(void)
|
||||||
|
{
|
||||||
|
rt_pm_request(PM_SLEEP_MODE_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wiced_platform_let_sleep(void)
|
||||||
|
{
|
||||||
|
rt_pm_release(PM_SLEEP_MODE_NONE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return:1 initialize done
|
||||||
|
* 0 not initialize
|
||||||
|
*/
|
||||||
|
int rt_hw_wlan_get_initialize_status(void)
|
||||||
|
{
|
||||||
|
return init_flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wait milliseconds for wifi low level initialize complete
|
||||||
|
*
|
||||||
|
* time_ms: timeout in milliseconds
|
||||||
|
*/
|
||||||
|
int rt_hw_wlan_wait_init_done(rt_uint32_t time_ms)
|
||||||
|
{
|
||||||
|
rt_uint32_t time_cnt = 0;
|
||||||
|
|
||||||
|
/* wait wifi low level initialize complete */
|
||||||
|
while (time_cnt <= (time_ms / 100))
|
||||||
|
{
|
||||||
|
time_cnt++;
|
||||||
|
rt_thread_mdelay(100);
|
||||||
|
if (rt_hw_wlan_get_initialize_status() == 1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_cnt > (time_ms / 100))
|
||||||
|
{
|
||||||
|
return -RT_ETIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _wiced_irq_handler(void *param)
|
||||||
|
{
|
||||||
|
wwd_thread_notify_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wifi_init_thread_entry(void *parameter)
|
||||||
|
{
|
||||||
|
/* set wifi irq handle, must be initialized first */
|
||||||
|
rt_pin_mode(WIFI_IRQ_PIN, PIN_MODE_INPUT_PULLUP);
|
||||||
|
rt_pin_attach_irq(WIFI_IRQ_PIN, PIN_IRQ_MODE_RISING_FALLING, _wiced_irq_handler, RT_NULL);
|
||||||
|
rt_pin_irq_enable(WIFI_IRQ_PIN, PIN_IRQ_ENABLE);
|
||||||
|
|
||||||
|
/* initialize low level wifi(ap6181) library */
|
||||||
|
wifi_hw_init();
|
||||||
|
|
||||||
|
/* waiting for sdio bus stability */
|
||||||
|
rt_thread_delay(WIFI_INIT_WAIT_TIME);
|
||||||
|
|
||||||
|
/* set wifi work mode */
|
||||||
|
rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
|
||||||
|
|
||||||
|
init_flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rt_hw_wlan_init(void)
|
||||||
|
{
|
||||||
|
if (init_flag == 1)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BSP_USING_WIFI_THREAD_INIT
|
||||||
|
rt_thread_t tid = RT_NULL;
|
||||||
|
|
||||||
|
tid = rt_thread_create("wifi_init", wifi_init_thread_entry, RT_NULL, WIFI_INIT_THREAD_STACK_SIZE, WIFI_INIT_THREAD_PRIORITY, 20);
|
||||||
|
if (tid)
|
||||||
|
{
|
||||||
|
rt_thread_startup(tid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_E("Create wifi initialization thread fail!");
|
||||||
|
return -RT_ERROR;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
wifi_init_thread_entry(RT_NULL);
|
||||||
|
init_flag = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BSP_USING_WIFI_AUTO_INIT
|
||||||
|
INIT_APP_EXPORT(rt_hw_wlan_init);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2018-08-30 ZeroFree the first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __DRV_WLAN_H__
|
||||||
|
#define __DRV_WLAN_H__
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
int rt_hw_wlan_init(void);
|
||||||
|
int rt_hw_wlan_get_initialize_status(void);
|
||||||
|
int rt_hw_wlan_wait_init_done(rt_uint32_t time_ms);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue