Ubiquitous/RT_Thread/:add rw007 driver and ov2640 driver
This commit is contained in:
parent
4510a95e90
commit
fedd6affc9
|
@ -1 +1,2 @@
|
|||
.vscode
|
||||
*.vscode
|
||||
*.o
|
||||
|
|
|
@ -368,22 +368,20 @@ CONFIG_BSP_UART1_RXD_PIN=21
|
|||
# CONFIG_BSP_USING_UART2 is not set
|
||||
# CONFIG_BSP_USING_UART3 is not set
|
||||
# CONFIG_BSP_USING_I2C1 is not set
|
||||
# CONFIG_BSP_USING_SPI1 is not set
|
||||
CONFIG_BSP_USING_SPI1=y
|
||||
# CONFIG_BSP_USING_SPI1_AS_QSPI is not set
|
||||
CONFIG_BSP_SPI1_CLK_PIN=27
|
||||
CONFIG_BSP_SPI1_D0_PIN=28
|
||||
CONFIG_BSP_SPI1_D1_PIN=26
|
||||
CONFIG_BSP_SPI1_USING_SS0=y
|
||||
CONFIG_BSP_SPI1_SS0_PIN=29
|
||||
CONFIG_BSP_SPI1_USING_SS1=y
|
||||
CONFIG_BSP_SPI1_SS1_PIN=8
|
||||
# CONFIG_BSP_SPI1_USING_SS2 is not set
|
||||
# CONFIG_BSP_SPI1_USING_SS3 is not set
|
||||
# CONFIG_BSP_USING_LCD is not set
|
||||
# CONFIG_BSP_USING_SDCARD is not set
|
||||
CONFIG_BSP_USING_DVP=y
|
||||
|
||||
#
|
||||
# The default pin assignment is based on the Maix Duino K210 development board
|
||||
#
|
||||
CONFIG_BSP_DVP_SCCB_SDA_PIN=40
|
||||
CONFIG_BSP_DVP_SCCB_SCLK_PIN=41
|
||||
CONFIG_BSP_DVP_CMOS_RST_PIN=42
|
||||
CONFIG_BSP_DVP_CMOS_VSYNC_PIN=43
|
||||
CONFIG_BSP_DVP_CMOS_PWDN_PIN=44
|
||||
CONFIG_BSP_DVP_CMOS_XCLK_PIN=46
|
||||
CONFIG_BSP_DVP_CMOS_PCLK_PIN=47
|
||||
CONFIG_BSP_DVP_CMOS_HREF_PIN=45
|
||||
CONFIG_BSP_USING_SDCARD=y
|
||||
# CONFIG_BSP_USING_DVP is not set
|
||||
|
||||
#
|
||||
# Kendryte SDK Config
|
||||
|
@ -393,4 +391,14 @@ CONFIG_PKG_KENDRYTE_SDK_VERNUM=0x0055
|
|||
#
|
||||
# More Drivers
|
||||
#
|
||||
# CONFIG_PKG_USING_RW007 is not set
|
||||
# CONFIG_DRV_USING_OV2640 is not set
|
||||
|
||||
#
|
||||
# Applications
|
||||
#
|
||||
|
||||
#
|
||||
# Framework
|
||||
#
|
||||
CONFIG___STACKSIZE__=4096
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "dvp.h"
|
||||
#include "fpioa.h"
|
||||
#include "plic.h"
|
||||
#include "sysctl.h"
|
||||
#if(defined DRV_USING_OV2640 && defined BSP_USING_LCD)
|
||||
#include<drv_ov2640.h>
|
||||
#define RGB_BUF_SIZE (320*240*2)
|
||||
#ifdef RT_USING_POSIX
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <dfs_poll.h>
|
||||
#ifdef RT_USING_POSIX_TERMIOS
|
||||
#include <posix_termios.h>
|
||||
#endif
|
||||
#endif
|
||||
static int g_fd = 0;
|
||||
static _ioctl_shoot_para shoot_para_t = {0};
|
||||
|
||||
|
||||
void ov2640_test(int argc, char **argv)
|
||||
{
|
||||
extern void lcd_draw_picture(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height, uint32_t *ptr);
|
||||
|
||||
g_fd = open("/dev/ov2640",O_RDONLY);
|
||||
if(g_fd < 0)
|
||||
{
|
||||
printf("open ov2640 fail !!");
|
||||
return;
|
||||
}
|
||||
if (argc < 2)
|
||||
{
|
||||
printf("Usage:ov2640 display images in real time or take photos \n");
|
||||
printf("Like: ov2640_test 1(take photos )\n");
|
||||
printf("Like: ov2640_test 0(display images in real time )\n");
|
||||
close(g_fd);
|
||||
return ;
|
||||
}
|
||||
uint32_t* rgbbuffer = rt_malloc(RGB_BUF_SIZE);
|
||||
rt_thread_t tid;
|
||||
rt_err_t ret = 0;
|
||||
int temf = 0;
|
||||
if(NULL == rgbbuffer)
|
||||
{
|
||||
printf("malloc rgbbuffer failed ! \n");
|
||||
close(g_fd);
|
||||
return;
|
||||
}
|
||||
temf = strtoul(argv[1],0, 10);
|
||||
printf("ov2640_test choose %d mode \n",temf);
|
||||
shoot_para_t.pdata = (uint32_t)(rgbbuffer);
|
||||
shoot_para_t.length = RGB_BUF_SIZE;
|
||||
if(temf == 0)
|
||||
{
|
||||
void lcd_show_ov2640_thread(uint32_t* rgbbuffer);
|
||||
tid = rt_thread_create("lcdshow", lcd_show_ov2640_thread, rgbbuffer,3000, 9, 20);
|
||||
rt_thread_startup(tid);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(rgbbuffer,0,320*240*2);
|
||||
ret = ioctl(g_fd,IOCTRL_CAMERA_START_SHOT,&shoot_para_t);
|
||||
// ret = rt_ov2640_start_shoot((uint32_t)(rgbbuffer), RGB_BUF_SIZE);
|
||||
if(RT_ERROR == ret)
|
||||
{
|
||||
printf("ov2640 can't wait event flag");
|
||||
close(g_fd);
|
||||
return;
|
||||
}
|
||||
lcd_draw_picture(0, 0, 320, 240, rgbbuffer);
|
||||
rt_thread_mdelay(100);
|
||||
printf("the lcd has shown the image \n");
|
||||
rt_free(rgbbuffer);
|
||||
close(g_fd);
|
||||
}
|
||||
}
|
||||
MSH_CMD_EXPORT(ov2640_test,lcd show camera shot image);
|
||||
|
||||
void lcd_show_ov2640_thread(uint32_t* rgbbuffer)
|
||||
{
|
||||
extern void lcd_draw_picture(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height, uint32_t *ptr);
|
||||
rt_err_t ret = 0;
|
||||
while(1)
|
||||
{
|
||||
|
||||
ret = ioctl(g_fd,IOCTRL_CAMERA_START_SHOT,&shoot_para_t);
|
||||
if(RT_ERROR == ret)
|
||||
{
|
||||
printf("ov2640 can't wait event flag");
|
||||
rt_free(rgbbuffer);
|
||||
return;
|
||||
}
|
||||
lcd_draw_picture(0, 0, 320, 240, rgbbuffer);
|
||||
rt_thread_mdelay(2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
#include <rtthread.h>
|
||||
#ifdef PKG_USING_RW007
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <finsh.h>
|
||||
#include <sys/socket.h>
|
||||
static const char send_data[] = "This is TCP Client from AIIT";
|
||||
void rw007_test(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
char *recv_data;
|
||||
struct hostent *host;
|
||||
int sock, bytes_received;
|
||||
struct sockaddr_in server_addr;
|
||||
const char *url;
|
||||
int port;
|
||||
extern rt_bool_t rt_wlan_is_connected(void);
|
||||
if (rt_wlan_is_connected() != 1)
|
||||
{
|
||||
printf("Please connect a wifi firstly\n");
|
||||
return;
|
||||
}
|
||||
if (argc < 3)
|
||||
{
|
||||
printf("Usage: rw007 URL PORT\n");
|
||||
printf("Like: rw007 192.168.12.44 5000\n");
|
||||
return ;
|
||||
}
|
||||
|
||||
url = argv[1];
|
||||
port = strtoul(argv[2], 0, 10);
|
||||
host = gethostbyname(url);
|
||||
recv_data = rt_malloc(1024);
|
||||
if (recv_data == RT_NULL)
|
||||
{
|
||||
printf("No memory\n");
|
||||
return;
|
||||
}
|
||||
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
|
||||
{
|
||||
printf("Socket error\n");
|
||||
rt_free(recv_data);
|
||||
return;
|
||||
}
|
||||
server_addr.sin_family = AF_INET;
|
||||
server_addr.sin_port = htons(port);
|
||||
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
|
||||
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
|
||||
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
|
||||
{
|
||||
printf("Connect fail!\n");
|
||||
closesocket(sock);
|
||||
rt_free(recv_data);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Connect successful\n");
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
bytes_received = recv(sock, recv_data, 1024 - 1, 0);
|
||||
if (bytes_received < 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nreceived error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else if (bytes_received == 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nreceived error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
recv_data[bytes_received] = '\0';
|
||||
if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\n got a 'q' or 'Q',close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nReceived data = %s ", recv_data);
|
||||
}
|
||||
ret = send(sock, send_data, strlen(send_data), 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nsend error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else if (ret == 0)
|
||||
{
|
||||
printf("\n Send warning,send function return 0.\r\n");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
MSH_CMD_EXPORT(rw007_test, a tcp client sample);
|
||||
#endif
|
|
@ -246,18 +246,15 @@
|
|||
#define BSP_USING_UART1
|
||||
#define BSP_UART1_TXD_PIN 20
|
||||
#define BSP_UART1_RXD_PIN 21
|
||||
#define BSP_USING_DVP
|
||||
|
||||
/* The default pin assignment is based on the Maix Duino K210 development board */
|
||||
|
||||
#define BSP_DVP_SCCB_SDA_PIN 40
|
||||
#define BSP_DVP_SCCB_SCLK_PIN 41
|
||||
#define BSP_DVP_CMOS_RST_PIN 42
|
||||
#define BSP_DVP_CMOS_VSYNC_PIN 43
|
||||
#define BSP_DVP_CMOS_PWDN_PIN 44
|
||||
#define BSP_DVP_CMOS_XCLK_PIN 46
|
||||
#define BSP_DVP_CMOS_PCLK_PIN 47
|
||||
#define BSP_DVP_CMOS_HREF_PIN 45
|
||||
#define BSP_USING_SPI1
|
||||
#define BSP_SPI1_CLK_PIN 27
|
||||
#define BSP_SPI1_D0_PIN 28
|
||||
#define BSP_SPI1_D1_PIN 26
|
||||
#define BSP_SPI1_USING_SS0
|
||||
#define BSP_SPI1_SS0_PIN 29
|
||||
#define BSP_SPI1_USING_SS1
|
||||
#define BSP_SPI1_SS1_PIN 8
|
||||
#define BSP_USING_SDCARD
|
||||
|
||||
/* Kendryte SDK Config */
|
||||
|
||||
|
@ -265,6 +262,11 @@
|
|||
|
||||
/* More Drivers */
|
||||
|
||||
|
||||
/* Applications */
|
||||
|
||||
/* Framework */
|
||||
|
||||
#define __STACKSIZE__ 4096
|
||||
|
||||
#endif
|
||||
|
|
|
@ -126,7 +126,28 @@ CONFIG_DFS_FILESYSTEMS_MAX=2
|
|||
CONFIG_DFS_FILESYSTEM_TYPES_MAX=2
|
||||
CONFIG_DFS_FD_MAX=16
|
||||
# CONFIG_RT_USING_DFS_MNTTABLE is not set
|
||||
# CONFIG_RT_USING_DFS_ELMFAT is not set
|
||||
CONFIG_RT_USING_DFS_ELMFAT=y
|
||||
|
||||
#
|
||||
# elm-chan's FatFs, Generic FAT Filesystem Module
|
||||
#
|
||||
CONFIG_RT_DFS_ELM_CODE_PAGE=437
|
||||
CONFIG_RT_DFS_ELM_WORD_ACCESS=y
|
||||
# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set
|
||||
# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set
|
||||
# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set
|
||||
CONFIG_RT_DFS_ELM_USE_LFN_3=y
|
||||
CONFIG_RT_DFS_ELM_USE_LFN=3
|
||||
CONFIG_RT_DFS_ELM_LFN_UNICODE_0=y
|
||||
# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set
|
||||
# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set
|
||||
# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set
|
||||
CONFIG_RT_DFS_ELM_LFN_UNICODE=0
|
||||
CONFIG_RT_DFS_ELM_MAX_LFN=255
|
||||
CONFIG_RT_DFS_ELM_DRIVES=2
|
||||
CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
|
||||
# CONFIG_RT_DFS_ELM_USE_ERASE is not set
|
||||
CONFIG_RT_DFS_ELM_REENTRANT=y
|
||||
CONFIG_RT_USING_DFS_DEVFS=y
|
||||
# CONFIG_RT_USING_DFS_ROMFS is not set
|
||||
# CONFIG_RT_USING_DFS_RAMFS is not set
|
||||
|
@ -162,7 +183,7 @@ CONFIG_RT_USING_PIN=y
|
|||
# CONFIG_RT_USING_SDIO is not set
|
||||
CONFIG_RT_USING_SPI=y
|
||||
# CONFIG_RT_USING_QSPI is not set
|
||||
# CONFIG_RT_USING_SPI_MSD is not set
|
||||
CONFIG_RT_USING_SPI_MSD=y
|
||||
# CONFIG_RT_USING_SFUD is not set
|
||||
# CONFIG_RT_USING_ENC28J60 is not set
|
||||
# CONFIG_RT_USING_SPI_WIFI is not set
|
||||
|
@ -348,10 +369,12 @@ CONFIG_BSP_USING_USB_TO_USART=y
|
|||
CONFIG_BSP_USING_SRAM=y
|
||||
# CONFIG_BSP_USING_SPI_FLASH is not set
|
||||
# CONFIG_BSP_USING_EEPROM is not set
|
||||
# CONFIG_BSP_USING_OV2640 is not set
|
||||
CONFIG_BSP_USING_OV2640=y
|
||||
# CONFIG_BSP_USING_ETH is not set
|
||||
# CONFIG_BSP_USING_MPU6050 is not set
|
||||
# CONFIG_BSP_USING_SDCARD is not set
|
||||
CONFIG_BSP_USING_SDCARD=y
|
||||
CONFIG_SDCARD_SPI2_CS_PIN=28
|
||||
CONFIG_SDCARD_SPI_BUS_NAME="spi2"
|
||||
|
||||
#
|
||||
# On-chip Peripheral Drivers
|
||||
|
@ -373,7 +396,9 @@ CONFIG_BSP_USING_SPI=y
|
|||
CONFIG_BSP_USING_SPI1=y
|
||||
# CONFIG_BSP_SPI1_TX_USING_DMA is not set
|
||||
# CONFIG_BSP_SPI1_RX_USING_DMA is not set
|
||||
# CONFIG_BSP_USING_SPI2 is not set
|
||||
CONFIG_BSP_USING_SPI2=y
|
||||
# CONFIG_BSP_SPI2_TX_USING_DMA is not set
|
||||
# CONFIG_BSP_SPI2_RX_USING_DMA is not set
|
||||
# CONFIG_BSP_USING_ADC is not set
|
||||
CONFIG_BSP_USING_I2C1=y
|
||||
CONFIG_BSP_I2C1_SCL_PIN=54
|
||||
|
@ -397,3 +422,15 @@ CONFIG_BSP_USING_FMC=y
|
|||
#
|
||||
# More Drivers
|
||||
#
|
||||
# CONFIG_PKG_USING_RW007 is not set
|
||||
# CONFIG_RW007_NOT_USE_EXAMPLE_DRIVERS is not set
|
||||
# CONFIG_RW007_USING_STM32_DRIVERS is not set
|
||||
# CONFIG_DRV_USING_OV2640 is not set
|
||||
|
||||
#
|
||||
# Applications
|
||||
#
|
||||
|
||||
#
|
||||
# Framework
|
||||
#
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#ifdef DRV_USING_OV2640
|
||||
#ifdef RT_USING_POSIX
|
||||
#include <dfs_posix.h>
|
||||
#include <dfs_poll.h>
|
||||
#ifdef RT_USING_POSIX_TERMIOS
|
||||
#include <posix_termios.h>
|
||||
#endif
|
||||
#endif
|
||||
#include<drv_ov2640.h>
|
||||
#define JPEG_BUF_SIZE (1024*200)
|
||||
#define UART_NUMBER2 "uart2"
|
||||
|
||||
void ov2640_test(int argc, char **argv)
|
||||
{
|
||||
|
||||
rt_err_t ret = 0;
|
||||
int fd = 0;
|
||||
fd = open("/dev/ov2640",O_RDONLY);
|
||||
if(fd < 0)
|
||||
{
|
||||
printf("open ov2640 fail !!");
|
||||
return;
|
||||
}
|
||||
rt_uint8_t* JpegBuffer = rt_malloc(JPEG_BUF_SIZE);
|
||||
_ioctl_shoot_para shoot_para_t = {0};
|
||||
if (RT_NULL == JpegBuffer)
|
||||
{
|
||||
printf("JpegBuffer senddata buf malloc error!\n");
|
||||
return;
|
||||
}
|
||||
printf("ov2640 test by printing the image value in memory \r\n");
|
||||
shoot_para_t.pdata = (uint32_t)JpegBuffer;
|
||||
shoot_para_t.length = JPEG_BUF_SIZE;
|
||||
ret = ioctl(fd,IOCTRL_CAMERA_START_SHOT,&shoot_para_t);
|
||||
if(RT_ERROR == ret)
|
||||
{
|
||||
printf("ov2640 can't wait event flag");
|
||||
return;
|
||||
}
|
||||
printf("print the vaule:\r\n\r\n");
|
||||
ret = rt_ov2640_calculate_jpeg_len(JpegBuffer,JPEG_BUF_SIZE);
|
||||
printf("photo leghth is %d :\r\n\r\n",ret);
|
||||
#ifdef BSP_USING_UART2
|
||||
void img_output_uart2(rt_uint8_t* jpegbuf,rt_uint16_t len);
|
||||
img_output_uart2(JpegBuffer,ret);
|
||||
#endif
|
||||
for(int i =0;i<ret;i++)
|
||||
{
|
||||
printf("%x",*(JpegBuffer+i));
|
||||
}
|
||||
printf("\r\n\r\n above :\r\n\r\n");
|
||||
rt_free(JpegBuffer);
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
MSH_CMD_EXPORT(ov2640_test,printing the image value in memory);
|
||||
|
||||
#ifdef BSP_USING_UART2
|
||||
void img_output_uart2(rt_uint8_t* jpegbuf,rt_uint16_t len)
|
||||
{
|
||||
static rt_uint8_t i =0;
|
||||
static rt_device_t serial = NULL;
|
||||
int ret = RT_EOK;
|
||||
if(i == 0)
|
||||
{
|
||||
i = 1;
|
||||
serial = rt_device_find(UART_NUMBER2);
|
||||
if (!serial)
|
||||
{
|
||||
printf("find uart2 failed!\n");
|
||||
i = 2;
|
||||
return;
|
||||
}
|
||||
ret = rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
|
||||
if(ret != RT_EOK)
|
||||
{
|
||||
printf("open uart2 failed!\n");
|
||||
i = 2;
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if(i == 1)
|
||||
{
|
||||
rt_device_write(serial, 0, jpegbuf, len);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
#include <rtthread.h>
|
||||
#ifdef PKG_USING_RW007
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <finsh.h>
|
||||
#include <sys/socket.h>
|
||||
static const char send_data[] = "This is TCP Client from AIIT";
|
||||
void rw007_test(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
char *recv_data;
|
||||
struct hostent *host;
|
||||
int sock, bytes_received;
|
||||
struct sockaddr_in server_addr;
|
||||
const char *url;
|
||||
int port;
|
||||
extern rt_bool_t rt_wlan_is_connected(void);
|
||||
if (rt_wlan_is_connected() != 1)
|
||||
{
|
||||
printf("Please connect a wifi firstly\n");
|
||||
return;
|
||||
}
|
||||
if (argc < 3)
|
||||
{
|
||||
printf("Usage: tcpclient URL PORT\n");
|
||||
printf("Like: tcpclient 192.168.12.44 5000\n");
|
||||
return ;
|
||||
}
|
||||
|
||||
url = argv[1];
|
||||
port = strtoul(argv[2], 0, 10);
|
||||
host = gethostbyname(url);
|
||||
recv_data = rt_malloc(1024);
|
||||
if (recv_data == RT_NULL)
|
||||
{
|
||||
printf("No memory\n");
|
||||
return;
|
||||
}
|
||||
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
|
||||
{
|
||||
printf("Socket error\n");
|
||||
rt_free(recv_data);
|
||||
return;
|
||||
}
|
||||
server_addr.sin_family = AF_INET;
|
||||
server_addr.sin_port = htons(port);
|
||||
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
|
||||
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
|
||||
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
|
||||
{
|
||||
printf("Connect fail!\n");
|
||||
closesocket(sock);
|
||||
rt_free(recv_data);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Connect successful\n");
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
bytes_received = recv(sock, recv_data, 1024 - 1, 0);
|
||||
if (bytes_received < 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nreceived error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else if (bytes_received == 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nreceived error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
recv_data[bytes_received] = '\0';
|
||||
if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\n got a 'q' or 'Q',close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nReceived data = %s ", recv_data);
|
||||
}
|
||||
ret = send(sock, send_data, strlen(send_data), 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
closesocket(sock);
|
||||
printf("\nsend error,close the socket.\r\n");
|
||||
rt_free(recv_data);
|
||||
break;
|
||||
}
|
||||
else if (ret == 0)
|
||||
{
|
||||
printf("\n Send warning,send function return 0.\r\n");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
MSH_CMD_EXPORT(rw007_test, a tcp client sample);
|
||||
#endif
|
||||
|
|
@ -91,6 +91,20 @@
|
|||
#define DFS_FILESYSTEMS_MAX 2
|
||||
#define DFS_FILESYSTEM_TYPES_MAX 2
|
||||
#define DFS_FD_MAX 16
|
||||
#define RT_USING_DFS_ELMFAT
|
||||
|
||||
/* elm-chan's FatFs, Generic FAT Filesystem Module */
|
||||
|
||||
#define RT_DFS_ELM_CODE_PAGE 437
|
||||
#define RT_DFS_ELM_WORD_ACCESS
|
||||
#define RT_DFS_ELM_USE_LFN_3
|
||||
#define RT_DFS_ELM_USE_LFN 3
|
||||
#define RT_DFS_ELM_LFN_UNICODE_0
|
||||
#define RT_DFS_ELM_LFN_UNICODE 0
|
||||
#define RT_DFS_ELM_MAX_LFN 255
|
||||
#define RT_DFS_ELM_DRIVES 2
|
||||
#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
|
||||
#define RT_DFS_ELM_REENTRANT
|
||||
#define RT_USING_DFS_DEVFS
|
||||
|
||||
/* Device Drivers */
|
||||
|
@ -107,6 +121,7 @@
|
|||
#define RT_USING_I2C_BITOPS
|
||||
#define RT_USING_PIN
|
||||
#define RT_USING_SPI
|
||||
#define RT_USING_SPI_MSD
|
||||
#define RT_USING_WIFI
|
||||
#define RT_WLAN_DEVICE_STA_NAME "wlan0"
|
||||
#define RT_WLAN_DEVICE_AP_NAME "wlan1"
|
||||
|
@ -230,6 +245,10 @@
|
|||
|
||||
#define BSP_USING_USB_TO_USART
|
||||
#define BSP_USING_SRAM
|
||||
#define BSP_USING_OV2640
|
||||
#define BSP_USING_SDCARD
|
||||
#define SDCARD_SPI2_CS_PIN 28
|
||||
#define SDCARD_SPI_BUS_NAME "spi2"
|
||||
|
||||
/* On-chip Peripheral Drivers */
|
||||
|
||||
|
@ -238,6 +257,7 @@
|
|||
#define BSP_USING_UART1
|
||||
#define BSP_USING_SPI
|
||||
#define BSP_USING_SPI1
|
||||
#define BSP_USING_SPI2
|
||||
#define BSP_USING_I2C1
|
||||
#define BSP_I2C1_SCL_PIN 54
|
||||
#define BSP_I2C1_SDA_PIN 55
|
||||
|
@ -250,4 +270,9 @@
|
|||
/* More Drivers */
|
||||
|
||||
|
||||
/* Applications */
|
||||
|
||||
/* Framework */
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
menu "More Drivers"
|
||||
|
||||
#source "$RT_Thread_DIR/drivers/rw007/Kconfig"
|
||||
#source "$RT_Thread_DIR/drivers/ov2640/Kconfig"
|
||||
source "$RT_Thread_DIR/drivers/rw007/Kconfig"
|
||||
source "$RT_Thread_DIR/drivers/ov2640/Kconfig"
|
||||
endmenu
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
menuconfig DRV_USING_OV2640
|
||||
bool "ov2640 driver"
|
||||
default n
|
||||
|
||||
if SOC_FAMILY_STM32
|
||||
config DRV_USING_OV2640
|
||||
select BSP_USING_DCMI
|
||||
endif
|
||||
|
||||
if BOARD_K210_EVB
|
||||
config DRV_USING_OV2640
|
||||
select BSP_USING_DVP
|
||||
endif
|
|
@ -0,0 +1,7 @@
|
|||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
objs = SConscript(os.path.join(cwd, 'ov2640_source', 'SConscript'))
|
||||
|
||||
Return('objs')
|
|
@ -0,0 +1,14 @@
|
|||
import os
|
||||
from building import *
|
||||
Import('RTT_ROOT')
|
||||
Import('rtconfig')
|
||||
cwd = GetCurrentDir()
|
||||
DEPENDS = ["DRV_USING_OV2640"]
|
||||
|
||||
SOURCES = []
|
||||
if GetDepend(['DRV_USING_OV2640']):
|
||||
SOURCES += ['drv_ov2640.c']
|
||||
path = [cwd]
|
||||
objs = DefineGroup('ov2640', src = SOURCES, depend = DEPENDS,CPPPATH = path)
|
||||
|
||||
Return("objs")
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2020-07-27 thread-liu first version
|
||||
* 2021-1-15 xiaoyu add set resolution function and the way of reset different manufactures's ov2640 egg:zhendianyuanzi and weixue
|
||||
*/
|
||||
|
||||
#ifndef __DRV_OV2640_H__
|
||||
#define __DRV_OV2640_H__
|
||||
#include <rtthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef SOC_FAMILY_STM32
|
||||
#include<drv_dcmi.h>
|
||||
#elif defined BOARD_K210_EVB
|
||||
#include<drv_dvp.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SOC_FAMILY_STM32
|
||||
#define DEV_ADDRESS 0x30 /* OV2640 address with rt-thread iic */
|
||||
#elif defined BOARD_K210_EVB
|
||||
#define DEV_ADDRESS 0x60 /* OV2640 address */
|
||||
#endif
|
||||
|
||||
#define LARGE_PHOTO_MODE (8)
|
||||
#define I2C_NAME "i2c1"
|
||||
#define RECV_EVENT_FLAG (1 << 1) //flag about event control block
|
||||
|
||||
#define OV2640_MID 0X7FA2
|
||||
#define OV2640_PID 0X2642
|
||||
#define OV2640_ZDYZ //The macro definition of the manufacturer's product
|
||||
|
||||
//DSP register address map table for OV2640 when DSP address (0xFF =0X00) is selected
|
||||
#define OV2640_DSP_R_BYPASS 0x05
|
||||
#define OV2640_DSP_Qs 0x44
|
||||
#define OV2640_DSP_CTRL 0x50
|
||||
#define OV2640_DSP_HSIZE1 0x51
|
||||
#define OV2640_DSP_VSIZE1 0x52
|
||||
#define OV2640_DSP_XOFFL 0x53
|
||||
#define OV2640_DSP_YOFFL 0x54
|
||||
#define OV2640_DSP_VHYX 0x55
|
||||
#define OV2640_DSP_DPRP 0x56
|
||||
#define OV2640_DSP_TEST 0x57
|
||||
#define OV2640_DSP_ZMOW 0x5A
|
||||
#define OV2640_DSP_ZMOH 0x5B
|
||||
#define OV2640_DSP_ZMHH 0x5C
|
||||
#define OV2640_DSP_BPADDR 0x7C
|
||||
#define OV2640_DSP_BPDATA 0x7D
|
||||
#define OV2640_DSP_CTRL2 0x86
|
||||
#define OV2640_DSP_CTRL3 0x87
|
||||
#define OV2640_DSP_SIZEL 0x8C
|
||||
#define OV2640_DSP_HSIZE2 0xC0
|
||||
#define OV2640_DSP_VSIZE2 0xC1
|
||||
#define OV2640_DSP_CTRL0 0xC2
|
||||
#define OV2640_DSP_CTRL1 0xC3
|
||||
#define OV2640_DSP_R_DVP_SP 0xD3
|
||||
#define OV2640_DSP_IMAGE_MODE 0xDA
|
||||
#define OV2640_DSP_RESET 0xE0
|
||||
#define OV2640_DSP_MS_SP 0xF0
|
||||
#define OV2640_DSP_SS_ID 0x7F
|
||||
#define OV2640_DSP_SS_CTRL 0xF8
|
||||
#define OV2640_DSP_MC_BIST 0xF9
|
||||
#define OV2640_DSP_MC_AL 0xFA
|
||||
#define OV2640_DSP_MC_AH 0xFB
|
||||
#define OV2640_DSP_MC_D 0xFC
|
||||
#define OV2640_DSP_P_STATUS 0xFE
|
||||
#define OV2640_DSP_RA_DLMT 0xFF
|
||||
|
||||
|
||||
//DSP register address map table for OV2640 when DSP address (0xFF =0X01) is selected
|
||||
#define OV2640_SENSOR_GAIN 0x00
|
||||
#define OV2640_SENSOR_COM1 0x03
|
||||
#define OV2640_SENSOR_REG04 0x04
|
||||
#define OV2640_SENSOR_REG08 0x08
|
||||
#define OV2640_SENSOR_COM2 0x09
|
||||
#define OV2640_SENSOR_PIDH 0x0A
|
||||
#define OV2640_SENSOR_PIDL 0x0B
|
||||
#define OV2640_SENSOR_COM3 0x0C
|
||||
#define OV2640_SENSOR_COM4 0x0D
|
||||
#define OV2640_SENSOR_AEC 0x10
|
||||
#define OV2640_SENSOR_CLKRC 0x11
|
||||
#define OV2640_SENSOR_COM7 0x12
|
||||
#define OV2640_SENSOR_COM8 0x13
|
||||
#define OV2640_SENSOR_COM9 0x14
|
||||
#define OV2640_SENSOR_COM10 0x15
|
||||
#define OV2640_SENSOR_HREFST 0x17
|
||||
#define OV2640_SENSOR_HREFEND 0x18
|
||||
#define OV2640_SENSOR_VSTART 0x19
|
||||
#define OV2640_SENSOR_VEND 0x1A
|
||||
#define OV2640_SENSOR_MIDH 0x1C
|
||||
#define OV2640_SENSOR_MIDL 0x1D
|
||||
#define OV2640_SENSOR_AEW 0x24
|
||||
#define OV2640_SENSOR_AEB 0x25
|
||||
#define OV2640_SENSOR_W 0x26
|
||||
#define OV2640_SENSOR_REG2A 0x2A
|
||||
#define OV2640_SENSOR_FRARL 0x2B
|
||||
#define OV2640_SENSOR_ADDVSL 0x2D
|
||||
#define OV2640_SENSOR_ADDVHS 0x2E
|
||||
#define OV2640_SENSOR_YAVG 0x2F
|
||||
#define OV2640_SENSOR_REG32 0x32
|
||||
#define OV2640_SENSOR_ARCOM2 0x34
|
||||
#define OV2640_SENSOR_REG45 0x45
|
||||
#define OV2640_SENSOR_FLL 0x46
|
||||
#define OV2640_SENSOR_FLH 0x47
|
||||
#define OV2640_SENSOR_COM19 0x48
|
||||
#define OV2640_SENSOR_ZOOMS 0x49
|
||||
#define OV2640_SENSOR_COM22 0x4B
|
||||
#define OV2640_SENSOR_COM25 0x4E
|
||||
#define OV2640_SENSOR_BD50 0x4F
|
||||
#define OV2640_SENSOR_BD60 0x50
|
||||
#define OV2640_SENSOR_REG5D 0x5D
|
||||
#define OV2640_SENSOR_REG5E 0x5E
|
||||
#define OV2640_SENSOR_REG5F 0x5F
|
||||
#define OV2640_SENSOR_REG60 0x60
|
||||
#define OV2640_SENSOR_HISTO_LOW 0x61
|
||||
#define OV2640_SENSOR_HISTO_HIGH 0x62
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define IOCTRL_CAMERA_START_SHOT (22) // start shoot
|
||||
#define IOCTRL_CAMERA_SET_RESO (23) //set resolution
|
||||
#define IOCTRL_CAMERA_SET_LIGHT (24) //set light mode
|
||||
#define IOCTRL_CAMERA_SET_COLOR (25) //set color saturation
|
||||
#define IOCTRL_CAMERA_SET_BRIGHTNESS (26) //set color brightness
|
||||
#define IOCTRL_CAMERA_SET_CONTRAST (27) //set contrast
|
||||
#define IOCTRL_CAMERA_SET_EFFECT (28) //set effect
|
||||
#define IOCTRL_CAMERA_SET_EXPOSURE (29) //set auto exposure
|
||||
|
||||
|
||||
struct camera_device
|
||||
{
|
||||
struct rt_device parent; /**< RT-Thread device struct */
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t pdata;
|
||||
uint32_t length;
|
||||
}_ioctl_shoot_para;
|
||||
|
||||
extern rt_uint32_t rt_ov2640_calculate_jpeg_len(rt_uint8_t* pdata,rt_uint32_t maxlength);
|
||||
extern rt_err_t rt_ov2640_start_shoot(uint32_t pdata, uint32_t length);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
|
||||
menuconfig PKG_USING_RW007
|
||||
bool "rw007: SPI WIFI rw007 driver"
|
||||
select RT_USING_SPI
|
||||
select RT_USING_PIN
|
||||
select RT_USING_LWIP
|
||||
default n
|
||||
help
|
||||
if "PKG_USING_RW007" is opened, "RT_USING_LWIP" will be default selected.
|
||||
|
||||
if PKG_USING_RW007
|
||||
|
||||
choice
|
||||
prompt "example driver port"
|
||||
default RW007_USING_STM32_DRIVERS
|
||||
config RW007_NOT_USE_EXAMPLE_DRIVERS
|
||||
bool "not use example driver, porting by myself"
|
||||
config RW007_USING_STM32_DRIVERS
|
||||
bool "rw007 for stm32"
|
||||
# config RW007_USING_IMXRT_DRIVERS
|
||||
# bool "rw007 for imxrt"
|
||||
endchoice
|
||||
|
||||
config RW007_SPI_MAX_HZ
|
||||
int "SPI Max Hz"
|
||||
default 30000000
|
||||
|
||||
if !RW007_NOT_USE_EXAMPLE_DRIVERS
|
||||
if RW007_USING_STM32_DRIVERS || RW007_USING_IMXRT_DRIVERS
|
||||
config RW007_SPI_BUS_NAME
|
||||
string "RW007 BUS NAME"
|
||||
default "spi1"
|
||||
|
||||
config RW007_CS_PIN
|
||||
int "CS pin index"
|
||||
default 86
|
||||
|
||||
endif
|
||||
|
||||
config RW007_BOOT0_PIN
|
||||
int "BOOT0 pin index (same as spi clk pin)"
|
||||
default 19
|
||||
|
||||
config RW007_BOOT1_PIN
|
||||
int "BOOT1 pin index (same as spi cs pin)"
|
||||
default 86
|
||||
|
||||
config RW007_INT_BUSY_PIN
|
||||
int "INT/BUSY pin index"
|
||||
default 87
|
||||
|
||||
config RW007_RST_PIN
|
||||
int "RESET pin index"
|
||||
default 88
|
||||
|
||||
endif
|
||||
|
||||
|
||||
endif
|
|
@ -0,0 +1,7 @@
|
|||
Import('RTT_ROOT')
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
objs = SConscript(os.path.join(cwd, 'rw007-source', 'SConscript'))
|
||||
|
||||
Return('objs')
|
|
@ -0,0 +1,52 @@
|
|||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
|
@ -0,0 +1,201 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -0,0 +1,59 @@
|
|||
# rw007
|
||||
|
||||
[中文页](README_ZH.md) | English
|
||||
|
||||
## 1. Introduction
|
||||
|
||||
**RW007** is a SPI/UART high-speed wifi module based on Cortex-M4 WIFI SOC developed by Shanghai Ruiside Electronic Technology Co., Ltd. The warehouse is the SPI driver of **rw007**
|
||||
|
||||
**RW007** The hardware design is simple. In SPI mode, users only need to reserve 1 set of SPI signals, one interrupt input, and one IO output, including a total of 8 pins for power and ground.
|
||||
|
||||
### 1.1. File structure
|
||||
|
||||
| Folder | Description |
|
||||
| ---- | ---- |
|
||||
| src | Core driver source code, which mainly implements communication logic |
|
||||
| inc | Header file directory |
|
||||
| example | Platform porting example |
|
||||
|
||||
### 1.2 License
|
||||
|
||||
The at_device package complies with the Apache 2.0 license, see the `LICENSE` file for details.
|
||||
|
||||
### 1.3 Dependency
|
||||
|
||||
- RT-Thread 3.0+
|
||||
- RT-Thread LWIP component
|
||||
- RT-Thread SPI driver framework
|
||||
- RT-Thread PIN driver framework (sample platform code dependency)
|
||||
|
||||
### 1.4 Configuration Macro Description
|
||||
|
||||
The relevant configuration macros will be configured in env during automatic configuration. The manual configuration is as follows
|
||||
|
||||
Type description
|
||||
|
||||
- bool: definition is valid, undefined, not valid
|
||||
- string: string
|
||||
- int: number
|
||||
|
||||
|Macro|Type|Function|
|
||||
|--|--|--|
|
||||
|PKG_USING_RW007|bool|Enable rw007 driver, use this software package, you need to define this macro|
|
||||
|RW007_USING_STM32_DRIVERS|bool|Enable STM32 platform migration example|
|
||||
|RW007_USING_IMXRT_DRIVERS|bool|Enable IMXRT platform migration example|
|
||||
|RW007_SPI_BUS_NAME|string|The SPI bus device name used in example|
|
||||
|RW007_CS_PIN|int|The serial number of the SPI chip select pin used in the example in the pin driver|
|
||||
|RW007_BOOT0_PIN|int|The serial number of the BOOT0 pin used in the example in the pin driver (the same pin is multiplexed with the CLK of SPI)|
|
||||
|RW007_BOOT1_PIN|int|The serial number of the BOOT1 pin used in the example in the pin driver (the same pin is multiplexed with the CS of SPI)|
|
||||
|RW007_INT_BUSY_PIN|int|The serial number of the INT/BUSY pin used in the example in the pin driver|
|
||||
|RW007_RST_PIN|int|The serial number of the RST pin used in the example in the pin driver|
|
||||
|
||||
## 2. Matters needing attention
|
||||
|
||||
Because of the pin multiplexing situation, the driver of the bsp SPI needs to be configured during Config.
|
||||
|
||||
## 4. Contact
|
||||
|
||||
- Maintenance: RT-Thread development team
|
||||
- Homepage: https://github.com/RT-Thread-packages/rw007
|
|
@ -0,0 +1,59 @@
|
|||
# rw007
|
||||
|
||||
中文页 | [English](README.md)
|
||||
|
||||
## 1. 简介
|
||||
|
||||
**RW007**是由上海睿赛德电子科技有限公司开发基于Cortex-M4 WIFI SOC的SPI/UART 高速wifi模块。该仓库为**rw007**的SPI驱动
|
||||
|
||||
**RW007**硬件设计简单,SPI模式下用户只需要预留1组SPI信号,一个中断输入,一个IO输出即可,包含电源和地总共8个引脚。
|
||||
|
||||
### 1.1. 文件结构
|
||||
|
||||
| 文件夹 | 说明 |
|
||||
| ---- | ---- |
|
||||
| src | 核心驱动源码,主要实现通信逻辑 |
|
||||
| inc | 头文件目录 |
|
||||
| example | 平台移植示例 |
|
||||
|
||||
### 1.2 许可证
|
||||
|
||||
at_device package 遵循 Apache 2.0 许可,详见 `LICENSE` 文件。
|
||||
|
||||
### 1.3 依赖
|
||||
|
||||
- RT-Thread 3.0+
|
||||
- RT-Thread LWIP 组件
|
||||
- RT-Thread SPI 驱动框架
|
||||
- RT-Thread PIN 驱动框架(示例平台代码依赖)
|
||||
|
||||
### 1.4 配置宏说明
|
||||
|
||||
自动配置时相关配置宏将在env中被配置 手动配置参考如下
|
||||
|
||||
类型说明
|
||||
|
||||
- bool: 定义生效 未定义 不生效
|
||||
- string: 字符串
|
||||
- int: 数值
|
||||
|
||||
|宏|类型|功能|
|
||||
|--|--|--|
|
||||
|PKG_USING_RW007|bool|开启rw007驱动,使用该软件包则需要定义该宏|
|
||||
|RW007_USING_STM32_DRIVERS|bool|使能STM32平台移植示例|
|
||||
|RW007_USING_IMXRT_DRIVERS|bool|使能IMXRT平台移植示例|
|
||||
|RW007_SPI_BUS_NAME|string|example中使用的SPI总线设备名称|
|
||||
|RW007_CS_PIN|int|example中使用的SPI 片选引脚在pin驱动中的序号|
|
||||
|RW007_BOOT0_PIN|int|example中使用的BOOT0引脚在pin驱动中的序号(与SPI的CLK是同一引脚复用)|
|
||||
|RW007_BOOT1_PIN|int|example中使用的BOOT1引脚在pin驱动中的序号(与SPI的CS是同一引脚复用)|
|
||||
|RW007_INT_BUSY_PIN|int|example中使用的INT/BUSY引脚在pin驱动中的序号|
|
||||
|RW007_RST_PIN|int|example中使用的RST引脚在pin驱动中的序号|
|
||||
|
||||
## 2. 注意事项
|
||||
|
||||
由于存在引脚复用情况,所以bsp的SPI的驱动需要引脚配置在Config时进行。
|
||||
|
||||
## 4. 联系方式
|
||||
|
||||
- 维护:RT-Thread 开发团队
|
||||
- 主页:https://github.com/RT-Thread-packages/rw007
|
|
@ -0,0 +1,87 @@
|
|||
#-*- encoding: utf-8 -*-
|
||||
#---------------------------------------------------------------------------------
|
||||
# @File: Sconscript for package
|
||||
# @Author: liu2guang
|
||||
# @Date: 2018-09-19 18:07:00(v0.1.0)
|
||||
#
|
||||
# @LICENSE: GPLv3: https://github.com/rtpkgs/buildpkg/blob/master/LICENSE.
|
||||
#
|
||||
#---------------------------------------------------------------------------------
|
||||
import os
|
||||
from building import *
|
||||
Import('RTT_ROOT')
|
||||
Import('rtconfig')
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Package configuration
|
||||
#---------------------------------------------------------------------------------
|
||||
PKGNAME = "rw007"
|
||||
VERSION = "v0.0.1"
|
||||
DEPENDS = ["PKG_USING_RW007"]
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Compile the configuration
|
||||
#
|
||||
# SOURCES: Need to compile c and c++ source, auto search when SOURCES is empty
|
||||
#
|
||||
# LOCAL_CPPPATH: Local file path (.h/.c/.cpp)
|
||||
# LOCAL_CCFLAGS: Local compilation parameter
|
||||
# LOCAL_ASFLAGS: Local assembly parameters
|
||||
#
|
||||
# CPPPATH: Global file path (.h/.c/.cpp), auto search when LOCAL_CPPPATH/CPPPATH
|
||||
# is empty # no pass!!!
|
||||
# CCFLAGS: Global compilation parameter
|
||||
# ASFLAGS: Global assembly parameters
|
||||
#
|
||||
# CPPDEFINES: Global macro definition
|
||||
# LOCAL_CPPDEFINES: Local macro definition
|
||||
#
|
||||
# LIBS: Specify the static library that need to be linked
|
||||
# LIBPATH: Specify the search directory for the library file (.lib/.a)
|
||||
#
|
||||
# LINKFLAGS: Link options
|
||||
#---------------------------------------------------------------------------------
|
||||
SOURCES = ["src/spi_wifi_rw007.c"]
|
||||
|
||||
if GetDepend(['RW007_USING_STM32_DRIVERS']):
|
||||
SOURCES += ["example/rw007_stm32_port.c"]
|
||||
|
||||
LOCAL_CPPPATH = []
|
||||
LOCAL_CCFLAGS = ""
|
||||
LOCAL_ASFLAGS = ""
|
||||
|
||||
CPPPATH = [GetCurrentDir(), os.path.join(GetCurrentDir(), 'inc')]
|
||||
CCFLAGS = ""
|
||||
ASFLAGS = ""
|
||||
|
||||
CPPDEFINES = []
|
||||
LOCAL_CPPDEFINES = []
|
||||
|
||||
LIBS = []
|
||||
LIBPATH = []
|
||||
|
||||
LINKFLAGS = ""
|
||||
|
||||
SOURCES_IGNORE = []
|
||||
CPPPATH_IGNORE = []
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Main target
|
||||
#---------------------------------------------------------------------------------
|
||||
objs = DefineGroup(name = PKGNAME, src = SOURCES, depend = DEPENDS,
|
||||
CPPPATH = CPPPATH,
|
||||
CCFLAGS = CCFLAGS,
|
||||
ASFLAGS = ASFLAGS,
|
||||
LOCAL_CPPPATH = LOCAL_CPPPATH,
|
||||
LOCAL_CCFLAGS = LOCAL_CCFLAGS,
|
||||
LOCAL_ASFLAGS = LOCAL_ASFLAGS,
|
||||
CPPDEFINES = CPPDEFINES,
|
||||
LOCAL_CPPDEFINES = LOCAL_CPPDEFINES,
|
||||
LIBS = LIBS,
|
||||
LIBPATH = LIBPATH,
|
||||
LINKFLAGS = LINKFLAGS)
|
||||
|
||||
Return("objs")
|
||||
#---------------------------------------------------------------------------------
|
||||
# End
|
||||
#---------------------------------------------------------------------------------
|
|
@ -0,0 +1,70 @@
|
|||
#include <rtthread.h>
|
||||
|
||||
#ifdef RW007_USING_STM32_DRIVERS
|
||||
#include <rtdevice.h>
|
||||
#include <drv_spi.h>
|
||||
#include <board.h>
|
||||
#include <spi_wifi_rw007.h>
|
||||
|
||||
extern void spi_wifi_isr(int vector);
|
||||
|
||||
static void rw007_gpio_init(void)
|
||||
{
|
||||
/* Configure IO */
|
||||
rt_pin_mode(RW007_RST_PIN, PIN_MODE_OUTPUT);
|
||||
rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLDOWN);
|
||||
|
||||
/* Reset rw007 and config mode */
|
||||
rt_pin_write(RW007_RST_PIN, PIN_LOW);
|
||||
rt_thread_delay(rt_tick_from_millisecond(100));
|
||||
rt_pin_write(RW007_RST_PIN, PIN_HIGH);
|
||||
|
||||
/* Wait rw007 ready(exit busy stat) */
|
||||
while(!rt_pin_read(RW007_INT_BUSY_PIN))
|
||||
{
|
||||
rt_thread_delay(5);
|
||||
}
|
||||
|
||||
rt_thread_delay(rt_tick_from_millisecond(200));
|
||||
rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLUP);
|
||||
}
|
||||
|
||||
int wifi_spi_device_init(void)
|
||||
{
|
||||
char sn_version[32];
|
||||
|
||||
GPIO_TypeDef *cs_gpiox;
|
||||
uint16_t cs_pin;
|
||||
|
||||
cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL);
|
||||
cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16);
|
||||
|
||||
rw007_gpio_init();
|
||||
rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", cs_gpiox, cs_pin);
|
||||
rt_hw_wifi_init("wspi");
|
||||
|
||||
rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
|
||||
rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP);
|
||||
|
||||
rw007_sn_get(sn_version);
|
||||
rt_kprintf("\nrw007 sn: [%s]\n", sn_version);
|
||||
rw007_version_get(sn_version);
|
||||
rt_kprintf("rw007 ver: [%s]\n\n", sn_version);
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_APP_EXPORT(wifi_spi_device_init);
|
||||
|
||||
static void int_wifi_irq(void * p)
|
||||
{
|
||||
((void)p);
|
||||
spi_wifi_isr(0);
|
||||
}
|
||||
|
||||
void spi_wifi_hw_init(void)
|
||||
{
|
||||
rt_pin_attach_irq(RW007_INT_BUSY_PIN, PIN_IRQ_MODE_FALLING, int_wifi_irq, 0);
|
||||
rt_pin_irq_enable(RW007_INT_BUSY_PIN, RT_TRUE);
|
||||
}
|
||||
|
||||
#endif /* RW007_USING_STM32_DRIVERS */
|
|
@ -0,0 +1,221 @@
|
|||
/*
|
||||
* COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2014-07-31 aozima the first version
|
||||
* 2014-09-18 aozima update command & response.
|
||||
*/
|
||||
|
||||
#ifndef SPI_WIFI_H_INCLUDED
|
||||
#define SPI_WIFI_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
#include <rtdevice.h>
|
||||
typedef enum
|
||||
{
|
||||
master_cmd_phase = 0x01,
|
||||
master_data_phase,
|
||||
slave_cmd_phase,
|
||||
slave_data_phase,
|
||||
}phase_type;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TRANSFER_DATA_SUCCESS = 0x00,
|
||||
TRANSFER_DATA_ERROR,
|
||||
TRANSFER_DATA_CONTINUE,
|
||||
}rw007_transfer_state;
|
||||
/* little-endian */
|
||||
struct spi_master_request
|
||||
{
|
||||
uint8_t reserve1;
|
||||
uint8_t flag: 4;
|
||||
uint8_t type: 4;
|
||||
uint16_t reserve2;
|
||||
uint16_t seq;
|
||||
uint16_t M2S_len; // master to slave data len.
|
||||
uint32_t magic1;
|
||||
uint32_t magic2;
|
||||
};
|
||||
|
||||
#define MASTER_MAGIC1 (0x67452301)
|
||||
#define MASTER_MAGIC2 (0xEFCDAB89)
|
||||
|
||||
#define MASTER_FLAG_MRDY (0x01)
|
||||
|
||||
/* little-endian */
|
||||
struct spi_slave_response
|
||||
{
|
||||
uint8_t reserve1;
|
||||
uint8_t flag: 4;
|
||||
uint8_t type: 4;
|
||||
uint8_t slave_rx_buf: 4;
|
||||
uint8_t slave_tx_buf: 4;
|
||||
uint8_t reserve2;
|
||||
uint16_t seq;
|
||||
uint16_t S2M_len; // slave to master data len.
|
||||
uint32_t magic1;
|
||||
uint32_t magic2;
|
||||
};
|
||||
|
||||
#define SLAVE_MAGIC1 (0x98BADCFE)
|
||||
#define SLAVE_MAGIC2 (0x10325476)
|
||||
#define SLAVE_FLAG_SRDY (0x01)
|
||||
|
||||
#define SLAVE_DATA_FULL (0x01)
|
||||
|
||||
/* spi buffer configure. */
|
||||
#define SPI_MAX_DATA_LEN 1520
|
||||
#define SPI_TX_POOL_SIZE 4
|
||||
#define SPI_RX_POOL_SIZE 4
|
||||
/* The slave interrupts wait timeout */
|
||||
#define SLAVE_INT_TIMEOUT 100
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RW007_SLAVE_INT = 1,
|
||||
RW007_MASTER_DATA = 1<<1,
|
||||
} wifi_event;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DATA_TYPE_STA_ETH_DATA = 1,
|
||||
DATA_TYPE_AP_ETH_DATA,
|
||||
DATA_TYPE_PROMISC_ETH_DATA,
|
||||
DATA_TYPE_CMD,
|
||||
DATA_TYPE_RESP,
|
||||
DATA_TYPE_CB,
|
||||
} app_data_type_t;
|
||||
|
||||
struct spi_data_packet
|
||||
{
|
||||
uint32_t data_len; /* length for buffer */
|
||||
uint32_t data_type; /* app_data_type_t */
|
||||
char buffer[SPI_MAX_DATA_LEN];
|
||||
};
|
||||
|
||||
typedef struct rw007_ap_info_value
|
||||
{
|
||||
struct rt_wlan_info info;
|
||||
char passwd[RT_WLAN_PASSWORD_MAX_LENGTH];
|
||||
} * rw007_ap_info_value_t;
|
||||
|
||||
/* littel endian */
|
||||
typedef struct rw007_cmd
|
||||
{
|
||||
uint32_t cmd;
|
||||
uint32_t len;
|
||||
|
||||
/* command parameter */
|
||||
union
|
||||
{
|
||||
uint32_t int_value;
|
||||
uint8_t mac_value[8]; /* padding 2bytes */
|
||||
struct rw007_ap_info_value ap_info_value;
|
||||
char string_value[UINT16_MAX];
|
||||
} value;
|
||||
} * rw007_cmd_t;
|
||||
|
||||
struct rw007_resp
|
||||
{
|
||||
uint32_t cmd;
|
||||
uint32_t len;
|
||||
|
||||
int32_t result; /* result of CMD. */
|
||||
|
||||
/* response value */
|
||||
union
|
||||
{
|
||||
uint32_t int_value;
|
||||
uint8_t mac_value[8]; /* padding 2bytes */
|
||||
struct rw007_ap_info_value ap_info_value;
|
||||
char string_value[UINT16_MAX];
|
||||
} value;
|
||||
};
|
||||
|
||||
/* tools */
|
||||
#define node_entry(node, type, member) ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member)))
|
||||
#define member_offset(type, member) ((unsigned long)(&((type *)0)->member))
|
||||
|
||||
#define MAX_SPI_PACKET_SIZE (member_offset(struct spi_data_packet, buffer) + SPI_MAX_DATA_LEN)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RW00x_CMD_INIT = 0x00,
|
||||
RW00x_CMD_SET_MODE,
|
||||
RW00x_CMD_MAC_GET,
|
||||
RW00x_CMD_MAC_SET,
|
||||
RW00x_CMD_GET_SN,
|
||||
RW00x_CMD_GET_VSR,
|
||||
RW00x_CMD_SCAN,
|
||||
RW00x_CMD_JOIN,
|
||||
RW00x_CMD_SOFTAP,
|
||||
RW00x_CMD_DISCONNECT,
|
||||
RW00x_CMD_AP_STOP,
|
||||
RW00x_CMD_AP_DEAUTH,
|
||||
RW00x_CMD_SCAN_STOP,
|
||||
RW00x_CMD_GET_RSSI,
|
||||
RW00x_CMD_SET_PWR_SAVE,
|
||||
RW00x_CMD_GET_PWR_SAVE,
|
||||
RW00x_CMD_CFG_PROMISC,
|
||||
RW00x_CMD_CFG_FILTER,
|
||||
RW00x_CMD_SET_CHANNEL,
|
||||
RW00x_CMD_GET_CHANNEL,
|
||||
RW00x_CMD_SET_COUNTRY,
|
||||
RW00x_CMD_GET_COUNTRY,
|
||||
RW00x_CMD_AP_MAC_GET,
|
||||
RW00x_CMD_AP_MAC_SET,
|
||||
RW00x_CMD_MAX_NUM
|
||||
}RW00x_CMD;
|
||||
|
||||
struct rw007_spi
|
||||
{
|
||||
/* Device handle for spi device */
|
||||
struct rt_spi_device *spi_device;
|
||||
|
||||
/* Tx mempool and mailbox */
|
||||
struct rt_mempool spi_tx_mp;
|
||||
ALIGN(RT_ALIGN_SIZE)
|
||||
rt_uint8_t spi_tx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_TX_POOL_SIZE];
|
||||
struct rt_mailbox spi_tx_mb;
|
||||
rt_ubase_t spi_tx_mb_pool[SPI_TX_POOL_SIZE + 1];
|
||||
|
||||
/* Rx mempool and mailbox */
|
||||
struct rt_mempool spi_rx_mp;
|
||||
ALIGN(RT_ALIGN_SIZE)
|
||||
rt_uint8_t spi_rx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_RX_POOL_SIZE];
|
||||
struct rt_mailbox spi_rx_mb;
|
||||
rt_ubase_t spi_rx_mb_pool[SPI_RX_POOL_SIZE + 1];
|
||||
|
||||
/* response event */
|
||||
rt_event_t rw007_cmd_event;
|
||||
/* response data */
|
||||
struct rw007_resp *resp[RW00x_CMD_MAX_NUM];
|
||||
};
|
||||
|
||||
#define RW00x_CMD_RESP_EVENT(n) (0x01UL << n)
|
||||
|
||||
struct rw007_wifi
|
||||
{
|
||||
/* inherit from ethernet device */
|
||||
struct rt_wlan_device *wlan;
|
||||
/* spi transfer layer handle */
|
||||
struct rw007_spi * hspi;
|
||||
};
|
||||
|
||||
/* porting */
|
||||
extern void spi_wifi_hw_init(void);
|
||||
|
||||
/* end porting */
|
||||
|
||||
/* api exclude in wlan framework */
|
||||
extern rt_err_t rw007_sn_get(char sn[24]);
|
||||
extern rt_err_t rw007_version_get(char version[16]);
|
||||
/* end api exclude in wlan framework */
|
||||
|
||||
extern rt_err_t rt_hw_wifi_init(const char *spi_device_name);
|
||||
|
||||
#endif /* SPI_WIFI_H_INCLUDED */
|
|
@ -0,0 +1,873 @@
|
|||
/*
|
||||
* COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2014-07-31 aozima the first version
|
||||
* 2014-09-18 aozima update command & response.
|
||||
* 2017-07-28 armink fix auto reconnect feature
|
||||
* 2018-12-24 zyh porting rw007 from rw009
|
||||
* 2019-02-25 zyh porting rw007 to wlan
|
||||
* 2020-02-28 shaoguoji add spi transfer retry
|
||||
* 2020-07-09 zj refactor the rw007
|
||||
*/
|
||||
#include <rtthread.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef RW007_LOG_LEVEL
|
||||
#define RW007_LOG_LEVEL DBG_LOG
|
||||
#endif
|
||||
|
||||
#define DBG_ENABLE
|
||||
#define DBG_SECTION_NAME "[RW007]"
|
||||
#define DBG_LEVEL RW007_LOG_LEVEL
|
||||
#define DBG_COLOR
|
||||
#include <rtdbg.h>
|
||||
|
||||
#include "spi_wifi_rw007.h"
|
||||
|
||||
static struct rw007_spi rw007_spi;
|
||||
static struct rw007_wifi wifi_sta, wifi_ap;
|
||||
static struct rt_event spi_wifi_data_event;
|
||||
static rt_bool_t inited = RT_FALSE;
|
||||
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
typedef struct
|
||||
{
|
||||
rt_uint32_t total;
|
||||
rt_uint32_t lose;
|
||||
rt_uint32_t retry;
|
||||
rt_uint32_t first_stage_err;
|
||||
rt_uint32_t second_stage_err;
|
||||
} net_packet;
|
||||
net_packet packet;
|
||||
#endif
|
||||
|
||||
static int wifi_data_transfer(struct rw007_spi *dev, uint16_t seq, uint8_t *rx_buffer)
|
||||
{
|
||||
static const struct spi_data_packet *send_packet = RT_NULL;
|
||||
struct spi_master_request cmd;
|
||||
struct spi_slave_response resp;
|
||||
struct rt_spi_message message;
|
||||
struct rt_spi_device *rt_spi_device = dev->spi_device;
|
||||
rt_uint32_t max_data_len = 0;
|
||||
|
||||
/* Clear cmd */
|
||||
rt_memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.type = master_cmd_phase;
|
||||
cmd.seq = seq;
|
||||
/* Set magic word */
|
||||
cmd.magic1 = MASTER_MAGIC1;
|
||||
cmd.magic2 = MASTER_MAGIC2;
|
||||
|
||||
/* If the buffer is not full, Set master ready flag bit */
|
||||
if(rx_buffer != RT_NULL)
|
||||
{
|
||||
cmd.flag |= MASTER_FLAG_MRDY;
|
||||
}
|
||||
|
||||
if (send_packet == RT_NULL)
|
||||
{
|
||||
/* Check to see if any data needs to be sent */
|
||||
if (rt_mb_recv(&dev->spi_tx_mb, (rt_ubase_t *)&send_packet, RT_WAITING_NO) != RT_EOK)
|
||||
{
|
||||
send_packet = RT_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set length for master to slave when data ready*/
|
||||
if (send_packet != RT_NULL)
|
||||
{
|
||||
/* Invalid data packet */
|
||||
if((send_packet->data_len == 0) || (send_packet->data_len > SPI_MAX_DATA_LEN))
|
||||
{
|
||||
rt_mp_free((void *)send_packet);
|
||||
send_packet = RT_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd.M2S_len = send_packet->data_len + member_offset(struct spi_data_packet, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
/* Stage 1: Send command to rw007 */
|
||||
rt_memset(&resp, 0, sizeof(resp));
|
||||
rt_spi_transfer(rt_spi_device, &cmd, &resp, sizeof(resp));
|
||||
|
||||
/* Clear event */
|
||||
rt_event_recv(&spi_wifi_data_event,
|
||||
RW007_SLAVE_INT,
|
||||
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
|
||||
RT_WAITING_NO,
|
||||
RT_NULL);
|
||||
/* checkout Stage 1 slave status */
|
||||
if ((resp.magic1 != SLAVE_MAGIC1) || (resp.magic2 != SLAVE_MAGIC2) || (resp.type != slave_cmd_phase))
|
||||
{
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
packet.first_stage_err++;
|
||||
#endif
|
||||
LOG_E("The wifi Stage 1 status %x %x %x %d\r", resp.magic1, resp.magic2, resp.type, cmd.seq);
|
||||
goto _cmderr;
|
||||
}
|
||||
|
||||
/* receive first event */
|
||||
if (rt_event_recv(&spi_wifi_data_event,
|
||||
RW007_SLAVE_INT,
|
||||
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
|
||||
SLAVE_INT_TIMEOUT,
|
||||
RT_NULL) != RT_EOK)
|
||||
{
|
||||
LOG_E("The wifi slave response timed out\r");
|
||||
}
|
||||
|
||||
/* Stage 2: Receive response from rw007 */
|
||||
cmd.type = master_data_phase; //data Stage
|
||||
rt_memset(&resp, 0, sizeof(resp));
|
||||
message.send_buf = &cmd;
|
||||
message.recv_buf = &resp;
|
||||
message.length = sizeof(resp);
|
||||
message.cs_take = 1;
|
||||
message.cs_release = 0;
|
||||
|
||||
/* Start a SPI transmit */
|
||||
rt_spi_take_bus(rt_spi_device);
|
||||
|
||||
/* Receive response from rw007 */
|
||||
rt_spi_device->bus->ops->xfer(rt_spi_device, &message);
|
||||
|
||||
/* Check response's magic word and seq */
|
||||
if ((resp.magic1 != SLAVE_MAGIC1) || (resp.magic2 != SLAVE_MAGIC2) || (resp.seq != seq) || (resp.type != slave_data_phase))
|
||||
{
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
packet.second_stage_err++;
|
||||
#endif
|
||||
LOG_E("The wifi Stage 2 status %x %x %x %x %d %d\r", resp.magic1, resp.magic2, resp.seq, resp.type, resp.S2M_len, cmd.seq);
|
||||
goto _txerr;
|
||||
}
|
||||
|
||||
/* Check rw007's data ready flag */
|
||||
if (resp.flag & SLAVE_FLAG_SRDY)
|
||||
{
|
||||
max_data_len = cmd.M2S_len;
|
||||
}
|
||||
|
||||
if (resp.S2M_len > MAX_SPI_PACKET_SIZE)
|
||||
{
|
||||
/* Drop error data */
|
||||
resp.S2M_len = 0;
|
||||
}
|
||||
|
||||
if (resp.S2M_len > max_data_len)
|
||||
{
|
||||
max_data_len = resp.S2M_len;
|
||||
}
|
||||
|
||||
/* Setup message */
|
||||
if((resp.S2M_len == 0) && (rx_buffer != RT_NULL))
|
||||
{
|
||||
rt_mp_free(rx_buffer);
|
||||
rx_buffer = RT_NULL;
|
||||
}
|
||||
|
||||
message.send_buf = send_packet;
|
||||
message.recv_buf = rx_buffer;
|
||||
message.length = RT_ALIGN(max_data_len, 4);/* align clk to word */
|
||||
message.cs_take = 0;
|
||||
message.cs_release = 1;
|
||||
|
||||
/* Transmit data */
|
||||
rt_spi_device->bus->ops->xfer(rt_spi_device, &message);
|
||||
|
||||
/* End a SPI transmit */
|
||||
rt_spi_release_bus(rt_spi_device);
|
||||
|
||||
/* Free send data space */
|
||||
if ((resp.flag & SLAVE_FLAG_SRDY) && (send_packet != RT_NULL))
|
||||
{
|
||||
rt_mp_free((void *)send_packet);
|
||||
send_packet = RT_NULL;
|
||||
}
|
||||
|
||||
/* Parse recevied data */
|
||||
if(rx_buffer)
|
||||
{
|
||||
rt_mb_send(&dev->spi_rx_mb, (rt_ubase_t)rx_buffer);
|
||||
}
|
||||
|
||||
/* receive data end event */
|
||||
if (rt_event_recv(&spi_wifi_data_event,
|
||||
RW007_SLAVE_INT,
|
||||
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
|
||||
SLAVE_INT_TIMEOUT,
|
||||
RT_NULL) != RT_EOK)
|
||||
{
|
||||
LOG_E("The wifi slave data response timed out\r");
|
||||
}
|
||||
|
||||
/* The slave has data */
|
||||
if (resp.slave_tx_buf > 0)
|
||||
{
|
||||
return TRANSFER_DATA_CONTINUE;
|
||||
}
|
||||
return TRANSFER_DATA_SUCCESS;
|
||||
_txerr:
|
||||
/* END SPI transfer */
|
||||
message.send_buf = RT_NULL;
|
||||
message.recv_buf = RT_NULL;
|
||||
message.length = 0;
|
||||
message.cs_take = 0;
|
||||
message.cs_release = 1;
|
||||
rt_spi_device->bus->ops->xfer(rt_spi_device, &message);
|
||||
|
||||
rt_spi_release_bus(rt_spi_device); // End a SPI transmit
|
||||
_cmderr:
|
||||
rt_thread_delay(1);
|
||||
return TRANSFER_DATA_ERROR;
|
||||
}
|
||||
|
||||
static int spi_wifi_transfer(struct rw007_spi *dev)
|
||||
{
|
||||
static uint16_t cmd_seq = 0;
|
||||
int result = TRANSFER_DATA_SUCCESS;
|
||||
uint8_t * rx_buffer = rt_mp_alloc(&dev->spi_rx_mp, RT_WAITING_NO);
|
||||
int32_t retry;
|
||||
|
||||
/* Generate the transmission sequence number */
|
||||
cmd_seq++;
|
||||
if (cmd_seq >= 65534)
|
||||
{
|
||||
cmd_seq = 1;
|
||||
}
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
packet.total++;
|
||||
#endif
|
||||
/* set retry count */
|
||||
retry = 3;
|
||||
while (retry > 0)
|
||||
{
|
||||
result = wifi_data_transfer(dev, cmd_seq, rx_buffer);
|
||||
if (result != TRANSFER_DATA_ERROR)
|
||||
{
|
||||
break;
|
||||
}
|
||||
retry--;
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
packet.retry++;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Receive response from rw007 error */
|
||||
if (retry <= 0)
|
||||
{
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
packet.lose++;
|
||||
#endif
|
||||
LOG_E("rw007 transfer failed\r");
|
||||
goto _err;
|
||||
}
|
||||
|
||||
return result;
|
||||
_err:
|
||||
if(rx_buffer)
|
||||
{
|
||||
rt_mp_free((void *)rx_buffer);
|
||||
}
|
||||
return TRANSFER_DATA_ERROR;
|
||||
}
|
||||
|
||||
static void wifi_data_process_thread_entry(void *parameter)
|
||||
{
|
||||
const struct spi_data_packet *data_packet = RT_NULL;
|
||||
struct rw007_spi *dev = (struct rw007_spi *)parameter;
|
||||
|
||||
while(1)
|
||||
{
|
||||
/* get the mempool memory for recv data package */
|
||||
if(rt_mb_recv(&dev->spi_rx_mb, (rt_ubase_t *)&data_packet, RT_WAITING_FOREVER) == RT_EOK)
|
||||
{
|
||||
if (data_packet->data_type == DATA_TYPE_STA_ETH_DATA)
|
||||
{
|
||||
/* Ethernet package from station device */
|
||||
rt_wlan_dev_report_data(wifi_sta.wlan, (void *)data_packet->buffer, data_packet->data_len);
|
||||
}
|
||||
else if (data_packet->data_type == DATA_TYPE_AP_ETH_DATA)
|
||||
{
|
||||
/* Ethernet package from ap device */
|
||||
rt_wlan_dev_report_data(wifi_ap.wlan, (void *)data_packet->buffer, data_packet->data_len);
|
||||
}
|
||||
else if (data_packet->data_type == DATA_TYPE_PROMISC_ETH_DATA)
|
||||
{
|
||||
/* air wifi package from promisc */
|
||||
rt_wlan_dev_promisc_handler(wifi_sta.wlan, (void *)data_packet->buffer, data_packet->data_len);
|
||||
}
|
||||
/* event callback */
|
||||
else if(data_packet->data_type == DATA_TYPE_CB)
|
||||
{
|
||||
struct rw007_resp * resp = (struct rw007_resp *)data_packet->buffer;
|
||||
if(resp->cmd == RT_WLAN_DEV_EVT_SCAN_REPORT)
|
||||
{
|
||||
/* parse scan report event data */
|
||||
struct rt_wlan_buff buff;
|
||||
struct rt_wlan_info * wlan_info;
|
||||
wlan_info = (struct rt_wlan_info *)&resp->value;
|
||||
buff.data = wlan_info;
|
||||
buff.len = sizeof(struct rt_wlan_info);
|
||||
|
||||
/* indicate scan report event */
|
||||
rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_SCAN_REPORT, &buff);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(resp->cmd == RT_WLAN_DEV_EVT_AP_START || resp->cmd == RT_WLAN_DEV_EVT_AP_STOP ||
|
||||
resp->cmd == RT_WLAN_DEV_EVT_AP_ASSOCIATED || resp->cmd == RT_WLAN_DEV_EVT_AP_DISASSOCIATED)
|
||||
{
|
||||
/* indicate ap device event */
|
||||
rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* indicate sta device event */
|
||||
rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (data_packet->data_type == DATA_TYPE_RESP)
|
||||
{
|
||||
/* parse cmd's response */
|
||||
struct rw007_resp * resp = (struct rw007_resp *)data_packet->buffer;
|
||||
if(resp->cmd < RW00x_CMD_MAX_NUM)
|
||||
{
|
||||
if(dev->resp[resp->cmd])
|
||||
{
|
||||
rt_free(dev->resp[resp->cmd]);
|
||||
}
|
||||
|
||||
/* stash response result */
|
||||
dev->resp[resp->cmd] = rt_malloc(MAX_SPI_PACKET_SIZE);
|
||||
if(dev->resp[resp->cmd])
|
||||
{
|
||||
rt_memcpy(dev->resp[resp->cmd], resp, MAX_SPI_PACKET_SIZE);
|
||||
|
||||
/* notify response arrived */
|
||||
rt_event_send(dev->rw007_cmd_event, RW00x_CMD_RESP_EVENT(resp->cmd));
|
||||
}
|
||||
}
|
||||
}
|
||||
/* free recv mempool memory */
|
||||
rt_mp_free((void *)data_packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void spi_wifi_data_thread_entry(void *parameter)
|
||||
{
|
||||
rt_bool_t empty_read = RT_TRUE;
|
||||
rt_uint32_t event;
|
||||
int state;
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* receive first event */
|
||||
if (rt_event_recv(&spi_wifi_data_event,
|
||||
RW007_MASTER_DATA|
|
||||
RW007_SLAVE_INT,
|
||||
RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
||||
RT_WAITING_FOREVER,
|
||||
&event) != RT_EOK)
|
||||
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/* transfer */
|
||||
state = spi_wifi_transfer(&rw007_spi);
|
||||
|
||||
/* Try reading again */
|
||||
if(state == TRANSFER_DATA_CONTINUE)
|
||||
{
|
||||
rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT);
|
||||
empty_read = RT_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((state == TRANSFER_DATA_SUCCESS) && (empty_read == RT_TRUE))
|
||||
{
|
||||
rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT);
|
||||
empty_read = RT_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
empty_read = RT_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rt_inline struct rw007_wifi *wifi_get_dev_by_wlan(struct rt_wlan_device *wlan)
|
||||
{
|
||||
if (wlan == wifi_sta.wlan)
|
||||
{
|
||||
return &wifi_sta;
|
||||
}
|
||||
if (wlan == wifi_ap.wlan)
|
||||
{
|
||||
return &wifi_ap;
|
||||
}
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
rt_inline void spi_send_cmd(struct rw007_spi * hspi, RW00x_CMD COMMAND, void * buffer, rt_uint32_t len)
|
||||
{
|
||||
struct spi_data_packet * data_packet;
|
||||
struct rw007_cmd * cmd;
|
||||
|
||||
data_packet = rt_mp_alloc(&hspi->spi_tx_mp, RT_WAITING_FOREVER);
|
||||
data_packet->data_type = DATA_TYPE_CMD;
|
||||
|
||||
cmd = (struct rw007_cmd *)data_packet->buffer;
|
||||
cmd->cmd = COMMAND;
|
||||
cmd->len = len;
|
||||
if(cmd->len)
|
||||
{
|
||||
rt_memcpy(&cmd->value, buffer, cmd->len);
|
||||
}
|
||||
|
||||
data_packet->data_len = member_offset(struct rw007_cmd, value) + cmd->len;
|
||||
|
||||
rt_mb_send(&hspi->spi_tx_mb, (rt_ubase_t)data_packet);
|
||||
rt_event_send(&spi_wifi_data_event, RW007_MASTER_DATA);
|
||||
}
|
||||
|
||||
rt_inline rt_err_t spi_set_data(struct rt_wlan_device *wlan, RW00x_CMD COMMAND, void * buffer, rt_uint32_t len)
|
||||
{
|
||||
struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi;
|
||||
rt_uint32_t result_event;
|
||||
rt_err_t result = RT_EOK;
|
||||
spi_send_cmd(hspi, COMMAND, buffer, len);
|
||||
if(rt_event_recv(hspi->rw007_cmd_event,
|
||||
RW00x_CMD_RESP_EVENT(COMMAND),
|
||||
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
|
||||
rt_tick_from_millisecond(10000),
|
||||
&result_event) != RT_EOK)
|
||||
{
|
||||
return -RT_ETIMEOUT;
|
||||
}
|
||||
|
||||
if(hspi->resp[COMMAND])
|
||||
{
|
||||
result = hspi->resp[COMMAND]->result;
|
||||
rt_free(hspi->resp[COMMAND]);
|
||||
hspi->resp[COMMAND] = RT_NULL;
|
||||
return result;
|
||||
}
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_inline rt_err_t spi_get_data(struct rt_wlan_device *wlan, RW00x_CMD COMMAND, void * buffer, rt_uint32_t *len)
|
||||
{
|
||||
struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi;
|
||||
rt_uint32_t result_event;
|
||||
rt_err_t result = RT_EOK;
|
||||
spi_send_cmd(hspi, COMMAND, RT_NULL, 0);
|
||||
if(rt_event_recv(hspi->rw007_cmd_event,
|
||||
RW00x_CMD_RESP_EVENT(COMMAND),
|
||||
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
|
||||
rt_tick_from_millisecond(10000),
|
||||
&result_event) != RT_EOK)
|
||||
{
|
||||
return -RT_ETIMEOUT;
|
||||
}
|
||||
|
||||
if(hspi->resp[COMMAND])
|
||||
{
|
||||
*len = hspi->resp[COMMAND]->len;
|
||||
rt_memcpy(buffer, &hspi->resp[COMMAND]->value, hspi->resp[COMMAND]->len);
|
||||
result = hspi->resp[COMMAND]->result;
|
||||
rt_free(hspi->resp[COMMAND]);
|
||||
hspi->resp[COMMAND] = RT_NULL;
|
||||
return result;
|
||||
}
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t rw007_sn_get(char sn[24])
|
||||
{
|
||||
rt_uint32_t size_of_data;
|
||||
return spi_get_data(wifi_sta.wlan, RW00x_CMD_GET_SN, sn, &size_of_data);
|
||||
}
|
||||
|
||||
rt_err_t rw007_version_get(char version[16])
|
||||
{
|
||||
rt_uint32_t size_of_data;
|
||||
return spi_get_data(wifi_sta.wlan, RW00x_CMD_GET_VSR, version, &size_of_data);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_init(struct rt_wlan_device *wlan)
|
||||
{
|
||||
if(inited == RT_FALSE)
|
||||
{
|
||||
inited = RT_TRUE;
|
||||
return spi_set_data(wlan, RW00x_CMD_INIT, RT_NULL, 0);
|
||||
}
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_mode(struct rt_wlan_device *wlan, rt_wlan_mode_t mode)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SET_MODE, &mode, sizeof(mode));
|
||||
}
|
||||
|
||||
static rt_err_t wlan_scan(struct rt_wlan_device *wlan, struct rt_scan_info *scan_info)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SCAN, RT_NULL, 0);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_join(struct rt_wlan_device *wlan, struct rt_sta_info *sta_info)
|
||||
{
|
||||
struct rw007_ap_info_value value;
|
||||
value.info.security = sta_info->security;
|
||||
value.info.band = RT_802_11_BAND_2_4GHZ;
|
||||
value.info.datarate = 0;
|
||||
value.info.channel = sta_info->channel;
|
||||
value.info.hidden = 0;
|
||||
value.info.rssi = 0;
|
||||
value.info.ssid = sta_info->ssid;
|
||||
rt_memcpy(value.info.bssid, sta_info->bssid, 6);
|
||||
strncpy(value.passwd, (const char *)&sta_info->key.val[0], sta_info->key.len);
|
||||
value.passwd[sta_info->key.len] = '\0';
|
||||
return spi_set_data(wlan, RW00x_CMD_JOIN, &value, sizeof(value));
|
||||
}
|
||||
|
||||
static rt_err_t wlan_softap(struct rt_wlan_device *wlan, struct rt_ap_info *ap_info)
|
||||
{
|
||||
struct rw007_ap_info_value value;
|
||||
value.info.security = ap_info->security;
|
||||
value.info.band = RT_802_11_BAND_2_4GHZ;
|
||||
value.info.datarate = 0;
|
||||
value.info.channel = ap_info->channel;
|
||||
value.info.hidden = ap_info->hidden;
|
||||
value.info.rssi = 0;
|
||||
value.info.ssid = ap_info->ssid;
|
||||
strncpy(value.passwd, (const char *)&ap_info->key.val[0], ap_info->key.len);
|
||||
value.passwd[ap_info->key.len] = '\0';
|
||||
return spi_set_data(wlan, RW00x_CMD_SOFTAP, &value, sizeof(value));
|
||||
}
|
||||
|
||||
static rt_err_t wlan_disconnect(struct rt_wlan_device *wlan)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_DISCONNECT, RT_NULL, 0);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_ap_stop(struct rt_wlan_device *wlan)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_AP_STOP, RT_NULL, 0);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_ap_deauth(struct rt_wlan_device *wlan, rt_uint8_t mac[])
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_AP_DEAUTH, mac, 6);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_scan_stop(struct rt_wlan_device *wlan)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SCAN_STOP, RT_NULL, 0);
|
||||
}
|
||||
|
||||
static int wlan_get_rssi(struct rt_wlan_device *wlan)
|
||||
{
|
||||
int rssi = -1;
|
||||
rt_uint32_t size_of_data;
|
||||
spi_get_data(wlan, RW00x_CMD_GET_RSSI, &rssi, &size_of_data);
|
||||
return rssi;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_set_powersave(struct rt_wlan_device *wlan, int level)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SET_PWR_SAVE, &level, sizeof(level));
|
||||
}
|
||||
|
||||
static int wlan_get_powersave(struct rt_wlan_device *wlan)
|
||||
{
|
||||
int level = -1;
|
||||
rt_uint32_t size_of_data;
|
||||
spi_get_data(wlan, RW00x_CMD_GET_PWR_SAVE, &level, &size_of_data);
|
||||
return level;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_cfg_promisc(struct rt_wlan_device *wlan, rt_bool_t start)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_CFG_PROMISC, &start, sizeof(start));
|
||||
}
|
||||
|
||||
static rt_err_t wlan_cfg_filter(struct rt_wlan_device *wlan, struct rt_wlan_filter *filter)
|
||||
{
|
||||
return -RT_ENOSYS;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_set_channel(struct rt_wlan_device *wlan, int channel)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SET_CHANNEL, &channel, sizeof(channel));
|
||||
}
|
||||
|
||||
static int wlan_get_channel(struct rt_wlan_device *wlan)
|
||||
{
|
||||
int channel = -1;
|
||||
rt_uint32_t size_of_data;
|
||||
spi_get_data(wlan, RW00x_CMD_GET_CHANNEL, &channel, &size_of_data);
|
||||
return channel;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_set_country(struct rt_wlan_device *wlan, rt_country_code_t country_code)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_SET_COUNTRY, &country_code, sizeof(country_code));
|
||||
}
|
||||
|
||||
static rt_country_code_t wlan_get_country(struct rt_wlan_device *wlan)
|
||||
{
|
||||
rt_country_code_t code;
|
||||
rt_uint32_t size_of_data;
|
||||
spi_get_data(wlan, RW00x_CMD_GET_COUNTRY, &code, &size_of_data);
|
||||
return code;
|
||||
}
|
||||
|
||||
static rt_err_t wlan_set_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
|
||||
{
|
||||
if(wlan == wifi_sta.wlan)
|
||||
{
|
||||
return spi_set_data(wlan, RW00x_CMD_MAC_SET, mac, 6);
|
||||
}
|
||||
return spi_set_data(wlan, RW00x_CMD_AP_MAC_SET, mac, 6);
|
||||
}
|
||||
|
||||
static rt_err_t wlan_get_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[])
|
||||
{
|
||||
rt_uint32_t size_of_data;
|
||||
if(wlan == wifi_sta.wlan)
|
||||
{
|
||||
return spi_get_data(wlan, RW00x_CMD_MAC_GET, mac, &size_of_data);
|
||||
}
|
||||
return spi_get_data(wlan, RW00x_CMD_AP_MAC_GET, mac, &size_of_data);
|
||||
}
|
||||
|
||||
static int wlan_send(struct rt_wlan_device *wlan, void *buff, int len)
|
||||
{
|
||||
struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi;
|
||||
struct spi_data_packet * data_packet;
|
||||
|
||||
if(wlan == RT_NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
data_packet = rt_mp_alloc(&hspi->spi_tx_mp, RT_WAITING_FOREVER);
|
||||
|
||||
if (wlan == wifi_sta.wlan)
|
||||
{
|
||||
data_packet->data_type = DATA_TYPE_STA_ETH_DATA;
|
||||
}
|
||||
else
|
||||
{
|
||||
data_packet->data_type = DATA_TYPE_AP_ETH_DATA;
|
||||
}
|
||||
data_packet->data_len = len;
|
||||
|
||||
rt_memcpy(data_packet->buffer, buff, len);
|
||||
|
||||
rt_mb_send(&hspi->spi_tx_mb, (rt_ubase_t)data_packet);
|
||||
rt_event_send(&spi_wifi_data_event, RW007_MASTER_DATA);
|
||||
return len;
|
||||
}
|
||||
|
||||
const static struct rt_wlan_dev_ops ops =
|
||||
{
|
||||
.wlan_init = wlan_init,
|
||||
.wlan_mode = wlan_mode,
|
||||
.wlan_scan = wlan_scan,
|
||||
.wlan_join = wlan_join,
|
||||
.wlan_softap = wlan_softap,
|
||||
.wlan_disconnect = wlan_disconnect,
|
||||
.wlan_ap_stop = wlan_ap_stop,
|
||||
.wlan_ap_deauth = wlan_ap_deauth,
|
||||
.wlan_scan_stop = wlan_scan_stop,
|
||||
.wlan_get_rssi = wlan_get_rssi,
|
||||
.wlan_set_powersave = wlan_set_powersave,
|
||||
.wlan_get_powersave = wlan_get_powersave,
|
||||
.wlan_cfg_promisc = wlan_cfg_promisc,
|
||||
.wlan_cfg_filter = wlan_cfg_filter,
|
||||
.wlan_set_channel = wlan_set_channel,
|
||||
.wlan_get_channel = wlan_get_channel,
|
||||
.wlan_set_country = wlan_set_country,
|
||||
.wlan_get_country = wlan_get_country,
|
||||
.wlan_set_mac = wlan_set_mac,
|
||||
.wlan_get_mac = wlan_get_mac,
|
||||
.wlan_recv = RT_NULL,
|
||||
.wlan_send = wlan_send,
|
||||
};
|
||||
|
||||
rt_err_t rt_hw_wifi_init(const char *spi_device_name)
|
||||
{
|
||||
static struct rt_wlan_device wlan_sta, wlan_ap;
|
||||
rt_err_t ret;
|
||||
wifi_sta.wlan = &wlan_sta;
|
||||
wifi_sta.hspi = &rw007_spi;
|
||||
wifi_ap.wlan = &wlan_ap;
|
||||
wifi_ap.hspi = &rw007_spi;
|
||||
/* align and struct size check. */
|
||||
RT_ASSERT((SPI_MAX_DATA_LEN & 0x03) == 0);
|
||||
|
||||
memset(&rw007_spi, 0, sizeof(struct rw007_spi));
|
||||
|
||||
rw007_spi.spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name);
|
||||
|
||||
if (rw007_spi.spi_device == RT_NULL)
|
||||
{
|
||||
LOG_E("spi device %s not found!\r", spi_device_name);
|
||||
return -RT_ENOSYS;
|
||||
}
|
||||
|
||||
/* config spi */
|
||||
{
|
||||
struct rt_spi_configuration cfg;
|
||||
cfg.data_width = 8;
|
||||
cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0. */
|
||||
cfg.max_hz = RW007_SPI_MAX_HZ; /* 15M 007 max 30M */
|
||||
rt_spi_configure(rw007_spi.spi_device, &cfg);
|
||||
}
|
||||
|
||||
/* init spi send mempool */
|
||||
rt_mp_init(&rw007_spi.spi_tx_mp,
|
||||
"spi_tx",
|
||||
&rw007_spi.spi_tx_mempool[0],
|
||||
sizeof(rw007_spi.spi_tx_mempool),
|
||||
sizeof(struct spi_data_packet));
|
||||
|
||||
/* init spi send mailbox */
|
||||
rt_mb_init(&rw007_spi.spi_tx_mb,
|
||||
"spi_tx",
|
||||
&rw007_spi.spi_tx_mb_pool[0],
|
||||
SPI_TX_POOL_SIZE,
|
||||
RT_IPC_FLAG_PRIO);
|
||||
|
||||
/* init spi recv mempool */
|
||||
rt_mp_init(&rw007_spi.spi_rx_mp,
|
||||
"spi_rx",
|
||||
&rw007_spi.spi_rx_mempool[0],
|
||||
sizeof(rw007_spi.spi_rx_mempool),
|
||||
sizeof(struct spi_data_packet));
|
||||
|
||||
/* init spi recv mailbox */
|
||||
rt_mb_init(&rw007_spi.spi_rx_mb,
|
||||
"spi_rx",
|
||||
&rw007_spi.spi_rx_mb_pool[0],
|
||||
SPI_RX_POOL_SIZE,
|
||||
RT_IPC_FLAG_PRIO);
|
||||
|
||||
/* init spi data notify event */
|
||||
rt_event_init(&spi_wifi_data_event, "wifi", RT_IPC_FLAG_FIFO);
|
||||
|
||||
rw007_spi.rw007_cmd_event = rt_event_create("wifi_cmd", RT_IPC_FLAG_FIFO);
|
||||
|
||||
/* register wlan device for ap */
|
||||
ret = rt_wlan_dev_register(&wlan_ap, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap);
|
||||
if (ret != RT_EOK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* register wlan device for sta */
|
||||
ret = rt_wlan_dev_register(&wlan_sta, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta);
|
||||
if (ret != RT_EOK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
{
|
||||
rt_thread_t tid;
|
||||
|
||||
/* Create package parse thread */
|
||||
tid = rt_thread_create("wifi_handle",
|
||||
wifi_data_process_thread_entry,
|
||||
&rw007_spi,
|
||||
2048,
|
||||
8,
|
||||
20);
|
||||
if(!tid)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
rt_thread_startup(tid);
|
||||
|
||||
/* Create wifi transfer thread */
|
||||
tid = rt_thread_create("wifi_xfer",
|
||||
spi_wifi_data_thread_entry,
|
||||
RT_NULL,
|
||||
2048,
|
||||
9,
|
||||
20);
|
||||
if(!tid)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
rt_thread_startup(tid);
|
||||
}
|
||||
|
||||
spi_wifi_hw_init();
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
void spi_wifi_isr(int vector)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
/* device has a package to ready transfer */
|
||||
rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT);
|
||||
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
#ifdef WLAN_DEV_MONITOR
|
||||
int rw007_dump(int argc, char **argv)
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
goto __usage;
|
||||
}
|
||||
|
||||
if (strcmp(argv[1], "--show") == 0)
|
||||
{
|
||||
rt_kprintf("Wifi Device transmission information:\n");
|
||||
rt_kprintf("Total packets : %d\n", packet.total);
|
||||
rt_kprintf("Failed packets : %d\n", packet.lose);
|
||||
rt_kprintf("Retry count : %d\n", packet.retry);
|
||||
rt_kprintf("Stage 1 error : %d\n", packet.first_stage_err);
|
||||
rt_kprintf("Stage 2 error : %d\n", packet.second_stage_err);
|
||||
}
|
||||
else if (strcmp(argv[1], "-h") == 0)
|
||||
{
|
||||
goto __usage;
|
||||
}
|
||||
else if (strcmp(argv[1], "-c") == 0)
|
||||
{
|
||||
rt_memset(&packet, 0, sizeof(packet));
|
||||
}
|
||||
return 0;
|
||||
__usage:
|
||||
rt_kprintf("Usage: wifi_dump [-s|-c]\n");
|
||||
rt_kprintf("\n");
|
||||
rt_kprintf("Miscellaneous:\n");
|
||||
rt_kprintf(" -h print this message and quit\n");
|
||||
rt_kprintf(" --show show information\n");
|
||||
rt_kprintf(" -c Clear record data\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
#include <finsh.h>
|
||||
MSH_CMD_EXPORT(rw007_dump, the rw007 Informations Viewer);
|
||||
#endif
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue