forked from xuos/xiuos
23/07/12 Separate w5500 driver and its tests.
This commit is contained in:
parent
3aad797827
commit
d7aa29e0df
|
@ -1,3 +1,3 @@
|
||||||
SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c
|
SRC_FILES := socket.c connect_w5500.c w5500.c wizchip_conf.c spi_interface.c wiz_ping.c connect_w5500_test.c
|
||||||
|
|
||||||
include $(KERNEL_ROOT)/compiler.mk
|
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -23,47 +23,53 @@ extern void spi_select_cs(void);
|
||||||
extern void spi_deselete_cs(void);
|
extern void spi_deselete_cs(void);
|
||||||
|
|
||||||
// global configurations for w5500 tcp connection
|
// global configurations for w5500 tcp connection
|
||||||
const uint32_t g_wiznet_buf_size = 2048;
|
uint32_t get_gbuf_size() {
|
||||||
|
static const uint32_t g_wiznet_buf_size = 2048;
|
||||||
|
return g_wiznet_buf_size;
|
||||||
|
}
|
||||||
|
|
||||||
static wiz_NetInfo g_wiz_netinfo = {.mac = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11},
|
wiz_NetInfo *get_gnetinfo() {
|
||||||
.ip = {192, 168, 131, 42},
|
static wiz_NetInfo g_wiz_netinfo = {.mac = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11},
|
||||||
.sn = {255, 255, 254, 0},
|
.ip = {192, 168, 131, 42},
|
||||||
.gw = {192, 168, 130, 1},
|
.sn = {255, 255, 254, 0},
|
||||||
.dns = {0, 0, 0, 0},
|
.gw = {192, 168, 130, 1},
|
||||||
.dhcp = NETINFO_STATIC};
|
.dns = {0, 0, 0, 0},
|
||||||
|
.dhcp = NETINFO_STATIC};
|
||||||
|
return &g_wiz_netinfo;
|
||||||
|
}
|
||||||
|
|
||||||
int network_init() {
|
int network_init() {
|
||||||
wiz_NetInfo check_wiz_netinfo;
|
wiz_NetInfo check_wiz_netinfo;
|
||||||
check_wiz_netinfo.dhcp = NETINFO_STATIC;
|
check_wiz_netinfo.dhcp = NETINFO_STATIC;
|
||||||
ctlnetwork(CN_SET_NETINFO, (void *)&g_wiz_netinfo);
|
ctlnetwork(CN_SET_NETINFO, (void *)get_gnetinfo());
|
||||||
ctlnetwork(CN_GET_NETINFO, (void *)&check_wiz_netinfo);
|
ctlnetwork(CN_GET_NETINFO, (void *)&check_wiz_netinfo);
|
||||||
|
|
||||||
if (memcmp(&g_wiz_netinfo, &check_wiz_netinfo, sizeof(wiz_NetInfo)) != 0) {
|
if (memcmp(get_gnetinfo(), &check_wiz_netinfo, sizeof(wiz_NetInfo)) != 0) {
|
||||||
KPrintf(
|
KPrintf(
|
||||||
"mac: %d; ip: %d; gw: %d; sn: %d; dns: %d; dhcp: %d;\n",
|
"mac: %d; ip: %d; gw: %d; sn: %d; dns: %d; dhcp: %d;\n",
|
||||||
memcmp(&g_wiz_netinfo.mac, &check_wiz_netinfo.mac, sizeof(uint8_t) * 6),
|
memcmp(&get_gnetinfo()->mac, &check_wiz_netinfo.mac, sizeof(uint8_t) * 6),
|
||||||
memcmp(&g_wiz_netinfo.ip, &check_wiz_netinfo.ip, sizeof(uint8_t) * 4),
|
memcmp(&get_gnetinfo()->ip, &check_wiz_netinfo.ip, sizeof(uint8_t) * 4),
|
||||||
memcmp(&g_wiz_netinfo.sn, &check_wiz_netinfo.sn, sizeof(uint8_t) * 4),
|
memcmp(&get_gnetinfo()->sn, &check_wiz_netinfo.sn, sizeof(uint8_t) * 4),
|
||||||
memcmp(&g_wiz_netinfo.gw, &check_wiz_netinfo.gw, sizeof(uint8_t) * 4),
|
memcmp(&get_gnetinfo()->gw, &check_wiz_netinfo.gw, sizeof(uint8_t) * 4),
|
||||||
memcmp(&g_wiz_netinfo.dns, &check_wiz_netinfo.dns, sizeof(uint8_t) * 4),
|
memcmp(&get_gnetinfo()->dns, &check_wiz_netinfo.dns, sizeof(uint8_t) * 4),
|
||||||
memcmp(&g_wiz_netinfo.dhcp, &check_wiz_netinfo.dhcp, sizeof(uint8_t)));
|
memcmp(&get_gnetinfo()->dhcp, &check_wiz_netinfo.dhcp, sizeof(uint8_t)));
|
||||||
KPrintf("WIZCHIP set network information fail.\n");
|
KPrintf("WIZCHIP set network information fail.\n");
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
uint8_t tmpstr[6];
|
uint8_t tmpstr[6];
|
||||||
ctlwizchip(CW_GET_ID, (void *)tmpstr);
|
ctlwizchip(CW_GET_ID, (void *)tmpstr);
|
||||||
KPrintf("=== %s NET CONF ===\r\n", (char *)tmpstr);
|
KPrintf("=== %s NET CONF ===\r\n", (char *)tmpstr);
|
||||||
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", g_wiz_netinfo.mac[0],
|
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", get_gnetinfo()->mac[0],
|
||||||
g_wiz_netinfo.mac[1], g_wiz_netinfo.mac[2], g_wiz_netinfo.mac[3],
|
get_gnetinfo()->mac[1], get_gnetinfo()->mac[2], get_gnetinfo()->mac[3],
|
||||||
g_wiz_netinfo.mac[4], g_wiz_netinfo.mac[5]);
|
get_gnetinfo()->mac[4], get_gnetinfo()->mac[5]);
|
||||||
KPrintf("SIP: %d.%d.%d.%d\r\n", g_wiz_netinfo.ip[0], g_wiz_netinfo.ip[1],
|
KPrintf("SIP: %d.%d.%d.%d\r\n", get_gnetinfo()->ip[0], get_gnetinfo()->ip[1],
|
||||||
g_wiz_netinfo.ip[2], g_wiz_netinfo.ip[3]);
|
get_gnetinfo()->ip[2], get_gnetinfo()->ip[3]);
|
||||||
KPrintf("GAR: %d.%d.%d.%d\r\n", g_wiz_netinfo.gw[0], g_wiz_netinfo.gw[1],
|
KPrintf("GAR: %d.%d.%d.%d\r\n", get_gnetinfo()->gw[0], get_gnetinfo()->gw[1],
|
||||||
g_wiz_netinfo.gw[2], g_wiz_netinfo.gw[3]);
|
get_gnetinfo()->gw[2], get_gnetinfo()->gw[3]);
|
||||||
KPrintf("SUB: %d.%d.%d.%d\r\n", g_wiz_netinfo.sn[0], g_wiz_netinfo.sn[1],
|
KPrintf("SUB: %d.%d.%d.%d\r\n", get_gnetinfo()->sn[0], get_gnetinfo()->sn[1],
|
||||||
g_wiz_netinfo.sn[2], g_wiz_netinfo.sn[3]);
|
get_gnetinfo()->sn[2], get_gnetinfo()->sn[3]);
|
||||||
KPrintf("DNS: %d.%d.%d.%d\r\n", g_wiz_netinfo.dns[0], g_wiz_netinfo.dns[1],
|
KPrintf("DNS: %d.%d.%d.%d\r\n", get_gnetinfo()->dns[0], get_gnetinfo()->dns[1],
|
||||||
g_wiz_netinfo.dns[2], g_wiz_netinfo.dns[3]);
|
get_gnetinfo()->dns[2], get_gnetinfo()->dns[3]);
|
||||||
KPrintf("======================\r\n");
|
KPrintf("======================\r\n");
|
||||||
|
|
||||||
return EOK;
|
return EOK;
|
||||||
|
@ -255,312 +261,4 @@ int HwWiznetInit(void) {
|
||||||
network_init();
|
network_init();
|
||||||
|
|
||||||
return EOK;
|
return EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************** basic functions ********************/
|
|
||||||
|
|
||||||
enum TCP_OPTION {
|
|
||||||
SEND_DATA = 0,
|
|
||||||
RECV_DATA,
|
|
||||||
};
|
|
||||||
|
|
||||||
uint32_t wiz_client_op(uint8_t sn, uint8_t *buf, uint32_t buf_size,
|
|
||||||
uint8_t dst_ip[4], uint16_t dst_port,
|
|
||||||
enum TCP_OPTION opt) {
|
|
||||||
// assert(buf_size <= g_wiznet_buf_size);
|
|
||||||
int32_t ret;
|
|
||||||
switch (getSn_SR(sn)) {
|
|
||||||
case SOCK_CLOSE_WAIT:
|
|
||||||
wiz_sock_disconnect(sn);
|
|
||||||
break;
|
|
||||||
case SOCK_CLOSED:
|
|
||||||
wiz_socket(sn, Sn_MR_TCP, 5000, 0x00);
|
|
||||||
break;
|
|
||||||
case SOCK_INIT:
|
|
||||||
KPrintf("[SOCKET CLIENT] sock init.\n");
|
|
||||||
wiz_sock_connect(sn, dst_ip, dst_port);
|
|
||||||
break;
|
|
||||||
case SOCK_ESTABLISHED:
|
|
||||||
if (getSn_IR(sn) & Sn_IR_CON) {
|
|
||||||
printf("[SOCKET CLIENT] %d:Connected\r\n", sn);
|
|
||||||
setSn_IR(sn, Sn_IR_CON);
|
|
||||||
}
|
|
||||||
if (opt == SEND_DATA) {
|
|
||||||
uint32_t sent_size = 0;
|
|
||||||
ret = wiz_sock_send(sn, buf, buf_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
wiz_sock_close(sn);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
} else if (opt == RECV_DATA) {
|
|
||||||
uint32_t size = 0;
|
|
||||||
if ((size = getSn_RX_RSR(sn)) > 0) {
|
|
||||||
if (size > buf_size) size = buf_size;
|
|
||||||
ret = wiz_sock_recv(sn, buf, size);
|
|
||||||
if (ret <= 0) return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wiz_client_op_test(int argc, char *argv[]) {
|
|
||||||
/* argv[1]: ip ip addr
|
|
||||||
* argv[2]: port port number
|
|
||||||
* argv[3]: msg send msg
|
|
||||||
* argv[4]: count test times,if no this parameter,default 10 times
|
|
||||||
*/
|
|
||||||
if (argc < 4)
|
|
||||||
{
|
|
||||||
KPrintf("wiz_client_op_test error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
uint8_t client_sock = 2;
|
|
||||||
uint32_t tmp_ip[4];
|
|
||||||
uint8_t ip[4];
|
|
||||||
uint64_t pCount = 10;
|
|
||||||
uint8_t buf[g_wiznet_buf_size];
|
|
||||||
uint16_t port;
|
|
||||||
|
|
||||||
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2], &tmp_ip[3]);
|
|
||||||
ip[0] = (uint8_t)tmp_ip[0];
|
|
||||||
ip[1] = (uint8_t)tmp_ip[1];
|
|
||||||
ip[2] = (uint8_t)tmp_ip[2];
|
|
||||||
ip[3] = (uint8_t)tmp_ip[3];
|
|
||||||
|
|
||||||
port = atoi(argv[2]);
|
|
||||||
KPrintf("wiz client to wiz_server, send to %d.%d.%d.%d %d\n", // tip info
|
|
||||||
ip[0], ip[1], ip[2], ip[3], port);
|
|
||||||
|
|
||||||
if (argc >= 5){
|
|
||||||
pCount = atoi(argv[4]);
|
|
||||||
}
|
|
||||||
for(uint64_t i = 0; i < pCount; i++)
|
|
||||||
{
|
|
||||||
wiz_client_op(client_sock, argv[3], strlen(argv[3]), ip, port, SEND_DATA);
|
|
||||||
MdelayKTask(10);
|
|
||||||
// waiting for a responding.
|
|
||||||
wiz_client_op(client_sock, buf, g_wiznet_buf_size, ip, port, RECV_DATA);
|
|
||||||
KPrintf("received msg: %s\n", buf);
|
|
||||||
memset(buf, 0, g_wiznet_buf_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
|
||||||
wiz_client_op, wiz_client_op_test,
|
|
||||||
wiz_sock_recv or wiz_sock_send data as tcp client);
|
|
||||||
|
|
||||||
int32_t wiz_server_op(uint8_t sn, uint8_t *buf, uint32_t buf_size,
|
|
||||||
uint16_t port, enum TCP_OPTION opt) {
|
|
||||||
int32_t ret = 0;
|
|
||||||
uint16_t size = 0, sentsize = 0;
|
|
||||||
switch (getSn_SR(sn)) {
|
|
||||||
case SOCK_ESTABLISHED:
|
|
||||||
if (getSn_IR(sn) & Sn_IR_CON) {
|
|
||||||
printf("%d:Connected\r\n", sn);
|
|
||||||
setSn_IR(sn, Sn_IR_CON);
|
|
||||||
}
|
|
||||||
if (opt == SEND_DATA) {
|
|
||||||
uint32_t sent_size = 0;
|
|
||||||
ret = wiz_sock_send(sn, buf, buf_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
wiz_sock_close(sn);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
} else if (opt == RECV_DATA) {
|
|
||||||
uint32_t size = 0;
|
|
||||||
if ((size = getSn_RX_RSR(sn)) > 0) {
|
|
||||||
if (size > buf_size) size = buf_size;
|
|
||||||
ret = wiz_sock_recv(sn, buf, size);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SOCK_CLOSE_WAIT:
|
|
||||||
printf("%d:CloseWait\r\n", sn);
|
|
||||||
if ((ret = wiz_sock_disconnect(sn)) != SOCK_OK) return ret;
|
|
||||||
printf("%d:Closed\r\n", sn);
|
|
||||||
break;
|
|
||||||
case SOCK_INIT:
|
|
||||||
printf("%d:Listen, port [%d]\r\n", sn, port);
|
|
||||||
if ((ret = wiz_sock_listen(sn)) != SOCK_OK) return ret;
|
|
||||||
break;
|
|
||||||
case SOCK_CLOSED:
|
|
||||||
printf("%d:LBTStart\r\n", sn);
|
|
||||||
if ((ret = wiz_socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
|
|
||||||
printf("%d:Opened\r\n", sn);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wiz_server(void *param) {
|
|
||||||
uint16_t port = *(uint16_t *)param;
|
|
||||||
KPrintf("wiz server, listen port: %d\n", port);
|
|
||||||
uint8_t buf[g_wiznet_buf_size];
|
|
||||||
memset(buf, 0, g_wiznet_buf_size);
|
|
||||||
int ret = 0;
|
|
||||||
uint32_t size = 0;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
ret = wiz_server_op(0, buf, g_wiznet_buf_size, port, RECV_DATA);
|
|
||||||
while(buf[size] != 0){
|
|
||||||
size ++;
|
|
||||||
}
|
|
||||||
if (ret > 0) {
|
|
||||||
KPrintf("received %d bytes: %s\n", size, buf);
|
|
||||||
|
|
||||||
wiz_server_op(0, buf, g_wiznet_buf_size, port, SEND_DATA);
|
|
||||||
memset(buf, 0, g_wiznet_buf_size);
|
|
||||||
}
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wiz_server_test(uint16_t port) {
|
|
||||||
/* argv[1]: port
|
|
||||||
*/
|
|
||||||
int32 wiz_server_id =
|
|
||||||
KTaskCreate("wiz_server", wiz_server, (void *)&port, 4096, 25);
|
|
||||||
x_err_t flag = StartupKTask(wiz_server_id);
|
|
||||||
if (flag != EOK) {
|
|
||||||
KPrintf("StartupKTask wiz_server_id failed .\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) |
|
|
||||||
SHELL_CMD_PARAM_NUM(1),
|
|
||||||
wiz_server_op, wiz_server_test,
|
|
||||||
wiz_sock_recv or wiz_sock_send data as tcp server);
|
|
||||||
|
|
||||||
void loopback_udps(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
/* argv[1]: remote_ip ip address of remote udp
|
|
||||||
* argv[2]: remote_port the port number of the remote udp
|
|
||||||
* argv[2]: local_port the port number of the local udp
|
|
||||||
*/
|
|
||||||
uint32_t tmp_ip[4];
|
|
||||||
uint8_t remote_ip[4];
|
|
||||||
uint16_t remote_port, local_port;
|
|
||||||
uint8_t buffer[g_wiznet_buf_size];
|
|
||||||
uint16_t len = 0;
|
|
||||||
|
|
||||||
if (argc < 4)
|
|
||||||
{
|
|
||||||
KPrintf("loopback_udps test error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2], &tmp_ip[3]);
|
|
||||||
for(int i = 0;i < 4; i++)
|
|
||||||
{
|
|
||||||
remote_ip[i] = (uint8_t)tmp_ip[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
remote_port = atoi(argv[2]);
|
|
||||||
local_port = atoi(argv[3]);
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
switch (getSn_SR(0))
|
|
||||||
{
|
|
||||||
case SOCK_UDP:
|
|
||||||
if(getSn_IR(0) & Sn_IR_RECV)
|
|
||||||
{
|
|
||||||
setSn_IR(0, Sn_IR_RECV);
|
|
||||||
}
|
|
||||||
if((len = getSn_RX_RSR(0))>0)
|
|
||||||
{
|
|
||||||
memset(buffer,0,len+1);
|
|
||||||
wiz_sock_recvfrom(0, buffer, len, remote_ip, (uint16_t *)&remote_port);
|
|
||||||
printf("received msg: %s\n", buffer);
|
|
||||||
wiz_sock_sendto(0, buffer, len, remote_ip, remote_port);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SOCK_CLOSED:
|
|
||||||
printf("LBUStart\r\n");
|
|
||||||
wiz_socket(0, Sn_MR_UDP, local_port, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* wiz_udp remote_ip remote_port local_port */
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
|
||||||
wiz_udp, loopback_udps, w5500 upd test);
|
|
||||||
|
|
||||||
void ifconfig() {
|
|
||||||
wiz_NetInfo wiz_netinfo;
|
|
||||||
ctlnetwork(CN_GET_NETINFO, (void *)&wiz_netinfo);
|
|
||||||
uint8_t tmpstr[6];
|
|
||||||
ctlwizchip(CW_GET_ID, (void *)tmpstr);
|
|
||||||
KPrintf("=== %s NET CONF ===\r\n", (char *)tmpstr);
|
|
||||||
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", wiz_netinfo.mac[0],
|
|
||||||
wiz_netinfo.mac[1], wiz_netinfo.mac[2], wiz_netinfo.mac[3],
|
|
||||||
wiz_netinfo.mac[4], wiz_netinfo.mac[5]);
|
|
||||||
KPrintf("SIP: %d.%d.%d.%d\r\n", wiz_netinfo.ip[0], wiz_netinfo.ip[1],
|
|
||||||
wiz_netinfo.ip[2], wiz_netinfo.ip[3]);
|
|
||||||
KPrintf("GAR: %d.%d.%d.%d\r\n", wiz_netinfo.gw[0], wiz_netinfo.gw[1],
|
|
||||||
wiz_netinfo.gw[2], wiz_netinfo.gw[3]);
|
|
||||||
KPrintf("SUB: %d.%d.%d.%d\r\n", wiz_netinfo.sn[0], wiz_netinfo.sn[1],
|
|
||||||
wiz_netinfo.sn[2], wiz_netinfo.sn[3]);
|
|
||||||
KPrintf("DNS: %d.%d.%d.%d\r\n", wiz_netinfo.dns[0], wiz_netinfo.dns[1],
|
|
||||||
wiz_netinfo.dns[2], wiz_netinfo.dns[3]);
|
|
||||||
KPrintf("======================\r\n");
|
|
||||||
}
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
|
|
||||||
ifconfig, ifconfig, printf w5500 configurations);
|
|
||||||
|
|
||||||
void char_arr_assign(uint8_t *dst, uint32_t *src, int len) {
|
|
||||||
for (int i = 0; i < len; ++i) {
|
|
||||||
dst[i] = (uint8_t)(src[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *network_param_name[] = {"ip", "sn", "gw"};
|
|
||||||
|
|
||||||
void config_w5500_network(int argc, char *argv[]) {
|
|
||||||
if (argc < 2) {
|
|
||||||
KPrintf("[W5500] Network config require params.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wiz_NetInfo wiz_netinfo;
|
|
||||||
memcpy(&wiz_netinfo, &g_wiz_netinfo, sizeof(wiz_NetInfo));
|
|
||||||
|
|
||||||
int cur_arg_idx = 1;
|
|
||||||
|
|
||||||
while (argv[cur_arg_idx] != NULL) {
|
|
||||||
if (argv[cur_arg_idx + 1] == NULL) {
|
|
||||||
KPrintf("[W5500] Network config %s requires value.\n", argv[cur_arg_idx]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
uint32_t tmp_arr[4];
|
|
||||||
sscanf(argv[cur_arg_idx + 1], "%d.%d.%d.%d", &tmp_arr[0], &tmp_arr[1],
|
|
||||||
&tmp_arr[2], &tmp_arr[3]);
|
|
||||||
if (memcmp(argv[cur_arg_idx], network_param_name[0], 2 * sizeof(char)) ==
|
|
||||||
0) {
|
|
||||||
char_arr_assign(wiz_netinfo.ip, tmp_arr, 4);
|
|
||||||
} else if (memcmp(argv[cur_arg_idx], network_param_name[1],
|
|
||||||
2 * sizeof(char)) == 0) {
|
|
||||||
char_arr_assign(wiz_netinfo.sn, tmp_arr, 4);
|
|
||||||
} else if (memcmp(argv[cur_arg_idx], network_param_name[2],
|
|
||||||
2 * sizeof(char)) == 0) {
|
|
||||||
char_arr_assign(wiz_netinfo.gw, tmp_arr, 4);
|
|
||||||
} else {
|
|
||||||
KPrintf("[W5500] Invalid network param.\n");
|
|
||||||
}
|
|
||||||
cur_arg_idx += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctlnetwork(CN_SET_NETINFO, (void *)&wiz_netinfo);
|
|
||||||
KPrintf("[W5500] Network config success.\n", argv[cur_arg_idx]);
|
|
||||||
ifconfig();
|
|
||||||
}
|
|
||||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
|
||||||
config_w5500_network, config_w5500_network,
|
|
||||||
set w5500 configurations);
|
|
|
@ -0,0 +1,314 @@
|
||||||
|
#include <dev_pin.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
extern uint32_t get_gbuf_size();
|
||||||
|
extern wiz_NetInfo *get_gnetinfo();
|
||||||
|
|
||||||
|
enum TCP_OPTION {
|
||||||
|
SEND_DATA = 0,
|
||||||
|
RECV_DATA,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t wiz_client_op(uint8_t sn, uint8_t *buf, uint32_t buf_size,
|
||||||
|
uint8_t dst_ip[4], uint16_t dst_port,
|
||||||
|
enum TCP_OPTION opt) {
|
||||||
|
// assert(buf_size <= get_gbuf_size());
|
||||||
|
int32_t ret;
|
||||||
|
switch (getSn_SR(sn)) {
|
||||||
|
case SOCK_CLOSE_WAIT:
|
||||||
|
wiz_sock_disconnect(sn);
|
||||||
|
break;
|
||||||
|
case SOCK_CLOSED:
|
||||||
|
wiz_socket(sn, Sn_MR_TCP, 5000, 0x00);
|
||||||
|
break;
|
||||||
|
case SOCK_INIT:
|
||||||
|
KPrintf("[SOCKET CLIENT] sock init.\n");
|
||||||
|
wiz_sock_connect(sn, dst_ip, dst_port);
|
||||||
|
break;
|
||||||
|
case SOCK_ESTABLISHED:
|
||||||
|
if (getSn_IR(sn) & Sn_IR_CON) {
|
||||||
|
printf("[SOCKET CLIENT] %d:Connected\r\n", sn);
|
||||||
|
setSn_IR(sn, Sn_IR_CON);
|
||||||
|
}
|
||||||
|
if (opt == SEND_DATA) {
|
||||||
|
uint32_t sent_size = 0;
|
||||||
|
ret = wiz_sock_send(sn, buf, buf_size);
|
||||||
|
if (ret < 0) {
|
||||||
|
wiz_sock_close(sn);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else if (opt == RECV_DATA) {
|
||||||
|
uint32_t size = 0;
|
||||||
|
if ((size = getSn_RX_RSR(sn)) > 0) {
|
||||||
|
if (size > buf_size) size = buf_size;
|
||||||
|
ret = wiz_sock_recv(sn, buf, size);
|
||||||
|
if (ret <= 0) return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wiz_client_op_test(int argc, char *argv[]) {
|
||||||
|
/* argv[1]: ip ip addr
|
||||||
|
* argv[2]: port port number
|
||||||
|
* argv[3]: msg send msg
|
||||||
|
* argv[4]: count test times,if no this parameter,default 10 times
|
||||||
|
*/
|
||||||
|
if (argc < 4)
|
||||||
|
{
|
||||||
|
KPrintf("wiz_client_op_test error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint8_t client_sock = 2;
|
||||||
|
uint32_t tmp_ip[4];
|
||||||
|
uint8_t ip[4];
|
||||||
|
uint64_t pCount = 10;
|
||||||
|
uint8_t buf[get_gbuf_size()];
|
||||||
|
uint16_t port;
|
||||||
|
|
||||||
|
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2], &tmp_ip[3]);
|
||||||
|
ip[0] = (uint8_t)tmp_ip[0];
|
||||||
|
ip[1] = (uint8_t)tmp_ip[1];
|
||||||
|
ip[2] = (uint8_t)tmp_ip[2];
|
||||||
|
ip[3] = (uint8_t)tmp_ip[3];
|
||||||
|
|
||||||
|
port = atoi(argv[2]);
|
||||||
|
KPrintf("wiz client to wiz_server, send to %d.%d.%d.%d %d\n", // tip info
|
||||||
|
ip[0], ip[1], ip[2], ip[3], port);
|
||||||
|
|
||||||
|
if (argc >= 5){
|
||||||
|
pCount = atoi(argv[4]);
|
||||||
|
}
|
||||||
|
for(uint64_t i = 0; i < pCount; i++)
|
||||||
|
{
|
||||||
|
wiz_client_op(client_sock, argv[3], strlen(argv[3]), ip, port, SEND_DATA);
|
||||||
|
MdelayKTask(10);
|
||||||
|
// waiting for a responding.
|
||||||
|
wiz_client_op(client_sock, buf, get_gbuf_size(), ip, port, RECV_DATA);
|
||||||
|
KPrintf("received msg: %s\n", buf);
|
||||||
|
memset(buf, 0, get_gbuf_size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
||||||
|
wiz_client_op, wiz_client_op_test,
|
||||||
|
wiz_sock_recv or wiz_sock_send data as tcp client);
|
||||||
|
|
||||||
|
int32_t wiz_server_op(uint8_t sn, uint8_t *buf, uint32_t buf_size,
|
||||||
|
uint16_t port, enum TCP_OPTION opt) {
|
||||||
|
int32_t ret = 0;
|
||||||
|
uint16_t size = 0, sentsize = 0;
|
||||||
|
switch (getSn_SR(sn)) {
|
||||||
|
case SOCK_ESTABLISHED:
|
||||||
|
if (getSn_IR(sn) & Sn_IR_CON) {
|
||||||
|
printf("%d:Connected\r\n", sn);
|
||||||
|
setSn_IR(sn, Sn_IR_CON);
|
||||||
|
}
|
||||||
|
if (opt == SEND_DATA) {
|
||||||
|
uint32_t sent_size = 0;
|
||||||
|
ret = wiz_sock_send(sn, buf, buf_size);
|
||||||
|
if (ret < 0) {
|
||||||
|
wiz_sock_close(sn);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else if (opt == RECV_DATA) {
|
||||||
|
uint32_t size = 0;
|
||||||
|
if ((size = getSn_RX_RSR(sn)) > 0) {
|
||||||
|
if (size > buf_size) size = buf_size;
|
||||||
|
ret = wiz_sock_recv(sn, buf, size);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SOCK_CLOSE_WAIT:
|
||||||
|
printf("%d:CloseWait\r\n", sn);
|
||||||
|
if ((ret = wiz_sock_disconnect(sn)) != SOCK_OK) return ret;
|
||||||
|
printf("%d:Closed\r\n", sn);
|
||||||
|
break;
|
||||||
|
case SOCK_INIT:
|
||||||
|
printf("%d:Listen, port [%d]\r\n", sn, port);
|
||||||
|
if ((ret = wiz_sock_listen(sn)) != SOCK_OK) return ret;
|
||||||
|
break;
|
||||||
|
case SOCK_CLOSED:
|
||||||
|
printf("%d:LBTStart\r\n", sn);
|
||||||
|
if ((ret = wiz_socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
|
||||||
|
printf("%d:Opened\r\n", sn);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wiz_server(void *param) {
|
||||||
|
uint16_t port = *(uint16_t *)param;
|
||||||
|
KPrintf("wiz server, listen port: %d\n", port);
|
||||||
|
uint8_t buf[get_gbuf_size()];
|
||||||
|
memset(buf, 0, get_gbuf_size());
|
||||||
|
int ret = 0;
|
||||||
|
uint32_t size = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ret = wiz_server_op(0, buf, get_gbuf_size(), port, RECV_DATA);
|
||||||
|
while(buf[size] != 0){
|
||||||
|
size ++;
|
||||||
|
}
|
||||||
|
if (ret > 0) {
|
||||||
|
KPrintf("received %d bytes: %s\n", size, buf);
|
||||||
|
|
||||||
|
wiz_server_op(0, buf, get_gbuf_size(), port, SEND_DATA);
|
||||||
|
memset(buf, 0, get_gbuf_size());
|
||||||
|
}
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wiz_server_test(uint16_t port) {
|
||||||
|
/* argv[1]: port
|
||||||
|
*/
|
||||||
|
int32 wiz_server_id =
|
||||||
|
KTaskCreate("wiz_server", wiz_server, (void *)&port, 4096, 25);
|
||||||
|
x_err_t flag = StartupKTask(wiz_server_id);
|
||||||
|
if (flag != EOK) {
|
||||||
|
KPrintf("StartupKTask wiz_server_id failed .\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC) |
|
||||||
|
SHELL_CMD_PARAM_NUM(1),
|
||||||
|
wiz_server_op, wiz_server_test,
|
||||||
|
wiz_sock_recv or wiz_sock_send data as tcp server);
|
||||||
|
|
||||||
|
void loopback_udps(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* argv[1]: remote_ip ip address of remote udp
|
||||||
|
* argv[2]: remote_port the port number of the remote udp
|
||||||
|
* argv[2]: local_port the port number of the local udp
|
||||||
|
*/
|
||||||
|
uint32_t tmp_ip[4];
|
||||||
|
uint8_t remote_ip[4];
|
||||||
|
uint16_t remote_port, local_port;
|
||||||
|
uint8_t buffer[get_gbuf_size()];
|
||||||
|
uint16_t len = 0;
|
||||||
|
|
||||||
|
if (argc < 4)
|
||||||
|
{
|
||||||
|
KPrintf("loopback_udps test error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sscanf(argv[1], "%d.%d.%d.%d", &tmp_ip[0], &tmp_ip[1], &tmp_ip[2], &tmp_ip[3]);
|
||||||
|
for(int i = 0;i < 4; i++)
|
||||||
|
{
|
||||||
|
remote_ip[i] = (uint8_t)tmp_ip[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
remote_port = atoi(argv[2]);
|
||||||
|
local_port = atoi(argv[3]);
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
switch (getSn_SR(0))
|
||||||
|
{
|
||||||
|
case SOCK_UDP:
|
||||||
|
if(getSn_IR(0) & Sn_IR_RECV)
|
||||||
|
{
|
||||||
|
setSn_IR(0, Sn_IR_RECV);
|
||||||
|
}
|
||||||
|
if((len = getSn_RX_RSR(0))>0)
|
||||||
|
{
|
||||||
|
memset(buffer, 0, len + 1);
|
||||||
|
wiz_sock_recvfrom(0, buffer, len, remote_ip, (uint16_t *)&remote_port);
|
||||||
|
printf("received msg: %s\n", buffer);
|
||||||
|
wiz_sock_sendto(0, buffer, len, remote_ip, remote_port);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SOCK_CLOSED:
|
||||||
|
printf("LBUStart\r\n");
|
||||||
|
wiz_socket(0, Sn_MR_UDP, local_port, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wiz_udp remote_ip remote_port local_port */
|
||||||
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
||||||
|
wiz_udp, loopback_udps, w5500 upd test);
|
||||||
|
|
||||||
|
void ifconfig() {
|
||||||
|
wiz_NetInfo wiz_netinfo;
|
||||||
|
ctlnetwork(CN_GET_NETINFO, (void *)&wiz_netinfo);
|
||||||
|
uint8_t tmpstr[6];
|
||||||
|
ctlwizchip(CW_GET_ID, (void *)tmpstr);
|
||||||
|
KPrintf("=== %s NET CONF ===\r\n", (char *)tmpstr);
|
||||||
|
KPrintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", wiz_netinfo.mac[0],
|
||||||
|
wiz_netinfo.mac[1], wiz_netinfo.mac[2], wiz_netinfo.mac[3],
|
||||||
|
wiz_netinfo.mac[4], wiz_netinfo.mac[5]);
|
||||||
|
KPrintf("SIP: %d.%d.%d.%d\r\n", wiz_netinfo.ip[0], wiz_netinfo.ip[1],
|
||||||
|
wiz_netinfo.ip[2], wiz_netinfo.ip[3]);
|
||||||
|
KPrintf("GAR: %d.%d.%d.%d\r\n", wiz_netinfo.gw[0], wiz_netinfo.gw[1],
|
||||||
|
wiz_netinfo.gw[2], wiz_netinfo.gw[3]);
|
||||||
|
KPrintf("SUB: %d.%d.%d.%d\r\n", wiz_netinfo.sn[0], wiz_netinfo.sn[1],
|
||||||
|
wiz_netinfo.sn[2], wiz_netinfo.sn[3]);
|
||||||
|
KPrintf("DNS: %d.%d.%d.%d\r\n", wiz_netinfo.dns[0], wiz_netinfo.dns[1],
|
||||||
|
wiz_netinfo.dns[2], wiz_netinfo.dns[3]);
|
||||||
|
KPrintf("======================\r\n");
|
||||||
|
}
|
||||||
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
|
||||||
|
ifconfig, ifconfig, printf w5500 configurations);
|
||||||
|
|
||||||
|
void char_arr_assign(uint8_t *dst, uint32_t *src, int len) {
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
dst[i] = (uint8_t)(src[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *network_param_name[] = {"ip", "sn", "gw"};
|
||||||
|
|
||||||
|
void config_w5500_network(int argc, char *argv[]) {
|
||||||
|
if (argc < 2) {
|
||||||
|
KPrintf("[W5500] Network config require params.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wiz_NetInfo wiz_netinfo;
|
||||||
|
memcpy(&wiz_netinfo, get_gnetinfo(), sizeof(wiz_NetInfo));
|
||||||
|
|
||||||
|
int cur_arg_idx = 1;
|
||||||
|
|
||||||
|
while (argv[cur_arg_idx] != NULL) {
|
||||||
|
if (argv[cur_arg_idx + 1] == NULL) {
|
||||||
|
KPrintf("[W5500] Network config %s requires value.\n", argv[cur_arg_idx]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint32_t tmp_arr[4];
|
||||||
|
sscanf(argv[cur_arg_idx + 1], "%d.%d.%d.%d", &tmp_arr[0], &tmp_arr[1],
|
||||||
|
&tmp_arr[2], &tmp_arr[3]);
|
||||||
|
if (memcmp(argv[cur_arg_idx], network_param_name[0], 2 * sizeof(char)) ==
|
||||||
|
0) {
|
||||||
|
char_arr_assign(wiz_netinfo.ip, tmp_arr, 4);
|
||||||
|
} else if (memcmp(argv[cur_arg_idx], network_param_name[1],
|
||||||
|
2 * sizeof(char)) == 0) {
|
||||||
|
char_arr_assign(wiz_netinfo.sn, tmp_arr, 4);
|
||||||
|
} else if (memcmp(argv[cur_arg_idx], network_param_name[2],
|
||||||
|
2 * sizeof(char)) == 0) {
|
||||||
|
char_arr_assign(wiz_netinfo.gw, tmp_arr, 4);
|
||||||
|
} else {
|
||||||
|
KPrintf("[W5500] Invalid network param.\n");
|
||||||
|
}
|
||||||
|
cur_arg_idx += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctlnetwork(CN_SET_NETINFO, (void *)&wiz_netinfo);
|
||||||
|
KPrintf("[W5500] Network config success.\n", argv[cur_arg_idx]);
|
||||||
|
ifconfig();
|
||||||
|
}
|
||||||
|
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
||||||
|
config_w5500_network, config_w5500_network,
|
||||||
|
set w5500 configurations);
|
Loading…
Reference in New Issue