summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2018-06-10 18:01:15 +0800
committerBernard Xiong <[email protected]>2018-06-10 18:01:15 +0800
commit564df04da1e0d0e7e3ac374fc7c3a51f2b0dba21 (patch)
treebf6c7b6d4514f8187d1ba4c87a7afc1ee641d901
parent8e67f65688eae1da7c9191de5c983e828fce3c91 (diff)
parente1a57f053a4b77cabaf988779c107c54c7995e77 (diff)
Merge branch 'master' of https://github.com/RT-Thread/rt-thread
-rw-r--r--bsp/asm9260t/platform/rt_low_level_init.h (renamed from bsp/asm9260t/platform/rt_low_level_iar.inc)8
-rw-r--r--bsp/asm9260t/platform/rt_low_level_keil.inc33
-rw-r--r--bsp/at91sam9260/platform/rt_low_level_gcc.inc31
-rw-r--r--bsp/at91sam9260/platform/rt_low_level_init.h (renamed from bsp/at91sam9260/platform/rt_low_level_iar.inc)8
-rw-r--r--bsp/at91sam9260/platform/rt_low_level_keil.inc32
-rw-r--r--bsp/hifive1/drivers/board.c1
-rw-r--r--bsp/lpc54608-LPCXpresso/drivers/drv_emac.c10
-rw-r--r--bsp/lpc54608-LPCXpresso/drivers/drv_sd.c16
-rw-r--r--bsp/ls1cdev/drivers/drv_spi.c71
-rw-r--r--bsp/ls1cdev/libraries/ls1c_spi.c2
-rw-r--r--bsp/stm32f10x/drivers/stm32f1_wdg.c2
-rwxr-xr-xcomponents/drivers/Kconfig22
-rw-r--r--components/drivers/cputime/cputime_cortexm.c3
-rw-r--r--components/drivers/include/drivers/rt_drv_pwm.h54
-rw-r--r--components/drivers/include/rtdevice.h4
-rw-r--r--components/drivers/misc/SConscript3
-rw-r--r--components/drivers/misc/rt_drv_pwm.c214
-rw-r--r--components/drivers/spi/spi_flash_sfud.c13
-rw-r--r--components/drivers/wlan/wlan_cmd.c102
-rw-r--r--components/drivers/wlan/wlan_cmd.h31
-rw-r--r--components/drivers/wlan/wlan_dev.c229
-rw-r--r--components/drivers/wlan/wlan_dev.h113
-rw-r--r--components/drivers/wlan/wlan_mgnt.c142
-rw-r--r--components/drivers/wlan/wlan_mgnt.h (renamed from bsp/asm9260t/platform/rt_low_level_gcc.inc)25
-rw-r--r--components/finsh/Kconfig4
-rw-r--r--components/finsh/msh.c11
-rw-r--r--libcpu/SConscript6
-rw-r--r--libcpu/arm/arm926/start_gcc.S7
-rw-r--r--libcpu/arm/arm926/start_iar.S7
-rw-r--r--libcpu/arm/arm926/start_rvds.S5
-rw-r--r--tools/building.py22
31 files changed, 894 insertions, 337 deletions
diff --git a/bsp/asm9260t/platform/rt_low_level_iar.inc b/bsp/asm9260t/platform/rt_low_level_init.h
index 3046253d07..86dcfb59dc 100644
--- a/bsp/asm9260t/platform/rt_low_level_iar.inc
+++ b/bsp/asm9260t/platform/rt_low_level_init.h
@@ -1,5 +1,5 @@
/*
- * File : rt_low_level_iar.inc
+ * File : rt_low_level_init.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
*
@@ -19,8 +19,10 @@
*
* Change Logs:
* Date Author Notes
- * 2015-04-14 ArdaFu first version
+ * 2018-06-04 ArdaFu first version
*/
+#ifndef __RT_LOW_LEVEL_INIT_H__
+#define __RT_LOW_LEVEL_INIT_H__
/*-------- Stack size of CPU modes -------------------------------------------*/
#define UND_STK_SIZE 512
@@ -29,3 +31,5 @@
#define IRQ_STK_SIZE 1024
#define FIQ_STK_SIZE 1024
#define SYS_STK_SIZE 512
+#define Heap_Size 512
+#endif
diff --git a/bsp/asm9260t/platform/rt_low_level_keil.inc b/bsp/asm9260t/platform/rt_low_level_keil.inc
deleted file mode 100644
index 7b3c8cfe99..0000000000
--- a/bsp/asm9260t/platform/rt_low_level_keil.inc
+++ /dev/null
@@ -1,33 +0,0 @@
-;/*
-; * File : rt_low_level_keil.inc
-; * This file is part of RT-Thread RTOS
-; * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
-; *
-; * This program is free software; you can redistribute it and/or modify
-; * it under the terms of the GNU General Public License as published by
-; * the Free Software Foundation; either version 2 of the License, or
-; * (at your option) any later version.
-; *
-; * This program is distributed in the hope that it will be useful,
-; * but WITHOUT ANY WARRANTY; without even the implied warranty of
-; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; * GNU General Public License for more details.
-; *
-; * You should have received a copy of the GNU General Public License along
-; * with this program; if not, write to the Free Software Foundation, Inc.,
-; * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2015-04-14 ArdaFu first version
-; */
-
-;/*-------- Stack size of CPU modes ------------------------------------------*/
-UND_STK_SIZE EQU 512
-SVC_STK_SIZE EQU 4096
-ABT_STK_SIZE EQU 512
-IRQ_STK_SIZE EQU 1024
-FIQ_STK_SIZE EQU 1024
-SYS_STK_SIZE EQU 512
-Heap_Size EQU 512
- END
diff --git a/bsp/at91sam9260/platform/rt_low_level_gcc.inc b/bsp/at91sam9260/platform/rt_low_level_gcc.inc
deleted file mode 100644
index c6edd3787c..0000000000
--- a/bsp/at91sam9260/platform/rt_low_level_gcc.inc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * File : rt_low_level_gcc.inc
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Change Logs:
- * Date Author Notes
- * 2015-04-14 ArdaFu first version
- */
-
-/*--------- Stack size of CPU modes ------------------------------------------*/
-.equ UND_STK_SIZE, 2048
-.equ SVC_STK_SIZE, 4096
-.equ ABT_STK_SIZE, 2048
-.equ IRQ_STK_SIZE, 4096
-.equ FIQ_STK_SIZE, 4096
-.equ SYS_STK_SIZE, 2048
diff --git a/bsp/at91sam9260/platform/rt_low_level_iar.inc b/bsp/at91sam9260/platform/rt_low_level_init.h
index 3046253d07..86dcfb59dc 100644
--- a/bsp/at91sam9260/platform/rt_low_level_iar.inc
+++ b/bsp/at91sam9260/platform/rt_low_level_init.h
@@ -1,5 +1,5 @@
/*
- * File : rt_low_level_iar.inc
+ * File : rt_low_level_init.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
*
@@ -19,8 +19,10 @@
*
* Change Logs:
* Date Author Notes
- * 2015-04-14 ArdaFu first version
+ * 2018-06-04 ArdaFu first version
*/
+#ifndef __RT_LOW_LEVEL_INIT_H__
+#define __RT_LOW_LEVEL_INIT_H__
/*-------- Stack size of CPU modes -------------------------------------------*/
#define UND_STK_SIZE 512
@@ -29,3 +31,5 @@
#define IRQ_STK_SIZE 1024
#define FIQ_STK_SIZE 1024
#define SYS_STK_SIZE 512
+#define Heap_Size 512
+#endif
diff --git a/bsp/at91sam9260/platform/rt_low_level_keil.inc b/bsp/at91sam9260/platform/rt_low_level_keil.inc
deleted file mode 100644
index c3cde15ded..0000000000
--- a/bsp/at91sam9260/platform/rt_low_level_keil.inc
+++ /dev/null
@@ -1,32 +0,0 @@
-;/*
-; * File : rt_low_level_keil.inc
-; * This file is part of RT-Thread RTOS
-; * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
-; *
-; * This program is free software; you can redistribute it and/or modify
-; * it under the terms of the GNU General Public License as published by
-; * the Free Software Foundation; either version 2 of the License, or
-; * (at your option) any later version.
-; *
-; * This program is distributed in the hope that it will be useful,
-; * but WITHOUT ANY WARRANTY; without even the implied warranty of
-; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; * GNU General Public License for more details.
-; *
-; * You should have received a copy of the GNU General Public License along
-; * with this program; if not, write to the Free Software Foundation, Inc.,
-; * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-; *
-; * Change Logs:
-; * Date Author Notes
-; * 2015-04-14 ArdaFu first version
-; */
-
-;/*-------- Stack size of CPU modes ------------------------------------------*/
-UND_STK_SIZE EQU 512
-SVC_STK_SIZE EQU 4096
-ABT_STK_SIZE EQU 512
-IRQ_STK_SIZE EQU 1024
-FIQ_STK_SIZE EQU 1024
-SYS_STK_SIZE EQU 512
- END
diff --git a/bsp/hifive1/drivers/board.c b/bsp/hifive1/drivers/board.c
index 2ddb720502..80a425309b 100644
--- a/bsp/hifive1/drivers/board.c
+++ b/bsp/hifive1/drivers/board.c
@@ -28,7 +28,6 @@
#include <platform.h>
#include <encoding.h>
#include <interrupt.h>
-#include <drv_led.h>
extern void use_default_clocks(void);
extern void use_pll(int refsel, int bypass, int r, int f, int q);
diff --git a/bsp/lpc54608-LPCXpresso/drivers/drv_emac.c b/bsp/lpc54608-LPCXpresso/drivers/drv_emac.c
index 8dc3b5ad09..1f38471fca 100644
--- a/bsp/lpc54608-LPCXpresso/drivers/drv_emac.c
+++ b/bsp/lpc54608-LPCXpresso/drivers/drv_emac.c
@@ -433,6 +433,8 @@ rt_err_t lpc_emac_tx(rt_device_t dev, struct pbuf *p)
enet_handle_t * enet_handle = &lpc_emac_device.handle;
ENET_Type *enet_base = lpc_emac_device.base;
uint8_t * data;
+
+ uint16_t len;
RT_ASSERT(p != NULL);
RT_ASSERT(enet_handle != RT_NULL);
@@ -454,11 +456,13 @@ rt_err_t lpc_emac_tx(rt_device_t dev, struct pbuf *p)
}
}
- data = (uint8_t *)ENET_ALIGN(&lpc_emac_device.RxDataBuff[lpc_emac_device.txIdx * ENET_ALIGN(ENET_RXBUFF_SIZE)]);
- pbuf_copy_partial(p, data, p->tot_len, 0);
+ // fix RxDataBuff -> TxDataBuff, ENET_RXBUFF_SIZE -> ENET_TXBUFF_SIZE
+ data = (uint8_t *)ENET_ALIGN(&lpc_emac_device.TxDataBuff[lpc_emac_device.txIdx * ENET_ALIGN(ENET_TXBUFF_SIZE)]);
+ len = pbuf_copy_partial(p, data, p->tot_len, 0);
lpc_emac_device.txIdx = (lpc_emac_device.txIdx + 1) / ENET_TXBD_NUM;
- result = ENET_SendFrame(enet_base, enet_handle, data, p->len);
+ // fix 'p->len' to 'len', avoid send wrong partial packet.
+ result = ENET_SendFrame(enet_base, enet_handle, data, len);
if ((result == kStatus_ENET_TxFrameFail) || (result == kStatus_ENET_TxFrameOverLen) || (result == kStatus_ENET_TxFrameBusy))
{
diff --git a/bsp/lpc54608-LPCXpresso/drivers/drv_sd.c b/bsp/lpc54608-LPCXpresso/drivers/drv_sd.c
index d0b9573046..9400671301 100644
--- a/bsp/lpc54608-LPCXpresso/drivers/drv_sd.c
+++ b/bsp/lpc54608-LPCXpresso/drivers/drv_sd.c
@@ -407,6 +407,22 @@ rt_err_t mci_hw_init(const char *device_name)
rt_kprintf("SD_Init failed!\n");
return -RT_ERROR;
}
+
+ /*
+ follow the page: https://community.nxp.com/thread/454769
+
+ The issue concerns sdmmc library bug (I finally solved) in SD_Init() in the file sdmmc/src/fsl_sd.c:SD_SelectBusTiming()
+ calls SD_SwitchFunction() which sets block size to 64bytes (512bits).Therefore SD_SetBlockSize(card, FSL_SDMMC_DEFAULT_BLOCK_SIZE)
+ should be called again before SD_Init() exits.
+ */
+
+ if (kStatus_Success != SDMMC_SetBlockSize(_mci_device->card.host.base, _mci_device->card.host.transfer, FSL_SDMMC_DEFAULT_BLOCK_SIZE))
+ {
+ SD_Deinit(&_mci_device->card);
+ memset(&_mci_device->card, 0U, sizeof(_mci_device->card));
+ rt_kprintf("SD_Init failed!\n");
+ return -RT_ERROR;
+ }
/* initialize mutex lock */
rt_mutex_init(&_mci_device->lock, device_name, RT_IPC_FLAG_FIFO);
diff --git a/bsp/ls1cdev/drivers/drv_spi.c b/bsp/ls1cdev/drivers/drv_spi.c
index 900f7e4aad..4b81d55d71 100644
--- a/bsp/ls1cdev/drivers/drv_spi.c
+++ b/bsp/ls1cdev/drivers/drv_spi.c
@@ -19,7 +19,8 @@
*
* Change Logs:
* Date Author Notes
- * 2017-11-02 ���� first version
+ * 2017-11-02 勤为本 first version
+ * 2018-06-09 zhuangwei add spi0 cs0 support,remove msd_init
*/
#include <rtthread.h>
@@ -42,14 +43,14 @@ static rt_err_t configure(struct rt_spi_device *device, struct rt_spi_configurat
static rt_uint32_t xfer(struct rt_spi_device *device, struct rt_spi_message *message);
-static struct rt_spi_ops ls1c_spi_ops =
+static struct rt_spi_ops ls1c_spi_ops =
{
.configure = configure,
.xfer = xfer
};
-static rt_err_t configure(struct rt_spi_device *device,
+static rt_err_t configure(struct rt_spi_device *device,
struct rt_spi_configuration *configuration)
{
struct rt_spi_bus *spi_bus = NULL;
@@ -69,28 +70,28 @@ static rt_err_t configure(struct rt_spi_device *device,
spi_base = ls1c_spi_get_base(SPIx);
{
- // ʹ��SPI��������masterģʽ���ر��ж�
+ // 使能SPI控制器,master模式,关闭中断
reg_write_8(0x53, spi_base + LS1C_SPI_SPCR_OFFSET);
- // ���״̬�Ĵ���
+ // 清空状态寄存器
reg_write_8(0xc0, spi_base + LS1C_SPI_SPSR_OFFSET);
- // 1�ֽڲ����жϣ�����(��)�뷢��(д)ʱ��ͬʱ
+ // 1字节产生中断,采样(读)与发送(写)时机同时
reg_write_8(0x03, spi_base + LS1C_SPI_SPER_OFFSET);
- // �ر�SPI flash
+ // 关闭SPI flash
val = reg_read_8(spi_base + LS1C_SPI_SFC_PARAM_OFFSET);
val &= 0xfe;
reg_write_8(val, spi_base + LS1C_SPI_SFC_PARAM_OFFSET);
- // spi flashʱ����ƼĴ���
+ // spi flash时序控制寄存器
reg_write_8(0x05, spi_base + LS1C_SPI_SFC_TIMING_OFFSET);
}
-
+
// baudrate
ls1c_spi_set_clock(spi_base, configuration->max_hz);
- // ����ͨ��ģʽ(ʱ�Ӽ��Ժ���λ)
+ // 设置通信模式(时钟极性和相位)
if (configuration->mode & RT_SPI_CPOL) // cpol
{
cpol = SPI_CPOL_1;
@@ -115,7 +116,7 @@ static rt_err_t configure(struct rt_spi_device *device,
}
-static rt_uint32_t xfer(struct rt_spi_device *device,
+static rt_uint32_t xfer(struct rt_spi_device *device,
struct rt_spi_message *message)
{
struct rt_spi_bus *spi_bus = NULL;
@@ -148,7 +149,7 @@ static rt_uint32_t xfer(struct rt_spi_device *device,
ls1c_spi_set_cs(spi_base, cs, 0);
}
- // �շ�����
+ // 收发数据
send_ptr = message->send_buf;
recv_ptr = message->recv_buf;
while (size--)
@@ -180,7 +181,7 @@ static rt_uint32_t xfer(struct rt_spi_device *device,
#ifdef RT_USING_SPI0
-struct ls1c_spi ls1c_spi0 =
+struct ls1c_spi ls1c_spi0 =
{
.SPIx = LS1C_SPI_0,
};
@@ -190,7 +191,7 @@ static struct rt_spi_bus spi0_bus;
#ifdef RT_USING_SPI1
-struct ls1c_spi ls1c_spi1 =
+struct ls1c_spi ls1c_spi1 =
{
.SPIx = LS1C_SPI_1,
};
@@ -200,10 +201,10 @@ static struct rt_spi_bus spi1_bus;
/*
- * ��ʼ����ע����о1c��spi����
- * @SPI SPI���ߣ�����LS1C_SPI_0�� LS1C_SPI_1
- * @spi_bus_name ��������
- * @ret
+ * 初始化并注册龙芯1c的spi总线
+ * @SPI SPI总线,比如LS1C_SPI_0, LS1C_SPI_1
+ * @spi_bus_name 总线名字
+ * @ret
*/
rt_err_t ls1c_spi_bus_register(rt_uint8_t SPI, const char *spi_bus_name)
{
@@ -235,14 +236,16 @@ int ls1c_hw_spi_init(void)
pin_set_purpose(79, PIN_PURPOSE_OTHER);
pin_set_purpose(80, PIN_PURPOSE_OTHER);
pin_set_purpose(83, PIN_PURPOSE_OTHER);//cs2 - SD card
- pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1
-
- pin_set_remap(78, PIN_REMAP_FOURTH);
- pin_set_remap(79, PIN_REMAP_FOURTH);
- pin_set_remap(80, PIN_REMAP_FOURTH);
- pin_set_remap(83, PIN_REMAP_FOURTH);//cs2 - SD card
- pin_set_remap(82, PIN_REMAP_FOURTH);//cs1
- ls1c_spi_bus_register(LS1C_SPI_0,"spi0");
+ pin_set_purpose(82, PIN_PURPOSE_OTHER);//cs1
+ pin_set_purpose(81, PIN_PURPOSE_OTHER);//cs0
+
+ pin_set_remap(78, PIN_REMAP_DEFAULT);
+ pin_set_remap(79, PIN_REMAP_DEFAULT);
+ pin_set_remap(80, PIN_REMAP_DEFAULT);
+ pin_set_remap(83, PIN_REMAP_DEFAULT);//cs2 - SD card
+ pin_set_remap(82, PIN_REMAP_DEFAULT);//CS1
+ pin_set_remap(81, PIN_REMAP_DEFAULT);//cs0
+ ls1c_spi_bus_register(LS1C_SPI_0, "spi0");
#endif
#ifdef RT_USING_SPI1
@@ -254,7 +257,7 @@ int ls1c_hw_spi_init(void)
pin_set_remap(47, PIN_REMAP_THIRD);
pin_set_remap(48, PIN_REMAP_THIRD);
pin_set_remap(49, PIN_REMAP_THIRD);//CS0 - touch screen
- ls1c_spi_bus_register(LS1C_SPI_1,"spi1");
+ ls1c_spi_bus_register(LS1C_SPI_1, "spi1");
#endif
@@ -262,31 +265,35 @@ int ls1c_hw_spi_init(void)
#ifdef RT_USING_SPI0
/* attach cs */
{
+ static struct rt_spi_device spi_device0;
static struct rt_spi_device spi_device1;
static struct rt_spi_device spi_device2;
+ static struct ls1c_spi_cs spi_cs0;
static struct ls1c_spi_cs spi_cs1;
static struct ls1c_spi_cs spi_cs2;
/* spi02: CS2 SD Card*/
spi_cs2.cs = LS1C_SPI_CS_2;
- rt_spi_bus_attach_device(&spi_device2, "spi02", "spi0", (void*)&spi_cs2);
+ rt_spi_bus_attach_device(&spi_device2, "spi02", "spi0", (void *)&spi_cs2);
spi_cs1.cs = LS1C_SPI_CS_1;
- rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void*)&spi_cs1);
- msd_init("sd0", "spi02");
+ rt_spi_bus_attach_device(&spi_device1, "spi01", "spi0", (void *)&spi_cs1);
+ spi_cs0.cs = LS1C_SPI_CS_0;
+ rt_spi_bus_attach_device(&spi_device0, "spi00", "spi0", (void *)&spi_cs0);
}
#endif
-#ifdef RT_USING_SPI1
+#ifdef RT_USING_SPI1
{
static struct rt_spi_device spi_device;
static struct ls1c_spi_cs spi_cs;
/* spi10: CS0 Touch*/
spi_cs.cs = LS1C_SPI_CS_0;
- rt_spi_bus_attach_device(&spi_device, "spi10", "spi1", (void*)&spi_cs);
+ rt_spi_bus_attach_device(&spi_device, "spi10", "spi1", (void *)&spi_cs);
}
#endif
}
+
INIT_BOARD_EXPORT(ls1c_hw_spi_init);
#endif
diff --git a/bsp/ls1cdev/libraries/ls1c_spi.c b/bsp/ls1cdev/libraries/ls1c_spi.c
index e3df729064..eff1deb74f 100644
--- a/bsp/ls1cdev/libraries/ls1c_spi.c
+++ b/bsp/ls1cdev/libraries/ls1c_spi.c
@@ -260,7 +260,7 @@ inline void ls1c_spi_clear(void *spi_base)
val = reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET);
if (LS1C_SPI_SPSR_WCOL_MASK & val)
{
- rt_kprintf("[%s] clear register SPSR's wcol!\r\n"); // 手册和linux源码中不一样,加个打印看看
+ rt_kprintf("[%s] clear register SPSR's wcol!\r\n",__FUNCTION__); // 手册和linux源码中不一样,加个打印看看
reg_write_8(val & ~LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写0,linux源码中是写0
// reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写1,按照1c手册,应该写1
}
diff --git a/bsp/stm32f10x/drivers/stm32f1_wdg.c b/bsp/stm32f10x/drivers/stm32f1_wdg.c
index fae575abc7..a26283fb27 100644
--- a/bsp/stm32f10x/drivers/stm32f1_wdg.c
+++ b/bsp/stm32f10x/drivers/stm32f1_wdg.c
@@ -27,7 +27,7 @@ static rt_err_t stm32f1_wdg_control(rt_watchdog_t *wdt, int cmd, void *arg)
switch(cmd)
{
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
- timeout_ms = (rt_uint32_t) arg;
+ timeout_ms = *((rt_uint32_t*) arg);
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
if(timeout_ms >= 13107)
{
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index 59fd83e091..1eb23df2f1 100755
--- a/components/drivers/Kconfig
+++ b/components/drivers/Kconfig
@@ -66,6 +66,10 @@ config RT_USING_PIN
bool "Using generic GPIO device drivers"
default y
+config RT_USING_PWM
+ bool "Using PWM device drivers"
+ default n
+
config RT_USING_MTD_NOR
bool "Using MTD Nor Flash device drivers"
default n
@@ -162,6 +166,24 @@ config RT_USING_WIFI
bool "Using Wi-Fi network"
default n
+ if RT_USING_WIFI
+ config RT_USING_WLAN_STA
+ bool "Using station mode"
+ default y
+
+ config RT_USING_WLAN_AP
+ bool "Using ap mode"
+ default n
+
+ config WIFI_DEVICE_STA_NAME
+ string "the wifi device name for station"
+ default "w0"
+
+ config WIFI_DEVICE_AP_NAME
+ string "the wifi device name for ap"
+ default "ap"
+ endif
+
config RT_USING_AUDIO
bool "Using Audio device drivers"
default n
diff --git a/components/drivers/cputime/cputime_cortexm.c b/components/drivers/cputime/cputime_cortexm.c
index f576df785f..99dc8b013e 100644
--- a/components/drivers/cputime/cputime_cortexm.c
+++ b/components/drivers/cputime/cputime_cortexm.c
@@ -54,6 +54,9 @@ int cortexm_cputime_init(void)
/* check support bit */
if ((DWT->CTRL & (1UL << DWT_CTRL_NOCYCCNT_Pos)) == 0)
{
+ /* enable trace*/
+ CoreDebug->DEMCR |= (1UL << CoreDebug_DEMCR_TRCENA_Pos);
+
/* whether cycle counter not enabled */
if ((DWT->CTRL & (1UL << DWT_CTRL_CYCCNTENA_Pos)) == 0)
{
diff --git a/components/drivers/include/drivers/rt_drv_pwm.h b/components/drivers/include/drivers/rt_drv_pwm.h
new file mode 100644
index 0000000000..ffd08edabb
--- /dev/null
+++ b/components/drivers/include/drivers/rt_drv_pwm.h
@@ -0,0 +1,54 @@
+/*
+ * File : rt_drv_pwm.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2018, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-07 aozima the first version
+ */
+
+#ifndef __DRV_PWM_H_INCLUDE__
+#define __DRV_PWM_H_INCLUDE__
+
+#define PWM_CMD_ENABLE (128 + 0)
+#define PWM_CMD_DISABLE (128 + 1)
+#define PWM_CMD_SET (128 + 2)
+#define PWM_CMD_GET (128 + 3)
+
+struct rt_pwm_configuration
+{
+ rt_uint32_t channel; /* 0-n */
+ rt_uint32_t period; /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
+ rt_uint32_t pulse; /* unit:ns (pulse<=period) */
+};
+
+struct rt_device_pwm;
+struct rt_pwm_ops
+{
+ rt_err_t (*control)(struct rt_device_pwm *device, int cmd, void *arg);
+};
+
+struct rt_device_pwm
+{
+ struct rt_device parent;
+ const struct rt_pwm_ops *ops;
+};
+
+extern rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data);
+
+#endif /* __DRV_PWM_H_INCLUDE__ */
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index f7aadd8305..e3c826fe53 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -112,6 +112,10 @@ extern "C" {
#include "drivers/cputime.h"
#endif
+#ifdef RT_USING_PWM
+#include "drivers/rt_drv_pwm.h"
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript
index 7f269d4ee9..4cc5f80084 100644
--- a/components/drivers/misc/SConscript
+++ b/components/drivers/misc/SConscript
@@ -8,6 +8,9 @@ group = []
if GetDepend(['RT_USING_PIN']):
src = src + ['pin.c']
+if GetDepend(['RT_USING_PWM']):
+ src = src + ['rt_drv_pwm.c']
+
if len(src):
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
diff --git a/components/drivers/misc/rt_drv_pwm.c b/components/drivers/misc/rt_drv_pwm.c
new file mode 100644
index 0000000000..6884f8cfe4
--- /dev/null
+++ b/components/drivers/misc/rt_drv_pwm.c
@@ -0,0 +1,214 @@
+/*
+ * File : rt_drv_pwm.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2018, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-07 aozima the first version
+ */
+
+#include <string.h>
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+
+static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev;
+
+ if (pwm->ops->control)
+ {
+ result = pwm->ops->control(pwm, cmd, args);
+ }
+
+ return result;
+}
+
+
+/*
+pos: channel
+void *buffer: rt_uint32_t pulse[size]
+size : number of pulse, only set to sizeof(rt_uint32_t).
+*/
+static rt_size_t _pwm_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev;
+ rt_uint32_t *pulse = (rt_uint32_t *)buffer;
+ struct rt_pwm_configuration configuration = {0};
+
+ configuration.channel = pos;
+
+ if (pwm->ops->control)
+ {
+ result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration);
+ if (result != RT_EOK)
+ {
+ return 0;
+ }
+
+ *pulse = configuration.pulse;
+ }
+
+ return size;
+}
+
+/*
+pos: channel
+void *buffer: rt_uint32_t pulse[size]
+size : number of pulse, only set to sizeof(rt_uint32_t).
+*/
+static rt_size_t _pwm_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev;
+ rt_uint32_t *pulse = (rt_uint32_t *)buffer;
+ struct rt_pwm_configuration configuration = {0};
+
+ configuration.channel = pos;
+
+ if (pwm->ops->control)
+ {
+ result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration);
+ if (result != RT_EOK)
+ {
+ return 0;
+ }
+
+ configuration.pulse = *pulse;
+
+ result = pwm->ops->control(pwm, PWM_CMD_SET, &configuration);
+ if (result != RT_EOK)
+ {
+ return 0;
+ }
+
+ }
+
+ return size;
+}
+
+rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data)
+{
+ rt_err_t result = RT_EOK;
+
+ memset(device, 0, sizeof(struct rt_device_pwm));
+
+ device->parent.type = RT_Device_Class_Miscellaneous;
+
+ device->parent.init = RT_NULL;
+ device->parent.open = RT_NULL;
+ device->parent.close = RT_NULL;
+ device->parent.read = _pwm_read;
+ device->parent.write = _pwm_write;
+ device->parent.control = _pwm_control;
+
+ device->ops = ops;
+ device->parent.user_data = (void *)user_data;
+
+ result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR);
+
+ return result;
+}
+
+rt_err_t rt_pwm_enable(int channel)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_device *device = rt_device_find("pwm");
+ struct rt_pwm_configuration configuration = {0};
+
+ if (!device)
+ {
+ return -RT_EIO;
+ }
+
+ configuration.channel = channel;
+ result = rt_device_control(device, PWM_CMD_ENABLE, &configuration);
+
+ return result;
+}
+
+rt_err_t rt_pwm_set(int channel, rt_uint32_t period, rt_uint32_t pulse)
+{
+ rt_err_t result = RT_EOK;
+ struct rt_device *device = rt_device_find("pwm");
+ struct rt_pwm_configuration configuration = {0};
+
+ if (!device)
+ {
+ return -RT_EIO;
+ }
+
+ configuration.channel = channel;
+ configuration.period = period;
+ configuration.pulse = pulse;
+ result = rt_device_control(device, PWM_CMD_SET, &configuration);
+
+ return result;
+}
+
+
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_enable, pwm_enable, enable pwm by channel.);
+FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_set, pwm_set, set pwm.);
+
+#ifdef FINSH_USING_MSH
+static int pwm_enable(int argc, char **argv)
+{
+ int result = 0;
+
+ if (argc != 2)
+ {
+ rt_kprintf("Usage: pwm_enable 1\n");
+ result = -RT_ERROR;
+ goto _exit;
+ }
+
+ result = rt_pwm_enable(atoi(argv[1]));
+
+_exit:
+ return result;
+}
+MSH_CMD_EXPORT(pwm_enable, pwm_enable 1);
+
+static int pwm_set(int argc, char **argv)
+{
+ int result = 0;
+
+ if (argc != 4)
+ {
+ rt_kprintf("Usage: pwm_set 1 100 50\n");
+ result = -RT_ERROR;
+ goto _exit;
+ }
+
+ result = rt_pwm_set(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
+
+_exit:
+ return result;
+}
+MSH_CMD_EXPORT(pwm_set, pwm_set 1 100 50);
+
+#endif /* FINSH_USING_MSH */
+
+
+#endif /* RT_USING_FINSH */
diff --git a/components/drivers/spi/spi_flash_sfud.c b/components/drivers/spi/spi_flash_sfud.c
index c4fd1e0208..c57ef86925 100644
--- a/components/drivers/spi/spi_flash_sfud.c
+++ b/components/drivers/spi/spi_flash_sfud.c
@@ -183,7 +183,7 @@ void sfud_log_debug(const char *file, const long line, const char *format, ...)
/* args point to the first variable parameter */
va_start(args, format);
- rt_kprintf("[SFUD](%s:%ld) ", file, line);
+ rt_kprintf("[SFUD] (%s:%ld) ", file, line);
/* must use vprintf to print */
vsnprintf(log_buf, sizeof(log_buf), format, args);
rt_kprintf("%s\n", log_buf);
@@ -201,7 +201,7 @@ void sfud_log_info(const char *format, ...) {
/* args point to the first variable parameter */
va_start(args, format);
- rt_kprintf("[SFUD]");
+ rt_kprintf("[SFUD] ");
/* must use vprintf to print */
vsnprintf(log_buf, sizeof(log_buf), format, args);
rt_kprintf("%s\n", log_buf);
@@ -216,6 +216,9 @@ sfud_err sfud_spi_port_init(sfud_flash *flash) {
flash->spi.lock = spi_lock;
flash->spi.unlock = spi_unlock;
flash->spi.user_data = flash;
+ if (RT_TICK_PER_SECOND < 1000) {
+ rt_kprintf("[SFUD] Warning: The OS tick(%d) is less than 1000. So the flash write will take more time.\n", RT_TICK_PER_SECOND);
+ }
/* 100 microsecond delay */
flash->retry.delay = retry_delay_100us;
/* 60 seconds timeout */
@@ -371,7 +374,7 @@ rt_err_t rt_sfud_flash_delete(rt_spi_flash_device_t spi_flash_dev) {
static void sf(uint8_t argc, char **argv) {
-#define CMD_SETECT_INDEX 0
+#define CMD_PROBE_INDEX 0
#define CMD_READ_INDEX 1
#define CMD_WRITE_INDEX 2
#define CMD_ERASE_INDEX 3
@@ -384,7 +387,7 @@ static void sf(uint8_t argc, char **argv) {
size_t i = 0;
const char* sf_help_info[] = {
- [CMD_SETECT_INDEX] = "sf probe [spi_device] - probe and init SPI flash by given 'spi_device'",
+ [CMD_PROBE_INDEX] = "sf probe [spi_device] - probe and init SPI flash by given 'spi_device'",
[CMD_READ_INDEX] = "sf read addr size - read 'size' bytes starting at 'addr'",
[CMD_WRITE_INDEX] = "sf write addr data1 ... dataN - write some bytes 'data' to flash starting at 'addr'",
[CMD_ERASE_INDEX] = "sf erase addr size - erase 'size' bytes starting at 'addr'",
@@ -404,7 +407,7 @@ static void sf(uint8_t argc, char **argv) {
if (!strcmp(operator, "probe")) {
if (argc < 3) {
- rt_kprintf("Usage: %s.\n", sf_help_info[CMD_SETECT_INDEX]);
+ rt_kprintf("Usage: %s.\n", sf_help_info[CMD_PROBE_INDEX]);
} else {
char *spi_dev_name = argv[2];
rtt_dev_bak = rtt_dev;
diff --git a/components/drivers/wlan/wlan_cmd.c b/components/drivers/wlan/wlan_cmd.c
index 5c01732321..33dfac5b75 100644
--- a/components/drivers/wlan/wlan_cmd.c
+++ b/components/drivers/wlan/wlan_cmd.c
@@ -2,7 +2,7 @@
* File : wlan_cmd.c
* Wi-Fi common commands
* This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2016, RT-Thread Development Team
+ * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -40,6 +40,13 @@ static char wifi_ssid[32] = {0};
static char wifi_key[32] = {0};
static int network_mode = WIFI_STATION;
+#define WLAN_DEBUG 1
+#if WLAN_DEBUG
+#define WLAN_DBG(...) rt_kprintf("[WLAN]"),rt_kprintf(__VA_ARGS__)
+#else
+#define WLAN_DBG(...)
+#endif
+
#ifndef WIFI_SETTING_FN
#define WIFI_SETTING_FN "/appfs/setting.json"
#endif
@@ -69,7 +76,7 @@ int wifi_set_mode(int mode)
return network_mode;
}
-int wifi_set_setting(const char* ssid, const char* pwd)
+int wifi_set_setting(const char *ssid, const char *pwd)
{
if (!ssid) return -1;
@@ -87,13 +94,13 @@ int wifi_set_setting(const char* ssid, const char* pwd)
}
#ifdef PKG_USING_CJSON
-int wifi_read_cfg(const char* filename)
+int wifi_read_cfg(const char *filename)
{
int fd;
cJSON *json = RT_NULL;
- fd = open(filename,O_RDONLY, 0);
- if(fd < 0)
+ fd = open(filename, O_RDONLY, 0);
+ if (fd < 0)
{
/* no setting file */
return -1;
@@ -106,7 +113,7 @@ int wifi_read_cfg(const char* filename)
length = lseek(fd, 0, SEEK_END);
if (length)
{
- char *json_str = (char *) rt_malloc (length);
+ char *json_str = (char *) rt_malloc(length);
if (json_str)
{
lseek(fd, 0, SEEK_SET);
@@ -149,7 +156,7 @@ int wifi_read_cfg(const char* filename)
return 0;
}
-int wifi_save_cfg(const char* filename)
+int wifi_save_cfg(const char *filename)
{
int fd;
cJSON *json = RT_NULL;
@@ -162,7 +169,7 @@ int wifi_save_cfg(const char* filename)
length = lseek(fd, 0, SEEK_END);
if (length)
{
- char *json_str = (char *) rt_malloc (length);
+ char *json_str = (char *) rt_malloc(length);
if (json_str)
{
lseek(fd, 0, SEEK_SET);
@@ -244,9 +251,9 @@ int wifi_save_cfg(const char* filename)
int wifi_save_setting(void)
{
- #ifdef PKG_USING_CJSON
+#ifdef PKG_USING_CJSON
wifi_save_cfg(WIFI_SETTING_FN);
- #endif
+#endif
return 0;
}
@@ -265,7 +272,7 @@ int wifi_softap_setup_netif(struct netif *netif)
{
char name[8];
memset(name, 0, sizeof(name));
- strncpy(name, netif->name, sizeof(name)>sizeof(netif->name)? sizeof(netif->name) : sizeof(name));
+ strncpy(name, netif->name, sizeof(name) > sizeof(netif->name) ? sizeof(netif->name) : sizeof(name));
dhcpd_start(name);
}
#endif
@@ -279,15 +286,15 @@ int wifi_default(void)
int result = 0;
struct rt_wlan_device *wlan;
- #ifdef PKG_USING_CJSON
+#ifdef PKG_USING_CJSON
/* read default setting for wifi */
wifi_read_cfg(WIFI_SETTING_FN);
- #endif
+#endif
if (network_mode == WIFI_STATION)
{
/* get wlan device */
- wlan = (struct rt_wlan_device*)rt_device_find(WIFI_DEVICE_STA_NAME);
+ wlan = (struct rt_wlan_device *)rt_device_find(WIFI_DEVICE_STA_NAME);
if (!wlan)
{
rt_kprintf("no wlan:%s device\n", WIFI_DEVICE_STA_NAME);
@@ -296,7 +303,7 @@ int wifi_default(void)
/* wifi station */
rt_wlan_info_init(&info, WIFI_STATION, SECURITY_WPA2_MIXED_PSK, wifi_ssid);
- result =rt_wlan_init(wlan, WIFI_STATION);
+ result = rt_wlan_init(wlan, WIFI_STATION);
if (result == RT_EOK)
{
result = rt_wlan_connect(wlan, &info, wifi_key);
@@ -306,7 +313,7 @@ int wifi_default(void)
{
/* wifi AP */
/* get wlan device */
- wlan = (struct rt_wlan_device*)rt_device_find(WIFI_DEVICE_AP_NAME);
+ wlan = (struct rt_wlan_device *)rt_device_find(WIFI_DEVICE_AP_NAME);
if (!wlan)
{
rt_kprintf("no wlan:%s device\n", WIFI_DEVICE_AP_NAME);
@@ -317,7 +324,7 @@ int wifi_default(void)
info.channel = 11;
/* wifi soft-AP */
- result =rt_wlan_init(wlan, WIFI_AP);
+ result = rt_wlan_init(wlan, WIFI_AP);
if (result == RT_EOK)
{
result = rt_wlan_softap(wlan, &info, wifi_key);
@@ -334,14 +341,14 @@ static void wifi_usage(void)
rt_kprintf("wifi - Do the default wifi action\n");
rt_kprintf("wifi wlan_dev scan\n");
rt_kprintf("wifi wlan_dev join SSID PASSWORD\n");
- rt_kprintf("wifi wlan_dev ap SSID [PASSWORD]\n");
+ rt_kprintf("wifi wlan_dev ap SSID [PASSWORD]\n");
rt_kprintf("wifi wlan_dev up\n");
rt_kprintf("wifi wlan_dev down\n");
rt_kprintf("wifi wlan_dev rssi\n");
rt_kprintf("wifi wlan_dev status\n");
}
-int wifi(int argc, char** argv)
+int wifi(int argc, char **argv)
{
struct rt_wlan_device *wlan;
@@ -368,15 +375,15 @@ int wifi(int argc, char** argv)
network_mode = WIFI_STATION;
- #ifdef PKG_USING_CJSON
+#ifdef PKG_USING_CJSON
wifi_save_cfg(WIFI_SETTING_FN);
- #endif
+#endif
return 0;
}
/* get wlan device */
- wlan = (struct rt_wlan_device*)rt_device_find(argv[1]);
+ wlan = (struct rt_wlan_device *)rt_device_find(argv[1]);
if (!wlan)
{
rt_kprintf("no wlan:%s device\n", argv[1]);
@@ -397,6 +404,7 @@ int wifi(int argc, char** argv)
/* TODO: use easy-join to replace */
rt_wlan_info_init(&info, WIFI_STATION, SECURITY_WPA2_MIXED_PSK, argv[3]);
rt_wlan_connect(wlan, &info, argv[4]);
+ rt_wlan_info_deinit(&info);
}
else if (strcmp(argv[2], "up") == 0)
{
@@ -406,36 +414,28 @@ int wifi(int argc, char** argv)
else if (strcmp(argv[2], "down") == 0)
{
rt_wlan_disconnect(wlan);
+ rt_wlan_info_deinit(&info);
}
else if (strcmp(argv[2], "scan") == 0)
{
- struct rt_wlan_info *infos;
+ struct rt_wlan_scan_result *scan_result = RT_NULL;
- infos = (struct rt_wlan_info*)rt_malloc(sizeof(struct rt_wlan_info) * 12);
- if (infos)
+ rt_wlan_scan(wlan, &scan_result);
+ if (scan_result)
{
int index, num;
- memset(infos, 0x0, sizeof(struct rt_wlan_info) * 12);
- num = rt_wlan_scan(wlan, infos, 12);
-
- for (index = 0; index < num; index ++)
- {
- rt_kprintf("----Wi-Fi AP[%d] Information----\n", index);
- rt_kprintf("SSID: %-.32s\n", infos[index].ssid);
- rt_kprintf("rssi: %d\n", infos[index].rssi);
- rt_kprintf(" chn: %d\n", infos[index].channel);
- rt_kprintf("rate: %d\n", infos[index].datarate);
- rt_kprintf("\n");
- }
-
- /* de-initialize info */
+ num = scan_result->ap_num;
+ rt_kprintf("----Wi-Fi APInformation----\n");
for (index = 0; index < num; index ++)
{
- rt_wlan_info_deinit(&infos[index]);
+ rt_kprintf("SSID:%-.32s, ", scan_result->ap_table[index].ssid);
+ rt_kprintf("rssi:%d, ", scan_result->ap_table[index].rssi);
+ rt_kprintf("chn:%d, ", scan_result->ap_table[index].channel);
+ rt_kprintf("rate:%d\n", scan_result->ap_table[index].datarate);
}
- rt_free(infos);
}
+ rt_wlan_release_scan_result(&scan_result);
}
else if (strcmp(argv[2], "rssi") == 0)
{
@@ -454,7 +454,7 @@ int wifi(int argc, char** argv)
rt_wlan_info_init(&info, WIFI_AP, SECURITY_OPEN, argv[3]);
info.channel = 11;
- result =rt_wlan_init(wlan, WIFI_AP);
+ result = rt_wlan_init(wlan, WIFI_AP);
/* start soft ap */
result = rt_wlan_softap(wlan, &info, NULL);
if (result == RT_EOK)
@@ -468,19 +468,19 @@ int wifi(int argc, char** argv)
rt_wlan_info_init(&info, WIFI_AP, SECURITY_WPA2_AES_PSK, argv[3]);
info.channel = 11;
- result =rt_wlan_init(wlan, WIFI_AP);
+ result = rt_wlan_init(wlan, WIFI_AP);
/* start soft ap */
result = rt_wlan_softap(wlan, &info, argv[4]);
if (result == RT_EOK)
{
network_mode = WIFI_AP;
- }
+ }
}
else
{
wifi_usage();
}
-
+
if (result != RT_EOK)
{
rt_kprintf("wifi start failed! result=%d\n", result);
@@ -496,13 +496,13 @@ int wifi(int argc, char** argv)
rt_kprintf("Wi-Fi AP: %-.32s\n", wlan->info->ssid);
rt_kprintf("MAC Addr: %02x:%02x:%02x:%02x:%02x:%02x\n", wlan->info->bssid[0],
- wlan->info->bssid[1],
- wlan->info->bssid[2],
- wlan->info->bssid[3],
- wlan->info->bssid[4],
- wlan->info->bssid[5]);
+ wlan->info->bssid[1],
+ wlan->info->bssid[2],
+ wlan->info->bssid[3],
+ wlan->info->bssid[4],
+ wlan->info->bssid[5]);
rt_kprintf(" Channel: %d\n", wlan->info->channel);
- rt_kprintf("DataRate: %dMbps\n", wlan->info->datarate/1000);
+ rt_kprintf("DataRate: %dMbps\n", wlan->info->datarate / 1000);
rt_kprintf(" RSSI: %d\n", rssi);
}
else
diff --git a/components/drivers/wlan/wlan_cmd.h b/components/drivers/wlan/wlan_cmd.h
index 5e8b13ce7c..a981601f5e 100644
--- a/components/drivers/wlan/wlan_cmd.h
+++ b/components/drivers/wlan/wlan_cmd.h
@@ -1,3 +1,28 @@
+/*
+ * File : wlan_cmd.h
+ * Wi-Fi common commands
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-06-05 RT-Thread first version
+ */
+
#ifndef WLAN_CMD_H__
#define WLAN_CMD_H__
@@ -11,11 +36,11 @@ int wifi_default(void);
/* setup netif for soft-ap */
int wifi_softap_setup_netif(struct netif *netif);
-int wifi_set_setting(const char* ssid, const char* pwd);
+int wifi_set_setting(const char *ssid, const char *pwd);
#ifdef PKG_USING_CJSON
-int wifi_read_cfg(const char* filename);
-int wifi_save_cfg(const char* filename);
+int wifi_read_cfg(const char *filename);
+int wifi_save_cfg(const char *filename);
#endif
/* save wifi setting with default storage file */
int wifi_save_setting(void);
diff --git a/components/drivers/wlan/wlan_dev.c b/components/drivers/wlan/wlan_dev.c
index 7c310791fa..3c26531508 100644
--- a/components/drivers/wlan/wlan_dev.c
+++ b/components/drivers/wlan/wlan_dev.c
@@ -1,7 +1,7 @@
/*
* RT-Thread Wi-Fi Device
*
- * COPYRIGHT (C) 2014 - 2015, Shanghai Real-Thread Technology Co., Ltd
+ * COPYRIGHT (C) 2014 - 2018, Shanghai Real-Thread Technology Co., Ltd
*
* This file is part of RT-Thread (http://www.rt-thread.org)
*
@@ -29,15 +29,13 @@
#include <rtthread.h>
#include <rtdevice.h>
-#include <lwip/netifapi.h>
-
#include "wlan_dev.h"
#include "wlan_cmd.h"
#define NIOCTL_SADDR 0x02
-void rt_wlan_info_init(struct rt_wlan_info* info, rt_wlan_mode_t mode, rt_wlan_security_t security,
- char *ssid)
+void rt_wlan_info_init(struct rt_wlan_info *info, rt_wlan_mode_t mode, rt_wlan_security_t security,
+ char *ssid)
{
if (info == RT_NULL) return ;
@@ -46,15 +44,15 @@ void rt_wlan_info_init(struct rt_wlan_info* info, rt_wlan_mode_t mode, rt_wlan_s
info->security = security;
if (ssid)
{
- info->ssid = rt_malloc(strlen((char*)ssid) + 1);
+ info->ssid = rt_malloc(strlen((char *)ssid) + 1);
if (info->ssid)
{
- strncpy((char*)info->ssid, (char*)ssid, strlen((char*)ssid) + 1);
+ strncpy((char *)info->ssid, (char *)ssid, strlen((char *)ssid) + 1);
}
}
}
-void rt_wlan_info_deinit(struct rt_wlan_info* info)
+void rt_wlan_info_deinit(struct rt_wlan_info *info)
{
if (info->ssid)
{
@@ -65,18 +63,32 @@ void rt_wlan_info_deinit(struct rt_wlan_info* info)
memset(info, 0x0, sizeof(struct rt_wlan_info));
}
-int rt_wlan_init(struct rt_wlan_device* device, rt_wlan_mode_t mode)
+int rt_wlan_init(struct rt_wlan_device *device, rt_wlan_mode_t mode)
{
int result;
if (device == RT_NULL) return 0;
- result = rt_device_control(RT_DEVICE(device), WIFI_INIT, (void*)&mode);
+ if (device->info == RT_NULL)
+ {
+ struct rt_wlan_info *info;
+ char *ssid;
+
+ info = rt_malloc(sizeof(struct rt_wlan_info));
+ if (info)
+ {
+ ssid = rt_malloc(SSID_LENGTH_MAX_SIZE);
+ info->ssid = ssid;
+ }
+ device->info = info;
+ }
+
+ result = rt_device_control(RT_DEVICE(device), WIFI_INIT, (void *)&mode);
return result;
}
-int rt_wlan_connect(struct rt_wlan_device* device, struct rt_wlan_info* info, char *password)
+int rt_wlan_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, char *password)
{
int result = 0;
@@ -87,28 +99,14 @@ int rt_wlan_connect(struct rt_wlan_device* device, struct rt_wlan_info* info, ch
rt_wlan_set_info(device, info);
}
- result = rt_device_control(RT_DEVICE(device), WIFI_EASYJOIN, (void*)password);
- if (result == RT_EOK)
- {
- struct netif *netif = device->parent.netif;
-
- netifapi_netif_set_up(netif);
- eth_device_linkchange(&(device->parent), RT_TRUE);
+ rt_strncpy((char *)device->key, (char *)password, sizeof(device->key) - 1);
-#ifdef RT_LWIP_DHCP
- /* set DHCP flags */
- // netif->flags |= NETIF_FLAG_DHCP;
- /* start DHCP */
- dhcp_start(netif);
-#endif
-
- rt_strncpy((char*)device->key, (char*)password, sizeof(device->key) - 1);
- }
+ result = rt_device_control(RT_DEVICE(device), WIFI_EASYJOIN, (void *)password);
return result;
}
-int rt_wlan_softap(struct rt_wlan_device* device, struct rt_wlan_info* info, char *password)
+int rt_wlan_softap(struct rt_wlan_device *device, struct rt_wlan_info *info, char *password)
{
int result = RT_EOK;
@@ -119,21 +117,14 @@ int rt_wlan_softap(struct rt_wlan_device* device, struct rt_wlan_info* info, cha
rt_wlan_set_info(device, info);
}
- result = rt_device_control(RT_DEVICE(device), WIFI_SOFTAP, (void*)password);
- if (result == RT_EOK)
- {
- rt_strncpy((char*)device->key, (char*)password, sizeof(device->key) - 1);
-
- netifapi_netif_set_up(device->parent.netif);
- eth_device_linkchange(&(device->parent), RT_TRUE);
+ rt_strncpy((char *)device->key, (char *)password, sizeof(device->key) - 1);
- wifi_softap_setup_netif(device->parent.netif);
- }
+ result = rt_device_control(RT_DEVICE(device), WIFI_SOFTAP, (void *)password);
return result;
}
-int rt_wlan_disconnect(struct rt_wlan_device* device)
+int rt_wlan_disconnect(struct rt_wlan_device *device)
{
int result = 0;
@@ -141,33 +132,30 @@ int rt_wlan_disconnect(struct rt_wlan_device* device)
/* save event handler */
result = rt_device_control(RT_DEVICE(device), WIFI_DISCONNECT, RT_NULL);
- if (result == RT_EOK)
- {
- netifapi_netif_set_down(device->parent.netif);
- eth_device_linkchange(&(device->parent), RT_FALSE);
- }
return result;
}
-int rt_wlan_set_info(struct rt_wlan_device* device, struct rt_wlan_info* info)
+int rt_wlan_set_info(struct rt_wlan_device *device, struct rt_wlan_info *info)
{
- if (device->info == info) return RT_EOK; /* same info */
-
- if (device->info != RT_NULL)
- {
- rt_wlan_info_deinit(device->info);
- rt_free(device->info);
- }
+ if (device == RT_NULL) return -RT_EIO;
+ if (device->info == RT_NULL) return -RT_EIO;
- device->info = info;
+ device->info->mode = info->mode;
+ device->info->security = info->security;
+ memset(device->info->ssid, 0, SSID_LENGTH_MAX_SIZE);
+ memcpy(device->info->ssid, info->ssid, strlen(info->ssid));
+ memcpy(device->info->bssid, info->bssid, 6);
+ device->info->datarate = info->datarate;
+ device->info->channel = info->channel;
+ device->info->rssi = info->rssi;
return RT_EOK;
}
-struct rt_wlan_info *rt_wlan_get_info(struct rt_wlan_device* device)
+struct rt_wlan_info *rt_wlan_get_info(struct rt_wlan_device *device)
{
- struct rt_wlan_info* info = RT_NULL;
+ struct rt_wlan_info *info = RT_NULL;
if (device != RT_NULL)
{
@@ -177,70 +165,153 @@ struct rt_wlan_info *rt_wlan_get_info(struct rt_wlan_device* device)
return info;
}
-int rt_wlan_scan(struct rt_wlan_device* device, struct rt_wlan_info *infos, int item_sz)
+int rt_wlan_scan(struct rt_wlan_device *device, struct rt_wlan_scan_result **scan_result)
{
int result;
- struct rt_wlan_info_request request;
- if (device == RT_NULL) return 0;
+ result = rt_device_control(RT_DEVICE(device), WIFI_SCAN, scan_result);
- request.req_number = item_sz;
- request.rsp_number = 0;
- request.infos = infos;
-
- result = rt_device_control(RT_DEVICE(device), WIFI_SCAN, (void*)&request);
- result = result; /* skip warning */
-
- return request.rsp_number;
+ return result;
}
-int rt_wlan_get_rssi(struct rt_wlan_device* device)
+int rt_wlan_get_rssi(struct rt_wlan_device *device)
{
int rssi;
int result;
if (device == RT_NULL) return 0;
- result = rt_device_control(RT_DEVICE(device), WIFI_GET_RSSI, (void*)&rssi);
+ result = rt_device_control(RT_DEVICE(device), WIFI_GET_RSSI, (void *)&rssi);
if (result == RT_EOK) return rssi;
return result;
}
-int rt_wlan_get_mac(struct rt_wlan_device* device, rt_uint8_t hwaddr[6])
+int rt_wlan_get_mac(struct rt_wlan_device *device, rt_uint8_t hwaddr[6])
{
int result;
if (device == RT_NULL) return 0;
- result = rt_device_control(RT_DEVICE(device), NIOCTL_GADDR, (void*)hwaddr);
+ result = rt_device_control(RT_DEVICE(device), NIOCTL_GADDR, (void *)hwaddr);
return result;
}
-int rt_wlan_set_mac(struct rt_wlan_device* device, rt_uint8_t hwaddr[6])
+int rt_wlan_set_mac(struct rt_wlan_device *device, rt_uint8_t hwaddr[6])
{
int result;
if (device == RT_NULL) return 0;
- result = rt_device_control(RT_DEVICE(device), NIOCTL_SADDR, (void*)hwaddr);
+ result = rt_device_control(RT_DEVICE(device), NIOCTL_SADDR, (void *)hwaddr);
+ return result;
+}
+
+int rt_wlan_enter_powersave(struct rt_wlan_device *device, int level)
+{
+ int result = 0;
+
+ if (device == RT_NULL) return -RT_EIO;
+
+ result = rt_device_control(RT_DEVICE(device), WIFI_ENTER_POWERSAVE, (void *)&level);
+
+ return result;
+}
+
+int rt_wlan_register_event_handler(struct rt_wlan_device *device, rt_wlan_event_t event,
+ rt_wlan_event_handler handler)
+{
+ if (device == RT_NULL) return -RT_EIO;
+ if (event >= WIFI_EVT_MAX) return -RT_EINVAL;
+
+ device->handler[event] = handler;
+
+ return RT_EOK;
+}
+
+int rt_wlan_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_event_t event)
+{
+ if (device == RT_NULL) return -RT_EIO;
+ if (event >= WIFI_EVT_MAX) return -RT_EINVAL;
+
+ device->handler[event] = RT_NULL;
+
+ return RT_EOK;
+}
+
+int rt_wlan_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ if (device == RT_NULL) return -RT_EIO;
+ if (event >= WIFI_EVT_MAX) return -RT_EINVAL;
+
+ if (device->handler[event] != RT_NULL)
+ device->handler[event](device, event, user_data);
+
+ return RT_EOK;
+}
+
+int rt_wlan_cfg_monitor(struct rt_wlan_device *device, rt_wlan_monitor_opition_t opition)
+{
+ int result = 0;
+
+ if (device == RT_NULL) return -RT_EIO;
+
+ result = rt_device_control(RT_DEVICE(device), WIFI_CFG_MONITOR, (void *)&opition);
+
+ return result;
+}
+
+int rt_wlan_set_monitor_callback(struct rt_wlan_device *device, rt_wlan_monitor_callback_t callback)
+{
+ int result = 0;
+
+ if (device == RT_NULL) return -RT_EIO;
+
+ result = rt_device_control(RT_DEVICE(device), WIFI_SET_MONITOR_CALLBACK, (void *)callback);
+
return result;
}
-int rt_wlan_enter_powersave(struct rt_wlan_device* device, int level)
+int rt_wlan_set_channel(struct rt_wlan_device *device, int channel)
{
int result = 0;
if (device == RT_NULL) return -RT_EIO;
- result = rt_device_control(RT_DEVICE(device), WIFI_ENTER_POWERSAVE, (void*)&level);
+ result = rt_device_control(RT_DEVICE(device), WIFI_SET_CHANNEL, (void *)&channel);
return result;
}
-void rt_wlan_set_event_callback(struct rt_wlan_device* device, rt_wlan_event_handler handler,
- void *user_data)
+int rt_wlan_get_channel(struct rt_wlan_device *device)
{
- if (device == RT_NULL) return ;
+ int channel = 0;
- device->handler = handler;
- device->user_data = user_data;
+ if (device == RT_NULL) return -RT_EIO;
+
+ rt_device_control(RT_DEVICE(device), WIFI_GET_CHANNEL, &channel);
+
+ return channel;
+}
+
+void rt_wlan_release_scan_result(struct rt_wlan_scan_result **scan_result)
+{
+ int i, ap_num;
+ struct rt_wlan_scan_result *_scan_result;
- return ;
+ if (*scan_result != RT_NULL)
+ {
+ _scan_result = *scan_result;
+ ap_num = _scan_result->ap_num;
+ for (i = 0; i < ap_num; i++)
+ {
+ if (_scan_result->ap_table[i].ssid != RT_NULL)
+ {
+ rt_free(_scan_result->ap_table[i].ssid);
+ _scan_result->ap_table[i].ssid = RT_NULL;
+ }
+ }
+ _scan_result->ap_num = 0;
+ rt_free(_scan_result->ap_table);
+ _scan_result->ap_table = RT_NULL;
+ }
+ rt_free(*scan_result);
+ *scan_result = RT_NULL;
+ scan_result = RT_NULL;
}
diff --git a/components/drivers/wlan/wlan_dev.h b/components/drivers/wlan/wlan_dev.h
index cbd5e2e5b5..df7244fd6f 100644
--- a/components/drivers/wlan/wlan_dev.h
+++ b/components/drivers/wlan/wlan_dev.h
@@ -1,7 +1,7 @@
/*
* RT-Thread Wi-Fi Device
*
- * COPYRIGHT (C) 2014 - 2015, Shanghai Real-Thread Technology Co., Ltd
+ * COPYRIGHT (C) 2014 - 2018, Shanghai Real-Thread Technology Co., Ltd
*
* This file is part of RT-Thread (http://www.rt-thread.org)
*
@@ -25,6 +25,7 @@
* Date Author Notes
* 2014-09-11 Bernard the first verion
*/
+
#ifndef WIFI_DEVICE_H__
#define WIFI_DEVICE_H__
@@ -33,6 +34,7 @@
typedef enum
{
+ WIFI_NONE,
WIFI_STATION,
WIFI_AP,
} rt_wlan_mode_t;
@@ -47,6 +49,10 @@ typedef enum
WIFI_DISCONNECT,
WIFI_GET_RSSI, /* get sensitivity (dBm) */
WIFI_ENTER_POWERSAVE,
+ WIFI_CFG_MONITOR, /* start/stop minitor */
+ WIFI_SET_CHANNEL,
+ WIFI_GET_CHANNEL,
+ WIFI_SET_MONITOR_CALLBACK,
} rt_wlan_cmd_t;
typedef enum
@@ -56,6 +62,12 @@ typedef enum
WIFI_PWR_NORMAL
} rt_wlan_powersave_t;
+typedef enum
+{
+ WIFI_MONITOR_START,
+ WIFI_MONITOR_STOP
+} rt_wlan_monitor_opition_t;
+
#define SHARED_ENABLED 0x00008000
#define WPA_SECURITY 0x00200000
#define WPA2_SECURITY 0x00400000
@@ -66,7 +78,7 @@ typedef enum
#define WSEC_SWFLAG 0x0008
#define KEY_ARRAY_SIZE 32
-
+#define SSID_LENGTH_MAX_SIZE 32 + 1
/**
* Enumeration of Wi-Fi security modes
*/
@@ -74,23 +86,32 @@ typedef enum
{
SECURITY_OPEN = 0, /**< Open security */
SECURITY_WEP_PSK = WEP_ENABLED, /**< WEP Security with open authentication */
- SECURITY_WEP_SHARED = ( WEP_ENABLED | SHARED_ENABLED ), /**< WEP Security with shared authentication */
- SECURITY_WPA_TKIP_PSK = ( WPA_SECURITY | TKIP_ENABLED ), /**< WPA Security with TKIP */
- SECURITY_WPA_AES_PSK = ( WPA_SECURITY | AES_ENABLED ), /**< WPA Security with AES */
- SECURITY_WPA2_AES_PSK = ( WPA2_SECURITY | AES_ENABLED ), /**< WPA2 Security with AES */
- SECURITY_WPA2_TKIP_PSK = ( WPA2_SECURITY | TKIP_ENABLED ), /**< WPA2 Security with TKIP */
- SECURITY_WPA2_MIXED_PSK = ( WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED ), /**< WPA2 Security with AES & TKIP */
+ SECURITY_WEP_SHARED = (WEP_ENABLED | SHARED_ENABLED), /**< WEP Security with shared authentication */
+ SECURITY_WPA_TKIP_PSK = (WPA_SECURITY | TKIP_ENABLED), /**< WPA Security with TKIP */
+ SECURITY_WPA_AES_PSK = (WPA_SECURITY | AES_ENABLED), /**< WPA Security with AES */
+ SECURITY_WPA2_AES_PSK = (WPA2_SECURITY | AES_ENABLED), /**< WPA2 Security with AES */
+ SECURITY_WPA2_TKIP_PSK = (WPA2_SECURITY | TKIP_ENABLED), /**< WPA2 Security with TKIP */
+ SECURITY_WPA2_MIXED_PSK = (WPA2_SECURITY | AES_ENABLED | TKIP_ENABLED), /**< WPA2 Security with AES & TKIP */
SECURITY_WPS_OPEN = WPS_ENABLED, /**< WPS with open security */
SECURITY_WPS_SECURE = (WPS_ENABLED | AES_ENABLED), /**< WPS with AES security */
- SECURITY_UNKNOWN = -1, /**< May be returned by scan function if security is unknown.
+ SECURITY_UNKNOWN = -1, /**< May be returned by scan function if security is unknown.
Do not pass this to the join function! */
} rt_wlan_security_t;
typedef enum
{
+ WIFI_EVT_INIT_DONE = 0,
WIFI_EVT_LINK_DOWN,
WIFI_EVT_LINK_UP,
-}rt_wlan_event_t;
+ WIFI_EVT_CONNECT,
+ WIFI_EVT_DISCONNECT,
+ WIFI_EVT_AP_START,
+ WIFI_EVT_AP_STOP,
+ WIFI_EVENT_STA_ASSOC,
+ WIFI_EVENT_STA_DISASSOC,
+ WIFI_EVT_SCAN_DONE,
+ WIFI_EVT_MAX,
+} rt_wlan_event_t;
/* wifi network information */
struct rt_wlan_info
@@ -117,59 +138,83 @@ struct rt_wlan_info_request
struct rt_wlan_info *infos;/* the array of information to save response */
};
-struct rt_wlan_device;
-typedef void (*rt_wlan_event_handler)(struct rt_wlan_device* device, rt_wlan_event_t event, void* user_data);
+typedef struct rt_wlan_scan_result
+{
+ char ap_num;
+ struct rt_wlan_info *ap_table;
+} rt_wlan_scan_result_t;
+struct rt_wlan_device;
+typedef void (*rt_wlan_event_handler)(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data);
+typedef void (*rt_wlan_monitor_callback_t)(uint8_t *data, int len, void *user_data);
struct rt_wlan_device
{
struct eth_device parent;
- struct rt_wlan_info* info;
+ struct rt_wlan_info *info;
char key[KEY_ARRAY_SIZE + 1];
- rt_wlan_event_handler handler;
- void* user_data;
+ rt_wlan_event_handler handler[WIFI_EVT_MAX];
+ void *user_data;
int interface;
};
/*
* Wi-Fi Information APIs
*/
-void rt_wlan_info_init(struct rt_wlan_info* info, rt_wlan_mode_t mode, rt_wlan_security_t security,
- char *ssid);
-void rt_wlan_info_deinit(struct rt_wlan_info* info);
+void rt_wlan_info_init(struct rt_wlan_info *info, rt_wlan_mode_t mode, rt_wlan_security_t security,
+ char *ssid);
+void rt_wlan_info_deinit(struct rt_wlan_info *info);
/*
* Wi-Fi Manager APIs
*/
-int rt_wlan_init(struct rt_wlan_device* device, rt_wlan_mode_t mode);
+int rt_wlan_init(struct rt_wlan_device *device, rt_wlan_mode_t mode);
-int rt_wlan_connect(struct rt_wlan_device* device, struct rt_wlan_info* info,
- char *password);
-int rt_wlan_disconnect(struct rt_wlan_device* device);
+int rt_wlan_connect(struct rt_wlan_device *device, struct rt_wlan_info *info,
+ char *password);
+int rt_wlan_disconnect(struct rt_wlan_device *device);
-int rt_wlan_softap(struct rt_wlan_device* device, struct rt_wlan_info* info,
- char *password);
+int rt_wlan_softap(struct rt_wlan_device *device, struct rt_wlan_info *info,
+ char *password);
/* set wifi information for AP */
-int rt_wlan_set_info(struct rt_wlan_device* device, struct rt_wlan_info* info);
+int rt_wlan_set_info(struct rt_wlan_device *device, struct rt_wlan_info *info);
/* get wifi information for AP */
-struct rt_wlan_info *rt_wlan_get_info(struct rt_wlan_device* device);
+struct rt_wlan_info *rt_wlan_get_info(struct rt_wlan_device *device);
/* get the AP result which were scaned in station */
-int rt_wlan_scan(struct rt_wlan_device* device, struct rt_wlan_info *infos, int item_sz);
+int rt_wlan_scan(struct rt_wlan_device *device, struct rt_wlan_scan_result **scan_result);
/* get rssi */
-int rt_wlan_get_rssi(struct rt_wlan_device* device);
+int rt_wlan_get_rssi(struct rt_wlan_device *device);
/* Get/Set MAC */
-int rt_wlan_get_mac(struct rt_wlan_device* device,rt_uint8_t hwaddr[6]);
-int rt_wlan_set_mac(struct rt_wlan_device* device,rt_uint8_t hwaddr[6]);
+int rt_wlan_get_mac(struct rt_wlan_device *device, rt_uint8_t hwaddr[6]);
+int rt_wlan_set_mac(struct rt_wlan_device *device, rt_uint8_t hwaddr[6]);
/* enter power save level */
-int rt_wlan_enter_powersave(struct rt_wlan_device* device, int level);
+int rt_wlan_enter_powersave(struct rt_wlan_device *device, int level);
-void rt_wlan_set_event_callback(struct rt_wlan_device* device, rt_wlan_event_handler handler,
- void *user_data);
+/* register the event handler */
+int rt_wlan_register_event_handler(struct rt_wlan_device *device, rt_wlan_event_t event,
+ rt_wlan_event_handler handler);
-#endif
+/* un-register the event handler */
+int rt_wlan_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_event_t event);
+
+/* wlan driver indicate event to upper layer through wifi_indication. */
+int rt_wlan_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_event_t event,
+ void *user_data);
+
+/* start or stop monitor */
+int rt_wlan_cfg_monitor(struct rt_wlan_device *device, rt_wlan_monitor_opition_t opition);
+
+/* set callback function for monitor mode*/
+int rt_wlan_set_monitor_callback(struct rt_wlan_device *device, rt_wlan_monitor_callback_t callback);
+/* Set the monitor channel */
+int rt_wlan_set_channel(struct rt_wlan_device *device, int channel);
+
+void rt_wlan_release_scan_result(struct rt_wlan_scan_result **scan_result);
+
+#endif
diff --git a/components/drivers/wlan/wlan_mgnt.c b/components/drivers/wlan/wlan_mgnt.c
new file mode 100644
index 0000000000..2a728747f2
--- /dev/null
+++ b/components/drivers/wlan/wlan_mgnt.c
@@ -0,0 +1,142 @@
+/*
+ * RT-Thread Wi-Fi Device
+ *
+ * COPYRIGHT (C) 2014 - 2018, Shanghai Real-Thread Technology Co., Ltd
+ *
+ * This file is part of RT-Thread (http://www.rt-thread.org)
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-02-27 EvalZero the first verion
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#include <lwip/netifapi.h>
+
+#include "wlan_dev.h"
+#include "wlan_cmd.h"
+
+#define WLAN_MGNT_DEBUG 1
+
+#if WLAN_MGNT_DEBUG
+#define WLAN_MGNT_DBG(...) rt_kprintf("[WLAN_MGNT]"),rt_kprintf(__VA_ARGS__)
+#else
+#define WLAN_MGNT_DBG(...)
+#endif
+
+#ifndef WIFI_DEVICE_STA_NAME
+#define WIFI_DEVICE_STA_NAME "w0"
+#endif
+#ifndef WIFI_DEVICE_AP_NAME
+#define WIFI_DEVICE_AP_NAME "ap"
+#endif
+
+static void wlan_mgnt_init_done_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan init done event callback \n");
+}
+
+static void wlan_mgnt_link_up_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan link up event callback \n");
+}
+
+static void wlan_mgnt_link_down_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan link down event callback \n");
+}
+
+static void wlan_mgnt_sta_connect_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan sta connect event callback \n");
+ struct netif *netif = device->parent.netif;
+
+ netifapi_netif_set_up(netif);
+ netifapi_netif_set_link_up(netif);
+#ifdef RT_LWIP_DHCP
+ /* start DHCP */
+ dhcp_start(netif);
+#endif
+}
+
+static void wlan_mgnt_sta_disconnect_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan sta disconnect event callback \n");
+ netifapi_netif_set_down(device->parent.netif);
+ netifapi_netif_set_link_down(device->parent.netif);
+ rt_memset(&device->parent.netif->ip_addr, 0, sizeof(ip_addr_t));
+ rt_memset(&device->parent.netif->netmask, 0, sizeof(ip_addr_t));
+ rt_memset(&device->parent.netif->gw, 0, sizeof(ip_addr_t));
+#ifdef RT_LWIP_DHCP
+ dhcp_stop(device->parent.netif);
+#endif
+}
+
+static void wlan_mgnt_ap_start_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan ap start event callback \n");
+ netifapi_netif_set_up(device->parent.netif);
+ netifapi_netif_set_link_up(device->parent.netif);
+
+ wifi_softap_setup_netif(device->parent.netif);
+}
+
+
+static void wlan_mgnt_ap_stop_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan ap stop event callback \n");
+
+ netifapi_netif_set_down(device->parent.netif);
+ netifapi_netif_set_link_down(device->parent.netif);
+}
+
+static void wlan_mgnt_ap_associate_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan ap associate event callback \n");
+}
+
+static void wlan_mgnt_ap_disassociate_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan ap disassociate event callback \n");
+}
+
+static void wlan_mgnt_scan_done_event(struct rt_wlan_device *device, rt_wlan_event_t event, void *user_data)
+{
+ WLAN_MGNT_DBG("wlan scan done event callback \n");
+}
+
+int rt_wlan_mgnt_attach(struct rt_wlan_device *device, void *user_data)
+{
+ RT_ASSERT(device != RT_NULL);
+
+ rt_wlan_register_event_handler(device, WIFI_EVT_INIT_DONE, wlan_mgnt_init_done_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_LINK_DOWN, wlan_mgnt_link_up_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_LINK_UP, wlan_mgnt_link_down_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_CONNECT, wlan_mgnt_sta_connect_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_DISCONNECT, wlan_mgnt_sta_disconnect_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_AP_START, wlan_mgnt_ap_start_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_AP_STOP, wlan_mgnt_ap_stop_event);
+ rt_wlan_register_event_handler(device, WIFI_EVENT_STA_ASSOC, wlan_mgnt_ap_associate_event);
+ rt_wlan_register_event_handler(device, WIFI_EVENT_STA_DISASSOC, wlan_mgnt_ap_disassociate_event);
+ rt_wlan_register_event_handler(device, WIFI_EVT_SCAN_DONE, wlan_mgnt_scan_done_event);
+
+ return RT_EOK;
+}
diff --git a/bsp/asm9260t/platform/rt_low_level_gcc.inc b/components/drivers/wlan/wlan_mgnt.h
index c6edd3787c..b00414c6e2 100644
--- a/bsp/asm9260t/platform/rt_low_level_gcc.inc
+++ b/components/drivers/wlan/wlan_mgnt.h
@@ -1,7 +1,11 @@
/*
- * File : rt_low_level_gcc.inc
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team
+ * RT-Thread Wi-Fi Device
+ *
+ * COPYRIGHT (C) 2014 - 2018, Shanghai Real-Thread Technology Co., Ltd
+ *
+ * This file is part of RT-Thread (http://www.rt-thread.org)
+ *
+ * All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,13 +23,12 @@
*
* Change Logs:
* Date Author Notes
- * 2015-04-14 ArdaFu first version
+ * 2018-02-27 EvalZero the first verion
*/
-/*--------- Stack size of CPU modes ------------------------------------------*/
-.equ UND_STK_SIZE, 2048
-.equ SVC_STK_SIZE, 4096
-.equ ABT_STK_SIZE, 2048
-.equ IRQ_STK_SIZE, 4096
-.equ FIQ_STK_SIZE, 4096
-.equ SYS_STK_SIZE, 2048
+#ifndef __WLAN_MGNT_H__
+#define __WLAN_MGNT_H__
+
+int rt_wlan_mgnt_attach(struct rt_wlan_device *device, void *user_data);
+
+#endif
diff --git a/components/finsh/Kconfig b/components/finsh/Kconfig
index 610db05eb6..8722fcd79a 100644
--- a/components/finsh/Kconfig
+++ b/components/finsh/Kconfig
@@ -70,6 +70,10 @@ config FINSH_USING_MSH_DEFAULT
config FINSH_USING_MSH_ONLY
bool "Only using module shell"
default n
+
+config FINSH_ARG_MAX
+ int "The command arg num for shell"
+ default 10
endif
endif
diff --git a/components/finsh/msh.c b/components/finsh/msh.c
index 26e0c9b5c7..e13f8598fd 100644
--- a/components/finsh/msh.c
+++ b/components/finsh/msh.c
@@ -37,7 +37,10 @@
#include <dfs_posix.h>
#endif
-#define RT_FINSH_ARG_MAX 10
+#ifndef FINSH_ARG_MAX
+#define FINSH_ARG_MAX 10
+#endif
+
typedef int (*cmd_function_t)(int argc, char **argv);
#ifdef FINSH_USING_MSH
@@ -99,7 +102,7 @@ int msh_help(int argc, char **argv)
}
FINSH_FUNCTION_EXPORT_ALIAS(msh_help, __cmd_help, RT-Thread shell help.);
-static int msh_split(char *cmd, rt_size_t length, char *argv[RT_FINSH_ARG_MAX])
+static int msh_split(char *cmd, rt_size_t length, char *argv[FINSH_ARG_MAX])
{
char *ptr;
rt_size_t position;
@@ -118,7 +121,7 @@ static int msh_split(char *cmd, rt_size_t length, char *argv[RT_FINSH_ARG_MAX])
ptr ++; position ++;
}
- if(argc >= RT_FINSH_ARG_MAX)
+ if(argc >= FINSH_ARG_MAX)
{
rt_kprintf("Too many args ! We only Use:\n");
for(i = 0; i < argc; i++)
@@ -284,7 +287,7 @@ static int _msh_exec_cmd(char *cmd, rt_size_t length, int *retp)
int argc;
rt_size_t cmd0_size = 0;
cmd_function_t cmd_func;
- char *argv[RT_FINSH_ARG_MAX];
+ char *argv[FINSH_ARG_MAX];
RT_ASSERT(cmd);
RT_ASSERT(retp);
diff --git a/libcpu/SConscript b/libcpu/SConscript
index 0d00976092..a42909e64c 100644
--- a/libcpu/SConscript
+++ b/libcpu/SConscript
@@ -4,6 +4,7 @@ from building import *
comm = rtconfig.ARCH + '/common'
path = rtconfig.ARCH + '/' + rtconfig.CPU
+ASFLAGS = ''
# The set of source files associated with this SConscript file.
if rtconfig.PLATFORM == 'armcc':
@@ -21,7 +22,10 @@ if rtconfig.PLATFORM == 'cl':
if rtconfig.PLATFORM == 'mingw':
src = Glob(path + '/*.c')
+if rtconfig.PLATFORM == 'armcc' and rtconfig.ARCH == 'arm' and rtconfig.CPU == 'arm926':
+ ASFLAGS = ' --cpreproc'
+
CPPPATH = [RTT_ROOT + '/libcpu/' + rtconfig.ARCH + '/' + rtconfig.CPU, RTT_ROOT + '/libcpu/' + rtconfig.ARCH + '/common']
-group = DefineGroup(rtconfig.CPU.upper(), src, depend = [''], CPPPATH = CPPPATH)
+group = DefineGroup(rtconfig.CPU.upper(), src, depend = [''], CPPPATH = CPPPATH, ASFLAGS = ASFLAGS)
Return('group')
diff --git a/libcpu/arm/arm926/start_gcc.S b/libcpu/arm/arm926/start_gcc.S
index 1ccff156b0..130bc041f8 100644
--- a/libcpu/arm/arm926/start_gcc.S
+++ b/libcpu/arm/arm926/start_gcc.S
@@ -24,7 +24,9 @@
* 2015-04-21 ArdaFu Remove remap code. Using mmu to map vector table
* 2015-06-04 aozima Align stack address to 8 byte.
*/
-
+
+#include "rt_low_level_init.h"
+
#define S_FRAME_SIZE (18*4) //72
@#define S_SPSR (17*4) //SPSR
@@ -54,9 +56,8 @@
#define MODE_ABT 0x17
#define MODE_UND 0x1B
#define MODEMASK 0x1F
-#define NOINT 0xC0
-.include "rt_low_level_gcc.inc"
+#define NOINT 0xC0
@;----------------------- Stack and Heap Definitions ---------------------------
.section .nobss, "w"
diff --git a/libcpu/arm/arm926/start_iar.S b/libcpu/arm/arm926/start_iar.S
index 3494b108d7..880f2d9706 100644
--- a/libcpu/arm/arm926/start_iar.S
+++ b/libcpu/arm/arm926/start_iar.S
@@ -24,7 +24,9 @@
; * 2015-04-21 ArdaFu Remove remap code. Using mmu to map vector table
; * 2015-06-04 aozima Align stack address to 8 byte.
; */
-
+
+#include "rt_low_level_init.h"
+
#define S_FRAME_SIZE (18*4) ;72
;#define S_SPSR (17*4) ;SPSR
@@ -54,9 +56,8 @@
#define MODE_ABT 0x17
#define MODE_UND 0x1B
#define MODEMASK 0x1F
-#define NOINT 0xC0
-#include "rt_low_level_iar.inc"
+#define NOINT 0xC0
;----------------------- Stack and Heap Definitions ----------------------------
MODULE ?cstartup
diff --git a/libcpu/arm/arm926/start_rvds.S b/libcpu/arm/arm926/start_rvds.S
index 1c1e48c07e..9f789b97f7 100644
--- a/libcpu/arm/arm926/start_rvds.S
+++ b/libcpu/arm/arm926/start_rvds.S
@@ -25,6 +25,8 @@
; * 2015-06-04 aozima Align stack address to 8 byte.
; */
+#include "rt_low_level_init.h"
+
S_FRAME_SIZE EQU (18*4) ;72
;S_SPSR EQU (17*4) ;SPSR
;S_CPSR EQU (16*4) ;CPSR
@@ -46,7 +48,6 @@ S_PC EQU (15*4) ;R15
;S_R1 EQU (1*4)
;S_R0 EQU (0*4)
-
MODE_USR EQU 0X10
MODE_FIQ EQU 0X11
MODE_IRQ EQU 0X12
@@ -57,8 +58,6 @@ MODE_SYS EQU 0X1F
MODEMASK EQU 0X1F
NOINT EQU 0xC0
-
- GET rt_low_level_keil.inc
;----------------------- Stack and Heap Definitions ----------------------------
AREA STACK, NOINIT, READWRITE, ALIGN=3
diff --git a/tools/building.py b/tools/building.py
index c727591bb0..4f75811e11 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -487,6 +487,11 @@ def MergeGroup(src_group, group):
src_group['CPPDEFINES'] = src_group['CPPDEFINES'] + group['CPPDEFINES']
else:
src_group['CPPDEFINES'] = group['CPPDEFINES']
+ if group.has_key('ASFLAGS'):
+ if src_group.has_key('ASFLAGS'):
+ src_group['ASFLAGS'] = src_group['ASFLAGS'] + group['ASFLAGS']
+ else:
+ src_group['ASFLAGS'] = group['ASFLAGS']
# for local CCFLAGS/CPPPATH/CPPDEFINES
if group.has_key('LOCAL_CCFLAGS'):
@@ -520,6 +525,11 @@ def MergeGroup(src_group, group):
src_group['LIBPATH'] = src_group['LIBPATH'] + group['LIBPATH']
else:
src_group['LIBPATH'] = group['LIBPATH']
+ if group.has_key('LOCAL_ASFLAGS'):
+ if src_group.has_key('LOCAL_ASFLAGS'):
+ src_group['LOCAL_ASFLAGS'] = src_group['LOCAL_ASFLAGS'] + group['LOCAL_ASFLAGS']
+ else:
+ src_group['LOCAL_ASFLAGS'] = group['LOCAL_ASFLAGS']
def DefineGroup(name, src, depend, **parameters):
global Env
@@ -550,6 +560,8 @@ def DefineGroup(name, src, depend, **parameters):
Env.AppendUnique(CPPDEFINES = group['CPPDEFINES'])
if group.has_key('LINKFLAGS'):
Env.AppendUnique(LINKFLAGS = group['LINKFLAGS'])
+ if group.has_key('ASFLAGS'):
+ Env.AppendUnique(ASFLAGS = group['ASFLAGS'])
# check whether to clean up library
if GetOption('cleanlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))):
@@ -645,13 +657,14 @@ def DoBuilding(target, objects):
# handle local group
def local_group(group, objects):
- if group.has_key('LOCAL_CCFLAGS') or group.has_key('LOCAL_CPPPATH') or group.has_key('LOCAL_CPPDEFINES'):
+ if group.has_key('LOCAL_CCFLAGS') or group.has_key('LOCAL_CPPPATH') or group.has_key('LOCAL_CPPDEFINES') or group.has_key('LOCAL_ASFLAGS'):
CCFLAGS = Env.get('CCFLAGS', '') + group.get('LOCAL_CCFLAGS', '')
CPPPATH = Env.get('CPPPATH', ['']) + group.get('LOCAL_CPPPATH', [''])
CPPDEFINES = Env.get('CPPDEFINES', ['']) + group.get('LOCAL_CPPDEFINES', [''])
+ ASFLAGS = Env.get('ASFLAGS', '') + group.get('LOCAL_ASFLAGS', '')
for source in group['src']:
- objects.append(Env.Object(source, CCFLAGS = CCFLAGS,
+ objects.append(Env.Object(source, CCFLAGS = CCFLAGS, ASFLAGS = ASFLAGS,
CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES))
return True
@@ -775,6 +788,11 @@ def EndBuilding(target, program = None):
from cscope import CscopeDatabase
CscopeDatabase(Projects)
+ if not GetOption('help') and not GetOption('target'):
+ if not os.path.exists(rtconfig.EXEC_PATH):
+ print "Error: Toolchain path (%s) is not exist, please check 'EXEC_PATH' in path or rtconfig.py." % rtconfig.EXEC_PATH
+ sys.exit(1)
+
def SrcRemove(src, remove):
if not src:
return