Merge remote-tracking branch 'upstream/master' into stm32nucleo-spirit1
This commit is contained in:
commit
e47c69c170
9
.gitignore
vendored
9
.gitignore
vendored
|
@ -24,7 +24,7 @@
|
|||
*.c128
|
||||
*.c64
|
||||
*.cc2538dk
|
||||
*.remote
|
||||
*.zoul
|
||||
*.jn516x
|
||||
*.srf06-cc26xx
|
||||
*.ev-aducrf101mkxz
|
||||
|
@ -39,6 +39,7 @@ obj_*
|
|||
symbols.*
|
||||
Makefile.target
|
||||
doc/html
|
||||
doc/latex
|
||||
patches-*
|
||||
tools/tunslip
|
||||
tools/tunslip6
|
||||
|
@ -87,8 +88,14 @@ contiki-cc2530dk.lib
|
|||
*.d71
|
||||
*.d81
|
||||
|
||||
# Cooja Build Artifacts
|
||||
*.cooja
|
||||
|
||||
#regression tests artifacts
|
||||
*.testlog
|
||||
*.log.prog
|
||||
regression-tests/[0-9][0-9]-*/report
|
||||
regression-tests/[0-9][0-9]-*/org/
|
||||
|
||||
# rl78 build artifacts
|
||||
*.eval-adf7xxxmb4z
|
||||
|
|
|
@ -161,7 +161,7 @@ char program_handler_screensaver[20];
|
|||
/*-----------------------------------------------------------------------------------*/
|
||||
void
|
||||
program_handler_add(struct dsc *dsc, char *menuname,
|
||||
unsigned char desktop)
|
||||
unsigned char desktop)
|
||||
{
|
||||
contikidsc[contikidsclast++] = dsc;
|
||||
ctk_menuitem_add(&contikimenu, menuname);
|
||||
|
@ -325,106 +325,106 @@ PROCESS_THREAD(program_handler_process, ev, data)
|
|||
if(ev == ctk_signal_button_activate) {
|
||||
#ifdef WITH_LOADER_ARCH
|
||||
if(data == (process_data_t)&loadbutton) {
|
||||
ctk_window_close(&runwindow);
|
||||
program_handler_load(name, NULL);
|
||||
ctk_window_close(&runwindow);
|
||||
program_handler_load(name, NULL);
|
||||
} else if(data == (process_data_t)&errorokbutton) {
|
||||
ctk_dialog_close();
|
||||
ctk_dialog_close();
|
||||
}
|
||||
#endif /* WITH_LOADER_ARCH */
|
||||
#if QUIT_MENU
|
||||
if(data == (process_data_t)&quityesbutton) {
|
||||
ctk_draw_init();
|
||||
exit(EXIT_SUCCESS);
|
||||
ctk_draw_init();
|
||||
exit(EXIT_SUCCESS);
|
||||
} else if(data == (process_data_t)&quitnobutton) {
|
||||
ctk_dialog_close();
|
||||
ctk_dialog_close();
|
||||
}
|
||||
#endif /* QUIT_MENU */
|
||||
dscp = &contikidsc[0];
|
||||
for(i = 0; i < CTK_MAXMENUITEMS; ++i) {
|
||||
if(*dscp != NULL
|
||||
if(*dscp != NULL
|
||||
#if CTK_CONF_ICONS
|
||||
&& data == (process_data_t)(*dscp)->icon
|
||||
&& data == (process_data_t)(*dscp)->icon
|
||||
#endif /* CTK_CONF_ICONS */
|
||||
) {
|
||||
RUN((*dscp)->prgname, (*dscp)->process, NULL);
|
||||
break;
|
||||
}
|
||||
++dscp;
|
||||
) {
|
||||
RUN((*dscp)->prgname, (*dscp)->process, NULL);
|
||||
break;
|
||||
}
|
||||
++dscp;
|
||||
}
|
||||
} else if(ev == ctk_signal_menu_activate) {
|
||||
if((struct ctk_menu *)data == &contikimenu) {
|
||||
#if WITH_LOADER_ARCH
|
||||
dsc = contikidsc[contikimenu.active];
|
||||
if(dsc != NULL) {
|
||||
RUN(dsc->prgname, dsc->process, NULL);
|
||||
} else if(contikimenu.active == runmenuitem) {
|
||||
make_windows();
|
||||
ctk_window_close(&runwindow);
|
||||
ctk_window_open(&runwindow);
|
||||
CTK_WIDGET_FOCUS(&runwindow, &nameentry);
|
||||
}
|
||||
dsc = contikidsc[contikimenu.active];
|
||||
if(dsc != NULL) {
|
||||
RUN(dsc->prgname, dsc->process, NULL);
|
||||
} else if(contikimenu.active == runmenuitem) {
|
||||
make_windows();
|
||||
ctk_window_close(&runwindow);
|
||||
ctk_window_open(&runwindow);
|
||||
CTK_WIDGET_FOCUS(&runwindow, &nameentry);
|
||||
}
|
||||
#else /* WITH_LOADER_ARCH */
|
||||
if(contikidsc[contikimenu.active] != NULL) {
|
||||
RUN(contikidsc[contikimenu.active]->prgname,
|
||||
contikidsc[contikimenu.active]->process,
|
||||
NULL);
|
||||
}
|
||||
if(contikidsc[contikimenu.active] != NULL) {
|
||||
RUN(contikidsc[contikimenu.active]->prgname,
|
||||
contikidsc[contikimenu.active]->process,
|
||||
NULL);
|
||||
}
|
||||
#endif /* WITH_LOADER_ARCH */
|
||||
#if QUIT_MENU
|
||||
if(contikimenu.active == quitmenuitem) {
|
||||
ctk_dialog_new(&quitdialog, 24, 5);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quitdialoglabel);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quityesbutton);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quitnobutton);
|
||||
CTK_WIDGET_FOCUS(&quitdialog, &quitnobutton);
|
||||
ctk_dialog_open(&quitdialog);
|
||||
}
|
||||
if(contikimenu.active == quitmenuitem) {
|
||||
ctk_dialog_new(&quitdialog, 24, 5);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quitdialoglabel);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quityesbutton);
|
||||
CTK_WIDGET_ADD(&quitdialog, &quitnobutton);
|
||||
CTK_WIDGET_FOCUS(&quitdialog, &quitnobutton);
|
||||
ctk_dialog_open(&quitdialog);
|
||||
}
|
||||
#endif /* QUIT_MENU */
|
||||
}
|
||||
#if CTK_CONF_SCREENSAVER
|
||||
} else if(ev == ctk_signal_screensaver_start) {
|
||||
#if WITH_LOADER_ARCH
|
||||
if(program_handler_screensaver[0] != 0) {
|
||||
program_handler_load(program_handler_screensaver, NULL);
|
||||
program_handler_load(program_handler_screensaver, NULL);
|
||||
}
|
||||
#endif /* WITH_LOADER_ARCH */
|
||||
#endif /* CTK_CONF_SCREENSAVER */
|
||||
} else if(ev == LOADER_EVENT_DISPLAY_NAME) {
|
||||
#if WITH_LOADER_ARCH
|
||||
if(displayname == NULL) {
|
||||
make_windows();
|
||||
make_windows();
|
||||
|
||||
ctk_label_set_text(&loadingname, ((struct pnarg *)data)->name);
|
||||
ctk_dialog_open(&loadingdialog);
|
||||
process_post(&program_handler_process, LOADER_EVENT_LOAD, data);
|
||||
displayname = data;
|
||||
ctk_label_set_text(&loadingname, ((struct pnarg *)data)->name);
|
||||
ctk_dialog_open(&loadingdialog);
|
||||
process_post(&program_handler_process, LOADER_EVENT_LOAD, data);
|
||||
displayname = data;
|
||||
} else {
|
||||
/* Try again. */
|
||||
process_post(&program_handler_process, LOADER_EVENT_DISPLAY_NAME, data);
|
||||
/* Try again. */
|
||||
process_post(&program_handler_process, LOADER_EVENT_DISPLAY_NAME, data);
|
||||
}
|
||||
#endif /* WITH_LOADER_ARCH */
|
||||
} else if(ev == LOADER_EVENT_LOAD) {
|
||||
#if WITH_LOADER_ARCH
|
||||
if(displayname == data) {
|
||||
ctk_dialog_close();
|
||||
displayname = NULL;
|
||||
log_message("Loading ", ((struct pnarg *)data)->name);
|
||||
err = LOADER_LOAD(((struct pnarg *)data)->name,
|
||||
((struct pnarg *)data)->arg);
|
||||
if(err != LOADER_OK) {
|
||||
make_windows();
|
||||
errorfilename[0] = '"';
|
||||
strncpy(errorfilename + 1, ((struct pnarg *)data)->name,
|
||||
sizeof(errorfilename) - 2);
|
||||
errorfilename[1 + strlen(((struct pnarg *)data)->name)] = '"';
|
||||
ctk_label_set_text(&errortype, (char *)errormsgs[err]);
|
||||
ctk_dialog_open(&errordialog);
|
||||
log_message((char *)errormsgs[err], errorfilename);
|
||||
}
|
||||
pnarg_free(data);
|
||||
ctk_dialog_close();
|
||||
displayname = NULL;
|
||||
log_message("Loading ", ((struct pnarg *)data)->name);
|
||||
err = LOADER_LOAD(((struct pnarg *)data)->name,
|
||||
((struct pnarg *)data)->arg);
|
||||
if(err != LOADER_OK) {
|
||||
make_windows();
|
||||
errorfilename[0] = '"';
|
||||
strncpy(errorfilename + 1, ((struct pnarg *)data)->name,
|
||||
sizeof(errorfilename) - 2);
|
||||
errorfilename[1 + strlen(((struct pnarg *)data)->name)] = '"';
|
||||
ctk_label_set_text(&errortype, (char *)errormsgs[err]);
|
||||
ctk_dialog_open(&errordialog);
|
||||
log_message((char *)errormsgs[err], errorfilename);
|
||||
}
|
||||
pnarg_free(data);
|
||||
} else {
|
||||
/* Try again. */
|
||||
process_post(&program_handler_process, LOADER_EVENT_DISPLAY_NAME, data);
|
||||
/* Try again. */
|
||||
process_post(&program_handler_process, LOADER_EVENT_DISPLAY_NAME, data);
|
||||
}
|
||||
#endif /* WITH_LOADEER_ARCH */
|
||||
}
|
||||
|
|
|
@ -64,17 +64,11 @@
|
|||
#define UIP_TCPH_LEN 20 /* Size of TCP header */
|
||||
#define UIP_ICMPH_LEN 4 /* Size of ICMP header */
|
||||
|
||||
#define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN) /* Size of IP +
|
||||
* UDP
|
||||
* header */
|
||||
#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN) /* Size of IP +
|
||||
* TCP
|
||||
* header */
|
||||
#define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN) /* Size of IP + UDP header */
|
||||
#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN) /* Size of IP + TCP header */
|
||||
#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN
|
||||
#define UIP_IPICMPH_LEN (UIP_IPH_LEN + UIP_ICMPH_LEN) /* size of ICMP
|
||||
+ IP header */
|
||||
#define UIP_LLIPH_LEN (UIP_LLH_LEN + UIP_IPH_LEN) /* size of L2
|
||||
+ IP header */
|
||||
#define UIP_IPICMPH_LEN (UIP_IPH_LEN + UIP_ICMPH_LEN) /* Size of ICMP + IP header */
|
||||
#define UIP_LLIPH_LEN (UIP_LLH_LEN + UIP_IPH_LEN) /* Size of L2 + IP header */
|
||||
#if NETSTACK_CONF_WITH_IPV6
|
||||
/**
|
||||
* The sums below are quite used in ND. When used for uip_buf, we
|
||||
|
@ -99,12 +93,12 @@
|
|||
*
|
||||
*/
|
||||
typedef union uip_ip4addr_t {
|
||||
uint8_t u8[4]; /* Initializer, must come first. */
|
||||
uint8_t u8[4]; /* Initializer, must come first. */
|
||||
uint16_t u16[2];
|
||||
} uip_ip4addr_t;
|
||||
|
||||
typedef union uip_ip6addr_t {
|
||||
uint8_t u8[16]; /* Initializer, must come first. */
|
||||
uint8_t u8[16]; /* Initializer, must come first. */
|
||||
uint16_t u16[8];
|
||||
} uip_ip6addr_t;
|
||||
|
||||
|
@ -1057,7 +1051,7 @@ struct uip_udp_conn *uip_udp_new(const uip_ipaddr_t *ripaddr, uint16_t rport);
|
|||
* \hideinitializer
|
||||
*/
|
||||
#define uip_ip4addr_cmp(addr1, addr2) ((addr1)->u16[0] == (addr2)->u16[0] && \
|
||||
(addr1)->u16[1] == (addr2)->u16[1])
|
||||
(addr1)->u16[1] == (addr2)->u16[1])
|
||||
#define uip_ip6addr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0)
|
||||
|
||||
#if NETSTACK_CONF_WITH_IPV6
|
||||
|
@ -1358,26 +1352,21 @@ struct uip_conn {
|
|||
|
||||
uint16_t lport; /**< The local TCP port, in network byte order. */
|
||||
uint16_t rport; /**< The local remote TCP port, in network byte
|
||||
order. */
|
||||
order. */
|
||||
|
||||
uint8_t rcv_nxt[4]; /**< The sequence number that we expect to
|
||||
receive next. */
|
||||
uint8_t snd_nxt[4]; /**< The sequence number that was last sent by
|
||||
us. */
|
||||
receive next. */
|
||||
uint8_t snd_nxt[4]; /**< The sequence number that was last sent by us. */
|
||||
uint16_t len; /**< Length of the data that was previously sent. */
|
||||
uint16_t mss; /**< Current maximum segment size for the
|
||||
connection. */
|
||||
uint16_t initialmss; /**< Initial maximum segment size for the
|
||||
connection. */
|
||||
uint8_t sa; /**< Retransmission time-out calculation state
|
||||
variable. */
|
||||
uint8_t sv; /**< Retransmission time-out calculation state
|
||||
variable. */
|
||||
uint16_t mss; /**< Current maximum segment size for the connection. */
|
||||
uint16_t initialmss; /**< Initial maximum segment size for the connection. */
|
||||
uint8_t sa; /**< Retransmission time-out calculation state variable. */
|
||||
uint8_t sv; /**< Retransmission time-out calculation state variable. */
|
||||
uint8_t rto; /**< Retransmission time-out. */
|
||||
uint8_t tcpstateflags; /**< TCP state and flags. */
|
||||
uint8_t timer; /**< The retransmission timer. */
|
||||
uint8_t nrtx; /**< The number of retransmissions for the last
|
||||
segment sent. */
|
||||
segment sent. */
|
||||
|
||||
/** The application state. */
|
||||
uip_tcp_appstate_t appstate;
|
||||
|
@ -1431,9 +1420,9 @@ struct uip_fallback_interface {
|
|||
void (*init)(void);
|
||||
/**
|
||||
* \retval >=0
|
||||
* in case of success
|
||||
* in case of success
|
||||
* \retval <0
|
||||
* in case of failure
|
||||
* in case of failure
|
||||
*/
|
||||
int (*output)(void);
|
||||
};
|
||||
|
@ -1464,51 +1453,43 @@ extern struct uip_stats uip_stat;
|
|||
*/
|
||||
struct uip_stats {
|
||||
struct {
|
||||
uip_stats_t recv; /**< Number of received packets at the IP
|
||||
layer. */
|
||||
uip_stats_t sent; /**< Number of sent packets at the IP
|
||||
layer. */
|
||||
uip_stats_t forwarded;/**< Number of forwarded packets at the IP
|
||||
layer. */
|
||||
uip_stats_t drop; /**< Number of dropped packets at the IP
|
||||
layer. */
|
||||
uip_stats_t recv; /**< Number of received packets at the IP layer. */
|
||||
uip_stats_t sent; /**< Number of sent packets at the IP layer. */
|
||||
uip_stats_t forwarded;/**< Number of forwarded packets at the IP layer. */
|
||||
uip_stats_t drop; /**< Number of dropped packets at the IP layer. */
|
||||
uip_stats_t vhlerr; /**< Number of packets dropped due to wrong
|
||||
IP version or header length. */
|
||||
IP version or header length. */
|
||||
uip_stats_t hblenerr; /**< Number of packets dropped due to wrong
|
||||
IP length, high byte. */
|
||||
IP length, high byte. */
|
||||
uip_stats_t lblenerr; /**< Number of packets dropped due to wrong
|
||||
IP length, low byte. */
|
||||
IP length, low byte. */
|
||||
uip_stats_t fragerr; /**< Number of packets dropped because they
|
||||
were IP fragments. */
|
||||
were IP fragments. */
|
||||
uip_stats_t chkerr; /**< Number of packets dropped due to IP
|
||||
checksum errors. */
|
||||
checksum errors. */
|
||||
uip_stats_t protoerr; /**< Number of packets dropped because they
|
||||
were neither ICMP, UDP nor TCP. */
|
||||
were neither ICMP, UDP nor TCP. */
|
||||
} ip; /**< IP statistics. */
|
||||
struct {
|
||||
uip_stats_t recv; /**< Number of received ICMP packets. */
|
||||
uip_stats_t sent; /**< Number of sent ICMP packets. */
|
||||
uip_stats_t drop; /**< Number of dropped ICMP packets. */
|
||||
uip_stats_t typeerr; /**< Number of ICMP packets with a wrong
|
||||
type. */
|
||||
uip_stats_t chkerr; /**< Number of ICMP packets with a bad
|
||||
checksum. */
|
||||
uip_stats_t typeerr; /**< Number of ICMP packets with a wrong type. */
|
||||
uip_stats_t chkerr; /**< Number of ICMP packets with a bad checksum. */
|
||||
} icmp; /**< ICMP statistics. */
|
||||
#if UIP_TCP
|
||||
struct {
|
||||
uip_stats_t recv; /**< Number of recived TCP segments. */
|
||||
uip_stats_t sent; /**< Number of sent TCP segments. */
|
||||
uip_stats_t drop; /**< Number of dropped TCP segments. */
|
||||
uip_stats_t chkerr; /**< Number of TCP segments with a bad
|
||||
checksum. */
|
||||
uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK
|
||||
number. */
|
||||
uip_stats_t chkerr; /**< Number of TCP segments with a bad checksum. */
|
||||
uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK number. */
|
||||
uip_stats_t rst; /**< Number of received TCP RST (reset) segments. */
|
||||
uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */
|
||||
uip_stats_t syndrop; /**< Number of dropped SYNs because too few
|
||||
connections were available. */
|
||||
connections were available. */
|
||||
uip_stats_t synrst; /**< Number of SYNs for closed ports,
|
||||
triggering a RST. */
|
||||
triggering a RST. */
|
||||
} tcp; /**< TCP statistics. */
|
||||
#endif
|
||||
#if UIP_UDP
|
||||
|
@ -1517,7 +1498,7 @@ struct uip_stats {
|
|||
uip_stats_t recv; /**< Number of recived UDP segments. */
|
||||
uip_stats_t sent; /**< Number of sent UDP segments. */
|
||||
uip_stats_t chkerr; /**< Number of UDP segments with a bad
|
||||
checksum. */
|
||||
checksum. */
|
||||
} udp; /**< UDP statistics. */
|
||||
#endif /* UIP_UDP */
|
||||
#if NETSTACK_CONF_WITH_IPV6
|
||||
|
@ -1554,33 +1535,33 @@ CCIF extern uint8_t uip_flags;
|
|||
functions/macros. */
|
||||
|
||||
#define UIP_ACKDATA 1 /* Signifies that the outstanding data was
|
||||
acked and the application should send
|
||||
out new data instead of retransmitting
|
||||
the last data. */
|
||||
acked and the application should send
|
||||
out new data instead of retransmitting
|
||||
the last data. */
|
||||
#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent
|
||||
us new data. */
|
||||
us new data. */
|
||||
#define UIP_REXMIT 4 /* Tells the application to retransmit the
|
||||
data that was last sent. */
|
||||
data that was last sent. */
|
||||
#define UIP_POLL 8 /* Used for polling the application, to
|
||||
check if the application has data that
|
||||
it wants to send. */
|
||||
check if the application has data that
|
||||
it wants to send. */
|
||||
#define UIP_CLOSE 16 /* The remote host has closed the
|
||||
connection, thus the connection has
|
||||
gone away. Or the application signals
|
||||
that it wants to close the
|
||||
connection. */
|
||||
connection, thus the connection has
|
||||
gone away. Or the application signals
|
||||
that it wants to close the
|
||||
connection. */
|
||||
#define UIP_ABORT 32 /* The remote host has aborted the
|
||||
connection, thus the connection has
|
||||
gone away. Or the application signals
|
||||
that it wants to abort the
|
||||
connection. */
|
||||
connection, thus the connection has
|
||||
gone away. Or the application signals
|
||||
that it wants to abort the
|
||||
connection. */
|
||||
#define UIP_CONNECTED 64 /* We have got a connection from a remote
|
||||
host and have set up a new connection
|
||||
for it, or an active connection has
|
||||
been successfully established. */
|
||||
|
||||
#define UIP_TIMEDOUT 128 /* The connection has been aborted due to
|
||||
too many retransmissions. */
|
||||
too many retransmissions. */
|
||||
|
||||
|
||||
/**
|
||||
|
@ -1606,16 +1587,16 @@ void uip_process(uint8_t flag);
|
|||
the macros defined in this file. */
|
||||
|
||||
#define UIP_DATA 1 /* Tells uIP that there is incoming
|
||||
data in the uip_buf buffer. The
|
||||
length of the data is stored in the
|
||||
global variable uip_len. */
|
||||
data in the uip_buf buffer. The
|
||||
length of the data is stored in the
|
||||
global variable uip_len. */
|
||||
#define UIP_TIMER 2 /* Tells uIP that the periodic timer
|
||||
has fired. */
|
||||
has fired. */
|
||||
#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should
|
||||
be polled. */
|
||||
be polled. */
|
||||
#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram
|
||||
should be constructed in the
|
||||
uip_buf buffer. */
|
||||
should be constructed in the
|
||||
uip_buf buffer. */
|
||||
#if UIP_UDP
|
||||
#define UIP_UDP_TIMER 5
|
||||
#endif /* UIP_UDP */
|
||||
|
|
|
@ -627,7 +627,7 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
!= NULL) {
|
||||
/* elide the prefix - indicate by CID and set context + SAC */
|
||||
PRINTF("IPHC: compressing src with context - setting CID & SAC ctx: %d\n",
|
||||
context->number);
|
||||
context->number);
|
||||
iphc1 |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
|
||||
PACKETBUF_IPHC_BUF[2] |= context->number << 4;
|
||||
/* compession compare with this nodes address (source) */
|
||||
|
@ -636,9 +636,9 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
/* No context found for this address */
|
||||
} else if(uip_is_addr_linklocal(&UIP_IP_BUF->srcipaddr) &&
|
||||
UIP_IP_BUF->destipaddr.u16[1] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[2] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[3] == 0) {
|
||||
UIP_IP_BUF->destipaddr.u16[1] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[2] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[3] == 0) {
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
} else {
|
||||
|
@ -684,12 +684,13 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
/* compession compare with link adress (destination) */
|
||||
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)link_destaddr);
|
||||
&UIP_IP_BUF->destipaddr,
|
||||
(uip_lladdr_t *)link_destaddr);
|
||||
/* No context found for this address */
|
||||
} else if(uip_is_addr_linklocal(&UIP_IP_BUF->destipaddr) &&
|
||||
UIP_IP_BUF->destipaddr.u16[1] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[2] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[3] == 0) {
|
||||
UIP_IP_BUF->destipaddr.u16[1] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[2] == 0 &&
|
||||
UIP_IP_BUF->destipaddr.u16[3] == 0) {
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)link_destaddr);
|
||||
} else {
|
||||
|
@ -706,7 +707,7 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
/* UDP header compression */
|
||||
if(UIP_IP_BUF->proto == UIP_PROTO_UDP) {
|
||||
PRINTF("IPHC: Uncompressed UDP ports on send side: %x, %x\n",
|
||||
UIP_HTONS(UIP_UDP_BUF->srcport), UIP_HTONS(UIP_UDP_BUF->destport));
|
||||
UIP_HTONS(UIP_UDP_BUF->srcport), UIP_HTONS(UIP_UDP_BUF->destport));
|
||||
/* Mask out the last 4 bits can be used as a mask */
|
||||
if(((UIP_HTONS(UIP_UDP_BUF->srcport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN) &&
|
||||
((UIP_HTONS(UIP_UDP_BUF->destport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN)) {
|
||||
|
@ -714,10 +715,10 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
*hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_11;
|
||||
PRINTF("IPHC: remove 12 b of both source & dest with prefix 0xFOB\n");
|
||||
*(hc06_ptr + 1) =
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->srcport) -
|
||||
SICSLOWPAN_UDP_4_BIT_PORT_MIN) << 4) +
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->destport) -
|
||||
SICSLOWPAN_UDP_4_BIT_PORT_MIN));
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->srcport) -
|
||||
SICSLOWPAN_UDP_4_BIT_PORT_MIN) << 4) +
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->destport) -
|
||||
SICSLOWPAN_UDP_4_BIT_PORT_MIN));
|
||||
hc06_ptr += 2;
|
||||
} else if((UIP_HTONS(UIP_UDP_BUF->destport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
|
||||
/* we can compress 8 bits of dest, leave source. */
|
||||
|
@ -725,16 +726,16 @@ compress_hdr_hc06(linkaddr_t *link_destaddr)
|
|||
PRINTF("IPHC: leave source, remove 8 bits of dest with prefix 0xF0\n");
|
||||
memcpy(hc06_ptr + 1, &UIP_UDP_BUF->srcport, 2);
|
||||
*(hc06_ptr + 3) =
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->destport) -
|
||||
SICSLOWPAN_UDP_8_BIT_PORT_MIN));
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->destport) -
|
||||
SICSLOWPAN_UDP_8_BIT_PORT_MIN));
|
||||
hc06_ptr += 4;
|
||||
} else if((UIP_HTONS(UIP_UDP_BUF->srcport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
|
||||
/* we can compress 8 bits of src, leave dest. Copy compressed port */
|
||||
*hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_10;
|
||||
PRINTF("IPHC: remove 8 bits of source with prefix 0xF0, leave dest. hch: %i\n", *hc06_ptr);
|
||||
*(hc06_ptr + 1) =
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->srcport) -
|
||||
SICSLOWPAN_UDP_8_BIT_PORT_MIN));
|
||||
(uint8_t)((UIP_HTONS(UIP_UDP_BUF->srcport) -
|
||||
SICSLOWPAN_UDP_8_BIT_PORT_MIN));
|
||||
memcpy(hc06_ptr + 2, &UIP_UDP_BUF->destport, 2);
|
||||
hc06_ptr += 4;
|
||||
} else {
|
||||
|
@ -811,13 +812,13 @@ uncompress_hdr_hc06(uint16_t ip_len)
|
|||
SICSLOWPAN_IP_BUF->vtc = 0x60 | ((tmp >> 2) & 0x0f);
|
||||
/* ECN rolled down two steps + lowest DSCP bits at top two bits */
|
||||
SICSLOWPAN_IP_BUF->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) |
|
||||
(SICSLOWPAN_IP_BUF->tcflow & 0x0f);
|
||||
(SICSLOWPAN_IP_BUF->tcflow & 0x0f);
|
||||
} else {
|
||||
/* Traffic class is compressed (set version and no TC)*/
|
||||
SICSLOWPAN_IP_BUF->vtc = 0x60;
|
||||
/* highest flow label bits + ECN bits */
|
||||
SICSLOWPAN_IP_BUF->tcflow = (*hc06_ptr & 0x0F) |
|
||||
((*hc06_ptr >> 2) & 0x30);
|
||||
((*hc06_ptr >> 2) & 0x30);
|
||||
memcpy(&SICSLOWPAN_IP_BUF->flow, hc06_ptr + 1, 2);
|
||||
hc06_ptr += 3;
|
||||
}
|
||||
|
@ -908,14 +909,13 @@ uncompress_hdr_hc06(uint16_t ip_len)
|
|||
/* no multicast */
|
||||
/* Context based */
|
||||
if(iphc1 & SICSLOWPAN_IPHC_DAC) {
|
||||
uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
|
||||
PACKETBUF_IPHC_BUF[2] & 0x0f : 0;
|
||||
uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ? PACKETBUF_IPHC_BUF[2] & 0x0f : 0;
|
||||
context = addr_context_lookup_by_number(dci);
|
||||
|
||||
/* all valid cases below need the context! */
|
||||
if(context == NULL) {
|
||||
PRINTF("sicslowpan uncompress_hdr: error context not found\n");
|
||||
return;
|
||||
PRINTF("sicslowpan uncompress_hdr: error context not found\n");
|
||||
return;
|
||||
}
|
||||
uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, context->prefix,
|
||||
unc_ctxconf[tmp],
|
||||
|
@ -939,56 +939,56 @@ uncompress_hdr_hc06(uint16_t ip_len)
|
|||
PRINTF("IPHC: Incoming header value: %i\n", *hc06_ptr);
|
||||
switch(*hc06_ptr & SICSLOWPAN_NHC_UDP_CS_P_11) {
|
||||
case SICSLOWPAN_NHC_UDP_CS_P_00:
|
||||
/* 1 byte for NHC, 4 byte for ports, 2 bytes chksum */
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 3, 2);
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+5): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 5;
|
||||
break;
|
||||
/* 1 byte for NHC, 4 byte for ports, 2 bytes chksum */
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 3, 2);
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+5): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 5;
|
||||
break;
|
||||
|
||||
case SICSLOWPAN_NHC_UDP_CS_P_01:
|
||||
/* 1 byte for NHC + source 16bit inline, dest = 0xF0 + 8 bit inline */
|
||||
PRINTF("IPHC: Decompressing destination\n");
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
|
||||
SICSLOWPAN_UDP_BUF->destport = UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN + (*(hc06_ptr + 3)));
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 4;
|
||||
break;
|
||||
PRINTF("IPHC: Decompressing destination\n");
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
|
||||
SICSLOWPAN_UDP_BUF->destport = UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN + (*(hc06_ptr + 3)));
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 4;
|
||||
break;
|
||||
|
||||
case SICSLOWPAN_NHC_UDP_CS_P_10:
|
||||
/* 1 byte for NHC + source = 0xF0 + 8bit inline, dest = 16 bit inline*/
|
||||
PRINTF("IPHC: Decompressing source\n");
|
||||
SICSLOWPAN_UDP_BUF->srcport = UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN +
|
||||
(*(hc06_ptr + 1)));
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 2, 2);
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 4;
|
||||
break;
|
||||
PRINTF("IPHC: Decompressing source\n");
|
||||
SICSLOWPAN_UDP_BUF->srcport = UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN +
|
||||
(*(hc06_ptr + 1)));
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 2, 2);
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 4;
|
||||
break;
|
||||
|
||||
case SICSLOWPAN_NHC_UDP_CS_P_11:
|
||||
/* 1 byte for NHC, 1 byte for ports */
|
||||
SICSLOWPAN_UDP_BUF->srcport = UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
|
||||
(*(hc06_ptr + 1) >> 4));
|
||||
SICSLOWPAN_UDP_BUF->destport = UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
|
||||
((*(hc06_ptr + 1)) & 0x0F));
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+2): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 2;
|
||||
break;
|
||||
/* 1 byte for NHC, 1 byte for ports */
|
||||
SICSLOWPAN_UDP_BUF->srcport = UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
|
||||
(*(hc06_ptr + 1) >> 4));
|
||||
SICSLOWPAN_UDP_BUF->destport = UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
|
||||
((*(hc06_ptr + 1)) & 0x0F));
|
||||
PRINTF("IPHC: Uncompressed UDP ports (ptr+2): %x, %x\n",
|
||||
UIP_HTONS(SICSLOWPAN_UDP_BUF->srcport), UIP_HTONS(SICSLOWPAN_UDP_BUF->destport));
|
||||
hc06_ptr += 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
PRINTF("sicslowpan uncompress_hdr: error unsupported UDP compression\n");
|
||||
return;
|
||||
PRINTF("sicslowpan uncompress_hdr: error unsupported UDP compression\n");
|
||||
return;
|
||||
}
|
||||
if(!checksum_compressed) { /* has_checksum, default */
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, hc06_ptr, 2);
|
||||
hc06_ptr += 2;
|
||||
PRINTF("IPHC: sicslowpan uncompress_hdr: checksum included\n");
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, hc06_ptr, 2);
|
||||
hc06_ptr += 2;
|
||||
PRINTF("IPHC: sicslowpan uncompress_hdr: checksum included\n");
|
||||
} else {
|
||||
PRINTF("IPHC: sicslowpan uncompress_hdr: checksum *NOT* included\n");
|
||||
PRINTF("IPHC: sicslowpan uncompress_hdr: checksum *NOT* included\n");
|
||||
}
|
||||
uncomp_hdr_len += UIP_UDPH_LEN;
|
||||
}
|
||||
|
@ -1196,10 +1196,10 @@ uncompress_hdr_hc1(uint16_t ip_len)
|
|||
/* src and dest ip addresses */
|
||||
uip_ip6addr(&SICSLOWPAN_IP_BUF->srcipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
|
||||
uip_ds6_set_addr_iid(&SICSLOWPAN_IP_BUF->srcipaddr,
|
||||
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
|
||||
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
|
||||
uip_ip6addr(&SICSLOWPAN_IP_BUF->destipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
|
||||
uip_ds6_set_addr_iid(&SICSLOWPAN_IP_BUF->destipaddr,
|
||||
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
|
||||
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
|
||||
|
||||
uncomp_hdr_len += UIP_IPH_LEN;
|
||||
|
||||
|
@ -1363,8 +1363,10 @@ output(const uip_lladdr_t *localdest)
|
|||
/* The MAC address of the destination of the packet */
|
||||
linkaddr_t dest;
|
||||
|
||||
#if SICSLOWPAN_CONF_FRAG
|
||||
/* Number of bytes processed. */
|
||||
uint16_t processed_ip_out_len;
|
||||
#endif /* SICSLOWPAN_CONF_FRAG */
|
||||
|
||||
/* init */
|
||||
uncomp_hdr_len = 0;
|
||||
|
@ -1593,8 +1595,8 @@ input(void)
|
|||
uint16_t frag_size = 0;
|
||||
/* offset of the fragment in the IP packet */
|
||||
uint8_t frag_offset = 0;
|
||||
uint8_t is_fragment = 0;
|
||||
#if SICSLOWPAN_CONF_FRAG
|
||||
uint8_t is_fragment = 0;
|
||||
/* tag of the fragment */
|
||||
uint16_t frag_tag = 0;
|
||||
uint8_t first_fragment = 0, last_fragment = 0;
|
||||
|
@ -1875,7 +1877,7 @@ sicslowpan_init(void)
|
|||
addr_contexts[0].used = 1;
|
||||
addr_contexts[0].number = 0;
|
||||
#ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_0
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_0;
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_0;
|
||||
#else
|
||||
addr_contexts[0].prefix[0] = 0xaa;
|
||||
addr_contexts[0].prefix[1] = 0xaa;
|
||||
|
@ -1887,15 +1889,15 @@ sicslowpan_init(void)
|
|||
int i;
|
||||
for(i = 1; i < SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS; i++) {
|
||||
#ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_1
|
||||
if (i==1) {
|
||||
addr_contexts[1].used = 1;
|
||||
addr_contexts[1].number = 1;
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_1;
|
||||
if (i==1) {
|
||||
addr_contexts[1].used = 1;
|
||||
addr_contexts[1].number = 1;
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_1;
|
||||
#ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_2
|
||||
} else if (i==2) {
|
||||
addr_contexts[2].used = 1;
|
||||
addr_contexts[2].number = 2;
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_2;
|
||||
addr_contexts[2].used = 1;
|
||||
addr_contexts[2].number = 2;
|
||||
SICSLOWPAN_CONF_ADDR_CONTEXT_2;
|
||||
#endif
|
||||
} else {
|
||||
addr_contexts[i].used = 0;
|
||||
|
@ -1903,7 +1905,6 @@ sicslowpan_init(void)
|
|||
#else
|
||||
addr_contexts[i].used = 0;
|
||||
#endif /* SICSLOWPAN_CONF_ADDR_CONTEXT_1 */
|
||||
|
||||
}
|
||||
}
|
||||
#endif /* SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 1 */
|
||||
|
|
|
@ -203,13 +203,13 @@ uip_ds6_link_neighbor_callback(int status, int numtx)
|
|||
#if UIP_DS6_LL_NUD
|
||||
/* From RFC4861, page 72, last paragraph of section 7.3.3:
|
||||
*
|
||||
* "In some cases, link-specific information may indicate that a path to
|
||||
* a neighbor has failed (e.g., the resetting of a virtual circuit). In
|
||||
* such cases, link-specific information may be used to purge Neighbor
|
||||
* Cache entries before the Neighbor Unreachability Detection would do
|
||||
* so. However, link-specific information MUST NOT be used to confirm
|
||||
* the reachability of a neighbor; such information does not provide
|
||||
* end-to-end confirmation between neighboring IP layers."
|
||||
* "In some cases, link-specific information may indicate that a path to
|
||||
* a neighbor has failed (e.g., the resetting of a virtual circuit). In
|
||||
* such cases, link-specific information may be used to purge Neighbor
|
||||
* Cache entries before the Neighbor Unreachability Detection would do
|
||||
* so. However, link-specific information MUST NOT be used to confirm
|
||||
* the reachability of a neighbor; such information does not provide
|
||||
* end-to-end confirmation between neighboring IP layers."
|
||||
*
|
||||
* However, we assume that receiving a link layer ack ensures the delivery
|
||||
* of the transmitted packed to the IP stack of the neighbour. This is a
|
||||
|
|
|
@ -297,9 +297,9 @@ uip_ds6_prefix_t *
|
|||
uip_ds6_prefix_lookup(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen)
|
||||
{
|
||||
if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_prefix_list,
|
||||
UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t),
|
||||
ipaddr, ipaddrlen,
|
||||
(uip_ds6_element_t **)&locprefix) == FOUND) {
|
||||
UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t),
|
||||
ipaddr, ipaddrlen,
|
||||
(uip_ds6_element_t **)&locprefix) == FOUND) {
|
||||
return locprefix;
|
||||
}
|
||||
return NULL;
|
||||
|
@ -489,8 +489,8 @@ uip_ds6_aaddr_lookup(uip_ipaddr_t *ipaddr)
|
|||
{
|
||||
#if UIP_DS6_AADDR_NB
|
||||
if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_if.aaddr_list,
|
||||
UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128,
|
||||
(uip_ds6_element_t **)&locaaddr) == FOUND) {
|
||||
UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128,
|
||||
(uip_ds6_element_t **)&locaaddr) == FOUND) {
|
||||
return locaaddr;
|
||||
}
|
||||
#endif /* UIP_DS6_AADDR_NB */
|
||||
|
|
|
@ -378,7 +378,7 @@ uip_nd6_ns_output(uip_ipaddr_t * src, uip_ipaddr_t * dest, uip_ipaddr_t * tgt)
|
|||
UIP_ICMPH_LEN + UIP_ND6_NS_LEN + UIP_ND6_OPT_LLAO_LEN;
|
||||
|
||||
create_llao(&uip_buf[uip_l2_l3_icmp_hdr_len + UIP_ND6_NS_LEN],
|
||||
UIP_ND6_OPT_SLLAO);
|
||||
UIP_ND6_OPT_SLLAO);
|
||||
|
||||
uip_len =
|
||||
UIP_IPH_LEN + UIP_ICMPH_LEN + UIP_ND6_NS_LEN + UIP_ND6_OPT_LLAO_LEN;
|
||||
|
@ -505,7 +505,7 @@ na_input(void)
|
|||
goto discard;
|
||||
}
|
||||
memcpy(lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],
|
||||
UIP_LLADDR_LEN);
|
||||
UIP_LLADDR_LEN);
|
||||
if(is_solicited) {
|
||||
nbr->state = NBR_REACHABLE;
|
||||
nbr->nscount = 0;
|
||||
|
@ -528,7 +528,7 @@ na_input(void)
|
|||
|| nd6_opt_llao == 0) {
|
||||
if(nd6_opt_llao != 0) {
|
||||
memcpy(lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],
|
||||
UIP_LLADDR_LEN);
|
||||
UIP_LLADDR_LEN);
|
||||
}
|
||||
if(is_solicited) {
|
||||
nbr->state = NBR_REACHABLE;
|
||||
|
@ -796,7 +796,7 @@ uip_nd6_rs_output(void)
|
|||
UIP_ICMPH_LEN + UIP_ND6_RS_LEN + UIP_ND6_OPT_LLAO_LEN;
|
||||
|
||||
create_llao(&uip_buf[uip_l2_l3_icmp_hdr_len + UIP_ND6_RS_LEN],
|
||||
UIP_ND6_OPT_SLLAO);
|
||||
UIP_ND6_OPT_SLLAO);
|
||||
}
|
||||
|
||||
UIP_ICMP_BUF->icmpchksum = 0;
|
||||
|
@ -877,9 +877,9 @@ ra_input(void)
|
|||
nbr->state = NBR_STALE;
|
||||
}
|
||||
if(memcmp(&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],
|
||||
lladdr, UIP_LLADDR_LEN) != 0) {
|
||||
lladdr, UIP_LLADDR_LEN) != 0) {
|
||||
memcpy(lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],
|
||||
UIP_LLADDR_LEN);
|
||||
UIP_LLADDR_LEN);
|
||||
nbr->state = NBR_STALE;
|
||||
}
|
||||
nbr->isrouter = 1;
|
||||
|
|
|
@ -128,9 +128,9 @@
|
|||
#endif
|
||||
|
||||
#ifdef UIP_CONF_ND6_RETRANS_TIMER
|
||||
#define UIP_ND6_RETRANS_TIMER UIP_CONF_ND6_RETRANS_TIMER
|
||||
#define UIP_ND6_RETRANS_TIMER UIP_CONF_ND6_RETRANS_TIMER
|
||||
#else
|
||||
#define UIP_ND6_RETRANS_TIMER 1000
|
||||
#define UIP_ND6_RETRANS_TIMER 1000
|
||||
#endif
|
||||
|
||||
#define UIP_ND6_DELAY_FIRST_PROBE_TIME 5
|
||||
|
|
|
@ -390,7 +390,7 @@ upper_layer_chksum(uint8_t proto)
|
|||
upper_layer_len = (((uint16_t)(UIP_IP_BUF->len[0]) << 8) + UIP_IP_BUF->len[1] - uip_ext_len);
|
||||
|
||||
PRINTF("Upper layer checksum len: %d from: %d\n", upper_layer_len,
|
||||
UIP_IPH_LEN + UIP_LLH_LEN + uip_ext_len);
|
||||
UIP_IPH_LEN + UIP_LLH_LEN + uip_ext_len);
|
||||
|
||||
/* First sum pseudoheader. */
|
||||
/* IP protocol and length fields. This addition cannot carry. */
|
||||
|
@ -538,14 +538,14 @@ remove_ext_hdr(void)
|
|||
/* Remove ext header before TCP/UDP processing. */
|
||||
if(uip_ext_len > 0) {
|
||||
PRINTF("Cutting ext-header before processing (extlen: %d, uiplen: %d)\n",
|
||||
uip_ext_len, uip_len);
|
||||
uip_ext_len, uip_len);
|
||||
if(uip_len < UIP_IPH_LEN + uip_ext_len) {
|
||||
PRINTF("ERROR: uip_len too short compared to ext len\n");
|
||||
uip_clear_buf();
|
||||
return;
|
||||
}
|
||||
memmove(((uint8_t *)UIP_TCP_BUF), (uint8_t *)UIP_TCP_BUF + uip_ext_len,
|
||||
uip_len - UIP_IPH_LEN - uip_ext_len);
|
||||
uip_len - UIP_IPH_LEN - uip_ext_len);
|
||||
|
||||
uip_len -= uip_ext_len;
|
||||
|
||||
|
@ -881,14 +881,14 @@ ext_hdr_options_process(void)
|
|||
uip_ext_opt_offset += UIP_EXT_HDR_OPT_PADN_BUF->opt_len + 2;
|
||||
break;
|
||||
case UIP_EXT_HDR_OPT_RPL:
|
||||
/* Fixes situation when a node that is not using RPL
|
||||
* joins a network which does. The received packages will include the
|
||||
* RPL header and processed by the "default" case of the switch
|
||||
* (0x63 & 0xC0 = 0x40). Hence, the packet is discarded as the header
|
||||
* is considered invalid.
|
||||
* Using this fix, the header is ignored, and the next header (if
|
||||
* present) is processed.
|
||||
*/
|
||||
/* Fixes situation when a node that is not using RPL
|
||||
* joins a network which does. The received packages will include the
|
||||
* RPL header and processed by the "default" case of the switch
|
||||
* (0x63 & 0xC0 = 0x40). Hence, the packet is discarded as the header
|
||||
* is considered invalid.
|
||||
* Using this fix, the header is ignored, and the next header (if
|
||||
* present) is processed.
|
||||
*/
|
||||
#if UIP_CONF_IPV6_RPL
|
||||
PRINTF("Processing RPL option\n");
|
||||
if(rpl_verify_header(uip_ext_opt_offset)) {
|
||||
|
@ -1168,11 +1168,11 @@ uip_process(uint8_t flag)
|
|||
uip_ext_len += (UIP_EXT_BUF->len << 3) + 8;
|
||||
break;
|
||||
case 1:
|
||||
PRINTF("Dropping packet after extension header processing\n");
|
||||
PRINTF("Dropping packet after extension header processing\n");
|
||||
/* silently discard */
|
||||
goto drop;
|
||||
case 2:
|
||||
PRINTF("Sending error message after extension header processing\n");
|
||||
PRINTF("Sending error message after extension header processing\n");
|
||||
/* send icmp error message (created in ext_hdr_options_process)
|
||||
* and discard*/
|
||||
goto send;
|
||||
|
@ -1839,9 +1839,9 @@ uip_process(uint8_t flag)
|
|||
receive a SYN, in which case we should retransmit our SYNACK
|
||||
(which is done futher down). */
|
||||
if(!((((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
|
||||
((UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
|
||||
((UIP_TCP_BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ||
|
||||
(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) &&
|
||||
((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN)))) {
|
||||
((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN)))) {
|
||||
if((uip_len > 0 || ((UIP_TCP_BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
|
||||
(UIP_TCP_BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
|
||||
UIP_TCP_BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
|
||||
|
@ -1927,7 +1927,7 @@ uip_process(uint8_t flag)
|
|||
}
|
||||
/* We need to retransmit the SYNACK */
|
||||
if((UIP_TCP_BUF->flags & TCP_CTL) == TCP_SYN) {
|
||||
goto tcp_send_synack;
|
||||
goto tcp_send_synack;
|
||||
}
|
||||
goto drop;
|
||||
#if UIP_ACTIVE_OPEN
|
||||
|
|
|
@ -106,7 +106,11 @@ static int we_are_receiving_burst = 0;
|
|||
|
||||
/* INTER_PACKET_DEADLINE is the maximum time a receiver waits for the
|
||||
next packet of a burst when FRAME_PENDING is set. */
|
||||
#ifdef CONTIKIMAC_CONF_INTER_PACKET_DEADLINE
|
||||
#define INTER_PACKET_DEADLINE CONTIKIMAC_CONF_INTER_PACKET_DEADLINE
|
||||
#else
|
||||
#define INTER_PACKET_DEADLINE CLOCK_SECOND / 32
|
||||
#endif
|
||||
|
||||
/* ContikiMAC performs periodic channel checks. Each channel check
|
||||
consists of two or more CCA checks. CCA_COUNT_MAX is the number of
|
||||
|
@ -166,12 +170,21 @@ static int we_are_receiving_burst = 0;
|
|||
/* MAX_SILENCE_PERIODS is the maximum amount of periods (a period is
|
||||
CCA_CHECK_TIME + CCA_SLEEP_TIME) that we allow to be silent before
|
||||
we turn of the radio. */
|
||||
#ifdef CONTIKIMAC_CONF_MAX_SILENCE_PERIODS
|
||||
#define MAX_SILENCE_PERIODS CONTIKIMAC_CONF_MAX_SILENCE_PERIODS
|
||||
#else
|
||||
#define MAX_SILENCE_PERIODS 5
|
||||
#endif
|
||||
|
||||
/* MAX_NONACTIVITY_PERIODS is the maximum number of periods we allow
|
||||
the radio to be turned on without any packet being received, when
|
||||
WITH_FAST_SLEEP is enabled. */
|
||||
#ifdef CONTIKIMAC_CONF_MAX_NONACTIVITY_PERIODS
|
||||
#define MAX_NONACTIVITY_PERIODS CONTIKIMAC_CONF_MAX_NONACTIVITY_PERIODS
|
||||
#else
|
||||
#define MAX_NONACTIVITY_PERIODS 10
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -181,7 +194,11 @@ static int we_are_receiving_burst = 0;
|
|||
|
||||
/* GUARD_TIME is the time before the expected phase of a neighbor that
|
||||
a transmitted should begin transmitting packets. */
|
||||
#ifdef CONTIKIMAC_CONF_GUARD_TIME
|
||||
#define GUARD_TIME CONTIKIMAC_CONF_GUARD_TIME
|
||||
#else
|
||||
#define GUARD_TIME 10 * CHECK_TIME + CHECK_TIME_TX
|
||||
#endif
|
||||
|
||||
/* INTER_PACKET_INTERVAL is the interval between two successive packet transmissions */
|
||||
#ifdef CONTIKIMAC_CONF_INTER_PACKET_INTERVAL
|
||||
|
@ -201,7 +218,11 @@ static int we_are_receiving_burst = 0;
|
|||
|
||||
/* MAX_PHASE_STROBE_TIME is the time that we transmit repeated packets
|
||||
to a neighbor for which we have a phase lock. */
|
||||
#ifdef CONTIKIMAC_CONF_MAX_PHASE_STROBE_TIME
|
||||
#define MAX_PHASE_STROBE_TIME CONTIKIMAC_CONF_MAX_PHASE_STROBE_TIME
|
||||
#else
|
||||
#define MAX_PHASE_STROBE_TIME RTIMER_ARCH_SECOND / 60
|
||||
#endif
|
||||
|
||||
#ifdef CONTIKIMAC_CONF_SEND_SW_ACK
|
||||
#define CONTIKIMAC_SEND_SW_ACK CONTIKIMAC_CONF_SEND_SW_ACK
|
||||
|
|
|
@ -68,6 +68,27 @@ static const uint8_t bitmask[9] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0,
|
|||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* For get_bits/set_bits functions in this file to work correctly,
|
||||
* the values contained in packetbuf_attr_t variables (uint16_t internally)
|
||||
* must be in little endian byte order.
|
||||
*/
|
||||
/* Write little endian 16 bit value */
|
||||
static void CC_INLINE
|
||||
le16_write(void *ptr, uint16_t v)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)ptr;
|
||||
p[0] = v & 0xff;
|
||||
p[1] = v >> 8;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Read little endian 16 bit value */
|
||||
static uint16_t CC_INLINE
|
||||
le16_read(const void *ptr)
|
||||
{
|
||||
const uint8_t *p = (const uint8_t *)ptr;
|
||||
return ((uint16_t)p[1] << 8) | p[0];
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
uint8_t CC_INLINE
|
||||
get_bits_in_byte(uint8_t *from, int bitpos, int vallen)
|
||||
|
@ -279,10 +300,10 @@ pack_header(struct channel *c)
|
|||
((uint8_t *)packetbuf_addr(a->type))[0],
|
||||
((uint8_t *)packetbuf_addr(a->type))[1]);
|
||||
} else {
|
||||
packetbuf_attr_t val;
|
||||
val = packetbuf_attr(a->type);
|
||||
set_bits(&hdrptr[byteptr], bitptr & 7,
|
||||
(uint8_t *)&val, len);
|
||||
uint8_t buffer[2];
|
||||
packetbuf_attr_t val = packetbuf_attr(a->type);
|
||||
le16_write(buffer, val);
|
||||
set_bits(&hdrptr[byteptr], bitptr & 7, buffer, len);
|
||||
PRINTF("value %d\n",
|
||||
/*linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1],*/
|
||||
val);
|
||||
|
@ -349,9 +370,10 @@ unpack_header(void)
|
|||
a->type, addr.u8[0], addr.u8[1]);
|
||||
packetbuf_set_addr(a->type, &addr);
|
||||
} else {
|
||||
packetbuf_attr_t val = 0;
|
||||
get_bits((uint8_t *)&val, &hdrptr[byteptr], bitptr & 7, len);
|
||||
|
||||
packetbuf_attr_t val;
|
||||
uint8_t buffer[2] = {0};
|
||||
get_bits(buffer, &hdrptr[byteptr], bitptr & 7, len);
|
||||
val = le16_read(buffer);
|
||||
packetbuf_set_attr(a->type, val);
|
||||
PRINTF("%d.%d: unpack_header type %d, val %d\n",
|
||||
linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1],
|
||||
|
|
|
@ -238,7 +238,7 @@
|
|||
/*
|
||||
* RPL probing. When enabled, probes will be sent periodically to keep
|
||||
* parent link estimates up to date.
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_WITH_PROBING
|
||||
#define RPL_WITH_PROBING RPL_CONF_WITH_PROBING
|
||||
#else
|
||||
|
@ -247,7 +247,7 @@
|
|||
|
||||
/*
|
||||
* RPL probing interval.
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_PROBING_INTERVAL
|
||||
#define RPL_PROBING_INTERVAL RPL_CONF_PROBING_INTERVAL
|
||||
#else
|
||||
|
@ -256,7 +256,7 @@
|
|||
|
||||
/*
|
||||
* RPL probing expiration time.
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_PROBING_EXPIRATION_TIME
|
||||
#define RPL_PROBING_EXPIRATION_TIME RPL_CONF_PROBING_EXPIRATION_TIME
|
||||
#else
|
||||
|
@ -265,7 +265,7 @@
|
|||
|
||||
/*
|
||||
* Function used to select the next parent to be probed.
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_PROBING_SELECT_FUNC
|
||||
#define RPL_PROBING_SELECT_FUNC RPL_CONF_PROBING_SELECT_FUNC
|
||||
#else
|
||||
|
@ -279,7 +279,7 @@
|
|||
* To probe with DIS, use:
|
||||
* #define RPL_CONF_PROBING_SEND_FUNC(instance, addr) dis_output((addr))
|
||||
* Any other custom probing function is also acceptable.
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_PROBING_SEND_FUNC
|
||||
#define RPL_PROBING_SEND_FUNC RPL_CONF_PROBING_SEND_FUNC
|
||||
#else
|
||||
|
@ -288,7 +288,7 @@
|
|||
|
||||
/*
|
||||
* Function used to calculate next RPL probing interval
|
||||
* */
|
||||
*/
|
||||
#ifdef RPL_CONF_PROBING_DELAY_FUNC
|
||||
#define RPL_PROBING_DELAY_FUNC RPL_CONF_PROBING_DELAY_FUNC
|
||||
#else
|
||||
|
@ -296,4 +296,22 @@
|
|||
+ random_rand() % (RPL_PROBING_INTERVAL))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Interval of DIS transmission
|
||||
*/
|
||||
#ifdef RPL_CONF_DIS_INTERVAL
|
||||
#define RPL_DIS_INTERVAL RPL_CONF_DIS_INTERVAL
|
||||
#else
|
||||
#define RPL_DIS_INTERVAL 60
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Added delay of first DIS transmission after boot
|
||||
*/
|
||||
#ifdef RPL_CONF_DIS_START_DELAY
|
||||
#define RPL_DIS_START_DELAY RPL_CONF_DIS_START_DELAY
|
||||
#else
|
||||
#define RPL_DIS_START_DELAY 5
|
||||
#endif
|
||||
|
||||
#endif /* RPL_CONF_H */
|
||||
|
|
|
@ -729,7 +729,7 @@ dao_input(void)
|
|||
PRINT6ADDR(&prefix);
|
||||
PRINTF("\n");
|
||||
rep->state.nopath_received = 1;
|
||||
rep->state.lifetime = DAO_EXPIRATION_TIMEOUT;
|
||||
rep->state.lifetime = RPL_NOPATH_REMOVAL_DELAY;
|
||||
|
||||
/* We forward the incoming no-path DAO to our parent, if we have
|
||||
one. */
|
||||
|
|
|
@ -103,12 +103,19 @@
|
|||
/*---------------------------------------------------------------------------*/
|
||||
/* Default values for RPL constants and variables. */
|
||||
|
||||
/* The default value for the DAO timer. */
|
||||
#ifdef RPL_CONF_DAO_LATENCY
|
||||
#define RPL_DAO_LATENCY RPL_CONF_DAO_LATENCY
|
||||
#else /* RPL_CONF_DAO_LATENCY */
|
||||
#define RPL_DAO_LATENCY (CLOCK_SECOND * 4)
|
||||
#endif /* RPL_DAO_LATENCY */
|
||||
/* DAO transmissions are always delayed by RPL_DAO_DELAY +/- RPL_DAO_DELAY/2 */
|
||||
#ifdef RPL_CONF_DAO_DELAY
|
||||
#define RPL_DAO_DELAY RPL_CONF_DAO_DELAY
|
||||
#else /* RPL_CONF_DAO_DELAY */
|
||||
#define RPL_DAO_DELAY (CLOCK_SECOND * 4)
|
||||
#endif /* RPL_CONF_DAO_DELAY */
|
||||
|
||||
/* Delay between reception of a no-path DAO and actual route removal */
|
||||
#ifdef RPL_CONF_NOPATH_REMOVAL_DELAY
|
||||
#define RPL_NOPATH_REMOVAL_DELAY RPL_CONF_NOPATH_REMOVAL_DELAY
|
||||
#else /* RPL_CONF_NOPATH_REMOVAL_DELAY */
|
||||
#define RPL_NOPATH_REMOVAL_DELAY 60
|
||||
#endif /* RPL_CONF_NOPATH_REMOVAL_DELAY */
|
||||
|
||||
/* Special value indicating immediate removal. */
|
||||
#define RPL_ZERO_LIFETIME 0
|
||||
|
@ -134,9 +141,6 @@
|
|||
|
||||
#define INFINITE_RANK 0xffff
|
||||
|
||||
|
||||
/* Expire DAOs from neighbors that do not respond in this time. (seconds) */
|
||||
#define DAO_EXPIRATION_TIMEOUT 60
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define RPL_INSTANCE_LOCAL_FLAG 0x80
|
||||
#define RPL_INSTANCE_D_FLAG 0x40
|
||||
|
@ -184,12 +188,7 @@
|
|||
|
||||
/* DIS related */
|
||||
#define RPL_DIS_SEND 1
|
||||
#ifdef RPL_DIS_INTERVAL_CONF
|
||||
#define RPL_DIS_INTERVAL RPL_DIS_INTERVAL_CONF
|
||||
#else
|
||||
#define RPL_DIS_INTERVAL 60
|
||||
#endif
|
||||
#define RPL_DIS_START_DELAY 5
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Lollipop counters */
|
||||
|
||||
|
|
|
@ -312,7 +312,7 @@ schedule_dao(rpl_instance_t *instance, clock_time_t latency)
|
|||
void
|
||||
rpl_schedule_dao(rpl_instance_t *instance)
|
||||
{
|
||||
schedule_dao(instance, RPL_DAO_LATENCY);
|
||||
schedule_dao(instance, RPL_DAO_DELAY);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
|
|
|
@ -9772,36 +9772,36 @@ typedef struct { /*!< pADI_WDT Structure
|
|||
*********************************************/
|
||||
|
||||
//iEiNr in EiCfg()
|
||||
#define EXTINT0 0x0
|
||||
#define EXTINT1 0x1
|
||||
#define EXTINT2 0x2
|
||||
#define EXTINT3 0x3
|
||||
#define EXTINT4 0x4
|
||||
#define EXTINT5 0x5
|
||||
#define EXTINT6 0x6
|
||||
#define EXTINT7 0x7
|
||||
#define EXTINT8 0x8
|
||||
#define EXTINT0 0x0
|
||||
#define EXTINT1 0x1
|
||||
#define EXTINT2 0x2
|
||||
#define EXTINT3 0x3
|
||||
#define EXTINT4 0x4
|
||||
#define EXTINT5 0x5
|
||||
#define EXTINT6 0x6
|
||||
#define EXTINT7 0x7
|
||||
#define EXTINT8 0x8
|
||||
|
||||
//iEnable in EiCfg()
|
||||
#define INT_DIS 0x0
|
||||
#define INT_EN 0x1
|
||||
#define INT_DIS 0x0
|
||||
#define INT_EN 0x1
|
||||
|
||||
//iMode in EiCfg()
|
||||
#define INT_RISE 0x0
|
||||
#define INT_FALL 0x1
|
||||
#define INT_RISE 0x0
|
||||
#define INT_FALL 0x1
|
||||
#define INT_EDGES 0x2
|
||||
#define INT_HIGH 0x3
|
||||
#define INT_LOW 0x4
|
||||
#define INT_HIGH 0x3
|
||||
#define INT_LOW 0x4
|
||||
|
||||
//Bit values.
|
||||
#define BIT0 1
|
||||
#define BIT1 2
|
||||
#define BIT2 4
|
||||
#define BIT3 8
|
||||
#define BIT4 0x10
|
||||
#define BIT5 0x20
|
||||
#define BIT6 0x40
|
||||
#define BIT7 0x80
|
||||
#define BIT0 1
|
||||
#define BIT1 2
|
||||
#define BIT2 4
|
||||
#define BIT3 8
|
||||
#define BIT4 0x10
|
||||
#define BIT5 0x20
|
||||
#define BIT6 0x40
|
||||
#define BIT7 0x80
|
||||
|
||||
|
||||
/* ================================================================================ */
|
||||
|
|
|
@ -89,10 +89,10 @@
|
|||
* processor.
|
||||
*/
|
||||
int elfloader_arch_relocate(int input_fd,
|
||||
struct elfloader_output *output,
|
||||
unsigned int sectionoffset,
|
||||
char *sectionaddr,
|
||||
struct elf32_rela *rela, char *addr);
|
||||
struct elfloader_output *output,
|
||||
unsigned int sectionoffset,
|
||||
char *sectionaddr,
|
||||
struct elf32_rela *rela, char *addr);
|
||||
|
||||
#endif /* ELFLOADER_ARCH_H_ */
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
* Header file for the Contiki ELF loader.
|
||||
* \author
|
||||
* Adam Dunkels <adam@sics.se>
|
||||
* Simon Berg <ksb@users.sourceforge.net>
|
||||
* Simon Berg <ksb@users.sourceforge.net>
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -132,7 +132,7 @@
|
|||
* Return value from elfloader_load() indicating that the offset for
|
||||
* a relative addressing mode was too big.
|
||||
*/
|
||||
#define ELFLOADER_OUTOF_RANGE 9
|
||||
#define ELFLOADER_OUTOF_RANGE 9
|
||||
|
||||
/**
|
||||
* Return value from elfloader_load() indicating that the relocations
|
||||
|
@ -144,13 +144,13 @@
|
|||
* Return value from elfloader_load() indicating that reading from the
|
||||
* ELF file failed in some way.
|
||||
*/
|
||||
#define ELFLOADER_INPUT_ERROR 11
|
||||
#define ELFLOADER_INPUT_ERROR 11
|
||||
|
||||
/**
|
||||
* Return value from elfloader_load() indicating that writing to a segment
|
||||
* failed.
|
||||
*/
|
||||
#define ELFLOADER_OUTPUT_ERROR 12
|
||||
#define ELFLOADER_OUTPUT_ERROR 12
|
||||
|
||||
|
||||
#define ELFLOADER_SEG_TEXT 1
|
||||
|
@ -164,10 +164,10 @@
|
|||
* This object defines methods (callbacks) for writing the segments to memory.
|
||||
* It can be extended by the user to include any necessary state.
|
||||
*/
|
||||
|
||||
struct elfloader_output {
|
||||
const struct elfloader_output_ops *ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Allocate a new segment
|
||||
* \param input The output object
|
||||
|
@ -178,9 +178,8 @@ struct elfloader_output {
|
|||
* The returned address doesn't need to correspond to any real memory,
|
||||
* since it's only used for calculating the relocations.
|
||||
*/
|
||||
|
||||
void *elfloader_allocate_segment(struct elfloader_output *output,
|
||||
unsigned int type, int size);
|
||||
unsigned int type, int size);
|
||||
|
||||
/**
|
||||
* \brief Start writing to a new segment
|
||||
|
@ -191,15 +190,14 @@ void *elfloader_allocate_segment(struct elfloader_output *output,
|
|||
* \return Returns ELFLOADER_OK if successful, otherwise an error code
|
||||
*
|
||||
*/
|
||||
|
||||
int elfloader_start_segment(struct elfloader_output *output,
|
||||
unsigned int type, void *addr, int size);
|
||||
unsigned int type, void *addr, int size);
|
||||
|
||||
/**
|
||||
* \brief Mark end of segment
|
||||
* \param input The output object
|
||||
* \return Zero if successful
|
||||
*/
|
||||
|
||||
int elfloader_end_segment(struct elfloader_output *output);
|
||||
|
||||
/**
|
||||
|
@ -209,9 +207,8 @@ int elfloader_end_segment(struct elfloader_output *output);
|
|||
* \param len Length of data
|
||||
* \return The number of bytes actually written, or negative if failed.
|
||||
*/
|
||||
|
||||
int elfloader_write_segment(struct elfloader_output *output, const char *buf,
|
||||
unsigned int len);
|
||||
unsigned int len);
|
||||
|
||||
/**
|
||||
* \brief Get the current offset in the file where the next data will
|
||||
|
@ -219,7 +216,6 @@ int elfloader_write_segment(struct elfloader_output *output, const char *buf,
|
|||
* \param input The output object
|
||||
* \return The current offset.
|
||||
*/
|
||||
|
||||
unsigned int elfloader_segment_offset(struct elfloader_output *output);
|
||||
|
||||
#define elfloader_output_alloc_segment(output, type, size) \
|
||||
|
@ -240,12 +236,12 @@ unsigned int elfloader_segment_offset(struct elfloader_output *output);
|
|||
|
||||
struct elfloader_output_ops {
|
||||
void * (*allocate_segment)(struct elfloader_output *output,
|
||||
unsigned int type, int size);
|
||||
unsigned int type, int size);
|
||||
int (*start_segment)(struct elfloader_output *output,
|
||||
unsigned int type, void *addr, int size);
|
||||
unsigned int type, void *addr, int size);
|
||||
int (*end_segment)(struct elfloader_output *output);
|
||||
int (*write_segment)(struct elfloader_output *output, const char *buf,
|
||||
unsigned int len);
|
||||
unsigned int len);
|
||||
unsigned int (*segment_offset)(struct elfloader_output *output);
|
||||
};
|
||||
|
||||
|
@ -269,8 +265,7 @@ void elfloader_init(void);
|
|||
* elfloader_loaded_process variable.
|
||||
*
|
||||
*/
|
||||
int elfloader_load(int input_fd,
|
||||
struct elfloader_output *output);
|
||||
int elfloader_load(int input_fd, struct elfloader_output *output);
|
||||
|
||||
/**
|
||||
* A pointer to the processes loaded with elfloader_load().
|
||||
|
|
|
@ -1001,11 +1001,11 @@ static NETBUF *NicGetPacket(void)
|
|||
* Hack alert: Rev A chips never set the odd frame indicator.
|
||||
*/
|
||||
fbc -= 3;
|
||||
/* nb = NutNetBufAlloc(0, NBAF_DATALINK, fbc);*/
|
||||
/* nb = NutNetBufAlloc(0, NBAF_DATALINK, fbc);*/
|
||||
|
||||
/* Perform the read. */
|
||||
/* if (nb)
|
||||
NicRead(nb->nb_dl.vp, fbc);*/
|
||||
/* if (nb)
|
||||
NicRead(nb->nb_dl.vp, fbc);*/
|
||||
}
|
||||
|
||||
/* Release the packet. */
|
||||
|
@ -1191,12 +1191,12 @@ PROCESS_THREAD(lanc111_process, ev, data)
|
|||
*/
|
||||
imsk = nic_inlb(NIC_MSK);
|
||||
nic_outlb(NIC_MSK, 0);
|
||||
/* while ((nb = NicGetPacket()) != 0) {
|
||||
if (nb != (NETBUF *) 0xFFFF) {
|
||||
ni->ni_rx_packets++;
|
||||
(*ifn->if_recv) (dev, nb);
|
||||
}
|
||||
}*/
|
||||
/* while ((nb = NicGetPacket()) != 0) {
|
||||
if (nb != (NETBUF *) 0xFFFF) {
|
||||
ni->ni_rx_packets++;
|
||||
(*ifn->if_recv) (dev, nb);
|
||||
}
|
||||
}*/
|
||||
nic_outlb(NIC_MSK, imsk | INT_RCV | INT_ERCV);
|
||||
}
|
||||
|
||||
|
@ -1351,7 +1351,7 @@ lanc111_init(void)
|
|||
|
||||
/* Register interrupt handler and enable interrupts. */
|
||||
/* if (NutRegisterIrqHandler(&LANC111_SIGNAL, NicInterrupt, dev))
|
||||
return -1;*/
|
||||
return -1;*/
|
||||
|
||||
/*
|
||||
* Start the receiver thread.
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
/**
|
||||
* \file
|
||||
* Dummy implementation of minileds module
|
||||
|
|
|
@ -60,6 +60,7 @@ CONTIKI_CPU_SOURCEFILES += ecc-curve.c
|
|||
CONTIKI_CPU_SOURCEFILES += dbg.c ieee-addr.c
|
||||
CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c
|
||||
CONTIKI_CPU_SOURCEFILES += i2c.c cc2538-temp-sensor.c vdd3-sensor.c
|
||||
CONTIKI_CPU_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c
|
||||
|
||||
DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c
|
||||
|
||||
|
@ -110,7 +111,8 @@ CUSTOM_RULE_LINK=1
|
|||
### This rule is used to generate the correct linker script
|
||||
LDGENFLAGS += $(addprefix -D,$(subst $(COMMA), ,$(DEFINES)))
|
||||
LDGENFLAGS += $(addprefix -I,$(SOURCEDIRS))
|
||||
LDGENFLAGS += -imacros "contiki-conf.h"
|
||||
LDGENFLAGS += -imacros "contiki-conf.h" -imacros "dev/cc2538-dev.h"
|
||||
LDGENFLAGS += -imacros "dev/flash.h" -imacros "cfs-coffee-arch.h"
|
||||
LDGENFLAGS += -x c -P -E
|
||||
|
||||
# NB: Assumes LDSCRIPT was not overridden and is in $(OBJECTDIR)
|
||||
|
|
|
@ -33,70 +33,61 @@
|
|||
* stage. Rather, it is used as input for the auto-generation of the actual
|
||||
* ld script, which is called cc2538.ld and will be in the project directory
|
||||
*/
|
||||
#if (LPM_CONF_MAX_PM==2) && (LPM_CONF_ENABLE != 0)
|
||||
#define NRSRAM_START 0x20000000
|
||||
#define NRSRAM_LEN 0x00004000
|
||||
#define SRAM_START 0x20004000
|
||||
#define SRAM_LEN 0x00004000
|
||||
#else
|
||||
#define SRAM_START 0x20000000
|
||||
#define SRAM_LEN 0x00008000
|
||||
#endif
|
||||
|
||||
#ifdef FLASH_CONF_ORIGIN
|
||||
#define FLASH_ORIGIN FLASH_CONF_ORIGIN
|
||||
#else
|
||||
#error FLASH_CONF_ORIGIN is not specified. Please define FLASH_CONF_ORIGIN in contiki-conf.h.
|
||||
#endif
|
||||
|
||||
#ifdef FLASH_CONF_SIZE
|
||||
#define FLASH_SIZE FLASH_CONF_SIZE
|
||||
#else
|
||||
#error FLASH_CONF_SIZE is not specified. Please define FLASH_CONF_SIZE in contiki-conf.h.
|
||||
#endif
|
||||
|
||||
#define FLASH_CCA_LENGTH 44
|
||||
#define FLASH_LENGTH (FLASH_SIZE - FLASH_CCA_LENGTH)
|
||||
#define FLASH_CCA_ORIGIN (FLASH_ORIGIN + FLASH_LENGTH)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = FLASH_ORIGIN, LENGTH = FLASH_LENGTH
|
||||
FLASH_CCA (RX) : ORIGIN = FLASH_CCA_ORIGIN, LENGTH = FLASH_CCA_LENGTH
|
||||
#if (LPM_CONF_MAX_PM==2) && (LPM_CONF_ENABLE != 0)
|
||||
NRSRAM (RWX) : ORIGIN = NRSRAM_START, LENGTH = NRSRAM_LEN
|
||||
FLASH_FW (rx) : ORIGIN = COFFEE_START + COFFEE_SIZE,
|
||||
LENGTH = FLASH_CCA_ADDR - (COFFEE_START + COFFEE_SIZE)
|
||||
FLASH_CCA (RX) : ORIGIN = FLASH_CCA_ADDR, LENGTH = FLASH_CCA_SIZE
|
||||
|
||||
/*
|
||||
* If PM2 is enabled, then the PM2 SRAM limitations apply, i.e. the
|
||||
* regular-leakage SRAM is a non-retention SRAM and the low-leakage SRAM is
|
||||
* a full-retention SRAM.
|
||||
* Else, the data in the regular-leakage SRAM is always retained, so there
|
||||
* are virtually a non-retention SRAM with a size of 0 bytes and a
|
||||
* full-retention SRAM spanning the whole SRAM, which is more convenient to
|
||||
* use.
|
||||
*/
|
||||
#if LPM_CONF_ENABLE && LPM_CONF_MAX_PM >= 2
|
||||
NRSRAM (RWX) : ORIGIN = CC2538_DEV_RLSRAM_ADDR,
|
||||
LENGTH = CC2538_DEV_RLSRAM_SIZE
|
||||
FRSRAM (RWX) : ORIGIN = CC2538_DEV_LLSRAM_ADDR,
|
||||
LENGTH = CC2538_DEV_LLSRAM_SIZE
|
||||
#else
|
||||
NRSRAM (RWX) : ORIGIN = CC2538_DEV_RLSRAM_ADDR, LENGTH = 0
|
||||
FRSRAM (RWX) : ORIGIN = CC2538_DEV_SRAM_ADDR, LENGTH = CC2538_DEV_SRAM_SIZE
|
||||
#endif
|
||||
SRAM (RWX) : ORIGIN = SRAM_START, LENGTH = SRAM_LEN
|
||||
}
|
||||
|
||||
ENTRY(flash_cca_lock_page)
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
_text = .;
|
||||
KEEP(*(.vectors))
|
||||
*(.vectors)
|
||||
*(.text*)
|
||||
*(.rodata*)
|
||||
_etext = .;
|
||||
} > FLASH= 0
|
||||
} > FLASH_FW= 0
|
||||
|
||||
.socdata (NOLOAD) :
|
||||
{
|
||||
*(.udma_channel_control_table)
|
||||
} > SRAM
|
||||
} > FRSRAM
|
||||
|
||||
.data : ALIGN(4)
|
||||
{
|
||||
_data = .;
|
||||
*(.data*)
|
||||
_edata = .;
|
||||
} > SRAM AT > FLASH
|
||||
} > FRSRAM AT > FLASH_FW
|
||||
_ldata = LOADADDR(.data);
|
||||
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx*)
|
||||
} > FLASH
|
||||
} > FLASH_FW
|
||||
|
||||
.bss :
|
||||
{
|
||||
|
@ -104,24 +95,22 @@ SECTIONS
|
|||
*(.bss*)
|
||||
*(COMMON)
|
||||
_ebss = .;
|
||||
} > SRAM
|
||||
} > FRSRAM
|
||||
|
||||
.stack (NOLOAD) :
|
||||
{
|
||||
*(.stack)
|
||||
} > SRAM
|
||||
} > FRSRAM
|
||||
|
||||
#if (LPM_CONF_MAX_PM==2) && (LPM_CONF_ENABLE != 0)
|
||||
.nrdata (NOLOAD) :
|
||||
{
|
||||
_nrdata = .;
|
||||
*(.nrdata*)
|
||||
_enrdata = .;
|
||||
} > NRSRAM
|
||||
#endif
|
||||
|
||||
.flashcca :
|
||||
{
|
||||
KEEP(*(.flashcca))
|
||||
*(.flashcca)
|
||||
} > FLASH_CCA
|
||||
}
|
||||
|
|
144
cpu/cc2538/cfs-coffee-arch.c
Normal file
144
cpu/cc2538/cfs-coffee-arch.c
Normal file
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* Copyright (c) 2013, ADVANSEE - http://www.advansee.com/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup cc2538-cfs-coffee-arch
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Module for the cc2538 Coffee port
|
||||
*/
|
||||
#include "contiki-conf.h"
|
||||
#include "sys/cc.h"
|
||||
#include "cfs/cfs-coffee.h"
|
||||
#include "dev/cc2538-dev.h"
|
||||
#include "dev/rom-util.h"
|
||||
#include "dev/flash.h"
|
||||
#include "dev/watchdog.h"
|
||||
#include "cpu.h"
|
||||
#include "cfs-coffee-arch.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef COFFEE_CONF_CUSTOM_PORT
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if !COFFEE_SECTOR_SIZE || COFFEE_SECTOR_SIZE % FLASH_PAGE_SIZE
|
||||
#error COFFEE_SECTOR_SIZE must be a non-zero multiple of the flash page size
|
||||
#endif
|
||||
#if !COFFEE_PAGE_SIZE || COFFEE_SECTOR_SIZE % COFFEE_PAGE_SIZE
|
||||
#error COFFEE_PAGE_SIZE must be a divisor of COFFEE_SECTOR_SIZE
|
||||
#endif
|
||||
#if COFFEE_PAGE_SIZE % FLASH_WORD_SIZE
|
||||
#error COFFEE_PAGE_SIZE must be a multiple of the flash word size
|
||||
#endif
|
||||
#if COFFEE_START % FLASH_PAGE_SIZE
|
||||
#error COFFEE_START must be aligned with a flash page boundary
|
||||
#endif
|
||||
#if COFFEE_SIZE % COFFEE_SECTOR_SIZE
|
||||
#error COFFEE_SIZE must be a multiple of COFFEE_SECTOR_SIZE
|
||||
#endif
|
||||
#if COFFEE_SIZE / COFFEE_PAGE_SIZE > INT16_MAX
|
||||
#error Too many Coffee pages for coffee_page_t
|
||||
#endif
|
||||
#if COFFEE_START < CC2538_DEV_FLASH_ADDR || \
|
||||
COFFEE_START + COFFEE_SIZE > FLASH_CCA_ADDR
|
||||
#error Coffee does not fit in flash
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cfs_coffee_arch_erase(uint16_t sector)
|
||||
{
|
||||
watchdog_periodic();
|
||||
INTERRUPTS_DISABLE();
|
||||
rom_util_page_erase(COFFEE_START + sector * COFFEE_SECTOR_SIZE,
|
||||
COFFEE_SECTOR_SIZE);
|
||||
INTERRUPTS_ENABLE();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cfs_coffee_arch_write(const void *buf, unsigned int size, cfs_offset_t offset)
|
||||
{
|
||||
const uint32_t *src = buf;
|
||||
uint32_t flash_addr = COFFEE_START + offset;
|
||||
unsigned int align;
|
||||
uint32_t word, len;
|
||||
uint32_t page_buf[COFFEE_PAGE_SIZE / FLASH_WORD_SIZE];
|
||||
unsigned int i;
|
||||
|
||||
if(size && (align = flash_addr & (FLASH_WORD_SIZE - 1))) {
|
||||
len = MIN(FLASH_WORD_SIZE - align, size);
|
||||
word = ~((*src & ((1 << (len << 3)) - 1)) << (align << 3));
|
||||
watchdog_periodic();
|
||||
INTERRUPTS_DISABLE();
|
||||
rom_util_program_flash(&word, flash_addr & ~(FLASH_WORD_SIZE - 1),
|
||||
FLASH_WORD_SIZE);
|
||||
INTERRUPTS_ENABLE();
|
||||
*(const uint8_t **)&src += len;
|
||||
size -= len;
|
||||
flash_addr += len;
|
||||
}
|
||||
|
||||
while(size >= FLASH_WORD_SIZE) {
|
||||
len = MIN(size & ~(FLASH_WORD_SIZE - 1), COFFEE_PAGE_SIZE);
|
||||
for(i = 0; i < len / FLASH_WORD_SIZE; i++) {
|
||||
page_buf[i] = ~*src++;
|
||||
}
|
||||
watchdog_periodic();
|
||||
INTERRUPTS_DISABLE();
|
||||
rom_util_program_flash(page_buf, flash_addr, len);
|
||||
INTERRUPTS_ENABLE();
|
||||
size -= len;
|
||||
flash_addr += len;
|
||||
}
|
||||
|
||||
if(size) {
|
||||
word = ~(*src & ((1 << (size << 3)) - 1));
|
||||
watchdog_periodic();
|
||||
INTERRUPTS_DISABLE();
|
||||
rom_util_program_flash(&word, flash_addr, FLASH_WORD_SIZE);
|
||||
INTERRUPTS_ENABLE();
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cfs_coffee_arch_read(void *buf, unsigned int size, cfs_offset_t offset)
|
||||
{
|
||||
const uint8_t *src;
|
||||
uint8_t *dst;
|
||||
|
||||
watchdog_periodic();
|
||||
for(src = (const void *)(COFFEE_START + offset), dst = buf; size; size--) {
|
||||
*dst++ = ~*src++;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* COFFEE_CONF_CUSTOM_PORT */
|
||||
|
||||
/** @} */
|
182
cpu/cc2538/cfs-coffee-arch.h
Normal file
182
cpu/cc2538/cfs-coffee-arch.h
Normal file
|
@ -0,0 +1,182 @@
|
|||
/*
|
||||
* Copyright (c) 2013, ADVANSEE - http://www.advansee.com/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup cc2538
|
||||
* @{
|
||||
*
|
||||
* \defgroup cc2538-cfs-coffee-arch cc2538 Coffee port module
|
||||
*
|
||||
* Module for the cc2538 Coffee port
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the cc2538 Coffee port module
|
||||
*/
|
||||
#ifndef CFS_COFFEE_ARCH_H_
|
||||
#define CFS_COFFEE_ARCH_H_
|
||||
|
||||
#include "contiki-conf.h"
|
||||
#include "cfs/cfs-coffee.h"
|
||||
#include "dev/cc2538-dev.h"
|
||||
#include "dev/flash.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef COFFEE_CONF_CUSTOM_PORT
|
||||
#include COFFEE_CONF_CUSTOM_PORT
|
||||
#else
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Coffee port constants
|
||||
* @{
|
||||
*/
|
||||
/** Logical sector size */
|
||||
#ifdef COFFEE_CONF_SECTOR_SIZE
|
||||
#define COFFEE_SECTOR_SIZE COFFEE_CONF_SECTOR_SIZE
|
||||
#else
|
||||
#define COFFEE_SECTOR_SIZE FLASH_PAGE_SIZE
|
||||
#endif
|
||||
/** Logical page size */
|
||||
#ifdef COFFEE_CONF_PAGE_SIZE
|
||||
#define COFFEE_PAGE_SIZE COFFEE_CONF_PAGE_SIZE
|
||||
#else
|
||||
#define COFFEE_PAGE_SIZE (COFFEE_SECTOR_SIZE / 8)
|
||||
#endif
|
||||
/** Start offset of the file system */
|
||||
#ifdef COFFEE_CONF_START
|
||||
#define COFFEE_START COFFEE_CONF_START
|
||||
#else
|
||||
#define COFFEE_START CC2538_DEV_FLASH_ADDR
|
||||
#endif
|
||||
/** Total size in bytes of the file system */
|
||||
#ifdef COFFEE_CONF_SIZE
|
||||
#define COFFEE_SIZE COFFEE_CONF_SIZE
|
||||
#else
|
||||
#define COFFEE_SIZE 0
|
||||
#endif
|
||||
/** Maximal filename length */
|
||||
#ifdef COFFEE_CONF_NAME_LENGTH
|
||||
#define COFFEE_NAME_LENGTH COFFEE_CONF_NAME_LENGTH
|
||||
#else
|
||||
#define COFFEE_NAME_LENGTH 40
|
||||
#endif
|
||||
/** Number of file cache entries */
|
||||
#ifdef COFFEE_CONF_MAX_OPEN_FILES
|
||||
#define COFFEE_MAX_OPEN_FILES COFFEE_CONF_MAX_OPEN_FILES
|
||||
#else
|
||||
#define COFFEE_MAX_OPEN_FILES 5
|
||||
#endif
|
||||
/** Number of file descriptor entries */
|
||||
#ifdef COFFEE_CONF_FD_SET_SIZE
|
||||
#define COFFEE_FD_SET_SIZE COFFEE_CONF_FD_SET_SIZE
|
||||
#else
|
||||
#define COFFEE_FD_SET_SIZE 5
|
||||
#endif
|
||||
/** Maximal amount of log table entries read in one batch */
|
||||
#ifdef COFFEE_CONF_LOG_TABLE_LIMIT
|
||||
#define COFFEE_LOG_TABLE_LIMIT COFFEE_CONF_LOG_TABLE_LIMIT
|
||||
#endif
|
||||
/** Default reserved file size */
|
||||
#ifdef COFFEE_CONF_DYN_SIZE
|
||||
#define COFFEE_DYN_SIZE COFFEE_CONF_DYN_SIZE
|
||||
#else
|
||||
#define COFFEE_DYN_SIZE (COFFEE_SECTOR_SIZE - 50)
|
||||
#endif
|
||||
/** Default micro-log size */
|
||||
#ifdef COFFEE_CONF_LOG_SIZE
|
||||
#define COFFEE_LOG_SIZE COFFEE_CONF_LOG_SIZE
|
||||
#endif
|
||||
/** Whether Coffee will use micro logs */
|
||||
#ifdef COFFEE_CONF_MICRO_LOGS
|
||||
#define COFFEE_MICRO_LOGS COFFEE_CONF_MICRO_LOGS
|
||||
#else
|
||||
#define COFFEE_MICRO_LOGS 0
|
||||
#endif
|
||||
/** Whether files are expected to be appended to only */
|
||||
#ifdef COFFEE_CONF_APPEND_ONLY
|
||||
#define COFFEE_APPEND_ONLY COFFEE_CONF_APPEND_ONLY
|
||||
#else
|
||||
#define COFFEE_APPEND_ONLY 1
|
||||
#endif
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Coffee port macros
|
||||
* @{
|
||||
*/
|
||||
/** Erase */
|
||||
#define COFFEE_ERASE(sector) \
|
||||
cfs_coffee_arch_erase(sector)
|
||||
/** Write */
|
||||
#define COFFEE_WRITE(buf, size, offset) \
|
||||
cfs_coffee_arch_write((buf), (size), (offset))
|
||||
/** Read */
|
||||
#define COFFEE_READ(buf, size, offset) \
|
||||
cfs_coffee_arch_read((buf), (size), (offset))
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Coffee port types
|
||||
* @{
|
||||
*/
|
||||
typedef int16_t coffee_page_t; /**< Page */
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Coffee port functions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Erases a device sector
|
||||
* \param sector Sector to erase
|
||||
*/
|
||||
void cfs_coffee_arch_erase(uint16_t sector);
|
||||
|
||||
/** \brief Writes a buffer to the device
|
||||
* \param buf Pointer to the buffer
|
||||
* \param size Byte size of the buffer
|
||||
* \param offset Device offset to write to
|
||||
*/
|
||||
void cfs_coffee_arch_write(const void *buf, unsigned int size,
|
||||
cfs_offset_t offset);
|
||||
|
||||
/** \brief Reads from the device to a buffer
|
||||
* \param buf Pointer to the buffer
|
||||
* \param size Byte size of the buffer
|
||||
* \param offset Device offset to read from
|
||||
*/
|
||||
void cfs_coffee_arch_read(void *buf, unsigned int size, cfs_offset_t offset);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COFFEE_CONF_CUSTOM_PORT */
|
||||
#endif /* CFS_COFFEE_ARCH_H_ */
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
126
cpu/cc2538/dev/cc2538-dev.h
Normal file
126
cpu/cc2538/dev/cc2538-dev.h
Normal file
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup cc2538
|
||||
* @{
|
||||
*
|
||||
* \defgroup cc2538-devices cc2538 family of devices
|
||||
*
|
||||
* Definitions for the cc2538 family of devices
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the cc2538 devices definitions
|
||||
*/
|
||||
#ifndef CC2538_DEV_H_
|
||||
#define CC2538_DEV_H_
|
||||
|
||||
#include "contiki-conf.h"
|
||||
#include "sys/cc.h"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/** \name Bit-fields for the CC2538 devices features
|
||||
* @{
|
||||
*/
|
||||
#define CC2538_DEV_ID_M 0x0000000F /**< ID mask */
|
||||
#define CC2538_DEV_ID_S 0 /**< ID shift */
|
||||
#define CC2538_DEV_FLASH_SIZE_KB_M 0x0000FFF0 /**< kiB flash size mask */
|
||||
#define CC2538_DEV_FLASH_SIZE_KB_S 4 /**< kiB flash size shift */
|
||||
#define CC2538_DEV_SRAM_SIZE_KB_M 0x00FF0000 /**< kiB SRAM size mask */
|
||||
#define CC2538_DEV_SRAM_SIZE_KB_S 16 /**< kiB SRAM size shift */
|
||||
#define CC2538_DEV_AES_SHA_M 0x01000000 /**< Security HW AES/SHA */
|
||||
#define CC2538_DEV_ECC_RSA_M 0x02000000 /**< Security HW ECC/RSA */
|
||||
/** @} */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/** \name Macro defining a CC2538 device from its features
|
||||
* @{
|
||||
*/
|
||||
#define CC2538_DEV_DEF(id, flash_size_kb, sram_size_kb, aes_sha, ecc_rsa) \
|
||||
((id) << CC2538_DEV_ID_S | (flash_size_kb) << CC2538_DEV_FLASH_SIZE_KB_S | \
|
||||
(sram_size_kb) << CC2538_DEV_SRAM_SIZE_KB_S | \
|
||||
((aes_sha) ? CC2538_DEV_AES_SHA_M : 0) | \
|
||||
((ecc_rsa) ? CC2538_DEV_ECC_RSA_M : 0))
|
||||
/** @} */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/** \name Available CC2538 devices
|
||||
* @{
|
||||
*/
|
||||
#define CC2538_DEV_CC2538SF53 CC2538_DEV_DEF(0, 512, 32, 1, 1)
|
||||
#define CC2538_DEV_CC2538SF23 CC2538_DEV_DEF(1, 256, 32, 1, 1)
|
||||
#define CC2538_DEV_CC2538NF53 CC2538_DEV_DEF(2, 512, 32, 1, 0)
|
||||
#define CC2538_DEV_CC2538NF23 CC2538_DEV_DEF(3, 256, 32, 1, 0)
|
||||
#define CC2538_DEV_CC2538NF11 CC2538_DEV_DEF(4, 128, 16, 1, 0)
|
||||
/** @} */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/** \name CC2538 device used by Contiki
|
||||
* @{
|
||||
*/
|
||||
#ifdef CC2538_DEV_CONF
|
||||
#define CC2538_DEV CC2538_DEV_CONF
|
||||
#else
|
||||
#define CC2538_DEV CC2538_DEV_CC2538SF53
|
||||
#endif
|
||||
/** @} */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/** \name Features of the CC2538 device used by Contiki
|
||||
* @{
|
||||
*/
|
||||
/** Flash address */
|
||||
#define CC2538_DEV_FLASH_ADDR 0x00200000
|
||||
/** Flash size in bytes */
|
||||
#define CC2538_DEV_FLASH_SIZE (((CC2538_DEV & CC2538_DEV_FLASH_SIZE_KB_M) >> \
|
||||
CC2538_DEV_FLASH_SIZE_KB_S) << 10)
|
||||
/** SRAM (non-retention + low-leakage) address */
|
||||
#define CC2538_DEV_SRAM_ADDR (CC2538_DEV_RLSRAM_SIZE ? \
|
||||
CC2538_DEV_RLSRAM_ADDR : \
|
||||
CC2538_DEV_LLSRAM_ADDR)
|
||||
/** SRAM (non-retention + low-leakage) size in bytes */
|
||||
#define CC2538_DEV_SRAM_SIZE (((CC2538_DEV & CC2538_DEV_SRAM_SIZE_KB_M) >> \
|
||||
CC2538_DEV_SRAM_SIZE_KB_S) << 10)
|
||||
/** Regular-leakage SRAM address */
|
||||
#define CC2538_DEV_RLSRAM_ADDR 0x20000000
|
||||
/** Regular-leakage SRAM size in bytes */
|
||||
#define CC2538_DEV_RLSRAM_SIZE (CC2538_DEV_SRAM_SIZE - CC2538_DEV_LLSRAM_SIZE)
|
||||
/** Low-leakage SRAM address */
|
||||
#define CC2538_DEV_LLSRAM_ADDR 0x20004000
|
||||
/** Low-leakage SRAM size in bytes */
|
||||
#define CC2538_DEV_LLSRAM_SIZE MIN(CC2538_DEV_SRAM_SIZE, 16384)
|
||||
/** Security HW AES/SHA */
|
||||
#define CC2538_DEV_AES_SHA (!!(CC2538_DEV & CC2538_DEV_AES_SHA_M))
|
||||
/** Security HW ECC/RSA */
|
||||
#define CC2538_DEV_ECC_RSA (!!(CC2538_DEV & CC2538_DEV_ECC_RSA_M))
|
||||
/** @} */
|
||||
|
||||
#endif /* CC2538_DEV_H_ */
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
|
@ -36,20 +36,36 @@
|
|||
* \addtogroup cc2538
|
||||
* @{
|
||||
*
|
||||
* \defgroup cc2538-flash-cca cc2538 flash CCA
|
||||
* \defgroup cc2538-flash cc2538 flash memory
|
||||
*
|
||||
* Definitions for the cc2538 flash lock bit page and customer configuration
|
||||
* area
|
||||
* Definitions for the cc2538 flash memory
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the flash lock bit page and CCA definitions
|
||||
* Header file for the flash memory definitions
|
||||
*/
|
||||
#ifndef FLASH_CCA_H_
|
||||
#define FLASH_CCA_H_
|
||||
#ifndef FLASH_H_
|
||||
#define FLASH_H_
|
||||
|
||||
#include "dev/cc2538-dev.h"
|
||||
|
||||
#include <stdint.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Flash memory organization
|
||||
* @{
|
||||
*/
|
||||
#define FLASH_PAGE_SIZE 2048
|
||||
#define FLASH_WORD_SIZE 4
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Flash lock bit page and CCA location
|
||||
* @{
|
||||
*/
|
||||
#define FLASH_CCA_ADDR (CC2538_DEV_FLASH_ADDR + CC2538_DEV_FLASH_SIZE - \
|
||||
FLASH_CCA_SIZE) /**< Address */
|
||||
#define FLASH_CCA_SIZE 0x0000002C /**< Size in bytes */
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Bootloader backdoor configuration bit fields
|
||||
* @{
|
||||
*/
|
||||
|
@ -85,7 +101,7 @@ typedef struct {
|
|||
} flash_cca_lock_page_t;
|
||||
/** @} */
|
||||
|
||||
#endif /* FLASH_CCA_H_ */
|
||||
#endif /* FLASH_H_ */
|
||||
|
||||
/**
|
||||
* @}
|
|
@ -57,7 +57,7 @@ nvic_init()
|
|||
interrupt_unpend = (uint32_t *)NVIC_UNPEND0;
|
||||
|
||||
/* Provide our interrupt table to the NVIC */
|
||||
REG(SCB_VTABLE) = (NVIC_CONF_VTABLE_BASE + NVIC_CONF_VTABLE_OFFSET);
|
||||
REG(SCB_VTABLE) = NVIC_VTABLE_ADDRESS;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
|
|
|
@ -48,18 +48,14 @@
|
|||
/** \name NVIC Constants and Configuration
|
||||
* @{
|
||||
*/
|
||||
#define NVIC_VTABLE_IN_SRAM 0x20000000
|
||||
#define NVIC_VTABLE_IN_CODE 0x00000000
|
||||
|
||||
#define NVIC_INTERRUPT_ENABLED 0x00000001
|
||||
#define NVIC_INTERRUPT_DISABLED 0x00000000
|
||||
|
||||
#ifndef NVIC_CONF_VTABLE_BASE
|
||||
#define NVIC_CONF_VTABLE_BASE NVIC_VTABLE_IN_CODE
|
||||
#endif
|
||||
|
||||
#ifndef NVIC_CONF_VTABLE_OFFSET
|
||||
#define NVIC_CONF_VTABLE_OFFSET 0x200000
|
||||
#ifdef NVIC_CONF_VTABLE_ADDRESS
|
||||
#define NVIC_VTABLE_ADDRESS NVIC_CONF_VTABLE_ADDRESS
|
||||
#else
|
||||
extern void(*const vectors[])(void);
|
||||
#define NVIC_VTABLE_ADDRESS ((uint32_t)&vectors)
|
||||
#endif
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
*/
|
||||
#include "contiki.h"
|
||||
#include "reg.h"
|
||||
#include "flash-cca.h"
|
||||
#include "flash.h"
|
||||
#include "sys-ctrl.h"
|
||||
#include "rom-util.h"
|
||||
|
||||
|
@ -94,22 +94,7 @@ void pka_isr(void);
|
|||
/* Allocate stack space */
|
||||
static unsigned long stack[512] __attribute__ ((section(".stack")));
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Linker construct indicating .text section location */
|
||||
extern uint8_t _text[0];
|
||||
/*---------------------------------------------------------------------------*/
|
||||
__attribute__ ((section(".flashcca"), used))
|
||||
const flash_cca_lock_page_t __cca = {
|
||||
FLASH_CCA_BOOTLDR_CFG, /* Boot loader backdoor configuration */
|
||||
FLASH_CCA_IMAGE_VALID, /* Image valid */
|
||||
&_text, /* Vector table located at the start of .text */
|
||||
/* Unlock all pages and debug */
|
||||
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
||||
__attribute__ ((section(".vectors"), used))
|
||||
__attribute__((__section__(".vectors")))
|
||||
void(*const vectors[])(void) =
|
||||
{
|
||||
(void (*)(void))((unsigned long)stack + sizeof(stack)), /* Stack pointer */
|
||||
|
@ -277,6 +262,18 @@ void(*const vectors[])(void) =
|
|||
default_handler, /* 162 MACTimer */
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
||||
__attribute__((__section__(".flashcca")))
|
||||
const flash_cca_lock_page_t flash_cca_lock_page = {
|
||||
FLASH_CCA_BOOTLDR_CFG, /* Boot loader backdoor configuration */
|
||||
FLASH_CCA_IMAGE_VALID, /* Image valid */
|
||||
&vectors, /* Vector table */
|
||||
/* Unlock all pages and debug */
|
||||
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Linker constructs indicating .data and .bss segment locations */
|
||||
extern uint8_t _ldata;
|
||||
extern uint8_t _data;
|
||||
|
|
|
@ -647,6 +647,7 @@ static int
|
|||
transmit(unsigned short transmit_len)
|
||||
{
|
||||
int ret;
|
||||
uint8_t was_off = 0;
|
||||
uint32_t cmd_status;
|
||||
volatile rfc_CMD_PROP_TX_ADV_t *cmd_tx_adv;
|
||||
|
||||
|
@ -654,6 +655,7 @@ transmit(unsigned short transmit_len)
|
|||
uint16_t total_length;
|
||||
|
||||
if(!rf_is_on()) {
|
||||
was_off = 1;
|
||||
if(on() != RF_CORE_CMD_OK) {
|
||||
PRINTF("transmit: on() failed\n");
|
||||
return RADIO_TX_ERR;
|
||||
|
@ -739,6 +741,10 @@ transmit(unsigned short transmit_len)
|
|||
|
||||
rx_on_prop();
|
||||
|
||||
if(was_off) {
|
||||
off();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -971,6 +977,8 @@ off(void)
|
|||
rx_off_prop();
|
||||
rf_core_power_down();
|
||||
|
||||
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
|
||||
|
||||
/* Switch HF clock source to the RCOSC to preserve power */
|
||||
oscillators_switch_to_hf_rc();
|
||||
|
||||
|
@ -1058,6 +1066,12 @@ set_value(radio_param_t param, radio_value_t value)
|
|||
return RADIO_RESULT_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if(get_channel() == (uint8_t)value) {
|
||||
/* We already have that very same channel configured.
|
||||
* Nothing to do here. */
|
||||
return RADIO_RESULT_OK;
|
||||
}
|
||||
|
||||
set_channel((uint8_t)value);
|
||||
break;
|
||||
case RADIO_PARAM_TXPOWER:
|
||||
|
|
|
@ -80,15 +80,15 @@ ISR(TIMERA1, timera1)
|
|||
++count;
|
||||
|
||||
/* Make sure the CLOCK_CONF_SECOND is a power of two, to ensure
|
||||
that the modulo operation below becomes a logical and and not
|
||||
an expensive divide. Algorithm from Wikipedia:
|
||||
http://en.wikipedia.org/wiki/Power_of_two */
|
||||
that the modulo operation below becomes a logical and and not
|
||||
an expensive divide. Algorithm from Wikipedia:
|
||||
http://en.wikipedia.org/wiki/Power_of_two */
|
||||
#if (CLOCK_CONF_SECOND & (CLOCK_CONF_SECOND - 1)) != 0
|
||||
#error CLOCK_CONF_SECOND must be a power of two (i.e., 1, 2, 4, 8, 16, 32, 64, ...).
|
||||
#error Change CLOCK_CONF_SECOND in contiki-conf.h.
|
||||
#endif
|
||||
if(count % CLOCK_CONF_SECOND == 0) {
|
||||
++seconds;
|
||||
++seconds;
|
||||
energest_flush();
|
||||
}
|
||||
last_tar = read_tar();
|
||||
|
|
|
@ -52,5 +52,3 @@ enum {
|
|||
|
||||
/**@} // End of addtogroup
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
@ -149,4 +149,3 @@ StStatus halBootloaderStart(uint8_t mode, uint8_t channel, uint16_t panId);
|
|||
|
||||
/** @} END micro group */
|
||||
/** @} */
|
||||
|
||||
|
|
|
@ -272,15 +272,15 @@ our code. These numbers are obtained using 'avr-gcc 4.2.2 (WinAVR
|
|||
|
||||
\note The following compilation flags were used:
|
||||
\code
|
||||
UIP_CONF_IPV6 1
|
||||
UIP_CONF_IPV6 1
|
||||
UIP_CONF_IPV6_CHECKS 1
|
||||
UIP_CONF_IPV6_QUEUE_PKT 0
|
||||
UIP_CONF_IPV6_QUEUE_PKT 0
|
||||
UIP_CONF_IPV6_REASSEMBLY 0
|
||||
|
||||
UIP_NETIF_MAX_ADDRESSES 3
|
||||
UIP_ND6_MAX_PREFIXES 3
|
||||
UIP_ND6_MAX_NEIGHBORS 4
|
||||
UIP_ND6_MAX_DEFROUTER 2
|
||||
UIP_NETIF_MAX_ADDRESSES 3
|
||||
UIP_ND6_MAX_PREFIXES 3
|
||||
UIP_ND6_MAX_NEIGHBORS 4
|
||||
UIP_ND6_MAX_DEFROUTER 2
|
||||
\endcode
|
||||
|
||||
The total IPv6 code size is approximately 11.5Kbyte and the RAM usage around
|
||||
|
|
|
@ -121,7 +121,6 @@ output(void)
|
|||
} else {
|
||||
PRINTF("SUT: %u\n", uip_len);
|
||||
slip_send();
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
TARGET = remote
|
|
@ -1 +0,0 @@
|
|||
TARGET = z1
|
|
@ -1,15 +0,0 @@
|
|||
CONTIKI = ../../..
|
||||
|
||||
ifndef TARGET
|
||||
TARGET=z1
|
||||
endif
|
||||
|
||||
CONTIKI_PROJECT = test-phidgets blink test-adxl345 tmp102-test test-battery test-sht11 #test-potent
|
||||
CONTIKI_SOURCEFILES += cc2420-arch.c sensors.c sht11.c
|
||||
PROJECT_SOURCEFILES = i2cmaster.c tmp102.c adxl345.c battery-sensor.c sky-sensors.c #potentiometer-sensor.c
|
||||
all: example-unicast2
|
||||
|
||||
CONTIKI_WITH_RIME = 1
|
||||
include $(CONTIKI)/Makefile.include
|
||||
|
||||
|
|
@ -15,6 +15,6 @@ CONTIKI_PROJECT += test-potent
|
|||
endif
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
CONTIKI = ../..
|
||||
CONTIKI = ../../..
|
||||
CONTIKI_WITH_RIME = 1
|
||||
include $(CONTIKI)/Makefile.include
|
|
@ -1,6 +1,6 @@
|
|||
all: z1-websense
|
||||
|
||||
CONTIKI=../../../..
|
||||
CONTIKI=../../../../..
|
||||
|
||||
SMALL=1
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A simple example using HTTP to control and be controlled
|
||||
|
@ -35,7 +35,7 @@
|
|||
* Niclas Finne <nfi@sics.se>
|
||||
* Joakim Eriksson <joakime@sics.se>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "dev/leds.h"
|
||||
|
@ -43,7 +43,7 @@
|
|||
#include "webserver-nogui.h"
|
||||
#include "httpd-simple.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* The address of the server to register the services for this node */
|
||||
#define SERVER "aaaa::1"
|
||||
|
||||
|
@ -56,11 +56,9 @@
|
|||
/* The commands to send to the other node */
|
||||
#define SET_LEDS_ON "/1"
|
||||
#define SET_LEDS_OFF "/0"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(websense_remote_process, "Websense Remote");
|
||||
|
||||
AUTOSTART_PROCESSES(&websense_remote_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static const char *TOP = "<html><head><title>Contiki Websense Remote</title></head><body>\n";
|
||||
static const char *BOTTOM = "</body></html>\n";
|
||||
|
@ -161,7 +159,6 @@ PROCESS_THREAD(websense_remote_process, ev, data)
|
|||
}
|
||||
/* Alternate between the two commands */
|
||||
mode = !mode;
|
||||
|
||||
} else if(ev == PROCESS_EVENT_TIMER && etimer_expired(&timer)) {
|
||||
printf("Registering services\n");
|
||||
send_command(SERVER, REGISTER_COMMAND);
|
|
@ -27,7 +27,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A simple wget implementation
|
||||
|
@ -35,28 +35,29 @@
|
|||
* Niclas Finne <nfi@sics.se>
|
||||
* Joakim Eriksson <joakime@sics.se>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "webclient.h"
|
||||
#include "wget.h"
|
||||
#include "dev/leds.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define DEBUG DEBUG_NONE
|
||||
#include "net/ip/uip-debug.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define DEBUG_LEDS 0
|
||||
#undef LEDS_ON
|
||||
#undef LEDS_OFF
|
||||
|
||||
#if DEBUG_LEDS
|
||||
#define LEDS_ON(led) leds_on(led)
|
||||
#define LEDS_OFF(led) leds_off(led)
|
||||
#else
|
||||
#define LEDS_ON(led)
|
||||
#define LEDS_OFF(led)
|
||||
#endif /* DEBUG */
|
||||
|
||||
#endif /* DEBUG_LEDS */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int fetch_running;
|
||||
|
||||
#define STATS ((DEBUG) & DEBUG_PRINT) && 1
|
||||
#define STATS ((DEBUG)&DEBUG_PRINT) && 1
|
||||
#if STATS
|
||||
static clock_time_t fetch_started;
|
||||
static unsigned long fetch_counter;
|
||||
|
@ -66,9 +67,8 @@ static const char *server;
|
|||
static const char *file;
|
||||
static uint16_t port;
|
||||
static const struct wget_callbacks *callbacks;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(wget_process, "wget");
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
call_done(int status)
|
||||
|
@ -115,11 +115,11 @@ webclient_datahandler(char *data, uint16_t len)
|
|||
PRINTF("wget: recv %lu bytes during %lu sec (",
|
||||
fetch_counter, (elapsed / CLOCK_SECOND));
|
||||
#if CLOCK_SECOND == 128
|
||||
PRINTF("%lu.%02lus, ", (unsigned long) elapsed >> 7,
|
||||
PRINTF("%lu.%02lus, ", (unsigned long)elapsed >> 7,
|
||||
(unsigned long)((elapsed & 127) * 100) / 128);
|
||||
PRINTF("%lu byte/sec ", (fetch_counter * 128L) / elapsed);
|
||||
#endif
|
||||
PRINTF("%lu tick): ", (unsigned long) elapsed);
|
||||
PRINTF("%lu tick): ", (unsigned long)elapsed);
|
||||
if(elapsed > CLOCK_SECOND) {
|
||||
PRINTF("%lu", fetch_counter / (elapsed / CLOCK_SECOND));
|
||||
} else {
|
||||
|
@ -132,7 +132,7 @@ webclient_datahandler(char *data, uint16_t len)
|
|||
|
||||
fetch_running = 0;
|
||||
call_done(WGET_OK);
|
||||
LEDS_OFF(LEDS_RED|LEDS_YELLOW);
|
||||
LEDS_OFF(LEDS_RED | LEDS_YELLOW);
|
||||
} else {
|
||||
#if STATS
|
||||
fetch_counter += len;
|
||||
|
@ -156,7 +156,7 @@ void
|
|||
webclient_timedout(void)
|
||||
{
|
||||
PRINTF("wget: timedout\n");
|
||||
LEDS_OFF(LEDS_RED|LEDS_YELLOW);
|
||||
LEDS_OFF(LEDS_RED | LEDS_YELLOW);
|
||||
fetch_running = 0;
|
||||
call_done(WGET_TIMEDOUT);
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ void
|
|||
webclient_aborted(void)
|
||||
{
|
||||
PRINTF("wget: aborted\n");
|
||||
LEDS_OFF(LEDS_RED|LEDS_YELLOW);
|
||||
LEDS_OFF(LEDS_RED | LEDS_YELLOW);
|
||||
fetch_running = 0;
|
||||
call_done(WGET_ABORTED);
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ webclient_closed(void)
|
|||
{
|
||||
PRINTF("wget: closed\n");
|
||||
fetch_running = 0;
|
||||
LEDS_OFF(LEDS_RED|LEDS_YELLOW);
|
||||
LEDS_OFF(LEDS_RED | LEDS_YELLOW);
|
||||
call_done(WGET_CLOSED);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -42,8 +42,8 @@
|
|||
#include "contiki.h"
|
||||
|
||||
struct wget_callbacks {
|
||||
void (* data)(const char *data, uint16_t len);
|
||||
void (* done)(int status);
|
||||
void (*data)(const char *data, uint16_t len);
|
||||
void (*done)(int status);
|
||||
};
|
||||
|
||||
void wget_init(void);
|
|
@ -27,7 +27,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* Battery and Temperature IPv6 Demo for Zolertia Z1
|
||||
|
@ -37,7 +37,7 @@
|
|||
* Joel Hoglund <joel@sics.se>
|
||||
* Enric M. Calvo <ecalvo@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "httpd-simple.h"
|
||||
#include "webserver-nogui.h"
|
||||
|
@ -46,22 +46,23 @@
|
|||
#include "cc2420.h"
|
||||
#include "dev/leds.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
float floor(float x){
|
||||
if(x>=0.0f) return (float) ((int)x);
|
||||
else return (float) ((int)x-1);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
float
|
||||
floor(float x)
|
||||
{
|
||||
if(x >= 0.0f) {
|
||||
return (float)((int)x);
|
||||
} else { return (float)((int)x - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(web_sense_process, "Sense Web Demo");
|
||||
|
||||
AUTOSTART_PROCESSES(&web_sense_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define HISTORY 16
|
||||
static int temperature[HISTORY];
|
||||
static int battery1[HISTORY];
|
||||
static int sensors_pos;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
get_battery(void)
|
||||
|
@ -74,10 +75,16 @@ get_temp(void)
|
|||
{
|
||||
return temperature_sensor.value(0);
|
||||
}
|
||||
|
||||
static float get_mybatt(void){ return (float) ((get_battery()*2.500*2)/4096);}
|
||||
static float get_mytemp(void){ return (float) (((get_temp()*2.500)/4096)-0.986)*282;}
|
||||
|
||||
static float
|
||||
get_mybatt(void)
|
||||
{
|
||||
return (float)((get_battery() * 2.500 * 2) / 4096);
|
||||
}
|
||||
static float
|
||||
get_mytemp(void)
|
||||
{
|
||||
return (float)(((get_temp() * 2.500) / 4096) - 0.986) * 282;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static const char *TOP = "<html><head><title>Contiki Web Sense</title></head><body>\n";
|
||||
static const char *BOTTOM = "</body></html>\n";
|
||||
|
@ -85,11 +92,13 @@ static const char *BOTTOM = "</body></html>\n";
|
|||
/* Only one single request at time */
|
||||
static char buf[256];
|
||||
static int blen;
|
||||
#define ADD(...) do { \
|
||||
blen += snprintf(&buf[blen], sizeof(buf) - blen, __VA_ARGS__); \
|
||||
} while(0)
|
||||
#define ADD(...) do { \
|
||||
blen += snprintf(&buf[blen], sizeof(buf) - blen, __VA_ARGS__); \
|
||||
} while(0)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
generate_chart(const char *title, const char *unit, int min, int max, int *values)
|
||||
generate_chart(const char *title, const char *unit, int min, int max,
|
||||
int *values)
|
||||
{
|
||||
int i;
|
||||
blen = 0;
|
||||
|
@ -103,6 +112,7 @@ generate_chart(const char *title, const char *unit, int min, int max, int *value
|
|||
}
|
||||
ADD("\">");
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static
|
||||
PT_THREAD(send_values(struct httpd_state *s))
|
||||
{
|
||||
|
@ -120,20 +130,17 @@ PT_THREAD(send_values(struct httpd_state *s))
|
|||
ADD("<h1>Current readings</h1>\n"
|
||||
"Battery: %ld.%03d V<br>"
|
||||
"Temperature: %ld.%03d ° C",
|
||||
(long) mybatt, (unsigned) ((mybatt-floor(mybatt))*1000),
|
||||
(long) mytemp, (unsigned) ((mytemp-floor(mytemp))*1000));
|
||||
(long)mybatt, (unsigned)((mybatt - floor(mybatt)) * 1000),
|
||||
(long)mytemp, (unsigned)((mytemp - floor(mytemp)) * 1000));
|
||||
SEND_STRING(&s->sout, buf);
|
||||
|
||||
} else if(s->filename[1] == '0') {
|
||||
/* Turn off leds */
|
||||
leds_off(LEDS_ALL);
|
||||
SEND_STRING(&s->sout, "Turned off leds!");
|
||||
|
||||
} else if(s->filename[1] == '1') {
|
||||
/* Turn on leds */
|
||||
leds_on(LEDS_ALL);
|
||||
SEND_STRING(&s->sout, "Turned on leds!");
|
||||
|
||||
} else {
|
||||
if(s->filename[1] != 't') {
|
||||
generate_chart("Battery", "mV", 0, 4000, battery1);
|
||||
|
@ -173,7 +180,7 @@ PROCESS_THREAD(web_sense_process, ev, data)
|
|||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
|
||||
etimer_reset(&timer);
|
||||
|
||||
battery1[sensors_pos] = get_mybatt()*1000;
|
||||
battery1[sensors_pos] = get_mybatt() * 1000;
|
||||
temperature[sensors_pos] = get_mytemp();
|
||||
sensors_pos = (sensors_pos + 1) % HISTORY;
|
||||
}
|
|
@ -47,36 +47,27 @@
|
|||
#include "shell-file.h"
|
||||
#include "shell-text.h"
|
||||
#include "dev/adxl345.h"
|
||||
|
||||
#define LED_INT_ONTIME CLOCK_SECOND/2
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define LED_INT_ONTIME (CLOCK_SECOND / 2)
|
||||
#define ACCM_READ_INTERVAL CLOCK_SECOND
|
||||
|
||||
static process_event_t ledOff_event;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static process_event_t led_off_event;
|
||||
static struct etimer led_etimer;
|
||||
static struct etimer et;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(accel_process, "Test Accel process");
|
||||
PROCESS(led_process, "LED handling process");
|
||||
AUTOSTART_PROCESSES(&accel_process, &led_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* As several interrupts can be mapped to one interrupt pin, when interrupt
|
||||
strikes, the adxl345 interrupt source register is read. This function prints
|
||||
out which interrupts occurred. Note that this will include all interrupts,
|
||||
even those mapped to 'the other' pin, and those that will always signal even if
|
||||
not enabled (such as watermark). */
|
||||
|
||||
* strikes, the adxl345 interrupt source register is read. This function prints
|
||||
* out which interrupts occurred. Note that this will include all interrupts,
|
||||
* even those mapped to 'the other' pin, and those that will always signal even
|
||||
* if not enabled (such as watermark).
|
||||
*/
|
||||
void
|
||||
print_int(uint16_t reg){
|
||||
#define ANNOYING_ALWAYS_THERE_ANYWAY_OUTPUT 0
|
||||
#if ANNOYING_ALWAYS_THERE_ANYWAY_OUTPUT
|
||||
if(reg & ADXL345_INT_OVERRUN) {
|
||||
printf("Overrun ");
|
||||
}
|
||||
if(reg & ADXL345_INT_WATERMARK) {
|
||||
printf("Watermark ");
|
||||
}
|
||||
if(reg & ADXL345_INT_DATAREADY) {
|
||||
printf("DataReady ");
|
||||
}
|
||||
#endif
|
||||
print_int(uint16_t reg)
|
||||
{
|
||||
if(reg & ADXL345_INT_FREEFALL) {
|
||||
printf("Freefall ");
|
||||
}
|
||||
|
@ -94,74 +85,49 @@ print_int(uint16_t reg){
|
|||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* accelerometer free fall detection callback */
|
||||
|
||||
void
|
||||
accm_ff_cb(uint8_t reg){
|
||||
accm_ff_cb(uint8_t reg)
|
||||
{
|
||||
L_ON(LEDS_B);
|
||||
process_post(&led_process, ledOff_event, NULL);
|
||||
printf("~~[%u] Freefall detected! (0x%02X) -- ", ((uint16_t) clock_time())/128, reg);
|
||||
process_post(&led_process, led_off_event, NULL);
|
||||
printf("~~[%u] Freefall detected! (0x%02X) -- ",
|
||||
((uint16_t)clock_time()) / 128, reg);
|
||||
print_int(reg);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* accelerometer tap and double tap detection callback */
|
||||
|
||||
void
|
||||
accm_tap_cb(uint8_t reg){
|
||||
process_post(&led_process, ledOff_event, NULL);
|
||||
if(reg & ADXL345_INT_DOUBLETAP){
|
||||
accm_tap_cb(uint8_t reg)
|
||||
{
|
||||
process_post(&led_process, led_off_event, NULL);
|
||||
if(reg & ADXL345_INT_DOUBLETAP) {
|
||||
L_ON(LEDS_G);
|
||||
printf("~~[%u] DoubleTap detected! (0x%02X) -- ", ((uint16_t) clock_time())/128, reg);
|
||||
printf("~~[%u] DoubleTap detected! (0x%02X) -- ",
|
||||
((uint16_t)clock_time()) / 128, reg);
|
||||
} else {
|
||||
L_ON(LEDS_R);
|
||||
printf("~~[%u] Tap detected! (0x%02X) -- ", ((uint16_t) clock_time())/128, reg);
|
||||
printf("~~[%u] Tap detected! (0x%02X) -- ",
|
||||
((uint16_t)clock_time()) / 128, reg);
|
||||
}
|
||||
print_int(reg);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* When posted an ledOff event, the LEDs will switch off after LED_INT_ONTIME.
|
||||
static process_event_t ledOff_event;
|
||||
ledOff_event = process_alloc_event();
|
||||
process_post(&led_process, ledOff_event, NULL);
|
||||
*/
|
||||
|
||||
static struct etimer ledETimer;
|
||||
PROCESS_THREAD(led_process, ev, data) {
|
||||
PROCESS_BEGIN();
|
||||
while(1){
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == ledOff_event);
|
||||
etimer_set(&ledETimer, LED_INT_ONTIME);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&ledETimer));
|
||||
while(1) {
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == led_off_event);
|
||||
etimer_set(&led_etimer, LED_INT_ONTIME);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&led_etimer));
|
||||
L_OFF(LEDS_R + LEDS_G + LEDS_B);
|
||||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Returns a string with the argument byte written in binary.
|
||||
Example usage:
|
||||
printf("Port1: %s\n", char2bin(P1IN));
|
||||
*/
|
||||
/*
|
||||
static uint8_t b[9];
|
||||
|
||||
static uint8_t
|
||||
*char2bin(uint8_t x) {
|
||||
uint8_t z;
|
||||
b[8] = '\0';
|
||||
for (z = 0; z < 8; z++) {
|
||||
b[7-z] = (x & (1 << z)) ? '1' : '0';
|
||||
}
|
||||
return b;
|
||||
}
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Main process, setups */
|
||||
|
||||
static struct etimer et;
|
||||
|
||||
PROCESS_THREAD(accel_process, ev, data) {
|
||||
PROCESS_BEGIN();
|
||||
{
|
||||
|
@ -169,11 +135,11 @@ PROCESS_THREAD(accel_process, ev, data) {
|
|||
|
||||
serial_shell_init();
|
||||
shell_ps_init();
|
||||
shell_file_init(); // for printing out files
|
||||
shell_text_init(); // for binprint
|
||||
shell_file_init(); /* for printing out files */
|
||||
shell_text_init(); /* for binprint */
|
||||
|
||||
/* Register the event used for lighting up an LED when interrupt strikes. */
|
||||
ledOff_event = process_alloc_event();
|
||||
led_off_event = process_alloc_event();
|
||||
|
||||
/* Start and setup the accelerometer with default values, eg no interrupts enabled. */
|
||||
accm_init();
|
||||
|
@ -183,14 +149,14 @@ PROCESS_THREAD(accel_process, ev, data) {
|
|||
ACCM_REGISTER_INT2_CB(accm_tap_cb);
|
||||
|
||||
/* Set what strikes the corresponding interrupts. Several interrupts per pin is
|
||||
possible. For the eight possible interrupts, see adxl345.h and adxl345 datasheet. */
|
||||
possible. For the eight possible interrupts, see adxl345.h and adxl345 datasheet. */
|
||||
accm_set_irq(ADXL345_INT_FREEFALL, ADXL345_INT_TAP + ADXL345_INT_DOUBLETAP);
|
||||
|
||||
while (1) {
|
||||
x = accm_read_axis(X_AXIS);
|
||||
y = accm_read_axis(Y_AXIS);
|
||||
z = accm_read_axis(Z_AXIS);
|
||||
printf("x: %d y: %d z: %d\n", x, y, z);
|
||||
while(1) {
|
||||
x = accm_read_axis(X_AXIS);
|
||||
y = accm_read_axis(Y_AXIS);
|
||||
z = accm_read_axis(Z_AXIS);
|
||||
printf("x: %d y: %d z: %d\n", x, y, z);
|
||||
|
||||
etimer_set(&et, ACCM_READ_INTERVAL);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
|
@ -198,6 +164,5 @@ PROCESS_THREAD(accel_process, ev, data) {
|
|||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
@ -29,30 +29,27 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* Testing the internal MSP430 battery sensor on the Zolertia Z1 Platform.
|
||||
* \author
|
||||
* Enric M. Calvo <ecalvo@zolertia.com>
|
||||
*/
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "dev/battery-sensor.h"
|
||||
#include <stdio.h> /* For printf() */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
float
|
||||
floor(float x)
|
||||
{
|
||||
if(x >= 0.0f) {
|
||||
return (float) ((int) x);
|
||||
return (float)((int)x);
|
||||
} else {
|
||||
return (float) ((int) x - 1);
|
||||
return (float)((int)x - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_battery_process, "Battery Sensor Test");
|
||||
AUTOSTART_PROCESSES(&test_battery_process);
|
||||
|
@ -67,13 +64,12 @@ PROCESS_THREAD(test_battery_process, ev, data)
|
|||
while(1) {
|
||||
uint16_t bateria = battery_sensor.value(0);
|
||||
float mv = (bateria * 2.500 * 2) / 4096;
|
||||
printf("Battery: %i (%ld.%03d mV)\n", bateria, (long) mv,
|
||||
(unsigned) ((mv - floor(mv)) * 1000));
|
||||
printf("Battery: %i (%ld.%03d mV)\n", bateria, (long)mv,
|
||||
(unsigned)((mv - floor(mv)) * 1000));
|
||||
}
|
||||
|
||||
SENSORS_DEACTIVATE(battery_sensor);
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,49 +29,39 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A quick program for testing the light ziglet driver in the Z1 platform
|
||||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/i2cmaster.h"
|
||||
#include "dev/light-ziglet.h"
|
||||
|
||||
#if 1
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define SENSOR_READ_INTERVAL (CLOCK_SECOND / 2)
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_process, "Test light ziglet process");
|
||||
AUTOSTART_PROCESSES(&test_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(test_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
||||
uint16_t light;
|
||||
|
||||
/* Initialize driver and set a slower data rate */
|
||||
|
||||
light_ziglet_init();
|
||||
i2c_setrate(I2C_PRESC_100KHZ_LSB, I2C_PRESC_100KHZ_MSB);
|
||||
|
||||
while(1) {
|
||||
etimer_set(&et, SENSOR_READ_INTERVAL);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
|
||||
light = light_ziglet_read();
|
||||
PRINTF("Light = %u\n", light);
|
||||
printf("Light = %u\n", light_ziglet_read());
|
||||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,52 +29,48 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* An example of how to use the button and light sensor on
|
||||
* the Z1 platform.
|
||||
* An example of how to use the button and read the ADC ports
|
||||
* \author
|
||||
* Joakim Eriksson <joakime@sics.se>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "dev/leds.h"
|
||||
#include "dev/z1-phidgets.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_button_process, "Test Button & Phidgets");
|
||||
PROCESS(test_button_process, "Test Button & ADC");
|
||||
AUTOSTART_PROCESSES(&test_button_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(test_button_process, ev, data)
|
||||
{
|
||||
//static struct etimer et;
|
||||
/* static struct etimer et; */
|
||||
PROCESS_BEGIN();
|
||||
SENSORS_ACTIVATE(phidgets);
|
||||
SENSORS_ACTIVATE(button_sensor);
|
||||
|
||||
while(1) {
|
||||
//etimer_set(&et, CLOCK_SECOND/2);
|
||||
printf("Please press the User Button\n");
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event &&
|
||||
data == &button_sensor);
|
||||
|
||||
//PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
leds_toggle(LEDS_GREEN);
|
||||
//printf("Button clicked\n");
|
||||
|
||||
printf("Phidget 5V 1:%d\n", phidgets.value(PHIDGET5V_1));
|
||||
printf("Phidget 5V 2:%d\n", phidgets.value(PHIDGET5V_2));
|
||||
printf("Phidget 3V 1:%d\n", phidgets.value(PHIDGET3V_1));
|
||||
printf("Phidget 3V 2:%d\n", phidgets.value(PHIDGET3V_2));
|
||||
|
||||
if (phidgets.value(PHIDGET3V_1) < 100) {
|
||||
if(phidgets.value(PHIDGET3V_1) < 100) {
|
||||
leds_on(LEDS_RED);
|
||||
} else {
|
||||
leds_off(LEDS_RED);
|
||||
}
|
||||
|
||||
}
|
||||
PROCESS_END();
|
||||
}
|
|
@ -29,19 +29,17 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* Testing the Potentiometer in Zolertia Z1 Starter Platform.
|
||||
* \author
|
||||
* Enric M. Calvo <ecalvo@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "dev/potentiometer-sensor.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_potent_process, "Testing Potentiometer in Z1SP");
|
||||
AUTOSTART_PROCESSES(&test_potent_process);
|
||||
|
@ -63,6 +61,4 @@ PROCESS_THREAD(test_potent_process, ev, data)
|
|||
|
||||
PROCESS_END();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A quick program for testing a generic relay device connected in the
|
||||
|
@ -37,25 +37,19 @@
|
|||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/relay-phidget.h"
|
||||
|
||||
#if 1
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if DEBUG
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define PRINTFDEBUG(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTFDEBUG(...)
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define RELAY_INTERVAL (CLOCK_SECOND)
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_process, "Relay test process");
|
||||
AUTOSTART_PROCESSES(&test_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -78,3 +72,4 @@ PROCESS_THREAD(test_process, ev, data)
|
|||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,7 +29,7 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* Testing the SHT11 sensor on the Zolertia Z1 Platform.
|
||||
|
@ -37,15 +37,15 @@
|
|||
* Nicolas Tsiftes <nvt@sics.se>
|
||||
* Enric M. Calvo <ecalvo@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "dev/sht11/sht11.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_sht11_process, "SHT11 test");
|
||||
AUTOSTART_PROCESSES(&test_sht11_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(test_sht11_process, ev, data)
|
||||
{
|
||||
static struct etimer et;
|
||||
|
@ -54,14 +54,15 @@ PROCESS_THREAD(test_sht11_process, ev, data)
|
|||
PROCESS_BEGIN();
|
||||
sht11_init();
|
||||
|
||||
for (etimer_set(&et, CLOCK_SECOND);; etimer_reset(&et)) {
|
||||
for(etimer_set(&et, CLOCK_SECOND);; etimer_reset(&et)) {
|
||||
PROCESS_YIELD();
|
||||
printf("Temperature: %u degrees Celsius\n",
|
||||
(unsigned) (-39.60 + 0.01 * sht11_temp()));
|
||||
(unsigned)(-39.60 + 0.01 * sht11_temp()));
|
||||
rh = sht11_humidity();
|
||||
printf("Rel. humidity: %u%%\n",
|
||||
(unsigned) (-4 + 0.0405*rh - 2.8e-6*(rh*rh)));
|
||||
(unsigned)(-4 + 0.0405 * rh - 2.8e-6 * (rh * rh)));
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,21 +29,23 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A quick program for testing the SHT25 temperature and humidity sensor
|
||||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/sht25.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(test_sht25_process, "SHT25 test");
|
||||
AUTOSTART_PROCESSES(&test_sht25_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(test_sht25_process, ev, data)
|
||||
{
|
||||
int16_t temperature, humidity;
|
||||
|
@ -61,3 +63,4 @@ PROCESS_THREAD(test_sht25_process, ev, data)
|
|||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,7 +29,7 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A simple program for testing the TLC59116 I2C led driver.
|
||||
|
@ -37,23 +37,21 @@
|
|||
* \author
|
||||
* Jelmer Tiete, VUB <jelmer@tiete.be>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/tlc59116.h"
|
||||
|
||||
#define BLINK_INTERVAL CLOCK_SECOND/25
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define BLINK_INTERVAL (CLOCK_SECOND / 25)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(tlc59116_process, "Test tlc59116 process");
|
||||
AUTOSTART_PROCESSES(&tlc59116_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Main process, setups */
|
||||
|
||||
static struct etimer et;
|
||||
static uint8_t count = 0;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(tlc59116_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
@ -80,5 +78,4 @@ PROCESS_THREAD(tlc59116_process, ev, data)
|
|||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -29,71 +29,40 @@
|
|||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \file
|
||||
* A quick program for testing the tmp102 driver in the Z1 platform
|
||||
* \author
|
||||
* Enric M. Calvo <ecalvo@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/i2cmaster.h"
|
||||
#include "dev/tmp102.h"
|
||||
|
||||
|
||||
#if 1
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
#define PRINTFDEBUG(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTFDEBUG(...)
|
||||
#endif
|
||||
|
||||
|
||||
#define TMP102_READ_INTERVAL (CLOCK_SECOND/2)
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define TMP102_READ_INTERVAL (CLOCK_SECOND / 2)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(temp_process, "Test Temperature process");
|
||||
AUTOSTART_PROCESSES(&temp_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(temp_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
||||
int16_t tempint;
|
||||
uint16_t tempfrac;
|
||||
int16_t raw;
|
||||
uint16_t absraw;
|
||||
int16_t sign;
|
||||
char minus = ' ';
|
||||
int16_t temp;
|
||||
|
||||
tmp102_init();
|
||||
|
||||
while(1) {
|
||||
etimer_set(&et, TMP102_READ_INTERVAL);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
|
||||
sign = 1;
|
||||
|
||||
PRINTFDEBUG("Reading Temp...\n");
|
||||
raw = tmp102_read_temp_raw();
|
||||
absraw = raw;
|
||||
if(raw < 0) { // Perform 2C's if sensor returned negative data
|
||||
absraw = (raw ^ 0xFFFF) + 1;
|
||||
sign = -1;
|
||||
}
|
||||
tempint = (absraw >> 8) * sign;
|
||||
tempfrac = ((absraw >> 4) % 16) * 625; // Info in 1/10000 of degree
|
||||
minus = ((tempint == 0) & (sign == -1)) ? '-' : ' ';
|
||||
PRINTF("Temp = %c%d.%04d\n", minus, tempint, tempfrac);
|
||||
temp = tmp102_read_temp_x100();
|
||||
printf("Temp = %d\n", temp);
|
||||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -1,9 +1,9 @@
|
|||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
||||
CONTIKI_PROJECT = remote-demo test-tsl2563 test-sht25
|
||||
CONTIKI_PROJECT = zoul-demo test-tsl2563 test-sht25
|
||||
CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../..
|
||||
CONTIKI = ../../..
|
||||
CONTIKI_WITH_RIME = 1
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/zolertia/zoul/Makefile.target
Normal file
1
examples/zolertia/zoul/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = zoul
|
8
examples/zolertia/zoul/cc1200-demo/Makefile
Normal file
8
examples/zolertia/zoul/cc1200-demo/Makefile
Normal file
|
@ -0,0 +1,8 @@
|
|||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
||||
CONTIKI_PROJECT = cc1200-demo
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../../../..
|
||||
CONTIKI_WITH_RIME = 1
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/zolertia/zoul/cc1200-demo/Makefile.target
Normal file
1
examples/zolertia/zoul/cc1200-demo/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = zoul
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2007, Swedish Institute of Computer Science.
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -26,106 +26,80 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup zoul-cc1200-demo Zoul on-board CC1200 RF transceiver test
|
||||
*
|
||||
* Demonstrates the use of the TI CC1200 RF transceiver on Sub-1GHz
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Best-effort single-hop unicast example
|
||||
* Test file for the CC1200 demo
|
||||
*
|
||||
* \author
|
||||
* Adam Dunkels <adam@sics.se>
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "net/rime/rime.h"
|
||||
|
||||
#include "dev/button-sensor.h"
|
||||
|
||||
#include "cpu.h"
|
||||
#include "sys/etimer.h"
|
||||
#include "dev/leds.h"
|
||||
#include "dev/watchdog.h"
|
||||
#include "dev/serial-line.h"
|
||||
#include "dev/sys-ctrl.h"
|
||||
#include "net/rime/broadcast.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "dev/i2cmaster.h"
|
||||
#include "dev/tmp102.h"
|
||||
|
||||
#if 1
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
|
||||
#define SENDER 205
|
||||
#define RECEIVER 200
|
||||
|
||||
|
||||
#define PRINTFDEBUG(...)
|
||||
|
||||
|
||||
#define TMP102_READ_INTERVAL (CLOCK_SECOND/2)
|
||||
|
||||
int16_t tempint;
|
||||
uint16_t tempfrac;
|
||||
int16_t raw;
|
||||
uint16_t absraw;
|
||||
int16_t sign;
|
||||
char minus = ' ';
|
||||
|
||||
#include <stdint.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(example_unicast_process, "Example unicast");
|
||||
AUTOSTART_PROCESSES(&example_unicast_process);
|
||||
#define LOOP_PERIOD 2
|
||||
#define LOOP_INTERVAL (CLOCK_SECOND * LOOP_PERIOD)
|
||||
#define BROADCAST_CHANNEL 129
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
static uint16_t counter;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
recv_uc(struct unicast_conn *c, const linkaddr_t *from)
|
||||
broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from)
|
||||
{
|
||||
printf("unicast message received from %d.%d\n",
|
||||
from->u8[0], from->u8[1]);
|
||||
printf("*** Received %u bytes from %u:%u: '0x%04u' ", packetbuf_datalen(),
|
||||
from->u8[0], from->u8[1], *(uint16_t *)packetbuf_dataptr());
|
||||
printf("%d - %u\n", (int8_t)packetbuf_attr(PACKETBUF_ATTR_RSSI),
|
||||
packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY));
|
||||
leds_toggle(LEDS_GREEN);
|
||||
}
|
||||
static const struct unicast_callbacks unicast_callbacks = {recv_uc};
|
||||
static struct unicast_conn uc;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(example_unicast_process, ev, data)
|
||||
static const struct broadcast_callbacks bc_rx = { broadcast_recv };
|
||||
static struct broadcast_conn bc;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(cc1200_demo_process, "cc1200 demo process");
|
||||
AUTOSTART_PROCESSES(&cc1200_demo_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(cc1200_demo_process, ev, data)
|
||||
{
|
||||
PROCESS_EXITHANDLER(unicast_close(&uc);)
|
||||
|
||||
PROCESS_EXITHANDLER(broadcast_close(&bc))
|
||||
PROCESS_BEGIN();
|
||||
|
||||
broadcast_open(&bc, BROADCAST_CHANNEL, &bc_rx);
|
||||
|
||||
etimer_set(&et, LOOP_INTERVAL);
|
||||
|
||||
tmp102_init();
|
||||
linkaddr_t addr;
|
||||
unicast_open(&uc, 133, &unicast_callbacks);
|
||||
SENSORS_ACTIVATE(button_sensor);
|
||||
while(1) {
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev==sensors_event && data == &button_sensor);
|
||||
sign = 1;
|
||||
|
||||
//PRINTFDEBUG ("Reading Temp...\n");
|
||||
raw = tmp102_read_temp_raw();
|
||||
|
||||
absraw = raw;
|
||||
if (raw < 0) { // Perform 2C's if sensor returned negative data
|
||||
absraw = (raw ^ 0xFFFF) + 1;
|
||||
sign = -1;
|
||||
}
|
||||
tempint = (absraw >> 8) * sign;
|
||||
tempfrac = ((absraw>>4) % 16) * 625; // Info in 1/10000 of degree
|
||||
minus = ((tempint == 0) & (sign == -1)) ? '-' : ' ' ;
|
||||
PRINTF ("Current Temp = %c%d.%04d\n", minus, tempint, tempfrac);
|
||||
|
||||
|
||||
|
||||
char s[30];
|
||||
sprintf(s,"Temp is %c%d.%04d\n", minus, tempint, tempfrac);
|
||||
printf("sending %s\n",s);
|
||||
packetbuf_copyfrom(s, 30);
|
||||
addr.u8[0] = RECEIVER;
|
||||
addr.u8[1] = 0;
|
||||
|
||||
unicast_send(&uc, &addr);
|
||||
PROCESS_YIELD();
|
||||
if(ev == PROCESS_EVENT_TIMER) {
|
||||
printf("Broadcast --> %u\n", counter);
|
||||
leds_toggle(LEDS_RED);
|
||||
packetbuf_copyfrom(&counter, sizeof(counter));
|
||||
broadcast_send(&bc);
|
||||
counter++;
|
||||
etimer_set(&et, LOOP_INTERVAL);
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2007, Swedish Institute of Computer Science.
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -26,64 +26,36 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup zoul-examples
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-cc1200-demo RE-Mote CC1200 RF transceiver test
|
||||
*
|
||||
* Demonstrates the use of the TI CC1200 RF transceiver on Sub-1GHz
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Configuration file for the cc1200 demo
|
||||
*
|
||||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
||||
|
||||
#undef NETSTACK_CONF_RADIO
|
||||
#define NETSTACK_CONF_RADIO cc1200_driver
|
||||
#define NETSTACK_CONF_RDC nullrdc_driver
|
||||
#define CC1200_CONF_USE_GPIO2 0
|
||||
#define CC1200_CONF_USE_RX_WATCHDOG 0
|
||||
#define ANTENNA_SW_SELECT_DEF_CONF ANTENNA_SW_SELECT_SUBGHZ
|
||||
|
||||
#endif /* PROJECT_CONF_H_ */
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Best-effort single-hop unicast example
|
||||
* \author
|
||||
* Adam Dunkels <adam@sics.se>
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "net/rime/rime.h"
|
||||
|
||||
#include "dev/button-sensor.h"
|
||||
|
||||
#include "dev/leds.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(example_unicast_process, "Example unicast");
|
||||
AUTOSTART_PROCESSES(&example_unicast_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
recv_uc(struct unicast_conn *c, const linkaddr_t *from)
|
||||
{
|
||||
printf("unicast message received from %d.%d\n",
|
||||
from->u8[0], from->u8[1]);
|
||||
}
|
||||
static const struct unicast_callbacks unicast_callbacks = {recv_uc};
|
||||
static struct unicast_conn uc;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(example_unicast_process, ev, data)
|
||||
{
|
||||
PROCESS_EXITHANDLER(unicast_close(&uc);)
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
unicast_open(&uc, 199, &unicast_callbacks);
|
||||
|
||||
while(1) {
|
||||
static struct etimer et;
|
||||
linkaddr_t addr;
|
||||
|
||||
etimer_set(&et, CLOCK_SECOND);
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
|
||||
//packetbuf_copyfrom("Enric Here!", 12);
|
||||
//addr.u8[0] = 200;
|
||||
//addr.u8[1] = 0;
|
||||
//if(!linkaddr_cmp(&addr, &linkaddr_node_addr)) {
|
||||
//unicast_send(&uc, &addr);
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
|
@ -1,4 +1,4 @@
|
|||
Re-Mote + Node Red README
|
||||
RE-Mote + Node Red README
|
||||
========================
|
||||
|
||||
A very basic example of how to use MQTT-Demo + Mosquitto + Node Red
|
||||
|
@ -10,9 +10,9 @@ Install Mosquitto
|
|||
|
||||
Fire up a Re-Mote
|
||||
-----------------
|
||||
* Compile the MQTT demo example from `../../cc2538dk/mqtt-demo.c` following
|
||||
* Compile the MQTT demo example from `../../../cc2538dk/mqtt-demo.c` following
|
||||
the instructions of the README.md therein.
|
||||
* Program your Re-Mote.
|
||||
* Program your RE-Mote.
|
||||
* If you are running mosquitto with `-v`, a few seconds later you should see
|
||||
the Re-Mote connect, subscribe and start publishing.
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
* @{
|
||||
*
|
||||
* \file
|
||||
* Project specific configuration defines for the basic Re-Mote examples
|
||||
* Project specific configuration defines for the basic RE-Mote examples
|
||||
*/
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
|
@ -30,21 +30,30 @@
|
|||
*
|
||||
*/
|
||||
/**
|
||||
* \addtogroup zoul-examples
|
||||
* @{
|
||||
*
|
||||
* \defgroup zoul-sht25-test SHT25 temperature and humidity sensor test
|
||||
*
|
||||
* Demonstrates the use of the SHT25 digital temperature and humidity sensor
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* A quick program for testing the SHT25 temperature and humidity sensor
|
||||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/sht25.h"
|
||||
|
||||
PROCESS(test_sht25_process, "SHT25 test");
|
||||
AUTOSTART_PROCESSES(&test_sht25_process);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(remote_sht25_process, "SHT25 test");
|
||||
AUTOSTART_PROCESSES(&remote_sht25_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
|
||||
PROCESS_THREAD(test_sht25_process, ev, data)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(remote_sht25_process, ev, data)
|
||||
{
|
||||
int16_t temperature, humidity;
|
||||
|
||||
|
@ -61,3 +70,9 @@ PROCESS_THREAD(test_sht25_process, ev, data)
|
|||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
|
@ -29,41 +29,41 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-examples
|
||||
* \addtogroup zoul-examples
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-tsl2563-test Re-Mote TSL2563 light sensor test
|
||||
* \defgroup zoul-tsl2563-test TSL2563 light sensor test
|
||||
*
|
||||
* Demonstrates the use of the TSL2563 digital ambient light sensor
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Driver for the Re-Mote external TSL2563 light sensor (Ziglet)
|
||||
* Driver for the external TSL2563 light sensor
|
||||
*
|
||||
* \author
|
||||
* Antonio Lignan <alinan@zolertia.com>
|
||||
* Toni Lozano <tlozano@zolertia.com>
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include "contiki.h"
|
||||
#include "dev/i2c.h"
|
||||
#include "dev/tsl2563.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if 1
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define SENSOR_READ_INTERVAL (CLOCK_SECOND / 2)
|
||||
|
||||
PROCESS(test_process, "Test TSL2563 light ziglet process");
|
||||
AUTOSTART_PROCESSES(&test_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(remote_tsl2563_process, "TSL2563 test process");
|
||||
AUTOSTART_PROCESSES(&remote_tsl2563_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(test_process, ev, data)
|
||||
PROCESS_THREAD(remote_tsl2563_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
int light;
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -29,15 +30,16 @@
|
|||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup remote
|
||||
* \addtogroup zoul
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-examples Re-Mote Example Projects
|
||||
* \defgroup zoul-examples Zoul examples
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-demo Re-Mote Demo Project
|
||||
* \defgroup zoul-demo Zoul demo application
|
||||
*
|
||||
* Example project demonstrating the Re-Mote functionality
|
||||
* Example project demonstrating the Zoul module on the RE-Mote and Firefly
|
||||
* platforms.
|
||||
*
|
||||
* - Boot sequence: LEDs flashing (Red, then yellow, finally green)
|
||||
*
|
||||
|
@ -54,13 +56,11 @@
|
|||
* packet will toggle LEDs defined as LEDS_RF_RX
|
||||
* - Button : Keeping the button pressed will print a counter that
|
||||
* increments every BUTTON_PRESS_EVENT_INTERVAL ticks
|
||||
* - TMP102 : Built-in digital temperature sensor, every LOOP_INTERVAL
|
||||
* clock ticks a sensor reading will be taken
|
||||
*
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Example demonstrating the Re-Mote platform
|
||||
* Example demonstrating the Zoul module on the RE-Mote & Firefly platforms
|
||||
*/
|
||||
#include "contiki.h"
|
||||
#include "cpu.h"
|
||||
|
@ -69,13 +69,11 @@
|
|||
#include "dev/leds.h"
|
||||
#include "dev/uart.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "dev/remote-sensors.h"
|
||||
#include "dev/zoul-sensors.h"
|
||||
#include "dev/watchdog.h"
|
||||
#include "dev/serial-line.h"
|
||||
#include "dev/sys-ctrl.h"
|
||||
#include "net/rime/broadcast.h"
|
||||
#include "dev/antenna-sw.h"
|
||||
#include "dev/tmp102.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
@ -94,10 +92,10 @@
|
|||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
static struct rtimer rt;
|
||||
static uint16_t counter, temperature;
|
||||
static uint16_t counter;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(cc2538_demo_process, "cc2538 demo process");
|
||||
AUTOSTART_PROCESSES(&cc2538_demo_process);
|
||||
PROCESS(zoul_demo_process, "Zoul demo process");
|
||||
AUTOSTART_PROCESSES(&zoul_demo_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from)
|
||||
|
@ -116,7 +114,7 @@ rt_callback(struct rtimer *t, void *ptr)
|
|||
leds_off(LEDS_PERIODIC);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(cc2538_demo_process, ev, data)
|
||||
PROCESS_THREAD(zoul_demo_process, ev, data)
|
||||
{
|
||||
PROCESS_EXITHANDLER(broadcast_close(&bc))
|
||||
|
||||
|
@ -125,15 +123,14 @@ PROCESS_THREAD(cc2538_demo_process, ev, data)
|
|||
counter = 0;
|
||||
broadcast_open(&bc, BROADCAST_CHANNEL, &bc_rx);
|
||||
|
||||
/* Enable antenna */
|
||||
antenna_sw_select(ANTENNA_SW_SELECT_INTERNAL);
|
||||
|
||||
/* Configure the user button */
|
||||
button_sensor.configure(BUTTON_SENSOR_CONFIG_TYPE_INTERVAL,
|
||||
BUTTON_PRESS_EVENT_INTERVAL);
|
||||
|
||||
tmp102_init();
|
||||
/* Configure the ADC ports */
|
||||
adc_sensors.configure(SENSORS_HW_INIT, ZOUL_SENSORS_ADC_ALL);
|
||||
|
||||
printf("Re-Mote test application, initial values:\n");
|
||||
printf("Zoul test application\n");
|
||||
|
||||
etimer_set(&et, LOOP_INTERVAL);
|
||||
|
||||
|
@ -153,14 +150,11 @@ PROCESS_THREAD(cc2538_demo_process, ev, data)
|
|||
printf("Temperature = %d mC\n",
|
||||
cc2538_temp_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED));
|
||||
|
||||
printf("Phidget ADC2 = %d raw\n",
|
||||
phidget_sensor.value(PHIDGET_SENSORS_ADC2));
|
||||
printf("ADC1 = %d raw\n",
|
||||
adc_sensors.value(ZOUL_SENSORS_ADC1));
|
||||
|
||||
printf("Phidget ADC3 = %d raw\n",
|
||||
phidget_sensor.value(PHIDGET_SENSORS_ADC3));
|
||||
|
||||
tmp102_read(&temperature);
|
||||
printf("TMP102 sensor = %u mC\n", temperature);
|
||||
printf("ADC3 = %d raw\n",
|
||||
adc_sensors.value(ZOUL_SENSORS_ADC3));
|
||||
|
||||
etimer_set(&et, LOOP_INTERVAL);
|
||||
rtimer_set(&rt, RTIMER_NOW() + LEDS_OFF_HYSTERISIS, 1,
|
||||
|
@ -170,11 +164,11 @@ PROCESS_THREAD(cc2538_demo_process, ev, data)
|
|||
if(data == &button_sensor) {
|
||||
if(button_sensor.value(BUTTON_SENSOR_VALUE_TYPE_LEVEL) ==
|
||||
BUTTON_SENSOR_PRESSED_LEVEL) {
|
||||
printf("Press\n");
|
||||
printf("Button pressed\n");
|
||||
packetbuf_copyfrom(&counter, sizeof(counter));
|
||||
broadcast_send(&bc);
|
||||
} else {
|
||||
printf("Release\n");
|
||||
printf("...and released!\n");
|
||||
}
|
||||
}
|
||||
} else if(ev == serial_line_event_message) {
|
|
@ -103,7 +103,7 @@ void menu_process(char c);
|
|||
extern char usb_busy;
|
||||
|
||||
//! Counter for USB Serial port
|
||||
extern U8 tx_counter;
|
||||
extern U8 tx_counter;
|
||||
|
||||
//! Timers for LEDs
|
||||
uint8_t led3_timer;
|
||||
|
|
|
@ -28,11 +28,21 @@ MODULES += core/net core/net/mac \
|
|||
core/net/mac/contikimac \
|
||||
core/net/llsec
|
||||
|
||||
PYTHON = python
|
||||
BSL_FLAGS += -e -w -v
|
||||
|
||||
ifdef PORT
|
||||
BSL_FLAGS += -p $(PORT)
|
||||
endif
|
||||
|
||||
BSL = $(CONTIKI)/tools/cc2538-bsl/cc2538-bsl.py
|
||||
|
||||
%.upload: %.bin
|
||||
%.upload: %.bin %.elf
|
||||
ifeq ($(wildcard $(BSL)), )
|
||||
@echo "ERROR: Could not find the cc2538-bsl script. Did you run 'git submodule update --init' ?"
|
||||
else
|
||||
python $(BSL) -e -w -v $<
|
||||
$(eval BSL_ADDRESS_ARG := -a $(shell $(OBJDUMP) -h $*.elf | grep -B1 LOAD | \
|
||||
grep -Ev 'LOAD|\-\-' | awk '{print "0x" $$5}' | \
|
||||
sort -g | head -1))
|
||||
$(PYTHON) $(BSL) $(BSL_FLAGS) $(BSL_ADDRESS_ARG) $<
|
||||
endif
|
||||
|
|
|
@ -31,6 +31,7 @@ In terms of hardware support, the following drivers have been implemented:
|
|||
* ADC
|
||||
* Cryptoprocessor (AES-CCM-256, SHA-256)
|
||||
* Public Key Accelerator (ECDH, ECDSA)
|
||||
* Flash-based port of Coffee
|
||||
* SmartRF06 EB and BB peripherals
|
||||
* LEDs
|
||||
* Buttons
|
||||
|
|
|
@ -57,21 +57,6 @@ typedef uint32_t rtimer_clock_t;
|
|||
#define FLASH_CCA_CONF_BOOTLDR_BACKDOOR_ACTIVE_HIGH 0 /**< A logic low level activates the boot loader */
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Flash Memory configuration
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#ifndef FLASH_CONF_ORIGIN
|
||||
#define FLASH_CONF_ORIGIN 0x00200000
|
||||
#endif
|
||||
|
||||
#ifndef FLASH_CONF_SIZE
|
||||
#define FLASH_CONF_SIZE 0x00080000 /* 512 KiB */
|
||||
#endif
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Watchdog Timer configuration
|
||||
|
|
|
@ -191,7 +191,7 @@ contiki_init(void)
|
|||
/* Initialize communication stack */
|
||||
netstack_init();
|
||||
printf("%s/%s/%s, channel check rate %lu Hz\n",
|
||||
NETSTACK_NETWORK.name, NETSTACK_MAC.name, NETSTACK_RDC.name,
|
||||
NETSTACK_NETWORK.name, NETSTACK_MAC.name, NETSTACK_RDC.name,
|
||||
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1:
|
||||
NETSTACK_RDC.channel_check_interval()));
|
||||
|
||||
|
|
|
@ -241,7 +241,7 @@ contiki_init()
|
|||
/* Initialize communication stack */
|
||||
netstack_init();
|
||||
printf("%s/%s/%s, channel check rate %lu Hz\n",
|
||||
NETSTACK_NETWORK.name, NETSTACK_MAC.name, NETSTACK_RDC.name,
|
||||
NETSTACK_NETWORK.name, NETSTACK_MAC.name, NETSTACK_RDC.name,
|
||||
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1:
|
||||
NETSTACK_RDC.channel_check_interval()));
|
||||
|
||||
|
@ -294,11 +294,11 @@ contiki_init()
|
|||
int i;
|
||||
lladdr = uip_ds6_get_link_local(-1);
|
||||
for(i = 0; i < 7; ++i) {
|
||||
printf("%02x%02x:", lladdr->ipaddr.u8[i * 2],
|
||||
lladdr->ipaddr.u8[i * 2 + 1]);
|
||||
printf("%02x%02x:", lladdr->ipaddr.u8[i * 2],
|
||||
lladdr->ipaddr.u8[i * 2 + 1]);
|
||||
}
|
||||
printf("%02x%02x\n", lladdr->ipaddr.u8[14],
|
||||
lladdr->ipaddr.u8[15]);
|
||||
lladdr->ipaddr.u8[15]);
|
||||
}
|
||||
|
||||
if(1) {
|
||||
|
@ -417,10 +417,9 @@ JNIEXPORT void JNICALL
|
|||
Java_org_contikios_cooja_corecomm_CLASSNAME_setMemory(JNIEnv *env, jobject obj, jint rel_addr, jint length, jbyteArray mem_arr)
|
||||
{
|
||||
jbyte *mem = (*env)->GetByteArrayElements(env, mem_arr, 0);
|
||||
memcpy(
|
||||
(char*) (((long)rel_addr) + referenceVar),
|
||||
mem,
|
||||
length);
|
||||
memcpy((char*) (((long)rel_addr) + referenceVar),
|
||||
mem,
|
||||
length);
|
||||
(*env)->ReleaseByteArrayElements(env, mem_arr, mem, 0);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -453,7 +452,7 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_tick(JNIEnv *env, jobject obj)
|
|||
doActionsBeforeTick();
|
||||
|
||||
/* Poll etimer process */
|
||||
if (etimer_pending()) {
|
||||
if(etimer_pending()) {
|
||||
etimer_request_poll();
|
||||
}
|
||||
|
||||
|
@ -481,9 +480,9 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_tick(JNIEnv *env, jobject obj)
|
|||
nextRtimer = rtimer_arch_next() - (rtimer_clock_t) simCurrentTime;
|
||||
if(etimer_pending() && rtimer_arch_pending()) {
|
||||
simNextExpirationTime = MIN(nextEtimer, nextRtimer);
|
||||
} else if (etimer_pending()) {
|
||||
} else if(etimer_pending()) {
|
||||
simNextExpirationTime = nextEtimer;
|
||||
} else if (rtimer_arch_pending()) {
|
||||
} else if(rtimer_arch_pending()) {
|
||||
simNextExpirationTime = nextRtimer;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -327,7 +327,8 @@ init(void)
|
|||
return 0;
|
||||
} else {
|
||||
rx_frame_buffer = &input_array[put_index];
|
||||
} input_frame_buffer = rx_frame_buffer;
|
||||
}
|
||||
input_frame_buffer = rx_frame_buffer;
|
||||
|
||||
process_start(µmac_radio_process, NULL);
|
||||
|
||||
|
@ -361,7 +362,8 @@ on(void)
|
|||
);
|
||||
} else {
|
||||
missed_radio_on_request = 1;
|
||||
} ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
||||
}
|
||||
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
||||
listen_on = 1;
|
||||
return 1;
|
||||
}
|
||||
|
@ -436,7 +438,8 @@ transmit(unsigned short payload_len)
|
|||
RIMESTATS_ADD(noacktx);
|
||||
} else {
|
||||
ret = RADIO_TX_ERR;
|
||||
} return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
|
@ -452,8 +455,8 @@ prepare(const void *payload, unsigned short payload_len)
|
|||
}
|
||||
if(payload_len > 127 || payload == NULL) {
|
||||
return 1;
|
||||
/* Copy payload to (soft) Ttx buffer */
|
||||
}
|
||||
/* Copy payload to (soft) Ttx buffer */
|
||||
memcpy(tx_frame_buffer.uPayload.au8Byte, payload, payload_len);
|
||||
i = payload_len;
|
||||
#if CRC_SW
|
||||
|
@ -563,6 +566,7 @@ read(void *buf, unsigned short bufsize)
|
|||
len = input_frame_buffer->u8PayloadLength;
|
||||
|
||||
if(len <= CHECKSUM_LEN) {
|
||||
input_frame_buffer->u8PayloadLength = 0;
|
||||
return 0;
|
||||
} else {
|
||||
len -= CHECKSUM_LEN;
|
||||
|
@ -599,8 +603,9 @@ read(void *buf, unsigned short bufsize)
|
|||
}
|
||||
} else {
|
||||
len = 0;
|
||||
/* Disable further read attempts */
|
||||
} input_frame_buffer->u8PayloadLength = 0;
|
||||
}
|
||||
/* Disable further read attempts */
|
||||
input_frame_buffer->u8PayloadLength = 0;
|
||||
}
|
||||
|
||||
return len;
|
||||
|
|
|
@ -49,8 +49,9 @@
|
|||
#define RTIMER_ARCH_SECOND (F_CPU / 2)
|
||||
#endif
|
||||
|
||||
#define US_TO_RTIMERTICKS(D) ((int64_t)(D) << 4)
|
||||
#define RTIMERTICKS_TO_US(T) ((int64_t)(T) >> 4)
|
||||
#define US_TO_RTIMERTICKS(D) ((int64_t)(D) << 4)
|
||||
#define RTIMERTICKS_TO_US(T) ((int64_t)(T) >> 4)
|
||||
#define RTIMERTICKS_TO_US_64(T) RTIMERTICKS_TO_US(T)
|
||||
|
||||
rtimer_clock_t rtimer_arch_now(void);
|
||||
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
# Remote platform makefile
|
||||
|
||||
ifndef CONTIKI
|
||||
$(error CONTIKI not defined! You must specify where CONTIKI resides!)
|
||||
endif
|
||||
|
||||
PYTHON = python
|
||||
BSL_FLAGS += -e -w -v -b 115200
|
||||
|
||||
ifdef PORT
|
||||
BSL_FLAGS += -p $(PORT)
|
||||
endif
|
||||
|
||||
CONTIKI_TARGET_DIRS = . dev
|
||||
|
||||
CONTIKI_TARGET_SOURCEFILES += leds.c leds-arch.c
|
||||
CONTIKI_TARGET_SOURCEFILES += contiki-main.c
|
||||
CONTIKI_TARGET_SOURCEFILES += sensors.c remote-sensors.c
|
||||
CONTIKI_TARGET_SOURCEFILES += button-sensor.c antenna-sw.c
|
||||
CONTIKI_TARGET_SOURCEFILES += phidget-sensor.c tmp102.c
|
||||
|
||||
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
|
||||
|
||||
CLEAN += *.remote
|
||||
|
||||
### Unless the example dictates otherwise, build with code size optimisations
|
||||
ifndef SMALL
|
||||
SMALL = 1
|
||||
endif
|
||||
|
||||
### Define the CPU directory
|
||||
CONTIKI_CPU=$(CONTIKI)/cpu/cc2538
|
||||
include $(CONTIKI_CPU)/Makefile.cc2538
|
||||
|
||||
MODULES += core/net core/net/mac \
|
||||
core/net/mac/contikimac \
|
||||
core/net/llsec
|
||||
|
||||
BSL = $(CONTIKI)/tools/cc2538-bsl/cc2538-bsl.py
|
||||
|
||||
%.upload: %.bin
|
||||
ifeq ($(wildcard $(BSL)), )
|
||||
@echo "ERROR: Could not find the cc2538-bsl script. Did you run 'git submodule update --init' ?"
|
||||
else
|
||||
$(PYTHON) $(BSL) $(BSL_FLAGS) $<
|
||||
endif
|
|
@ -1,278 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/** \addtogroup remote
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-peripherals Re-Mote Peripherals
|
||||
*
|
||||
* Defines related to the Re-Mote
|
||||
*
|
||||
* This file provides connectivity information on LEDs, Buttons, UART and
|
||||
* other Re-Mote peripherals
|
||||
*
|
||||
* This file can be used as the basis to configure other platforms using the
|
||||
* cc2538 SoC.
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file with definitions related to the I/O connections on the Zolertia's
|
||||
* Re-Mote platform, cc2538-based
|
||||
*
|
||||
* \note Do not include this file directly. It gets included by contiki-conf
|
||||
* after all relevant directives have been set.
|
||||
*/
|
||||
#ifndef BOARD_H_
|
||||
#define BOARD_H_
|
||||
|
||||
#include "dev/gpio.h"
|
||||
#include "dev/nvic.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Re-Mote LED configuration
|
||||
*
|
||||
* LEDs on the Re-mote are connected as follows:
|
||||
* - LED1 (Red) -> PD2
|
||||
* - LED2 (Blue) -> PC3
|
||||
* - LED3 (Green) -> PD5
|
||||
*
|
||||
* LED1 routed also to JP5 connector
|
||||
* LED2 shares the same pin with Watchdog WDI pulse and routed to JP8 connector
|
||||
* LED3 routed also to JP5 connector
|
||||
* @{
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Some files include leds.h before us, so we need to get rid of defaults in
|
||||
* leds.h before we provide correct definitions */
|
||||
#undef LEDS_GREEN
|
||||
#undef LEDS_YELLOW
|
||||
#undef LEDS_BLUE
|
||||
#undef LEDS_RED
|
||||
#undef LEDS_CONF_ALL
|
||||
|
||||
/* In leds.h the LEDS_BLUE is defined by LED_YELLOW definition */
|
||||
#define LEDS_GREEN 1 /**< LED1 (Green) -> PD5 */
|
||||
#define LEDS_BLUE 2 /**< LED2 (Blue) -> PC3 */
|
||||
#define LEDS_RED 4 /**< LED3 (Red) -> PD2 */
|
||||
|
||||
#define LEDS_CONF_ALL 7
|
||||
|
||||
#define LEDS_LIGHT_BLUE (LEDS_GREEN | LEDS_BLUE) /**< Green + Blue (3) */
|
||||
#define LEDS_YELLOW (LEDS_GREEN | LEDS_RED) /**< Green + Red (5) */
|
||||
#define LEDS_PURPLE (LEDS_BLUE | LEDS_RED) /**< Blue + Red (6) */
|
||||
#define LEDS_WHITE LEDS_ALL /**< Green + Blue + Red (7) */
|
||||
|
||||
/* Notify various examples that we have LEDs */
|
||||
#define PLATFORM_HAS_LEDS 1
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name USB configuration
|
||||
*
|
||||
* The USB pullup is enabled by an external resistor, not mapped to a GPIO
|
||||
*/
|
||||
#ifdef USB_PULLUP_PORT
|
||||
#undef USB_PULLUP_PORT
|
||||
#endif
|
||||
#ifdef USB_PULLUP_PIN
|
||||
#undef USB_PULLUP_PIN
|
||||
#endif
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name UART configuration
|
||||
*
|
||||
* On the Re-Mote, the UART is connected to the following ports/pins
|
||||
* - UART0:
|
||||
* - RX: PA0
|
||||
* - TX: PA1
|
||||
* - UART1:
|
||||
* - RX: PC6
|
||||
* - TX: PC5
|
||||
* - CTS:
|
||||
* - RTS:
|
||||
* We configure the port to use UART0 and UART1, CTS/RTS only for UART1,
|
||||
* both without a HW pull-up resistor
|
||||
* @{
|
||||
*/
|
||||
#define UART0_RX_PORT GPIO_A_NUM
|
||||
#define UART0_RX_PIN 0
|
||||
#define UART0_TX_PORT GPIO_A_NUM
|
||||
#define UART0_TX_PIN 1
|
||||
|
||||
#define UART1_RX_PORT GPIO_C_NUM
|
||||
#define UART1_RX_PIN 6
|
||||
#define UART1_TX_PORT GPIO_C_NUM
|
||||
#define UART1_TX_PIN 5
|
||||
#define UART1_CTS_PORT GPIO_C_NUM
|
||||
#define UART1_CTS_PIN 1
|
||||
#define UART1_RTS_PORT GPIO_C_NUM
|
||||
#define UART1_RTS_PIN 2
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \name Re-Mote Button configuration
|
||||
*
|
||||
* Buttons on the Re-Mote are connected as follows:
|
||||
* - BUTTON_USER -> PA3, S1 user button, shared with bootloader
|
||||
* - BUTTON_RESET -> RESET_N line, S2 reset both CC2538 and CoP
|
||||
* - BUTTON_VBAT -> Power switch, not mounted by default
|
||||
* @{
|
||||
*/
|
||||
/** BUTTON_USER -> PA3 */
|
||||
#define BUTTON_USER_PORT GPIO_A_NUM
|
||||
#define BUTTON_USER_PIN 3
|
||||
#define BUTTON_USER_VECTOR NVIC_INT_GPIO_PORT_A
|
||||
|
||||
/* Notify various examples that we have Buttons */
|
||||
#define PLATFORM_HAS_BUTTON 1
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name ADC configuration
|
||||
*
|
||||
* These values configure which CC2538 pins and ADC channels to use for the ADC
|
||||
* inputs. By default the Re-Mote allows two out-of-the-box ADC ports with a
|
||||
* phidget-like 3-pin connector (GND/3V3/ADC)
|
||||
*
|
||||
* ADC inputs can only be on port A.
|
||||
* @{
|
||||
*/
|
||||
#define ADC_PHIDGET_PORT GPIO_A_NUM /**< Phidget GPIO control port */
|
||||
#define ADC_PHIDGET_ADC2_PIN 6 /**< ADC2 to PA6, 3V3 */
|
||||
#define ADC_PHIDGET_ADC3_PIN 7 /**< ADC3 to PA7, 3V3 */
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name SPI (SSI0) configuration
|
||||
*
|
||||
* These values configure which CC2538 pins to use for the SPI (SSI0) lines,
|
||||
* shared with the CC1120 RF transceiver
|
||||
* TX -> MOSI, RX -> MISO
|
||||
* @{
|
||||
*/
|
||||
#define SPI0_CLK_PORT GPIO_D_NUM
|
||||
#define SPI0_CLK_PIN 1
|
||||
#define SPI0_TX_PORT GPIO_D_NUM
|
||||
#define SPI0_TX_PIN 0
|
||||
#define SPI0_RX_PORT GPIO_C_NUM
|
||||
#define SPI0_RX_PIN 4
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name SPI (SSI1) configuration
|
||||
*
|
||||
* These values configure which CC2538 pins to use for the SPI (SSI1) lines,
|
||||
* shared with the microSD, not routed anywhere.
|
||||
* TX -> MOSI, RX -> MISO
|
||||
* @{
|
||||
*/
|
||||
#define SPI1_CLK_PORT GPIO_B_NUM
|
||||
#define SPI1_CLK_PIN 5
|
||||
#define SPI1_TX_PORT GPIO_C_NUM
|
||||
#define SPI1_TX_PIN 7
|
||||
#define SPI1_RX_PORT GPIO_A_NUM
|
||||
#define SPI1_RX_PIN 4
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name I2C configuration
|
||||
*
|
||||
* These values configure which CC2538 pins to use for the I2C lines, shared
|
||||
* with the TMP102 built-in temperature sensor
|
||||
* @{
|
||||
*/
|
||||
#define I2C_SCL_PORT GPIO_B_NUM
|
||||
#define I2C_SCL_PIN 1
|
||||
#define I2C_SDA_PORT GPIO_B_NUM
|
||||
#define I2C_SDA_PIN 0
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Antenna switch configuration
|
||||
*
|
||||
* These values configure the required pin to drive the antenna switch, to
|
||||
* use either the built-in ceramic antenna or an external one over the uFL
|
||||
* connector
|
||||
* - Internal antenna: LOW
|
||||
* - External antenna: HIGH
|
||||
* @{
|
||||
*/
|
||||
#define ANTENNA_2_4GHZ_SW_PORT GPIO_D_NUM
|
||||
#define ANTENNA_2_4GHZ_SW_PIN 4
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name CC1120/CC1200 configuration
|
||||
*
|
||||
* These values configure the required pins to drive the CC1120/CC1200
|
||||
* @{
|
||||
*/
|
||||
#define CC1120_SPI_SCLK_PORT SPI0_CLK_PORT
|
||||
#define CC1120_SPI_SCLK_PIN SPI0_CLK_PIN
|
||||
#define CC1120_SPI_MOSI_PORT SPIO0_TX_PORT
|
||||
#define CC1120_SPI_MOSI_PIN SPIO0_TX_PIN
|
||||
#define CC1120_SPI_MISO_PORT SPIO0_RX_PORT
|
||||
#define CC1120_SPI_MISO_PIN SPIO0_RX_PIN
|
||||
#define CC1120_SPI_CSN_PORT GPIO_D_NUM
|
||||
#define CC1120_SPI_CSN_PIN 3
|
||||
#define CC1120_GDO0_PORT GPIO_B_NUM
|
||||
#define CC1120_GDO0_PIN 4
|
||||
#define CC1120_GDO2_PORT GPIO_B_NUM
|
||||
#define CC1120_GDO2_PIN 3
|
||||
#define CC1120_RESET_PORT GPIO_B_NUM
|
||||
#define CC1120_RESET_PIN 2
|
||||
#define CC1120_GPIO0_VECTOR NVIC_INT_GPIO_PORT_B
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name microSD configuration
|
||||
*
|
||||
* These values configure the required pins to drive the built-in microSD
|
||||
* external module, to be used with SSI1
|
||||
* @{
|
||||
*/
|
||||
#define USD_CLK_PORT SPI1_CLK_PORT
|
||||
#define USD_CLK_PIN SPI1_CLK_PIN
|
||||
#define USD_MOSI_PORT SPI1_TX_PORT
|
||||
#define USD_MOSI_PIN SPI1_TX_PIN
|
||||
#define USD_MISO_PORT SPI1_RX_PORT
|
||||
#define USD_MISO_PIN SPI1_RX_PIN
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Device string used on startup
|
||||
* @{
|
||||
*/
|
||||
#define BOARD_STRING "Zolertia Re-Mote platform"
|
||||
/** @} */
|
||||
|
||||
#endif /* BOARD_H_ */
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
|
@ -45,16 +45,64 @@ In terms of hardware support, the following drivers have been implemented:
|
|||
* Buzzer
|
||||
* External SPI flash
|
||||
|
||||
Requirements
|
||||
============
|
||||
To use the port you need:
|
||||
|
||||
* TI's CC26xxware sources. The correct version will be installed automatically
|
||||
as a submodule when you clone Contiki.
|
||||
* TI's CC13xxware sources. The correct version will be installed automatically
|
||||
as a submodule when you clone Contiki.
|
||||
* Contiki can automatically upload firmware to the nodes over serial with the
|
||||
included [cc2538-bsl script](https://github.com/JelmerT/cc2538-bsl).
|
||||
Note that uploading over serial doesn't work for the Sensortag, you can use
|
||||
TI's SmartRF Flash Programmer in this case.
|
||||
* A toolchain to build firmware: The port has been developed and tested with
|
||||
GNU Tools for ARM Embedded Processors <https://launchpad.net/gcc-arm-embedded>.
|
||||
The port was developed and tested using this version:
|
||||
|
||||
$ arm-none-eabi-gcc -v
|
||||
[...]
|
||||
gcc version 4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278] (GNU Tools for ARM Embedded Processors)
|
||||
|
||||
* srecord (http://srecord.sourceforge.net/)
|
||||
* You may also need other drivers so that the SmartRF can communicate with your
|
||||
operating system and so that you can use the chip's UART for I/O. Please read
|
||||
the section ["Drivers" in the CC2538DK readme](https://github.com/contiki-os/contiki/tree/master/platform/cc2538dk#drivers).
|
||||
|
||||
Examples
|
||||
========
|
||||
The port comes with two examples: A very basic example and a mode advanced one
|
||||
(web demo). The former demonstrates how to read sensors and how to use board
|
||||
peripherals. It also demonstrates how to send out BLE advertisements.
|
||||
The latter includes a CoAP server, an MQTT client which connects and publishes
|
||||
to the IBM quickstart service, a net-based UART and lastly a web server that
|
||||
can be used to configure the rest of the example.
|
||||
The port comes with three examples:
|
||||
- A very basic example which demonstrates how to read sensors and how to use board peripherals. It also demonstrates how to send out BLE advertisements.
|
||||
- A more advanced one (web demo) which includes a CoAP server, an MQTT client which connects and publishes to the IBM quickstart service, a net-based UART and lastly a web server that can be used to configure the rest of the example.
|
||||
- An example demonstrating a very sleepy node.
|
||||
|
||||
More details about those two examples can be found in their respective READMEs.
|
||||
More details about those three examples can be found in their respective READMEs.
|
||||
|
||||
Build your First Example
|
||||
------------------------
|
||||
It is recommended to start with the `cc26xx-demo` example under `examples/cc26xx/`. This is a very simple example which will help you get familiar with the hardware and the environment. This example can be used for the Sensortag and SmartRF06 EB.
|
||||
|
||||
Strictly speaking, to build it you need to run `make TARGET=srf06-cc26xx BOARD=srf06/cc26xx`. However, the example directories contain a `Makefile.target` which is automatically included and specifies the correct `TARGET=` argument. The `BOARD=` environment variable defaults to `srf06/cc26xx` (which is the SmartRF06 EB + CC26XXEM). Thus, for examples under the `cc26xx` directory, and when using the SmartRF06 EB, you can simply run `make`.
|
||||
|
||||
Other options for the `BOARD` make variable are:
|
||||
|
||||
* Srf06+CC26xxEM: Set `BOARD=srf06/cc26xx`
|
||||
* Srf06+CC13xxEM: Set `BOARD=srf06/cc13xx`
|
||||
* CC2650 tag: Set `BOARD=sensortag/cc2650`
|
||||
|
||||
If the `BOARD` variable is unspecified, an image for the Srf06 CC26XXEM will be built.
|
||||
|
||||
If you want to switch between building for one platform to the other, make certain to `make clean` before building for the new one, or you will get linker
|
||||
errors.
|
||||
|
||||
If you want to upload the compiled firmware to a node via the serial boot loader you need to manually enable the boot loader and then use `make cc26xx-demo.upload`. On the SmartRF06 board you enable the boot loader by resetting the board (EM RESET button) while holding the `select` button. (The boot loader backdoor needs to be enabled on the chip, and the chip needs to be configured correctly, for this to work. See README in the `tools/cc2538-bsl` directory for more info). The serial uploader script will automatically pick the first available serial port. If this is not the port where your node is connected, you can force the script to use a specific port by defining the `PORT` argument eg. `make cc26xx-demo.upload PORT=/dev/tty.usbserial`
|
||||
|
||||
Note that uploading over serial doesn't work for the Sensortag, you can use TI's SmartRF Flash Programmer in this case.
|
||||
|
||||
For the `cc26xx-demo`, the included readme describes in detail what the example does.
|
||||
|
||||
To generate an assembly listing of the compiled firmware, run `make cc26xx-demo.lst`. This may be useful for debugging or optimizing your application code. To intersperse the C source code within the assembly listing, you must instruct the compiler to include debugging information by adding `CFLAGS += -g` to the project Makefile and rebuild by running `make clean cc26xx-demo.lst`.
|
||||
|
||||
CC13xx/CC26xx Border Router over UART
|
||||
=====================================
|
||||
|
@ -94,28 +142,6 @@ that limit the size of the uIP buffer. Removing the two lines below from
|
|||
Do not forget to set the correct channel by defining `RF_CORE_CONF_CHANNEL` as
|
||||
required.
|
||||
|
||||
Requirements
|
||||
============
|
||||
To use the port you need:
|
||||
|
||||
* TI's CC26xxware sources. The correct version will be installed automatically
|
||||
as a submodule when you clone Contiki.
|
||||
* TI's CC13xxware sources. The correct version will be installed automatically
|
||||
as a submodule when you clone Contiki.
|
||||
* Software to program the nodes. Use TI's SmartRF Flash Programmer
|
||||
* A toolchain to build firmware: The port has been developed and tested with
|
||||
GNU Tools for ARM Embedded Processors <https://launchpad.net/gcc-arm-embedded>.
|
||||
The port was developed and tested using this version:
|
||||
|
||||
$ arm-none-eabi-gcc -v
|
||||
[...]
|
||||
gcc version 4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278] (GNU Tools for ARM Embedded Processors)
|
||||
|
||||
* srecord (http://srecord.sourceforge.net/)
|
||||
* You may also need other drivers so that the SmartRF can communicate with your
|
||||
operating system and so that you can use the chip's UART for I/O. Please read
|
||||
the section ["Drivers" in the CC2538DK readme](https://github.com/contiki-os/contiki/tree/master/platform/cc2538dk#drivers).
|
||||
|
||||
Filename conflicts between Contiki and CC26xxware
|
||||
=================================================
|
||||
There is a file called `timer.c` both in Contiki as well as in CC26xxware. The
|
||||
|
@ -124,25 +150,6 @@ start using it at some point, you will need to rename it:
|
|||
|
||||
From `cpu/cc26xx/lib/cc26xxware/driverlib/timer.c` to `driverlib-timer.c`
|
||||
|
||||
Sensortag vs Srf06
|
||||
==================
|
||||
To build for the sensortag, you will need to set the `BOARD` make variable as
|
||||
follows:
|
||||
|
||||
* Srf06+CC26xxEM: Set `BOARD=srf06/cc26xx`
|
||||
* Srf06+CC13xxEM: Set `BOARD=srf06/cc13xx`
|
||||
* CC2650 tag: Set `BOARD=sensortag/cc2650`
|
||||
|
||||
You can do that by exporting `BOARD` as an environment variable, by adding it
|
||||
to your Makefile or by adding it to your make command as an argument.
|
||||
|
||||
If the `BOARD` variable is unspecified, an image for the Srf06 CC26XXEM will be
|
||||
built.
|
||||
|
||||
If you want to switch between building for one platform to the other, make
|
||||
certain to `make clean` before building for the new one, or you will get linker
|
||||
errors.
|
||||
|
||||
Sensortag UART usage (with or without the Debugger Devpack)
|
||||
===========================================================
|
||||
There are two ways to get debugging (printf etc) output from the Sensortag.
|
||||
|
|
|
@ -3,3 +3,19 @@ CFLAGS += -DBOARD_SMARTRF06EB=1
|
|||
CONTIKI_TARGET_DIRS += srf06
|
||||
|
||||
BOARD_SOURCEFILES += leds-arch.c srf06-sensors.c button-sensor.c board.c
|
||||
|
||||
PYTHON = python
|
||||
BSL_FLAGS += -e -w -v
|
||||
|
||||
ifdef PORT
|
||||
BSL_FLAGS += -p $(PORT)
|
||||
endif
|
||||
|
||||
BSL = $(CONTIKI)/tools/cc2538-bsl/cc2538-bsl.py
|
||||
|
||||
%.upload: %.bin
|
||||
ifeq ($(wildcard $(BSL)), )
|
||||
@echo "ERROR: Could not find the cc2538-bsl script. Did you run 'git submodule update --init' ?"
|
||||
else
|
||||
$(PYTHON) $(BSL) $(BSL_FLAGS) $<
|
||||
endif
|
||||
|
|
|
@ -122,5 +122,4 @@ status(int type)
|
|||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
SENSORS_SENSOR(acc_sensor, ACC_SENSOR,
|
||||
value, configure, status);
|
||||
SENSORS_SENSOR(acc_sensor, ACC_SENSOR, value, configure, status);
|
||||
|
|
|
@ -100,5 +100,4 @@ configure(int type, int c)
|
|||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
SENSORS_SENSOR(ext_sensor, "Ext",
|
||||
value, configure, status);
|
||||
SENSORS_SENSOR(ext_sensor, "Ext", value, configure, status);
|
||||
|
|
|
@ -57,12 +57,11 @@ ifeq ($(HOST_OS),Darwin)
|
|||
ifndef MOTELIST
|
||||
USBDEVPREFIX=
|
||||
SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-linux
|
||||
MOTELIST = $(CONTIKI)/tools/z1/motelist-z1-macos
|
||||
BSL = $(CONTIKI)/tools/z1/z1-bsl-nopic --z1
|
||||
MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia-macos
|
||||
BSL = $(CONTIKI)/tools/zolertia/z1-bsl-nopic --z1
|
||||
BSL_FILETYPE = -I
|
||||
MOTES = $(shell $(MOTELIST) -c 2>&- | \
|
||||
MOTES = $(shell $(MOTELIST) -b z1 -c 2>&- | \
|
||||
cut -f 2 -d ,)
|
||||
CMOTES=$(MOTES)
|
||||
REFNUM = $(shell $(MOTELIST) -c 2>&- | \
|
||||
cut -f 1 -d , | tail -c5 | sed 's/^0*//')
|
||||
ifneq (,$(REFNUM))
|
||||
|
@ -77,10 +76,10 @@ else
|
|||
ifndef MOTELIST
|
||||
USBDEVPREFIX=
|
||||
SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-linux
|
||||
MOTELIST = $(CONTIKI)/tools/z1/motelist-z1
|
||||
BSL = $(CONTIKI)/tools/z1/z1-bsl-nopic --z1
|
||||
MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia
|
||||
BSL = $(CONTIKI)/tools/zolertia/z1-bsl-nopic --z1
|
||||
BSL_FILETYPE = -I
|
||||
MOTES = $(shell $(MOTELIST) -c 2>&- | \
|
||||
MOTES = $(shell $(MOTELIST) -b z1 -c 2>&- | \
|
||||
cut -f 2 -d , | \
|
||||
perl -ne 'print $$1 . " " if(m-(/dev/\w+)-);')
|
||||
CMOTES=$(MOTES)
|
||||
|
@ -95,12 +94,10 @@ else
|
|||
endif
|
||||
endif
|
||||
|
||||
|
||||
|
||||
motelist: z1-motelist
|
||||
|
||||
z1-motelist:
|
||||
motelist:
|
||||
$(MOTELIST)
|
||||
z1-motelist:
|
||||
$(MOTELIST) -b z1
|
||||
z1-motes:
|
||||
@echo $(MOTES)
|
||||
|
||||
|
|
100
platform/zoul/Makefile.zoul
Normal file
100
platform/zoul/Makefile.zoul
Normal file
|
@ -0,0 +1,100 @@
|
|||
### Zoul Makefile
|
||||
|
||||
ifndef CONTIKI
|
||||
$(error CONTIKI not defined! You must specify where CONTIKI resides!)
|
||||
endif
|
||||
|
||||
### If no board is specified the default option is the RE-Mote
|
||||
ifeq ($(BOARD),)
|
||||
BOARD=remote
|
||||
endif
|
||||
|
||||
PYTHON = python
|
||||
BSL_FLAGS += -e -w -v
|
||||
|
||||
ifdef PORT
|
||||
BSL_FLAGS += -p $(PORT)
|
||||
endif
|
||||
|
||||
### Configure the build for the board and pull in board-specific sources
|
||||
CONTIKI_TARGET_DIRS += . dev
|
||||
CONTIKI_TARGET_DIRS += . $(BOARD)
|
||||
PLATFORM_ROOT_DIR = $(CONTIKI)/platform/$(TARGET)
|
||||
|
||||
### Include the board dir if one exists
|
||||
-include $(PLATFORM_ROOT_DIR)/$(BOARD)/Makefile.$(BOARD)
|
||||
|
||||
### Include
|
||||
CONTIKI_TARGET_SOURCEFILES += contiki-main.c
|
||||
CONTIKI_TARGET_SOURCEFILES += leds.c leds-arch.c cc1200-zoul-arch.c
|
||||
CONTIKI_TARGET_SOURCEFILES += adc-sensors.c button-sensor.c zoul-sensors.c
|
||||
CONTIKI_TARGET_SOURCEFILES += $(BOARD_SOURCEFILES)
|
||||
|
||||
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
|
||||
|
||||
CLEAN += *.zoul
|
||||
|
||||
### Unless the example dictates otherwise, build with code size optimisations
|
||||
ifndef SMALL
|
||||
SMALL = 1
|
||||
endif
|
||||
|
||||
### Define the CPU directory
|
||||
CONTIKI_CPU=$(CONTIKI)/cpu/cc2538
|
||||
include $(CONTIKI_CPU)/Makefile.cc2538
|
||||
|
||||
MODULES += core/net core/net/mac \
|
||||
core/net/mac/contikimac \
|
||||
core/net/llsec dev/cc1200
|
||||
|
||||
BSL = $(CONTIKI)/tools/cc2538-bsl/cc2538-bsl.py
|
||||
|
||||
### USe the specific Zoul subplatform to query for connected devices
|
||||
ifdef MOTELIST_ZOLERTIA
|
||||
MOTELIST_FLAGS += -b $(MOTELIST_ZOLERTIA)
|
||||
endif
|
||||
|
||||
### Detect if a mote is connected over serial port
|
||||
ifeq ($(HOST_OS),Darwin)
|
||||
USBDEVPREFIX=
|
||||
MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia-macos
|
||||
MOTES = $(shell $(MOTELIST) -c 2>&- | cut -f 2 -d ,)
|
||||
else
|
||||
### If we are not running under Mac, we assume Linux
|
||||
USBDEVPREFIX=
|
||||
SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-linux
|
||||
MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia
|
||||
MOTES = $(shell $(MOTELIST) -b $(MOTELIST_ZOLERTIA) -c 2>&- | cut -f 2 -d , | \
|
||||
perl -ne 'print $$1 . " " if(m-(/dev/\w+)-);')
|
||||
endif
|
||||
|
||||
%.upload: %.bin %.elf
|
||||
ifeq ($(wildcard $(BSL)), )
|
||||
@echo "ERROR: Could not find the cc2538-bsl script. Did you run 'git submodule update --init' ?"
|
||||
else
|
||||
$(eval BSL_ADDRESS_ARG := -a $(shell $(OBJDUMP) -h $*.elf | grep -B1 LOAD | \
|
||||
grep -Ev 'LOAD|\-\-' | awk '{print "0x" $$5}' | \
|
||||
sort -g | head -1))
|
||||
$(PYTHON) $(BSL) $(BSL_FLAGS) $(BSL_ADDRESS_ARG) $<
|
||||
endif
|
||||
|
||||
motelist:
|
||||
$(MOTELIST)
|
||||
zoul-motelist:
|
||||
$(MOTELIST) $(MOTELIST_FLAGS)
|
||||
zoul-motes:
|
||||
@echo $(MOTES)
|
||||
|
||||
ifdef PORT
|
||||
serialview:
|
||||
$(SERIALDUMP) -b115200 $(USBDEVPREFIX) $(PORT) | $(CONTIKI)/tools/timestamp
|
||||
|
||||
login:
|
||||
$(SERIALDUMP) -b115200 $(USBDEVPREFIX) $(PORT)
|
||||
else
|
||||
serialview:
|
||||
$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(MOTES)) | $(CONTIKI)/tools/timestamp
|
||||
|
||||
login:
|
||||
$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(MOTES))
|
||||
endif
|
|
@ -1,41 +1,48 @@
|
|||
Zolertia Re-Mote platform
|
||||
Zolertia Zoul core module
|
||||
============================================
|
||||
|
||||
<a href="url"><img src="http://goo.gl/3AGZkI" align="center" height="320" ></a>
|
||||
![Zolertia Zoul Module][zoul]
|
||||
|
||||
The Re-Mote platform is a IoT Hardware development platform based on TI's CC2538
|
||||
system on chip (SoC), featuring an ARM Cortex-M3 with 512KB flash, 32Kb RAM,
|
||||
double RF interface, and the following goodies:
|
||||
The Zoul is a core module developed by Zolertia to target most IoT applications,
|
||||
providing a flexible and affordable module solution to integrate to most
|
||||
existing products and solutions, or ease the prototyping and production of new
|
||||
products in a short time.
|
||||
|
||||
The Zoul is based on TI's CC2538 system on chip (SoC), featuring an ARM
|
||||
Cortex-M3 with 512KB flash, 32Kb RAM, double RF interface, and the following
|
||||
goodies:
|
||||
|
||||
* ISM 2.4-GHz IEEE 802.15.4 & Zigbee compliant.
|
||||
* ISM 868-, 915-, 920-, 950-MHz ISM/SRD Band.
|
||||
* AES-128/256, SHA2 Hardware Encryption Engine.
|
||||
* ECC-128/256, RSA Hardware Acceleration Engine for Secure Key Exchange.
|
||||
* Power consumption down to 3uA using our shutdown mode.
|
||||
* Co-Processor to allow peripheral management, programming over BSL without requiring to press any button to enter bootloader mode.
|
||||
* Built-in battery charger (500mA), Energy Harvesting and Solar Panels to be connected to standards LiPo batteries.
|
||||
* Power input with wide range 2-26VDC.
|
||||
* Built-in TMP102 temperature sensor
|
||||
* Small form-factor (as the Z1 mote, half the size of an Arduino) 57x35 mm.
|
||||
* Small form-factor of 16.78 x 30.89 mm.
|
||||
* Prototype friendly, to fit on most prototyping boards (breadboard, etc.).
|
||||
* Self-contained and EMI-protected module under a shield.
|
||||
|
||||
The Zoul will be CE/FCC certified (2016) to allow a fast integration and short time to market for new products and solutions.
|
||||
|
||||
Zoul pin-out
|
||||
=============
|
||||
|
||||
![Zoul pin-out (front)][zoul-pinout-front]
|
||||
![Zoul pin-out (back)][zoul-pinout-back]
|
||||
|
||||
Port Features
|
||||
=============
|
||||
The platform has the following key features:
|
||||
The Zoul has the following key features:
|
||||
|
||||
* Deep Sleep support with RAM retention for ultra-low energy consumption.
|
||||
* Native USB support (CDC-ACM). SLIP over UART for border routers is no longer a bottleneck.
|
||||
* DMA transfers for increased performance (RAM to/from RF, RAM to/from USB).
|
||||
* Shutdown mode controlled externally by the Co-processor, completely power the
|
||||
platform OFF, further reducing current consumption.
|
||||
|
||||
In terms of hardware support, the following drivers have been implemented:
|
||||
In terms of hardware support, the following drivers have been implemented for the Zoul-based platforms:
|
||||
|
||||
* CC2538 System-on-Chip:
|
||||
* Standard Cortex M3 peripherals (NVIC, SCB, SysTick)
|
||||
* Sleep Timer (underpins rtimers)
|
||||
* SysTick (underpins the platform clock and Contiki's timers infrastructure)
|
||||
* RF
|
||||
* RF (2.4GHz)
|
||||
* UART
|
||||
* Watchdog (in watchdog mode)
|
||||
* USB (in CDC-ACM)
|
||||
|
@ -46,28 +53,25 @@ In terms of hardware support, the following drivers have been implemented:
|
|||
* ADC
|
||||
* Cryptoprocessor (AES-CCM-256, SHA-256)
|
||||
* Public Key Accelerator (ECDH, ECDSA)
|
||||
* Flash-based port of Coffee
|
||||
* LEDs
|
||||
* Buttons
|
||||
* Internal/external 2.4GHz antenna switch controllable by SW.
|
||||
* Built-in core temperature and battery sensor.
|
||||
* TMP102 temperature sensor driver.
|
||||
* CC1120 sub-1GHz radio interface:
|
||||
* Ported in Contiki, SPI based.
|
||||
* Micro-SD external storage:
|
||||
* Pending to port, SPI based.
|
||||
* CC1200 sub-1GHz radio interface.
|
||||
|
||||
There is a Zoul powering the RE-Mote and Firefly platforms, check out its specific README files for more information about on-board features.
|
||||
|
||||
Requirements
|
||||
============
|
||||
To start using Contiki, the following is required:
|
||||
|
||||
* A zoul-based board (RE-Mote, firefly)
|
||||
* A toolchain to compile Contiki for the CC2538.
|
||||
* Drivers so that your OS can communicate with your hardware.
|
||||
* Software to upload images to the CC2538.
|
||||
|
||||
|
||||
Install a Toolchain
|
||||
-------------------
|
||||
Forked from `platform/cc2538dk/README.md`.
|
||||
The toolchain used to build contiki is arm-gcc, also used by other arm-based Contiki ports. If you are using Instant Contiki, you will have a version pre-installed in your system. To find out if this is the case, try this:
|
||||
|
||||
$ arm-none-eabi-gcc -v
|
||||
|
@ -87,47 +91,25 @@ The platform is currently being used/tested with the following toolchains:
|
|||
|
||||
Drivers
|
||||
-------
|
||||
The Re-Mote features a FTDI serial-to-USB module, the driver is commonly found in most OS, but if required it can be downloaded
|
||||
from <http://www.ftdichip.com/Drivers/VCP.htm>
|
||||
Depending on your Zoul flavour, there are different options. As today the RE-Mote and Firefly platforms host a Zoul with a CP2104 USB-to-serial converter, governed by a low-power PIC to handle resetting and flashing the Zoul over USB, without having to press any button or use external tools.
|
||||
|
||||
The driver is available at <https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx>
|
||||
|
||||
### For the CC2538EM (USB CDC-ACM)
|
||||
The Re-Mote has built-in support for USB 2.0 USB, Vendor and Product IDs are the following:
|
||||
Check the board's specific README files for more information.
|
||||
|
||||
* VID 0x0451
|
||||
* PID 0x16C8
|
||||
For windows users, if using the USB 2.0 interface (via CDC-ACM driver), there is an available driver in this folder:
|
||||
|
||||
The implementation in Contiki is pure CDC-ACM: The Linux and OS X kernels know exactly what to do and drivers are not required.
|
||||
|
||||
On windows, you will need to provide a driver:
|
||||
|
||||
* Download this LUFA CDC-ACM driver:
|
||||
<https://github.com/abcminiuser/lufa/blob/master/Demos/Device/LowLevel/VirtualSerial/LUFA%20VirtualSerial.inf>
|
||||
* Adjust the VID and PID near the end with the values at the start of this section.
|
||||
* Next time you get prompted for the driver, include the directory containing the .inf file in the search path and the driver will be installed.
|
||||
|
||||
### Device Enumerations
|
||||
For the UART, serial line settings are 115200 8N1, no flow control.
|
||||
|
||||
Once all drivers have been installed correctly:
|
||||
|
||||
On windows, devices will appear as a virtual COM port.
|
||||
|
||||
On Linux and OS X, devices will appear under `/dev/`.
|
||||
|
||||
On OS X:
|
||||
|
||||
* XDS backchannel: `tty.usbserial-<serial number>`
|
||||
* EM in CDC-ACM: `tty.usbmodemf<X><ABC>` (X a letter, ABC a number e.g. `tty.usbmodemfd121`)
|
||||
|
||||
On Linux:
|
||||
|
||||
* Re-Mote over FTDI: `ttyUSB1`
|
||||
* Re-Mote over USB driver (in CDC-ACM): `ttyACMn` (n=0, 1, ....)
|
||||
`zolertia-zoul-cdc-acm`
|
||||
|
||||
Software to Program the Nodes
|
||||
-----------------------------
|
||||
The Re-Mote can be programmed via the jtag interface or via the serial boot loader on the chip.
|
||||
The Zoul can be programmed via the jtag interface or via the serial boot loader on the chip.
|
||||
|
||||
Both the RE-Mote and Firefly has a mini JTAG 10-pin male header, compatible with the `SmartRF06` development board, which can be used to flash and debug the platforms. Alternatively one could use the `JLink` programmer with a 20-to-10 pin converter like the following: <https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG-20-10/>.
|
||||
|
||||
The serial boot loader on the chip is exposed to the user via an USB interface. In the not so distant past we used to press a button sequence to unlock the boot loader, but now an on-board PIC in both RE-Motes and Fireflies handles this on its own, so it will detect the BSL sequence and flash the CC2538 without user intervention.
|
||||
|
||||
Instructions to flash for different OS are given below.
|
||||
|
||||
* On Windows:
|
||||
* Nodes can be programmed with TI's ArmProgConsole or the [SmartRF Flash Programmer 2][smart-rf-flashprog]. The README should be self-explanatory. With ArmProgConsole, upload the file with a `.bin` extension. (jtag + serial)
|
||||
|
@ -140,13 +122,13 @@ The Re-Mote can be programmed via the jtag interface or via the serial boot load
|
|||
* On OSX:
|
||||
* The `cc2538-bsl.py` script in `tools/cc2538-bsl/` is the only option. No extra software needs to be installed. (serial)
|
||||
|
||||
The file with a `.remote` extension is a copy of the `.elf` file.
|
||||
The file with a `.zoul` extension is a copy of the `.elf` file.
|
||||
|
||||
Use the Port
|
||||
============
|
||||
The following examples are intended to work off-the-shelf:
|
||||
|
||||
* Examples under `examples/remote`
|
||||
* Examples under `examples/zolertia/zoul`
|
||||
* MQTT example `examples/cc2538dk/mqtt-demo`
|
||||
* Border router: `examples/ipv6/rpl-border-router`
|
||||
* Webserver: `examples/webserver-ipv6`
|
||||
|
@ -154,24 +136,31 @@ The following examples are intended to work off-the-shelf:
|
|||
|
||||
Build your First Examples
|
||||
-------------------------
|
||||
It is recommended to start with the `remote-demo`, it is a simple example that walkthroughs the platform features, such as
|
||||
the built-in sensors, LEDs, user button operation modes (press, release, hold-press), radio (Rime broadcast).
|
||||
It is recommended to start with the `zoul-demo`, it is a simple example that walkthroughs the zoul features (can be compiled for both the RE-Mote and the Firefly), such as the built-in sensors, LEDs, user button operation modes (press, release, hold-press), radio (Rime broadcast).
|
||||
|
||||
The `Makefile.target` includes the `TARGET=` argument, predefining which is the target platform to compile for, it is automatically included at compilation. To generate or override an existing one, you can run:
|
||||
The `Makefile.target` includes the `TARGET=` argument, predefining which is the target platform to compile for, it is automatically included at compilation. The `BOARD=` argument is using as a glue switch to pull in specific platform files, for example the specific RE-Mote core drivers. If no `BOARD` argument is given, it will default to `remote` and compile for the RE-Mote platform.
|
||||
|
||||
`make TARGET=remote savetarget`
|
||||
To generate or override an existing one, you can run:
|
||||
|
||||
Then you can just run `make` to compile an application, otherwise you will need to do `make TARGET=remote`.
|
||||
`make TARGET=zoul savetarget`
|
||||
|
||||
Then you can just run `make` to compile an application, otherwise you will need to do `make TARGET=zoul`.
|
||||
|
||||
Alternatively you can export the following to your work environment:
|
||||
|
||||
`export BOARD=remote` or `export BOARD=firefly`
|
||||
|
||||
This will avoid having to type this argument at each compilation.
|
||||
|
||||
If you want to upload the compiled firmware to a node via the serial boot loader you need first to either manually enable the boot loader, or just let the Co-Processor detect the flash sequence and do it on your behalf, as simple as not pressing anything at all!
|
||||
|
||||
Then use `make remote-demo.upload PORT=/dev/ttyUSB1`.
|
||||
Then use `make zoul-demo.upload`.
|
||||
|
||||
The `PORT` argument is used to specify in which port the device is connected, as we are currently using a dual-channel FTDI chip, at the moment the programming channel is always assigned to the second FTDI channel, so the FTDI will enumerate as `/dev/ttyUSB0`, `/dev/ttyUSB1`, and we would need to use the later one and specify when flashing using the `cc2538-bsl` script, as it will use the first port found by default. This will be improved in the next release.
|
||||
The `PORT` argument could be used to specify in which port the device is connected, in case we have multiple devices connected at the same time.
|
||||
|
||||
To manually enable the boot loader, press the `reset` button on the board while holding the `user` button. (The boot loader backdoor needs to be enabled on the chip for this to work, see README in the `tools/cc2538-bsl` directory for more info)
|
||||
To generate an assembly listing of the compiled firmware, run `make zoul-demo.lst`. This may be useful for debugging or optimizing your application code. To intersperse the C source code within the assembly listing, you must instruct the compiler to include debugging information by adding `CFLAGS += -g` to the project Makefile and rebuild by running `make clean zoul-demo.lst`.
|
||||
|
||||
To generate an assembly listing of the compiled firmware, run `make remote-demo.lst`. This may be useful for debugging or optimizing your application code. To intersperse the C source code within the assembly listing, you must instruct the compiler to include debugging information by adding `CFLAGS += -g` to the project Makefile and rebuild by running `make clean remote-demo.lst`.
|
||||
To enable printing debug output to your console, use the `make login` to get the information over the USB programming/debugging port, or alternatively use `make serialview` to also add a timestamp in each print.
|
||||
|
||||
Node IEEE/RIME/IPv6 Addresses
|
||||
-----------------------------
|
||||
|
@ -193,16 +182,12 @@ This will result in the 2 last bytes of the IEEE address getting set to 0x79 0xA
|
|||
|
||||
Note: Some early production devices do not have am IEEE address written on the Info Page. For those devices, using value 0 above will result in a Rime address of all 0xFFs. If your device is in this category, define `IEEE_ADDR_CONF_HARDCODED` to 1 and specify `NODEID` to differentiate between devices.
|
||||
|
||||
|
||||
|
||||
Low-Power Modes
|
||||
---------------
|
||||
The CC2538 port supports power modes for low energy consumption. The SoC will enter a low power mode as part of the main loop when there are no more events to service.
|
||||
|
||||
LPM support can be disabled in its entirety by setting `LPM_CONF_ENABLE` to 0 in `contiki-conf.h` or `project-conf.h`.
|
||||
|
||||
NOTE: If you are using PG2 version of the Evaluation Module, the SoC will refuse to enter Power Modes 1+ if the debugger is connected and will always enter PM0 regardless of configuration. In order to get real low power mode functionality, make sure the debugger is disconnected. The Battery Board is ideal to test this.
|
||||
|
||||
The Low-Power module uses a simple heuristic to determine the best power mode, depending on anticipated Deep Sleep duration and the state of various peripherals.
|
||||
|
||||
In a nutshell, the algorithm first answers the following questions:
|
||||
|
@ -232,7 +217,7 @@ LPM is highly related to the operations of the Radio Duty Cycling (RDC) driver o
|
|||
* When NullRDC is in use, the radio will be always on. As a result, the algorithm discussed above will always choose PM0 and will never attempt to drop to PM1/2.
|
||||
|
||||
### Shutdown Mode
|
||||
The Re-Mote allows to further reduce power consumption by shutting down entirely all the components but the Co-Processor, powering completely of the CC2538 and CC1120 even preventing quiescent current from being drawn, allowing the platform to awake after a given period governed by the Co-Processor and the built-in battery management IC. This effectively reduces the power consumption down to 3-4uA.
|
||||
The RE-Mote has a built-in shutdown mode which effectively reduces the power consumption down to 300nA. Check its specific README file for more information.
|
||||
|
||||
Build headless nodes
|
||||
--------------------
|
||||
|
@ -248,7 +233,7 @@ Setting this define to 1 will automatically set the following to 0:
|
|||
|
||||
Code Size Optimisations
|
||||
-----------------------
|
||||
The build system currently uses optimization level `-Os`, which is controlled indirectly through the value of the `SMALL` make variable. This value can be overridden by example makefiles, or it can be changed directly in `platform/remote/Makefile.remote`.
|
||||
The build system currently uses optimization level `-Os`, which is controlled indirectly through the value of the `SMALL` make variable. This value can be overridden by example makefiles, or it can be changed directly in `platform/zoul/Makefile.zoul`.
|
||||
|
||||
Historically, the `-Os` flag has caused problems with some toolchains. If you are using one of the toolchains documented in this README, you should be able to use it without issues. If for whatever reason you do come across problems, try setting `SMALL=0` or replacing `-Os` with `-O2` in `cpu/cc2538/Makefile.cc2538`.
|
||||
|
||||
|
@ -258,7 +243,7 @@ This port's code has been documented with doxygen. To build the documentation, n
|
|||
|
||||
If you want to build this platform's documentation only and skip the remaining platforms, run this:
|
||||
|
||||
make basedirs="platform/remote core cpu/cc2538 examples/remote examples/cc2538dk"
|
||||
make basedirs="platform/zoul core cpu/cc2538 examples/zolertia/zoul examples/cc2538dk"
|
||||
|
||||
Once you've built the docs, open `$(CONTIKI)/doc/html/index.html` and enjoy.
|
||||
|
||||
|
@ -271,14 +256,26 @@ If you prefer this guide in other formats, use the excellent [pandoc] to convert
|
|||
|
||||
More Reading
|
||||
============
|
||||
1. [Zolertia Re-Mote website][remote-site]
|
||||
2. [CC2538 System-on-Chip Solution for 2.4-GHz IEEE 802.15.4 and ZigBee®/ZigBee IP® Applications, (SWRU319B)][cc2538]
|
||||
3. [CC1120 sub-1GHz RF transceiver][cc1120]
|
||||
1. [Zolertia website][zolertia-site]
|
||||
2. [CC2538 System-on-Chip Solution][cc2538]
|
||||
3. [CC1200 sub-1GHz RF transceiver][cc1200]
|
||||
4. [Zolertia Hackster channel][hackster]
|
||||
5. [IoT in five days open source and online book][IoT5days]
|
||||
|
||||
[remote-site]: http://www.zolertia.io/products "Zolertia Re-Mote"
|
||||
[cc1120]: http://www.ti.com/cc1120 "CC1120"
|
||||
Maintainers
|
||||
===========
|
||||
The Zoul and derived platforms (as well as the Z1 mote) are maintained by Zolertia.
|
||||
Main contributor: Antonio Lignan <alignan@zolertia.com>
|
||||
|
||||
[zolertia-site]: http://www.zolertia.io/products "Zolertia"
|
||||
[cc1200]: http://www.ti.com/product/cc1200 "CC1200"
|
||||
[smart-rf-studio]: http://www.ti.com/tool/smartrftm-studio "SmartRF Studio"
|
||||
[smart-rf-flashprog]: http://www.ti.com/tool/flash-programmer "SmartRF Flash Programmer"
|
||||
[cc2538]: http://www.ti.com/product/cc2538 "CC2538"
|
||||
[uniflash]: http://processors.wiki.ti.com/index.php/Category:CCS_UniFlash "UniFlash"
|
||||
[pandoc]: http://johnmacfarlane.net/pandoc/ "Pandoc - a universal document converter"
|
||||
[hackster]: https://www.hackster.io/zolertia "Zolertia Hackster Channel"
|
||||
[zoul]: images/zoul-front.png "Zolertia Zoul Module"
|
||||
[zoul-pinout-front]: images/zoul-pinout-front.png "Zoul pin-out (front)"
|
||||
[zoul-pinout-back]: images/zoul-pinout-back.png "Zoul pin-out (back)"
|
||||
[IoT5days]: https://github.com/alignan/IPv6-WSN-book "IoT in Five days online book"
|
|
@ -1,9 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup remote
|
||||
* \addtogroup zoul
|
||||
* @{
|
||||
*
|
||||
* \defgroup zoul-platforms Zolertia platforms based on the Zoul core module
|
||||
*
|
||||
* The Zoul allows a fast reuse and easy integration to most applications and
|
||||
* products. Its small size and module format eases to place in different PCB
|
||||
* designs and to integrate in existing products. The Zoul-based platforms
|
||||
* share most of the Zoul core implementation.
|
||||
*
|
||||
* \file
|
||||
* Configuration for the Re-Mote platform
|
||||
* Configuration for the Zoul-based platforms
|
||||
*/
|
||||
#ifndef CONTIKI_CONF_H_
|
||||
#define CONTIKI_CONF_H_
|
||||
|
@ -37,7 +74,7 @@ typedef uint32_t uip_stats_t;
|
|||
* RTIMER_CLOCK_LT to override this
|
||||
*/
|
||||
typedef uint32_t rtimer_clock_t;
|
||||
#define RTIMER_CLOCK_LT(a,b) ((int32_t)((a)-(b)) < 0)
|
||||
#define RTIMER_CLOCK_LT(a, b) ((int32_t)((a) - (b)) < 0)
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
|
@ -46,7 +83,7 @@ typedef uint32_t rtimer_clock_t;
|
|||
* @{
|
||||
*/
|
||||
#ifndef FLASH_CCA_CONF_BOOTLDR_BACKDOOR
|
||||
#define FLASH_CCA_CONF_BOOTLDR_BACKDOOR 1 /**<Enable the boot loader backdoor */
|
||||
#define FLASH_CCA_CONF_BOOTLDR_BACKDOOR 1 /**<Enable the boot loader backdoor */
|
||||
#endif
|
||||
|
||||
#ifndef FLASH_CCA_CONF_BOOTLDR_BACKDOOR_PORT_A_PIN
|
||||
|
@ -60,17 +97,11 @@ typedef uint32_t rtimer_clock_t;
|
|||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Flash Memory configuration
|
||||
* \name CFS configuration
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#ifndef FLASH_CONF_ORIGIN
|
||||
#define FLASH_CONF_ORIGIN 0x00200000
|
||||
#endif
|
||||
|
||||
#ifndef FLASH_CONF_SIZE
|
||||
#define FLASH_CONF_SIZE 0x00080000 /* 512 KiB */
|
||||
#endif
|
||||
#define COFFEE_CONF_SIZE (4 * COFFEE_SECTOR_SIZE)
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
|
@ -79,7 +110,7 @@ typedef uint32_t rtimer_clock_t;
|
|||
* @{
|
||||
*/
|
||||
#ifndef WATCHDOG_CONF_ENABLE
|
||||
#define WATCHDOG_CONF_ENABLE 1 /**< Enable the watchdog timer */
|
||||
#define WATCHDOG_CONF_ENABLE 1 /**< Enable the watchdog timer */
|
||||
#endif
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -194,7 +225,7 @@ typedef uint32_t rtimer_clock_t;
|
|||
* This will keep working while UIP_FALLBACK_INTERFACE and CMD_CONF_OUTPUT
|
||||
* keep using SLIP
|
||||
*/
|
||||
#if defined (UIP_FALLBACK_INTERFACE) || defined (CMD_CONF_OUTPUT)
|
||||
#if defined(UIP_FALLBACK_INTERFACE) || defined(CMD_CONF_OUTPUT)
|
||||
#define SLIP_ARCH_CONF_ENABLED 1
|
||||
#endif
|
||||
#endif
|
||||
|
@ -323,11 +354,29 @@ typedef uint32_t rtimer_clock_t;
|
|||
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
||||
#endif /* NETSTACK_CONF_FRAMER */
|
||||
|
||||
/* This can be overriden to use the cc1120_driver instead */
|
||||
/* This can be overriden to use the cc1200_driver instead */
|
||||
#ifndef NETSTACK_CONF_RADIO
|
||||
#define NETSTACK_CONF_RADIO cc2538_rf_driver
|
||||
#define NETSTACK_CONF_RADIO cc2538_rf_driver
|
||||
#endif
|
||||
|
||||
/*
|
||||
* RE-Mote specific:
|
||||
* If dual RF enabled, we set the RF switch to enable the CC1200 and use 2.4GHz
|
||||
* on the available uFl/chip antenna (not mounted as default). In contiki main
|
||||
* platform routine we set the right antenna depending on NETSTACK_CONF_RADIO,
|
||||
* but as changing the RF antenna also implies enabling/disabling the CC1200,
|
||||
* is better to start off with the right configuration
|
||||
*/
|
||||
#if REMOTE_DUAL_RF_ENABLED
|
||||
#define ANTENNA_SW_SELECT_DEFAULT ANTENNA_SW_SELECT_SUBGHZ
|
||||
#else /* REMOTE_DUAL_RF_ENABLED */
|
||||
#ifndef ANTENNA_SW_SELECT_DEF_CONF
|
||||
#define ANTENNA_SW_SELECT_DEFAULT ANTENNA_SW_SELECT_2_4GHZ
|
||||
#else /* ANTENNA_SW_SELECT_DEF_CONF */
|
||||
#define ANTENNA_SW_SELECT_DEFAULT ANTENNA_SW_SELECT_DEF_CONF
|
||||
#endif /* ANTENNA_SW_SELECT_DEF_CONF */
|
||||
#endif /* REMOTE_DUAL_RF_ENABLED */
|
||||
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
|
@ -398,7 +447,7 @@ typedef uint32_t rtimer_clock_t;
|
|||
#endif
|
||||
|
||||
#ifndef CC2538_RF_CONF_CHANNEL
|
||||
#define CC2538_RF_CONF_CHANNEL 25
|
||||
#define CC2538_RF_CONF_CHANNEL 26
|
||||
#endif /* CC2538_RF_CONF_CHANNEL */
|
||||
|
||||
#ifndef CC2538_RF_CONF_AUTOACK
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -32,14 +33,15 @@
|
|||
* \addtogroup platform
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote Zolertia Re-Mote platform
|
||||
* \defgroup zoul Zolertia Zoul core module
|
||||
*
|
||||
* The Re-Mote is the new platform by Zolertia based on the cc2538, featuring a
|
||||
* cc2538 SoC with an ARM Cortex-M3 core plus the CC1120 Sub-1Ghz transceiver
|
||||
* The Zoul comprises the CC2538SF53 and CC1200 in a single module
|
||||
* format, which allows a fast reuse of its core components in different
|
||||
* formats and form-factors.
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Main module for the Re-Mote platform
|
||||
* Main module for the Zolertia Zoul core and based platforms
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
|
@ -66,7 +68,6 @@
|
|||
#include "reg.h"
|
||||
#include "ieee-addr.h"
|
||||
#include "lpm.h"
|
||||
#include "dev/antenna-sw.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
@ -84,6 +85,9 @@
|
|||
#define PUTS(s)
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** \brief Board specific iniatialisation */
|
||||
void board_init(void);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
fade(unsigned char l)
|
||||
{
|
||||
|
@ -135,7 +139,7 @@ set_rf_params(void)
|
|||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \brief Main routine for the Re-Mote platform
|
||||
* \brief Main routine for the Zoul-based platforms
|
||||
*/
|
||||
int
|
||||
main(void)
|
||||
|
@ -147,14 +151,10 @@ main(void)
|
|||
lpm_init();
|
||||
rtimer_init();
|
||||
gpio_init();
|
||||
|
||||
leds_init();
|
||||
fade(LEDS_RED);
|
||||
|
||||
process_init();
|
||||
|
||||
watchdog_init();
|
||||
SENSORS_ACTIVATE(button_sensor);
|
||||
|
||||
/*
|
||||
* Character I/O Initialisation.
|
||||
|
@ -185,13 +185,6 @@ main(void)
|
|||
PUTS(CONTIKI_VERSION_STRING);
|
||||
PUTS(BOARD_STRING);
|
||||
|
||||
PRINTF(" Net: ");
|
||||
PRINTF("%s\n", NETSTACK_NETWORK.name);
|
||||
PRINTF(" MAC: ");
|
||||
PRINTF("%s\n", NETSTACK_MAC.name);
|
||||
PRINTF(" RDC: ");
|
||||
PRINTF("%s\n", NETSTACK_RDC.name);
|
||||
|
||||
/* Initialise the H/W RNG engine. */
|
||||
random_init(0);
|
||||
|
||||
|
@ -200,8 +193,17 @@ main(void)
|
|||
process_start(&etimer_process, NULL);
|
||||
ctimer_init();
|
||||
|
||||
set_rf_params();
|
||||
board_init();
|
||||
|
||||
netstack_init();
|
||||
set_rf_params();
|
||||
|
||||
PRINTF(" Net: ");
|
||||
PRINTF("%s\n", NETSTACK_NETWORK.name);
|
||||
PRINTF(" MAC: ");
|
||||
PRINTF("%s\n", NETSTACK_MAC.name);
|
||||
PRINTF(" RDC: ");
|
||||
PRINTF("%s\n", NETSTACK_RDC.name);
|
||||
|
||||
#if NETSTACK_CONF_WITH_IPV6
|
||||
memcpy(&uip_lladdr.addr, &linkaddr_node_addr, sizeof(uip_lladdr.addr));
|
||||
|
@ -209,8 +211,6 @@ main(void)
|
|||
process_start(&tcpip_process, NULL);
|
||||
#endif /* NETSTACK_CONF_WITH_IPV6 */
|
||||
|
||||
antenna_sw_config();
|
||||
|
||||
process_start(&sensors_process, NULL);
|
||||
|
||||
SENSORS_ACTIVATE(button_sensor);
|
|
@ -31,11 +31,11 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-phidget-sensor
|
||||
* \addtogroup zoul-adc-sensors
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Generic driver for the Re-Mote Phidget/ADC sensors
|
||||
* Generic driver for the Zoul ADC sensors
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
|
@ -43,16 +43,13 @@
|
|||
#include "dev/ioc.h"
|
||||
#include "dev/gpio.h"
|
||||
#include "dev/adc.h"
|
||||
#include "dev/phidget-sensor.h"
|
||||
#include "dev/remote-sensors.h"
|
||||
#include "adc-sensors.h"
|
||||
#include "zoul-sensors.h"
|
||||
|
||||
#include <stdint.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define ADC_PHIDGET_PORT_BASE GPIO_PORT_TO_BASE(ADC_PHIDGET_PORT)
|
||||
#define ADC_PHIDGET_ADC2_PIN_MASK GPIO_PIN_MASK(ADC_PHIDGET_ADC2_PIN)
|
||||
#define ADC_PHIDGET_ADC3_PIN_MASK GPIO_PIN_MASK(ADC_PHIDGET_ADC3_PIN)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uint8_t decimation_rate;
|
||||
static uint8_t enabled_channels;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
set_decimation_rate(uint8_t rate)
|
||||
|
@ -65,31 +62,44 @@ set_decimation_rate(uint8_t rate)
|
|||
decimation_rate = rate;
|
||||
break;
|
||||
default:
|
||||
return REMOTE_SENSORS_ERROR;
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
|
||||
return decimation_rate;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
get_channel_pin(int type)
|
||||
{
|
||||
if((ZOUL_SENSORS_ADC1) && (type == ZOUL_SENSORS_ADC1)) {
|
||||
return SOC_ADC_ADCCON_CH_AIN0 + ADC_SENSORS_ADC1_PIN;
|
||||
}
|
||||
if((ZOUL_SENSORS_ADC2) && (type == ZOUL_SENSORS_ADC2)) {
|
||||
return SOC_ADC_ADCCON_CH_AIN0 + ADC_SENSORS_ADC2_PIN;
|
||||
}
|
||||
if((ZOUL_SENSORS_ADC3) && (type == ZOUL_SENSORS_ADC3)) {
|
||||
return SOC_ADC_ADCCON_CH_AIN0 + ADC_SENSORS_ADC3_PIN;
|
||||
}
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
value(int type)
|
||||
{
|
||||
uint8_t channel;
|
||||
int channel;
|
||||
int16_t res;
|
||||
|
||||
switch(type) {
|
||||
case PHIDGET_SENSORS_ADC2:
|
||||
channel = SOC_ADC_ADCCON_CH_AIN0 + ADC_PHIDGET_ADC2_PIN;
|
||||
break;
|
||||
case PHIDGET_SENSORS_ADC3:
|
||||
channel = SOC_ADC_ADCCON_CH_AIN0 + ADC_PHIDGET_ADC3_PIN;
|
||||
break;
|
||||
default:
|
||||
return REMOTE_SENSORS_ERROR;
|
||||
if(!(type & enabled_channels)) {
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
|
||||
res = adc_get(channel, SOC_ADC_ADCCON_REF_INT, decimation_rate);
|
||||
channel = get_channel_pin(type);
|
||||
|
||||
if(channel == ZOUL_SENSORS_ERROR) {
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
|
||||
res = adc_get(channel, SOC_ADC_ADCCON_REF_AVDD5, decimation_rate);
|
||||
return res;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -98,18 +108,40 @@ configure(int type, int value)
|
|||
{
|
||||
switch(type) {
|
||||
case SENSORS_HW_INIT:
|
||||
GPIO_SOFTWARE_CONTROL(GPIO_A_BASE, ADC_PHIDGET_ADC2_PIN_MASK);
|
||||
GPIO_SET_INPUT(GPIO_A_BASE, ADC_PHIDGET_ADC2_PIN_MASK);
|
||||
ioc_set_over(GPIO_A_NUM, ADC_PHIDGET_ADC2_PIN, IOC_OVERRIDE_ANA);
|
||||
|
||||
GPIO_SOFTWARE_CONTROL(GPIO_A_BASE, ADC_PHIDGET_ADC3_PIN_MASK);
|
||||
GPIO_SET_INPUT(GPIO_A_BASE, ADC_PHIDGET_ADC3_PIN_MASK);
|
||||
ioc_set_over(GPIO_A_NUM, ADC_PHIDGET_ADC3_PIN, IOC_OVERRIDE_ANA);
|
||||
/* This should filter out disabled sensors as its value should be zero */
|
||||
if((value < ZOUL_SENSORS_ADC_MIN) || (value > ZOUL_SENSORS_ADC_ALL)) {
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
|
||||
if((value != ZOUL_SENSORS_ADC1) && (value != ZOUL_SENSORS_ADC2) &&
|
||||
(value != ZOUL_SENSORS_ADC3) && (value != ZOUL_SENSORS_ADC12) &&
|
||||
(value != ZOUL_SENSORS_ADC13) && (value != ZOUL_SENSORS_ADC23)) {
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
|
||||
GPIO_SOFTWARE_CONTROL(GPIO_A_BASE, value);
|
||||
GPIO_SET_INPUT(GPIO_A_BASE, value);
|
||||
|
||||
if(value & ZOUL_SENSORS_ADC1) {
|
||||
ioc_set_over(GPIO_A_NUM, ADC_SENSORS_ADC1_PIN, IOC_OVERRIDE_ANA);
|
||||
}
|
||||
if(value & ZOUL_SENSORS_ADC2) {
|
||||
ioc_set_over(GPIO_A_NUM, ADC_SENSORS_ADC2_PIN, IOC_OVERRIDE_ANA);
|
||||
}
|
||||
if(value & ZOUL_SENSORS_ADC3) {
|
||||
ioc_set_over(GPIO_A_NUM, ADC_SENSORS_ADC3_PIN, IOC_OVERRIDE_ANA);
|
||||
}
|
||||
adc_init();
|
||||
set_decimation_rate(SOC_ADC_ADCCON_DIV_512);
|
||||
enabled_channels = value;
|
||||
break;
|
||||
case REMOTE_SENSORS_CONFIGURE_TYPE_DECIMATION_RATE:
|
||||
|
||||
case ZOUL_SENSORS_CONFIGURE_TYPE_DECIMATION_RATE:
|
||||
return set_decimation_rate((uint8_t)value);
|
||||
|
||||
default:
|
||||
return ZOUL_SENSORS_ERROR;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -120,6 +152,7 @@ status(int type)
|
|||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
SENSORS_SENSOR(phidget_sensor, PHIDGET_SENSOR, value, configure, status);
|
||||
SENSORS_SENSOR(adc_sensors, ADC_SENSORS, value, configure, status);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/** @} */
|
||||
|
133
platform/zoul/dev/adc-sensors.h
Normal file
133
platform/zoul/dev/adc-sensors.h
Normal file
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Zolertia - http://www.zolertia.com
|
||||
* Copyright (c) 2015, University of Bristol - http://www.bristol.ac.uk
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup zoul-sensors
|
||||
* @{
|
||||
*
|
||||
* \defgroup zoul-adc-sensors Zoul Generic ADC sensor
|
||||
*
|
||||
* Driver for the Zoul ADC sensors
|
||||
*
|
||||
* This driver supports analogue sensors connected to ADC1, ADC2 and AND3 inputs
|
||||
* This is controlled by the type argument of the value() function. Possible
|
||||
* choices are:
|
||||
* - ZOUL_SENSORS_ADC1
|
||||
* - ZOUL_SENSORS_ADC2
|
||||
* - ZOUL_SENSORS_ADC3
|
||||
*
|
||||
* To initialize the ADC sensors use the configure() function, using as first
|
||||
* argument SENSORS_HW_INIT, and choose which ADC channels to enable passing as
|
||||
* second argument any single or combined (sum) values as below:
|
||||
* - ZOUL_SENSORS_ADC1
|
||||
* - ZOUL_SENSORS_ADC2
|
||||
* - ZOUL_SENSORS_ADC3
|
||||
* - ZOUL_SENSORS_ADC_ALL (all channels above)
|
||||
*
|
||||
* Using an invalid combination will return ZOUL_SENSORS_ERROR.
|
||||
*
|
||||
* The decimation rate can be set by passing
|
||||
* ZOUL_SENSORS_CONFIGURE_TYPE_DECIMATION_RATE as the type argument to the
|
||||
* configure() function and then specifying the rate through the value
|
||||
* argument. Valid values are:
|
||||
* - SOC_ADC_ADCCON_DIV_64 (64 bit rate)
|
||||
* - SOC_ADC_ADCCON_DIV_128 (128 bit rate)
|
||||
* - SOC_ADC_ADCCON_DIV_256 (256 bit rate)
|
||||
* - SOC_ADC_ADCCON_DIV_512 (512 bit rate)
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the Zoul Generic Driver for ADC sensors
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#ifndef ADC_SENSORS_H_
|
||||
#define ADC_SENSORS_H_
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "lib/sensors.h"
|
||||
#include "dev/soc-adc.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \name Generic ADC sensors
|
||||
* @{
|
||||
*/
|
||||
#define ADC_SENSORS "ADC sensors"
|
||||
#define ADC_SENSORS_PORT_BASE GPIO_PORT_TO_BASE(ADC_SENSORS_PORT)
|
||||
|
||||
/*
|
||||
* PA0-PA3 are hardcoded to UART0 and the user button for most Zolertia
|
||||
* platforms, the following assumes PA0 shall not be used as ADC input, else
|
||||
* re-write the below definitions
|
||||
*/
|
||||
#define ZOUL_SENSORS_ADC_MIN 4
|
||||
/* ADC phidget-like connector ADC1 */
|
||||
#if ADC_SENSORS_ADC1_PIN >= ZOUL_SENSORS_ADC_MIN
|
||||
#define ZOUL_SENSORS_ADC1 GPIO_PIN_MASK(ADC_SENSORS_ADC1_PIN)
|
||||
#else
|
||||
#define ZOUL_SENSORS_ADC1 0
|
||||
#endif
|
||||
/* ADC phidget-like connector ADC2 */
|
||||
#if ADC_SENSORS_ADC2_PIN >= ZOUL_SENSORS_ADC_MIN
|
||||
#define ZOUL_SENSORS_ADC2 GPIO_PIN_MASK(ADC_SENSORS_ADC2_PIN)
|
||||
#else
|
||||
#define ZOUL_SENSORS_ADC2 0
|
||||
#endif
|
||||
/* ADC phidget-like connector ADC3 */
|
||||
#if ADC_SENSORS_ADC3_PIN >= ZOUL_SENSORS_ADC_MIN
|
||||
#define ZOUL_SENSORS_ADC3 GPIO_PIN_MASK(ADC_SENSORS_ADC3_PIN)
|
||||
#else
|
||||
#define ZOUL_SENSORS_ADC3 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is safe as the disabled sensors should have a zero value thus not
|
||||
* affecting the mask operations
|
||||
*/
|
||||
|
||||
/* Enable all channels */
|
||||
#define ZOUL_SENSORS_ADC_ALL (ZOUL_SENSORS_ADC1 + ZOUL_SENSORS_ADC2 + \
|
||||
ZOUL_SENSORS_ADC3)
|
||||
/* Other allowed combinations */
|
||||
#define ZOUL_SENSORS_ADC12 (ZOUL_SENSORS_ADC1 + ZOUL_SENSORS_ADC2)
|
||||
#define ZOUL_SENSORS_ADC13 (ZOUL_SENSORS_ADC1 + ZOUL_SENSORS_ADC3)
|
||||
#define ZOUL_SENSORS_ADC23 (ZOUL_SENSORS_ADC2 + ZOUL_SENSORS_ADC3)
|
||||
|
||||
/** @} */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
extern const struct sensors_sensor adc_sensors;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#endif /* ADC_SENSORS_H_ */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
|
@ -32,11 +32,11 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-button-sensor
|
||||
* \addtogroup zoul-button-sensor
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* Driver for the Re-Mote user button
|
||||
* Driver for the Zoul user button
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
|
@ -32,17 +32,17 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-sensors
|
||||
* \addtogroup zoul-sensors
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-button-sensor Re-Mote User Button Driver
|
||||
* \defgroup zoul-button-sensor Zoul User Button Driver
|
||||
*
|
||||
* Driver for the Re-Mote user button
|
||||
* Driver for the Zoul user button
|
||||
*
|
||||
* The Re-Mote button will generate a sensors_changed event on press as well
|
||||
* as on release.
|
||||
* The user button (on Zoul-based platforms like the RE-Mote and the Firefly)
|
||||
* will generate a sensors_changed event on press as well as on release.
|
||||
*
|
||||
* Unlike many other platforms, the Re-Mote user button has the ability to
|
||||
* Unlike many other platforms, the user button has the ability to
|
||||
* generate events when the user keeps the button pressed. The user can
|
||||
* configure the button driver with a timer interval in clock ticks. When the
|
||||
* button is kept pressed, the driver will then generate a broadcast event
|
||||
|
@ -53,7 +53,7 @@
|
|||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the Re-Mote User Button Driver
|
||||
* Header file for the Zoul User Button Driver
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#ifndef BUTTON_SENSOR_H_
|
293
platform/zoul/dev/cc1200-zoul-arch.c
Normal file
293
platform/zoul/dev/cc1200-zoul-arch.c
Normal file
|
@ -0,0 +1,293 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Zolertia
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup zoul
|
||||
* @{
|
||||
*
|
||||
* \defgroup zoul-cc1200 Zoul CC1200 arch
|
||||
*
|
||||
* CC1200 Zoul arch specifics
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* CC1200 Zoul arch specifics
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
#include "contiki-net.h"
|
||||
#include "dev/leds.h"
|
||||
#include "reg.h"
|
||||
#include "spi-arch.h"
|
||||
#include "dev/ioc.h"
|
||||
#include "dev/sys-ctrl.h"
|
||||
#include "dev/spi.h"
|
||||
#include "dev/ssi.h"
|
||||
#include "dev/gpio.h"
|
||||
#include <stdio.h>
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define CC1200_SPI_CLK_PORT_BASE GPIO_PORT_TO_BASE(SPI0_CLK_PORT)
|
||||
#define CC1200_SPI_CLK_PIN_MASK GPIO_PIN_MASK(SPI0_CLK_PIN)
|
||||
#define CC1200_SPI_MOSI_PORT_BASE GPIO_PORT_TO_BASE(SPI0_TX_PORT)
|
||||
#define CC1200_SPI_MOSI_PIN_MASK GPIO_PIN_MASK(SPI0_TX_PIN)
|
||||
#define CC1200_SPI_MISO_PORT_BASE GPIO_PORT_TO_BASE(SPI0_RX_PORT)
|
||||
#define CC1200_SPI_MISO_PIN_MASK GPIO_PIN_MASK(SPI0_RX_PIN)
|
||||
#define CC1200_SPI_CSN_PORT_BASE GPIO_PORT_TO_BASE(CC1200_SPI_CSN_PORT)
|
||||
#define CC1200_SPI_CSN_PIN_MASK GPIO_PIN_MASK(CC1200_SPI_CSN_PIN)
|
||||
#define CC1200_GDO0_PORT_BASE GPIO_PORT_TO_BASE(CC1200_GDO0_PORT)
|
||||
#define CC1200_GDO0_PIN_MASK GPIO_PIN_MASK(CC1200_GDO0_PIN)
|
||||
#define CC1200_GDO2_PORT_BASE GPIO_PORT_TO_BASE(CC1200_GDO2_PORT)
|
||||
#define CC1200_GDO2_PIN_MASK GPIO_PIN_MASK(CC1200_GDO2_PIN)
|
||||
#define CC1200_RESET_PORT_BASE GPIO_PORT_TO_BASE(CC1200_RESET_PORT)
|
||||
#define CC1200_RESET_PIN_MASK GPIO_PIN_MASK(CC1200_RESET_PIN)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#ifndef DEBUG_CC1200_ARCH
|
||||
#define DEBUG_CC1200_ARCH 0
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if DEBUG_CC1200_ARCH > 0
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#define BUSYWAIT_UNTIL(cond, max_time) \
|
||||
do { \
|
||||
rtimer_clock_t t0; \
|
||||
t0 = RTIMER_NOW(); \
|
||||
while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))) {} \
|
||||
if(!(RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time)))) { \
|
||||
printf("ARCH: Timeout exceeded in line %d!\n", __LINE__); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
#define PRINTF(...)
|
||||
#define BUSYWAIT_UNTIL(cond, max_time) while(!cond)
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
extern int cc1200_rx_interrupt(void);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_int_handler(uint8_t port, uint8_t pin)
|
||||
{
|
||||
/* To keep the gpio_register_callback happy */
|
||||
cc1200_rx_interrupt();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_spi_select(void)
|
||||
{
|
||||
/* Set CSn to low (0) */
|
||||
GPIO_CLR_PIN(CC1200_SPI_CSN_PORT_BASE, CC1200_SPI_CSN_PIN_MASK);
|
||||
/* The MISO pin should go low before chip is fully enabled. */
|
||||
BUSYWAIT_UNTIL(
|
||||
GPIO_READ_PIN(CC1200_SPI_MISO_PORT_BASE, CC1200_SPI_MISO_PIN_MASK) == 0,
|
||||
RTIMER_SECOND / 100);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_spi_deselect(void)
|
||||
{
|
||||
/* Set CSn to high (1) */
|
||||
GPIO_SET_PIN(CC1200_SPI_CSN_PORT_BASE, CC1200_SPI_CSN_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
cc1200_arch_spi_rw_byte(uint8_t c)
|
||||
{
|
||||
SPI_WAITFORTx_BEFORE();
|
||||
SPIX_BUF(CC1200_SPI_INSTANCE) = c;
|
||||
SPIX_WAITFOREOTx(CC1200_SPI_INSTANCE);
|
||||
SPIX_WAITFOREORx(CC1200_SPI_INSTANCE);
|
||||
c = SPIX_BUF(CC1200_SPI_INSTANCE);
|
||||
|
||||
return c;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
cc1200_arch_spi_rw(uint8_t *inbuf, const uint8_t *write_buf, uint16_t len)
|
||||
{
|
||||
int i;
|
||||
uint8_t c;
|
||||
|
||||
if((inbuf == NULL && write_buf == NULL) || len <= 0) {
|
||||
return 1;
|
||||
} else if(inbuf == NULL) {
|
||||
for(i = 0; i < len; i++) {
|
||||
SPI_WAITFORTx_BEFORE();
|
||||
SPIX_BUF(CC1200_SPI_INSTANCE) = write_buf[i];
|
||||
SPIX_WAITFOREOTx(CC1200_SPI_INSTANCE);
|
||||
SPIX_WAITFOREORx(CC1200_SPI_INSTANCE);
|
||||
c = SPIX_BUF(CC1200_SPI_INSTANCE);
|
||||
/* read and discard to avoid "variable set but not used" warning */
|
||||
(void)c;
|
||||
}
|
||||
} else if(write_buf == NULL) {
|
||||
for(i = 0; i < len; i++) {
|
||||
SPI_WAITFORTx_BEFORE();
|
||||
SPIX_BUF(CC1200_SPI_INSTANCE) = 0;
|
||||
SPIX_WAITFOREOTx(CC1200_SPI_INSTANCE);
|
||||
SPIX_WAITFOREORx(CC1200_SPI_INSTANCE);
|
||||
inbuf[i] = SPIX_BUF(CC1200_SPI_INSTANCE);
|
||||
}
|
||||
} else {
|
||||
for(i = 0; i < len; i++) {
|
||||
SPI_WAITFORTx_BEFORE();
|
||||
SPIX_BUF(CC1200_SPI_INSTANCE) = write_buf[i];
|
||||
SPIX_WAITFOREOTx(CC1200_SPI_INSTANCE);
|
||||
SPIX_WAITFOREORx(CC1200_SPI_INSTANCE);
|
||||
inbuf[i] = SPIX_BUF(CC1200_SPI_INSTANCE);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio0_setup_irq(int rising)
|
||||
{
|
||||
|
||||
GPIO_SOFTWARE_CONTROL(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
GPIO_SET_INPUT(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
GPIO_DETECT_EDGE(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
GPIO_TRIGGER_SINGLE_EDGE(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
|
||||
if(rising) {
|
||||
GPIO_DETECT_RISING(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
} else {
|
||||
GPIO_DETECT_FALLING(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
}
|
||||
|
||||
GPIO_ENABLE_INTERRUPT(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
ioc_set_over(CC1200_GDO0_PORT, CC1200_GDO0_PIN, IOC_OVERRIDE_PUE);
|
||||
nvic_interrupt_enable(CC1200_GPIOx_VECTOR);
|
||||
gpio_register_callback(cc1200_int_handler, CC1200_GDO0_PORT,
|
||||
CC1200_GDO0_PIN);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio2_setup_irq(int rising)
|
||||
{
|
||||
|
||||
GPIO_SOFTWARE_CONTROL(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
GPIO_SET_INPUT(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
GPIO_DETECT_EDGE(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
GPIO_TRIGGER_SINGLE_EDGE(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
|
||||
if(rising) {
|
||||
GPIO_DETECT_RISING(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
} else {
|
||||
GPIO_DETECT_FALLING(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
}
|
||||
|
||||
GPIO_ENABLE_INTERRUPT(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
ioc_set_over(CC1200_GDO2_PORT, CC1200_GDO2_PIN, IOC_OVERRIDE_PUE);
|
||||
nvic_interrupt_enable(CC1200_GPIOx_VECTOR);
|
||||
gpio_register_callback(cc1200_int_handler, CC1200_GDO2_PORT,
|
||||
CC1200_GDO2_PIN);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio0_enable_irq(void)
|
||||
{
|
||||
GPIO_ENABLE_INTERRUPT(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
ioc_set_over(CC1200_GDO0_PORT, CC1200_GDO0_PIN, IOC_OVERRIDE_PUE);
|
||||
nvic_interrupt_enable(CC1200_GPIOx_VECTOR);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio0_disable_irq(void)
|
||||
{
|
||||
GPIO_DISABLE_INTERRUPT(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio2_enable_irq(void)
|
||||
{
|
||||
GPIO_ENABLE_INTERRUPT(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
ioc_set_over(CC1200_GDO2_PORT, CC1200_GDO2_PIN, IOC_OVERRIDE_PUE);
|
||||
nvic_interrupt_enable(CC1200_GPIOx_VECTOR);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_gpio2_disable_irq(void)
|
||||
{
|
||||
GPIO_DISABLE_INTERRUPT(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
cc1200_arch_gpio0_read_pin(void)
|
||||
{
|
||||
return GPIO_READ_PIN(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
cc1200_arch_gpio2_read_pin(void)
|
||||
{
|
||||
return GPIO_READ_PIN(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
cc1200_arch_gpio3_read_pin(void)
|
||||
{
|
||||
return 0x00;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
cc1200_arch_init(void)
|
||||
{
|
||||
/* First leave RESET high */
|
||||
GPIO_SOFTWARE_CONTROL(CC1200_RESET_PORT_BASE, CC1200_RESET_PIN_MASK);
|
||||
GPIO_SET_OUTPUT(CC1200_RESET_PORT_BASE, CC1200_RESET_PIN_MASK);
|
||||
ioc_set_over(CC1200_RESET_PORT, CC1200_RESET_PIN, IOC_OVERRIDE_OE);
|
||||
GPIO_SET_PIN(CC1200_RESET_PORT_BASE, CC1200_RESET_PIN_MASK);
|
||||
|
||||
/* Initialize CSn, enable CSn and then wait for MISO to go low*/
|
||||
spix_cs_init(CC1200_SPI_CSN_PORT, CC1200_SPI_CSN_PIN);
|
||||
|
||||
/* Initialize SPI */
|
||||
spix_init(CC1200_SPI_INSTANCE);
|
||||
|
||||
/* Configure GPIOx */
|
||||
GPIO_SOFTWARE_CONTROL(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
GPIO_SET_INPUT(CC1200_GDO0_PORT_BASE, CC1200_GDO0_PIN_MASK);
|
||||
GPIO_SOFTWARE_CONTROL(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
GPIO_SET_INPUT(CC1200_GDO2_PORT_BASE, CC1200_GDO2_PIN_MASK);
|
||||
|
||||
/* Leave CSn as default */
|
||||
cc1200_arch_spi_deselect();
|
||||
|
||||
/* Ensure MISO is high */
|
||||
BUSYWAIT_UNTIL(
|
||||
GPIO_READ_PIN(CC1200_SPI_MISO_PORT_BASE, CC1200_SPI_MISO_PIN_MASK),
|
||||
RTIMER_SECOND / 10);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-led-strip
|
||||
* \addtogroup zoul-led-strip
|
||||
* @{
|
||||
*
|
||||
* Driver to control a bright LED strip powered at 3VDC, drawing power directly
|
||||
|
@ -38,7 +38,7 @@
|
|||
* @{
|
||||
*
|
||||
* \file
|
||||
* Driver for the Re-Mote bright LED strip Driver
|
||||
* Driver for a bright LED strip
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "contiki.h"
|
||||
|
@ -65,7 +65,7 @@ led_strip_config(void)
|
|||
GPIO_SOFTWARE_CONTROL(LED_STRIP_PORT_BASE, LED_STRIP_PIN_MASK);
|
||||
/* Set pin to output */
|
||||
GPIO_SET_OUTPUT(LED_STRIP_PORT_BASE, LED_STRIP_PIN_MASK);
|
||||
/* Set the antenna selector to a default position */
|
||||
/* Set the pin to a default position */
|
||||
GPIO_SET_PIN(LED_STRIP_PORT_BASE, LED_STRIP_PIN_MASK);
|
||||
|
||||
initialized = 1;
|
|
@ -28,10 +28,10 @@
|
|||
*/
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/**
|
||||
* \addtogroup remote-sensors
|
||||
* \addtogroup zoul-sensors
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-led-strip Re-Mote LED strip driver
|
||||
* \defgroup zoul-led-strip LED strip compatible with Zoul-based platforms
|
||||
*
|
||||
* Driver to control a bright LED strip powered at 3VDC, drawing power directly
|
||||
* from the battery power supply. An example on how to adapt 12VDC LED strips
|
||||
|
@ -39,7 +39,7 @@
|
|||
* @{
|
||||
*
|
||||
* \file
|
||||
* Header file for the Re-Mote bright LED strip Driver
|
||||
* Header file for a bright LED strip driver
|
||||
*/
|
||||
/* -------------------------------------------------------------------------- */
|
||||
#ifndef LED_STRIP_H_
|
|
@ -30,78 +30,40 @@
|
|||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/**
|
||||
* \addtogroup remote
|
||||
* \addtogroup zoul
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-leds Re-Mote LED driver
|
||||
* \defgroup zoul-leds Zoul LED driver
|
||||
*
|
||||
* LED driver implementation for the Re-Mote platform
|
||||
* LED driver implementation for the Zoul-based platforms
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
* LED driver implementation for the Re-Mote platform
|
||||
* LED driver implementation for the Zoul-based platforms
|
||||
*/
|
||||
#include "contiki.h"
|
||||
#include "reg.h"
|
||||
#include "dev/leds.h"
|
||||
#include "dev/gpio.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define LED_GREEN_PORT GPIO_D_BASE
|
||||
#define LED_GREEN_PIN (1 << 5)
|
||||
|
||||
#define LED_BLUE_PORT GPIO_C_BASE
|
||||
#define LED_BLUE_PIN (1 << 3)
|
||||
|
||||
#define LED_RED_PORT GPIO_D_BASE
|
||||
#define LED_RED_PIN (1 << 2)
|
||||
|
||||
#define PORT_D_LEDS (LED_RED_PIN | LED_GREEN_PIN)
|
||||
#define PORT_C_LEDS LED_BLUE_PIN
|
||||
#define LEDS_GPIO_PIN_MASK LEDS_ALL
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
leds_arch_init(void)
|
||||
{
|
||||
/* Initialize LED1 (Red) and LED3 (Green) */
|
||||
GPIO_SET_OUTPUT(GPIO_D_BASE, PORT_D_LEDS);
|
||||
GPIO_SET_PIN(GPIO_D_BASE, PORT_D_LEDS);
|
||||
|
||||
/* Initialize LED2 - Blue */
|
||||
GPIO_SET_OUTPUT(GPIO_C_BASE, PORT_C_LEDS);
|
||||
GPIO_SET_PIN(GPIO_C_BASE, PORT_C_LEDS);
|
||||
GPIO_SET_OUTPUT(GPIO_D_BASE, LEDS_GPIO_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
unsigned char
|
||||
leds_arch_get(void)
|
||||
{
|
||||
uint8_t mask_leds;
|
||||
|
||||
mask_leds = GPIO_READ_PIN(LED_GREEN_PORT, LED_GREEN_PIN) == 0? LEDS_GREEN : 0;
|
||||
mask_leds |= GPIO_READ_PIN(LED_BLUE_PORT, LED_BLUE_PIN) == 0? LEDS_BLUE : 0;
|
||||
mask_leds |= GPIO_READ_PIN(LED_RED_PORT, LED_RED_PIN) == 0? LEDS_RED : 0;
|
||||
|
||||
return mask_leds;
|
||||
return GPIO_READ_PIN(GPIO_D_BASE, LEDS_GPIO_PIN_MASK);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
leds_arch_set(unsigned char leds)
|
||||
{
|
||||
if(leds & LEDS_GREEN) {
|
||||
GPIO_CLR_PIN(LED_GREEN_PORT, LED_GREEN_PIN);
|
||||
} else {
|
||||
GPIO_SET_PIN(LED_GREEN_PORT, LED_GREEN_PIN);
|
||||
}
|
||||
|
||||
if(leds & LEDS_BLUE) {
|
||||
GPIO_CLR_PIN(LED_BLUE_PORT, LED_BLUE_PIN);
|
||||
} else {
|
||||
GPIO_SET_PIN(LED_BLUE_PORT, LED_BLUE_PIN);
|
||||
}
|
||||
|
||||
if(leds & LEDS_RED) {
|
||||
GPIO_CLR_PIN(LED_RED_PORT, LED_RED_PIN);
|
||||
} else {
|
||||
GPIO_SET_PIN(LED_RED_PORT, LED_RED_PIN);
|
||||
}
|
||||
GPIO_WRITE_PIN(GPIO_D_BASE, LEDS_GPIO_PIN_MASK, leds);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-mp3-wtv020sd
|
||||
* \addtogroup zoul-mp3-wtv020sd
|
||||
* @{
|
||||
*
|
||||
* Driver to control the MP3 WTV020SD board in MP3 mode (GPIO based) and the
|
|
@ -28,10 +28,11 @@
|
|||
*/
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/**
|
||||
* \addtogroup remote-sensors
|
||||
* \addtogroup zoul-sensors
|
||||
* @{
|
||||
*
|
||||
* \defgroup remote-mp3-wtv020sd Re-Mote MP3 WTV020SD driver
|
||||
* \defgroup zoul-mp3-wtv020sd MP3 WTV020SD driver compatible with Zoul-based
|
||||
* platforms
|
||||
*
|
||||
* Driver to control the MP3 WTV020SD board in MP3 mode (GPIO based) and the
|
||||
* 2-line serial mode (CLK/DI). Loop Mode and Key Modes not implemented.
|
|
@ -31,7 +31,7 @@
|
|||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/**
|
||||
* \addtogroup remote-sht25-sensor
|
||||
* \addtogroup zoul-sht25-sensor
|
||||
* @{
|
||||
*
|
||||
* \file
|
||||
|
@ -46,8 +46,6 @@
|
|||
#include "dev/sht25.h"
|
||||
#include "lib/sensors.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#warning I2C SDA AND SCL are inverted in JP8 connector, inverted in init() call
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uint8_t enabled;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int
|
||||
|
@ -57,7 +55,7 @@ configure(int type, int value)
|
|||
return SHT25_ERROR;
|
||||
}
|
||||
if(value) {
|
||||
i2c_init(I2C_SCL_PORT, I2C_SCL_PIN, I2C_SDA_PORT, I2C_SDA_PIN,
|
||||
i2c_init(I2C_SDA_PORT, I2C_SDA_PIN, I2C_SCL_PORT, I2C_SCL_PIN,
|
||||
I2C_SCL_NORMAL_BUS_SPEED);
|
||||
}
|
||||
enabled = value;
|
||||
|
@ -115,7 +113,7 @@ sht25_read(uint8_t variable, uint16_t *rd)
|
|||
return SHT25_ERROR;
|
||||
}
|
||||
|
||||
if (sht25_read_reg(variable, buf, 2) == SHT25_SUCCESS){
|
||||
if(sht25_read_reg(variable, buf, 2) == SHT25_SUCCESS) {
|
||||
raw = (buf[0] << 8) + buf[1];
|
||||
*rd = sht25_convert(variable, raw);
|
||||
return SHT25_SUCCESS;
|
||||
|
@ -127,7 +125,7 @@ static int
|
|||
value(int type)
|
||||
{
|
||||
uint16_t val;
|
||||
if (sht25_read(type, &val) == SHT25_SUCCESS){
|
||||
if(sht25_read(type, &val) == SHT25_SUCCESS) {
|
||||
return val;
|
||||
}
|
||||
return SHT25_ERROR;
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue