Skip to content

Commit e43ed7d

Browse files
committed
Added API to set static IP and DNS server
1 parent f0ba738 commit e43ed7d

File tree

8 files changed

+15856
-15682
lines changed

8 files changed

+15856
-15682
lines changed
469 Bytes
Binary file not shown.

firmwares/wifishield/wifiHD/Release/wifiHD.hex

Lines changed: 15717 additions & 15662 deletions
Large diffs are not rendered by default.

firmwares/wifishield/wifiHD/src/ard_spi.c

Lines changed: 120 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <board_init.h>
2727
#include "util.h"
2828
#include "lwip/udp.h"
29+
#include "lwip_setup.h"
2930

3031
extern const char* fwVersion;
3132

@@ -94,7 +95,7 @@ bool end_write = false; //TODO only for debug
9495
// Signal indicating a new command is coming from SPI interface
9596
static volatile Bool startRecvCmdSignal = FALSE;
9697

97-
#define MAX_CMD_NUM 34
98+
#define MAX_CMD_NUM 36
9899
typedef struct sCmd_spi_list{
99100
cmd_spi_cb_t cb;
100101
char cmd_id;
@@ -535,6 +536,117 @@ int set_passphrase_cmd_cb(int numParam, char* buf, void* ctx) {
535536
RETURN_ERR(err)
536537
}
537538

539+
int set_ip_config_cmd_cb(int numParam, char* buf, void* ctx) {
540+
struct ip_addr lwip_addr;
541+
uint32_t _ip_addr = 0;
542+
struct ctx_server *hs = ctx;
543+
struct net_cfg *ncfg = &(hs->net_cfg);
544+
struct netif *nif = ncfg->netif;
545+
uint8_t parmsToChange=0;
546+
const uint8_t MAX_IP_CONFIG_PARAMS = 3;
547+
const uint8_t DNS_SERVER_IDX_CHANG = 2;
548+
549+
wl_err_t err = WL_SUCCESS;
550+
tParam* params = (tParam*) buf;
551+
552+
if (params->paramLen == 1)
553+
{
554+
GET_PARAM_NEXT(BYTE, params, _parmsToChange);
555+
parmsToChange = _parmsToChange;
556+
}
557+
else
558+
RETURN_ERR(WL_FAILURE)
559+
560+
INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange);
561+
562+
if (parmsToChange <= MAX_IP_CONFIG_PARAMS)
563+
{
564+
int i=0;
565+
for (; i<parmsToChange; ++i)
566+
{
567+
if (params->paramLen == 4)
568+
{
569+
GET_PARAM_NEXT(LONG, params, _ip_addr);
570+
lwip_addr.addr = _ip_addr;
571+
INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr);
572+
switch (i)
573+
{
574+
case 0: // local_ip
575+
{
576+
netif_set_ipaddr(nif, &lwip_addr);
577+
break;
578+
}
579+
case 1: // gateway
580+
{
581+
netif_set_gw(nif, &lwip_addr);
582+
break;
583+
}
584+
case 2: // subnet
585+
{
586+
netif_set_netmask(nif, &lwip_addr);
587+
break;
588+
}
589+
}
590+
}else{
591+
RETURN_ERR(WL_FAILURE)
592+
}
593+
594+
}
595+
/* Disable DHCP */
596+
ncfg->dhcp_enabled = 0;
597+
}else
598+
RETURN_ERR(WL_FAILURE)
599+
600+
RETURN_ERR(err)
601+
}
602+
603+
int set_dns_config_cmd_cb(int numParam, char* buf, void* ctx) {
604+
struct ip_addr lwip_addr;
605+
struct ctx_server *hs = ctx;
606+
struct net_cfg *ncfg = &(hs->net_cfg);
607+
struct netif *nif = ncfg->netif;
608+
uint8_t parmsToChange=0;
609+
const uint8_t MAX_DNS_CONFIG_PARAMS = 2;
610+
const uint8_t DNS_SERVER_IDX_CHANG = 2;
611+
612+
wl_err_t err = WL_SUCCESS;
613+
tParam* params = (tParam*) buf;
614+
615+
if (params->paramLen == 1)
616+
{
617+
GET_PARAM_NEXT(BYTE, params, _parmsToChange);
618+
parmsToChange = _parmsToChange;
619+
}
620+
else
621+
RETURN_ERR(WL_FAILURE)
622+
623+
INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange);
624+
625+
if (parmsToChange <= MAX_DNS_CONFIG_PARAMS)
626+
{
627+
int i=0;
628+
for (; i<parmsToChange; ++i)
629+
{
630+
if (params->paramLen == 4)
631+
{
632+
GET_PARAM_NEXT(LONG, params, _ip_addr);
633+
lwip_addr.addr = _ip_addr;
634+
INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr);
635+
dns_setserver(i, &lwip_addr);
636+
}else{
637+
RETURN_ERR(WL_FAILURE)
638+
}
639+
}
640+
/* Disable DHCP */
641+
ncfg->dhcp_enabled = 0;
642+
}else
643+
RETURN_ERR(WL_FAILURE)
644+
645+
RETURN_ERR(err)
646+
}
647+
648+
649+
538650
void set_result(wl_status_t _status)
539651
{
540652
result = _status;
@@ -1402,12 +1514,12 @@ int call_reply_cb(char* recv, char* reply) {
14021514
{
14031515
tSpiMsg* spiMsg = (tSpiMsg*) recv;
14041516
_result = cmd_spi_list[i].cb(spiMsg->nParam,
1405-
(char*) &(spiMsg->params[0]), NULL);
1517+
(char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx);
14061518
}else
14071519
{
14081520
tSpiMsgData* spiMsg = (tSpiMsgData*) recv;
14091521
_result = cmd_spi_list[i].cb(spiMsg->nParam,
1410-
(char*) &(spiMsg->params[0]), NULL);
1522+
(char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx);
14111523
}
14121524

14131525
if (_result != WIFI_SPI_ACK)
@@ -1452,10 +1564,12 @@ int call_reply_cb(char* recv, char* reply) {
14521564
return REPLY_NO_ERR;
14531565
}
14541566

1455-
void init_spi_cmds() {
1567+
void init_spi_cmds(void* ctx) {
14561568
spi_add_cmd(SET_NET_CMD, set_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
14571569
spi_add_cmd(SET_PASSPHRASE_CMD, set_passphrase_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
14581570
spi_add_cmd(SET_KEY_CMD, set_key_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG);
1571+
spi_add_cmd(SET_IP_CONFIG_CMD, set_ip_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG);
1572+
spi_add_cmd(SET_DNS_CONFIG_CMD, set_dns_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG);
14591573
spi_add_cmd(GET_CONN_STATUS_CMD, get_result_cmd_cb, get_reply_cb, NULL, CMD_GET_FLAG);
14601574
spi_add_cmd(GET_IPADDR_CMD, ack_cmd_cb, get_reply_ipaddr_cb, NULL, CMD_GET_FLAG);
14611575
spi_add_cmd(GET_MACADDR_CMD, ack_cmd_cb, get_reply_mac_cb, NULL, CMD_GET_FLAG);
@@ -1786,7 +1900,7 @@ void initExtInt()
17861900
Enable_global_interrupt();
17871901
}
17881902

1789-
int initSpi()
1903+
int initSpi(void* ctx)
17901904
{
17911905
volatile avr32_spi_t *spi = &AVR32_SPI0;
17921906
gpio_map_t spi_piomap = { \
@@ -1838,7 +1952,7 @@ int initSpi()
18381952
#ifdef _SPI_STATS_
18391953
initStatSpi();
18401954
#endif
1841-
init_spi_cmds();
1955+
init_spi_cmds(ctx);
18421956

18431957
memset(_receiveBuffer, 0, sizeof(_receiveBuffer));
18441958
memset(buf, 0, sizeof(buf));

firmwares/wifishield/wifiHD/src/ard_spi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void set_result_cmd(int err) ;
5757

5858
void set_result(wl_status_t _status);
5959

60-
int initSpi(void);
60+
int initSpi(void* ctx);
6161

6262
void initExtInt();
6363

firmwares/wifishield/wifiHD/src/cmd_wl.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ cmd_ibss(int argc, char* argv[], void* ctx)
182182
cmd_state_t
183183
cmd_set_ip(int argc, char* argv[], void* ctx)
184184
{
185-
struct net_cfg *ncfg = ctx;
185+
struct ctx_server *hs = ctx;
186+
struct net_cfg *ncfg = &(hs->net_cfg);
186187
struct ip_addr lwip_addr;
187188
struct netif *nif = ncfg->netif;
188189

@@ -197,8 +198,10 @@ cmd_set_ip(int argc, char* argv[], void* ctx)
197198
printk(" or : ip none (to enable DHCP)\n");
198199
return CMD_DONE;
199200
}
201+
200202
/* IP address */
201203
lwip_addr = str2ip(argv[1]);
204+
INFO_SPI("nif:%p lwip_addr=0x%x\n", nif, lwip_addr.addr);
202205
netif_set_ipaddr(nif, &lwip_addr);
203206
/* Netmask */
204207
lwip_addr = str2ip(argv[2]);

firmwares/wifishield/wifiHD/src/lwip_setup.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ struct net_cfg {
77
uint8_t dhcp_running;
88
};
99

10+
struct ctx_server {
11+
struct net_cfg net_cfg;
12+
uint8_t wl_init_complete;
13+
};
14+
1015
/*! Start the IP stack.
1116
* If cfg->netif must have been allocated and lwip_init()
1217
* must have been called before this function is called

firmwares/wifishield/wifiHD/src/main.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ void fw_download_cb(void* ctx, uint8_t** buf, uint32_t* len)
7878
#endif
7979
#endif
8080

81-
struct ctx_server {
82-
struct net_cfg net_cfg;
83-
uint8_t wl_init_complete;
84-
};
85-
8681
bool ifStatus = false;
8782
bool scanNetCompleted = false;
8883

@@ -122,7 +117,7 @@ wl_cm_conn_cb(struct wl_network_t* net, void* ctx)
122117
hs->net_cfg.dhcp_running = 1;
123118
}
124119
else {
125-
netif_set_up(hs->net_cfg.netif);
120+
netif_set_up(hs->net_cfg.netif);
126121
}
127122

128123
INFO_INIT("Start DNS...\n");
@@ -270,7 +265,7 @@ poll(struct ctx_server* hs)
270265
#endif
271266
}
272267

273-
void initShell()
268+
void initShell(void* ctx)
274269
{
275270
/* initialize shell */
276271
INFO_INIT("Shell init...\n");
@@ -281,7 +276,7 @@ void initShell()
281276
console_add_cmd("status", cmd_status, NULL);
282277
console_add_cmd("debug", cmd_debug, NULL);
283278
console_add_cmd("dumpBuf", cmd_dumpBuf, NULL);
284-
console_add_cmd("ipconfig", cmd_set_ip, NULL);
279+
console_add_cmd("ipconfig", cmd_set_ip, ctx);
285280

286281
#ifdef ADD_CMDS
287282
console_add_cmd("powersave", cmd_power, NULL);
@@ -325,6 +320,7 @@ wl_init_complete_cb(void* ctx)
325320

326321
/* default is dhcp enabled */
327322
hs->net_cfg.dhcp_enabled = 1;
323+
328324
start_ip_stack(&hs->net_cfg,
329325
ipaddr,
330326
netmask,
@@ -339,7 +335,7 @@ wl_init_complete_cb(void* ctx)
339335

340336
wl_scan();
341337

342-
if (initSpi()){
338+
if (initSpi(hs)){
343339
WARN("Spi not initialized\n");
344340
}else
345341
{
@@ -381,8 +377,6 @@ main(void)
381377

382378
tc_init();
383379

384-
initShell();
385-
386380
delay_init(FOSC0);
387381

388382
#ifdef _TEST_SPI_
@@ -408,7 +402,7 @@ main(void)
408402

409403
INFO_INIT("hs:%p size:0x%x netif:%p size:0x%x\n", hs, size_ctx_server,
410404
hs->net_cfg.netif, size_netif);
411-
405+
initShell(hs);
412406
timer_init(NULL, NULL);
413407
lwip_init();
414408

firmwares/wifishield/wifiHD/src/wifi_spi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ enum {
3232
SET_PASSPHRASE_CMD = 0x11,
3333
SET_KEY_CMD = 0x12,
3434
TEST_CMD = 0x13,
35+
SET_IP_CONFIG_CMD = 0x14,
36+
SET_DNS_CONFIG_CMD = 0x15,
3537

3638
GET_CONN_STATUS_CMD = 0x20,
3739
GET_IPADDR_CMD = 0x21,
@@ -155,3 +157,4 @@ typedef struct __attribute__((__packed__))
155157
}tByteParam;
156158

157159
#endif
160+
uint8_t param;

0 commit comments

Comments
 (0)