From d0e9cd18c7bc7777d18b8cff00ab55191283783e Mon Sep 17 00:00:00 2001 From: Tommy Sparber Date: Fri, 30 Oct 2015 11:44:48 +1100 Subject: [PATCH 1/3] doxygen regression test: Tolerate only warning-free builds This commit simplifies the regression test for the doxygen build to allow only 0 warnings. Clean doxygen.runlog and doxygen.runerr for clean target and ignore them in .gitignore. --- .gitignore | 2 ++ regression-tests/00-doxygen/Makefile | 13 ++++++++----- regression-tests/00-doxygen/doxyerrors.cnt | 1 - 3 files changed, 10 insertions(+), 6 deletions(-) delete mode 100644 regression-tests/00-doxygen/doxyerrors.cnt diff --git a/.gitignore b/.gitignore index 88fae42fc..e74d14e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ *.report summary *.summary +*.runerr +*.runlog *.faillog *.orig *~ diff --git a/regression-tests/00-doxygen/Makefile b/regression-tests/00-doxygen/Makefile index 17313aef4..86196d6bf 100644 --- a/regression-tests/00-doxygen/Makefile +++ b/regression-tests/00-doxygen/Makefile @@ -33,22 +33,25 @@ doxygen: @make -C $(DOCDIR) doxygen.log 2> doxygen.runerr > doxygen.runlog summary: doxygen - @( doxyerr=`cat doxyerrors.cnt`; curerr=`cat $(DOCDIR)/doxygen.log | grep ": warning: " | wc -l` ; delta=`expr $$curerr - $$doxyerr`; \ - if [ $$delta -lt 0 ] ; then echo "doxygen: FAIL ಠ_ಠ\nCongratulations you fixed `expr $$delta \"*\" -1 ` of doxyen's warnings (old: $$doxyerr new: $$curerr). Please adjust regression-tests/00-doxygen/doxyerrors.cnt accordingly." > summary; fi ;\ - if [ $$delta -gt 0 ] ; then echo "doxygen: FAIL ಠ_ಠ\nYou increased the number of warnings caused by doxygen by $$delta (old: $$doxyerr new: $$curerr). Please fix these." > summary; fi ; \ - if [ $$delta -eq 0 ] ; then echo "doxygen: OK\nDoxygen found $$doxyerr errors" > summary ; fi ; \ + @( \ + 1> summary; \ if [ -s doxygen.runerr ] ; then \ + echo "doxygen: FAIL ಠ_ಠ\nDoxygen caused some runtime warnings. Please fix these." >> summary; \ echo "Runtime warnings:" >> summary; \ cat doxygen.runerr >> summary; \ echo >> summary; \ fi ; \ if [ -s $(DOCDIR)/doxygen.log ] ; then \ + echo "doxygen: FAIL ಠ_ಠ\nDoxygen caused some warnings. Please fix these." >> summary; \ echo "Warnings:" >> summary; \ cat $(DOCDIR)/doxygen.log >> summary; \ fi ; \ + if [ ! -s summary ] ; then \ + echo "doxygen: OK\nDoxygen found no warnings" >> summary; \ + fi ; \ cat summary \ ) - clean: + @rm -f summary doxygen.runlog doxygen.runerr @make -C $(DOCDIR) clean diff --git a/regression-tests/00-doxygen/doxyerrors.cnt b/regression-tests/00-doxygen/doxyerrors.cnt deleted file mode 100644 index 405e2afe8..000000000 --- a/regression-tests/00-doxygen/doxyerrors.cnt +++ /dev/null @@ -1 +0,0 @@ -134 From 938d17576ba345875feee6f458b4bbad42fc5153 Mon Sep 17 00:00:00 2001 From: Tommy Sparber Date: Fri, 30 Oct 2015 18:55:11 +1100 Subject: [PATCH 2/3] doxygen: Fix many warnings This commit fixes nearly all of the reported doxygen warnings. I tried to not clutter the log with removed trailing spaces. Removed whitespace and converted tab/spaces for all files affected by this commit are in a separate branch. --- apps/program-handler/program-handler.c | 2 +- core/net/ip/uip.h | 6 +- core/net/ipv6/sicslowpan.c | 13 ++-- core/net/ipv6/uip-ds6-nbr.c | 2 +- core/net/ipv6/uip-ds6.c | 16 ++--- core/net/ipv6/uip-ds6.h | 1 + core/net/ipv6/uip-nd6.c | 2 +- core/net/ipv6/uip-nd6.h | 5 +- core/net/ipv6/uip6.c | 2 +- cpu/arm/aducrf101/Common/ADuCRF101.h | 2 +- cpu/arm/aducrf101/Common/radioeng.c | 1 - cpu/arm/aducrf101/Common/system_ADuCRF101.c | 3 +- cpu/arm/aducrf101/Common/system_ADuCRF101.h | 4 +- cpu/arm/at91sam7s/loader/elfloader-arch-otf.h | 3 +- cpu/arm/at91sam7s/loader/elfloader-otf.h | 50 +++++++-------- cpu/avr/dev/lanc111.c | 48 +++++++-------- cpu/avr/minileds.c | 1 + cpu/mc1322x/lib/printf.c | 2 +- cpu/stm32w108/hal/error.h | 10 ++- cpu/stm32w108/hal/micro/cortexm3/mfg-token.h | 52 ++++++++++------ cpu/stm32w108/hal/micro/cortexm3/nvm.h | 3 +- cpu/stm32w108/hal/micro/cortexm3/uart.h | 4 +- .../micro/generic/compiler/platform-common.h | 2 +- cpu/stm32w108/hal/micro/micro-common.h | 57 ++++++++++-------- cpu/stm32w108/hal/micro/system-timer.h | 2 +- doc/Doxyfile | 5 ++ doc/pics/raven3290p.jpg | Bin 0 -> 34027 bytes platform/avr-ravenusb/cdc_task.c | 8 ++- platform/cooja-ip64/contiki-cooja-ip64-main.c | 25 +++++--- platform/cooja/contiki-cooja-main.c | 25 +++++--- .../srf06-cc26xx/sensortag/bmp-280-sensor.c | 2 +- .../srf06-cc26xx/sensortag/opt-3001-sensor.c | 2 +- platform/wismote/dev/acc-sensor.c | 24 +++++--- platform/wismote/dev/ext-sensor.c | 22 ++++--- 34 files changed, 231 insertions(+), 175 deletions(-) create mode 100644 doc/pics/raven3290p.jpg diff --git a/apps/program-handler/program-handler.c b/apps/program-handler/program-handler.c index 4173d7c04..0718b5c89 100644 --- a/apps/program-handler/program-handler.c +++ b/apps/program-handler/program-handler.c @@ -246,6 +246,7 @@ program_handler_load(char *name, char *arg) #else /* WITH_LOADER_ARCH */ #define RUN(prg, process, arg) process_start(process, arg) #endif /* WITH_LOADER_ARCH */ +#if CTK_CONF_SCREENSAVER /*-----------------------------------------------------------------------------------*/ /** * Configures the name of the screensaver to be loaded when @@ -255,7 +256,6 @@ program_handler_load(char *name, char *arg) * should be used. */ /*-----------------------------------------------------------------------------------*/ -#if CTK_CONF_SCREENSAVER void program_handler_setscreensaver(char *name) { diff --git a/core/net/ip/uip.h b/core/net/ip/uip.h index 12861cdd9..ae00a729c 100644 --- a/core/net/ip/uip.h +++ b/core/net/ip/uip.h @@ -142,15 +142,18 @@ typedef struct uip_eth_addr { typedef uip_802154_longaddr uip_lladdr_t; #define UIP_802154_SHORTADDR_LEN 2 #define UIP_802154_LONGADDR_LEN 8 +/** \brief Link layer address length */ #define UIP_LLADDR_LEN UIP_802154_LONGADDR_LEN #else /*UIP_CONF_LL_802154*/ #if UIP_CONF_LL_80211 /** \brief 802.11 address */ typedef uip_80211_addr uip_lladdr_t; +/** \brief Link layer address length */ #define UIP_LLADDR_LEN 6 #else /*UIP_CONF_LL_80211*/ /** \brief Ethernet address */ typedef uip_eth_addr uip_lladdr_t; +/** \brief Link layer address length */ #define UIP_LLADDR_LEN 6 #endif /*UIP_CONF_LL_80211*/ #endif /*UIP_CONF_LL_802154*/ @@ -1379,8 +1382,7 @@ struct uip_conn { uint8_t nrtx; /**< The number of retransmissions for the last segment sent. */ - /** The application state. */ - uip_tcp_appstate_t appstate; + uip_tcp_appstate_t appstate; /** The application state. */ }; diff --git a/core/net/ipv6/sicslowpan.c b/core/net/ipv6/sicslowpan.c index 3a870a8c5..7e5228e9e 100644 --- a/core/net/ipv6/sicslowpan.c +++ b/core/net/ipv6/sicslowpan.c @@ -1046,12 +1046,14 @@ uncompress_hdr_hc06(uint16_t ip_len) * - Both src and dest interface ID are recoverable from lower layer * header * - Next header is either ICMP, UDP or TCP + * * Moreover, if next header is UDP, we try to compress it using HC_UDP. - * This is feasible is both ports are between F0B0 and F0B0 + 15\n\n + * This is feasible is both ports are between F0B0 and F0B0 + 15. + * * * Resulting header structure: - * - For ICMP, TCP, non compressed UDP\n - * HC1 encoding = 11111010 (UDP) 11111110 (TCP) 11111100 (ICMP)\n + * - For ICMP, TCP, non compressed UDP\n + * HC1 encoding = 11111010 (UDP) 11111110 (TCP) 11111100 (ICMP)\n * \verbatim * 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -1062,8 +1064,8 @@ uncompress_hdr_hc06(uint16_t ip_len) * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * \endverbatim * - * - For compressed UDP - * HC1 encoding = 11111011, HC_UDP encoding = 11100000\n + * - For compressed UDP\n + * HC1 encoding = 11111011, HC_UDP encoding = 11100000\n * \verbatim * 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -1577,7 +1579,6 @@ output(const uip_lladdr_t *localdest) /*--------------------------------------------------------------------*/ /** \brief Process a received 6lowpan packet. - * \param r The MAC layer * * The 6lowpan packet is put in packetbuf by the MAC. If its a frag1 or * a non-fragmented packet we first uncompress the IP header. The diff --git a/core/net/ipv6/uip-ds6-nbr.c b/core/net/ipv6/uip-ds6-nbr.c index db14f8647..6243b0368 100644 --- a/core/net/ipv6/uip-ds6-nbr.c +++ b/core/net/ipv6/uip-ds6-nbr.c @@ -231,10 +231,10 @@ uip_ds6_link_neighbor_callback(int status, int numtx) } /*---------------------------------------------------------------------------*/ +/** Periodic processing on neighbors */ void uip_ds6_neighbor_periodic(void) { - /* Periodic processing on neighbors */ uip_ds6_nbr_t *nbr = nbr_table_head(ds6_neighbors); while(nbr != NULL) { switch(nbr->state) { diff --git a/core/net/ipv6/uip-ds6.c b/core/net/ipv6/uip-ds6.c index 148c8aa24..463798815 100644 --- a/core/net/ipv6/uip-ds6.c +++ b/core/net/ipv6/uip-ds6.c @@ -53,23 +53,23 @@ #define DEBUG DEBUG_NONE #include "net/ip/uip-debug.h" -struct etimer uip_ds6_timer_periodic; /** \brief Timer for maintenance of data structures */ +struct etimer uip_ds6_timer_periodic; /**< Timer for maintenance of data structures */ #if UIP_CONF_ROUTER -struct stimer uip_ds6_timer_ra; /** \brief RA timer, to schedule RA sending */ +struct stimer uip_ds6_timer_ra; /**< RA timer, to schedule RA sending */ #if UIP_ND6_SEND_RA -static uint8_t racount; /** \brief number of RA already sent */ -static uint16_t rand_time; /** \brief random time value for timers */ +static uint8_t racount; /**< number of RA already sent */ +static uint16_t rand_time; /**< random time value for timers */ #endif #else /* UIP_CONF_ROUTER */ -struct etimer uip_ds6_timer_rs; /** \brief RS timer, to schedule RS sending */ -static uint8_t rscount; /** \brief number of rs already sent */ +struct etimer uip_ds6_timer_rs; /**< RS timer, to schedule RS sending */ +static uint8_t rscount; /**< number of rs already sent */ #endif /* UIP_CONF_ROUTER */ /** \name "DS6" Data structures */ /** @{ */ -uip_ds6_netif_t uip_ds6_if; /** \brief The single interface */ -uip_ds6_prefix_t uip_ds6_prefix_list[UIP_DS6_PREFIX_NB]; /** \brief Prefix list */ +uip_ds6_netif_t uip_ds6_if; /**< The single interface */ +uip_ds6_prefix_t uip_ds6_prefix_list[UIP_DS6_PREFIX_NB]; /**< Prefix list */ /* Used by Cooja to enable extraction of addresses from memory.*/ uint8_t uip_ds6_addr_size; diff --git a/core/net/ipv6/uip-ds6.h b/core/net/ipv6/uip-ds6.h index b111d0f5b..1c00a50b0 100644 --- a/core/net/ipv6/uip-ds6.h +++ b/core/net/ipv6/uip-ds6.h @@ -282,6 +282,7 @@ uint8_t uip_ds6_is_addr_onlink(uip_ipaddr_t *ipaddr); /** \name Unicast address list basic routines */ /** @{ */ +/** \brief Add a unicast address to the interface */ uip_ds6_addr_t *uip_ds6_addr_add(uip_ipaddr_t *ipaddr, unsigned long vlifetime, uint8_t type); void uip_ds6_addr_rm(uip_ds6_addr_t *addr); diff --git a/core/net/ipv6/uip-nd6.c b/core/net/ipv6/uip-nd6.c index 1b966027a..65e534832 100644 --- a/core/net/ipv6/uip-nd6.c +++ b/core/net/ipv6/uip-nd6.c @@ -811,7 +811,7 @@ uip_nd6_rs_output(void) return; } /*---------------------------------------------------------------------------*/ -/* +/** * Process a Router Advertisement * * - Possible actions when receiving a RA: add router to router list, diff --git a/core/net/ipv6/uip-nd6.h b/core/net/ipv6/uip-nd6.h index 8b5893328..c51d465b5 100644 --- a/core/net/ipv6/uip-nd6.h +++ b/core/net/ipv6/uip-nd6.h @@ -59,9 +59,12 @@ /** \name RFC 4861 Host constant */ /** @{ */ +/** \brief Maximum router solicitation delay */ #define UIP_ND6_MAX_RTR_SOLICITATION_DELAY 1 +/** \brief Router solicitation interval */ #define UIP_ND6_RTR_SOLICITATION_INTERVAL 4 -#define UIP_ND6_MAX_RTR_SOLICITATIONS 3 +/** \brief Maximum router solicitations */ +#define UIP_ND6_MAX_RTR_SOLICITATIONS 3 /** @} */ /** \name RFC 4861 Router constants */ diff --git a/core/net/ipv6/uip6.c b/core/net/ipv6/uip6.c index 63858017c..7614b537d 100644 --- a/core/net/ipv6/uip6.c +++ b/core/net/ipv6/uip6.c @@ -654,7 +654,7 @@ static uint8_t uip_reassflags; */ -struct etimer uip_reass_timer; /* timer for reassembly */ +struct etimer uip_reass_timer; /**< Timer for reassembly */ uint8_t uip_reass_on; /* equal to 1 if we are currently reassembling a packet */ static uint32_t uip_id; /* For every packet that is to be fragmented, the source diff --git a/cpu/arm/aducrf101/Common/ADuCRF101.h b/cpu/arm/aducrf101/Common/ADuCRF101.h index 287c6416a..46c02d740 100644 --- a/cpu/arm/aducrf101/Common/ADuCRF101.h +++ b/cpu/arm/aducrf101/Common/ADuCRF101.h @@ -33,7 +33,7 @@ */ /****************************************************************************************************//** - * @file ADUCRF101.h + * @file ADuCRF101.h * * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for * default ADUCRF101 Device Series diff --git a/cpu/arm/aducrf101/Common/radioeng.c b/cpu/arm/aducrf101/Common/radioeng.c index c4431c832..975ddbde6 100644 --- a/cpu/arm/aducrf101/Common/radioeng.c +++ b/cpu/arm/aducrf101/Common/radioeng.c @@ -1292,7 +1292,6 @@ static RIE_Responses RadioWaitOnState(RadioState FinalState) /** @fn RIE_Responses RadioWaitOnCmdLdr(void) @brief Wait for Final State to be reached - @param FinalState State to wait on @return RIE_Responses Error code **/ static RIE_Responses RadioWaitOnCmdLdr(void) diff --git a/cpu/arm/aducrf101/Common/system_ADuCRF101.c b/cpu/arm/aducrf101/Common/system_ADuCRF101.c index 0db949554..f6abc0a98 100644 --- a/cpu/arm/aducrf101/Common/system_ADuCRF101.c +++ b/cpu/arm/aducrf101/Common/system_ADuCRF101.c @@ -32,7 +32,7 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** -@file system_ADUCRF101.c +@file system_ADuCRF101.c @brief CMSIS Cortex-M3 Device Peripheral Access Layer Implementation File for the ADuCRF101 @version v1.0 @@ -106,7 +106,6 @@ void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ /** * Initialize the system * - * @param none * @return none * * @brief Setup the microcontroller system. diff --git a/cpu/arm/aducrf101/Common/system_ADuCRF101.h b/cpu/arm/aducrf101/Common/system_ADuCRF101.h index 4e6532215..241e3b062 100644 --- a/cpu/arm/aducrf101/Common/system_ADuCRF101.h +++ b/cpu/arm/aducrf101/Common/system_ADuCRF101.h @@ -32,7 +32,7 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** -@file system_ADUCRF101.h +@file system_ADuCRF101.h @brief: CMSIS Cortex-M3 Device Peripheral Access Layer Header File for the ADuCRF101 @version v0.2 @@ -51,7 +51,6 @@ /** * @brief Initialize the system * - * @param none * @return none * * Setup the microcontroller system. @@ -62,7 +61,6 @@ extern void SystemInit (void); /** * @brief Update internal SystemCoreClock variable * - * @param none * @return none * * Updates the internal SystemCoreClock with current core diff --git a/cpu/arm/at91sam7s/loader/elfloader-arch-otf.h b/cpu/arm/at91sam7s/loader/elfloader-arch-otf.h index 9fe8a77ae..904e601f8 100644 --- a/cpu/arm/at91sam7s/loader/elfloader-arch-otf.h +++ b/cpu/arm/at91sam7s/loader/elfloader-arch-otf.h @@ -71,7 +71,8 @@ /** * \brief Perform a relocation. - * \param output The output object for the segment. + * \param input_fd The file descriptor for the ELF file. + * \param output The output object for the segment. * \param sectionoffset The file offset at which the relocation can be found. * \param sectionaddr The section start address (absolute runtime). * \param rela A pointer to an ELF32 rela structure (struct elf32_rela). diff --git a/cpu/arm/at91sam7s/loader/elfloader-otf.h b/cpu/arm/at91sam7s/loader/elfloader-otf.h index d3c06c091..5812fbe53 100644 --- a/cpu/arm/at91sam7s/loader/elfloader-otf.h +++ b/cpu/arm/at91sam7s/loader/elfloader-otf.h @@ -169,11 +169,11 @@ struct elfloader_output { const struct elfloader_output_ops *ops; }; /** - * \brief Allocate a new segment - * \param input The output object - * \param type Type of segment - * \param size Size of segment in bytes - * \return A pointer to the start of the segment. + * \brief Allocate a new segment + * \param output The output object + * \param type Type of segment + * \param size Size of segment in bytes + * \return A pointer to the start of the segment. * * The returned address doesn't need to correspond to any real memory, * since it's only used for calculating the relocations. @@ -183,41 +183,41 @@ void *elfloader_allocate_segment(struct elfloader_output *output, unsigned int type, int size); /** - * \brief Start writing to a new segment - * \param input The output object - * \param type Type of segment - * \param addr Address of segment from elfloader_allocate_segment - * \param size Size of segment in bytes - * \return Returns ELFLOADER_OK if successful, otherwise an error code + * \brief Start writing to a new segment + * \param output The output object + * \param type Type of segment + * \param addr Address of segment from elfloader_allocate_segment + * \param size Size of segment in bytes + * \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); /** - * \brief Mark end of segment - * \param input The output object - * \return Zero if successful + * \brief Mark end of segment + * \param output The output object + * \return Zero if successful */ int elfloader_end_segment(struct elfloader_output *output); /** - * \brief Write data to a segment - * \param input The output object - * \param buf Data to be written - * \param len Length of data - * \return The number of bytes actually written, or negative if failed. + * \brief Write data to a segment + * \param output The output object + * \param buf Data to be written + * \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); /** - * \brief Get the current offset in the file where the next data will - * be written. - * \param input The output object - * \return The current offset. + * \brief Get the current offset in the file where the next data will + * be written. + * \param output The output object + * \return The current offset. */ unsigned int elfloader_segment_offset(struct elfloader_output *output); @@ -259,8 +259,8 @@ void elfloader_init(void); /** * \brief Load and relocate an ELF file. - * \param input Input object defining how to read from the ELF file - * \param output Output object defining how to create and write to seegments. + * \param input_fd Input object defining how to read from the ELF file + * \param output Output object defining how to create and write to seegments. * \return ELFLOADER_OK if loading and relocation worked. * Otherwise an error value. * diff --git a/cpu/avr/dev/lanc111.c b/cpu/avr/dev/lanc111.c index 60cde63af..ebf5242c6 100644 --- a/cpu/avr/dev/lanc111.c +++ b/cpu/avr/dev/lanc111.c @@ -271,6 +271,9 @@ */ #define NIC_MMUCR (LANC111_BASE_ADDR + 0x00) +/*! + * \brief MMU command register busy flag. + */ #define MMUCR_BUSY 0x0001 #define MMU_NOP 0 @@ -292,7 +295,7 @@ /*! * \brief Bank 2 - Allocation result register. * - * This byte register is updated upon a \ref MMU_ALO command. + * This byte register is updated upon a MMU_ALO command. */ #define NIC_ARR (LANC111_BASE_ADDR + 0x03) @@ -334,14 +337,14 @@ */ #define NIC_MSK (LANC111_BASE_ADDR + 0x0D) -#define INT_MD 0x80 /*!< \ref PHY state change interrupt bit mask. */ -#define INT_ERCV 0x40 /*!< \ref Early receive interrupt bit mask. */ -#define INT_EPH 0x20 /*!< \ref Ethernet protocol interrupt bit mask. */ -#define INT_RX_OVRN 0x10 /*!< \ref Receive overrun interrupt bit mask. */ -#define INT_ALLOC 0x08 /*!< \ref Transmit allocation interrupt bit mask. */ -#define INT_TX_EMPTY 0x04 /*!< \ref Transmitter empty interrupt bit mask. */ -#define INT_TX 0x02 /*!< \ref Transmit complete interrupt bit mask. */ -#define INT_RCV 0x01 /*!< \ref Receive interrupt bit mask. */ +#define INT_MD 0x80 /*!< PHY state change interrupt bit mask. */ +#define INT_ERCV 0x40 /*!< Early receive interrupt bit mask. */ +#define INT_EPH 0x20 /*!< Ethernet protocol interrupt bit mask. */ +#define INT_RX_OVRN 0x10 /*!< Receive overrun interrupt bit mask. */ +#define INT_ALLOC 0x08 /*!< Transmit allocation interrupt bit mask. */ +#define INT_TX_EMPTY 0x04 /*!< Transmitter empty interrupt bit mask. */ +#define INT_TX 0x02 /*!< Transmit complete interrupt bit mask. */ +#define INT_RCV 0x01 /*!< Receive interrupt bit mask. */ /*! * \brief Bank 3 - Multicast table register. @@ -493,12 +496,6 @@ #define nic_bs(bank) nic_outlb(NIC_BSR, bank) -/*! - * \struct _NICINFO lanc111.h dev/lanc111.h - * \brief Network interface controller information structure. - */ -/*@}*/ - /*! * \addtogroup xgNicLanc111 */ @@ -840,10 +837,10 @@ static int NicStart(CONST uint8_t * mac) return 0; } +#if 0 /* * NIC interrupt entry. */ -#if 0 static void NicInterrupt(void *arg) { uint8_t isr; @@ -955,7 +952,7 @@ static void NicRead(uint8_t * buf, uint16_t len) * * Nic interrupts must be disabled when calling this funtion. * - * \return Pointer to an allocated ::NETBUF. If there is no + * \return Pointer to an allocated NETBUF. If there is no * no data available, then the function returns a * null pointer. If the NIC's buffer seems to be * corrupted, a pointer to 0xFFFF is returned. @@ -1014,6 +1011,7 @@ static NETBUF *NicGetPacket(void) return nb; } +#if 0 /*! * \brief Load a packet into the nic's transmit ring buffer. * @@ -1028,7 +1026,6 @@ static NETBUF *NicGetPacket(void) * will automatically release the network buffer * structure. */ -#if 0 static int NicPutPacket(NETBUF * nb) { uint16_t sz; @@ -1119,13 +1116,12 @@ static int NicPutPacket(NETBUF * nb) return 0; } -#endif +#endif /* 0 */ -/*! \fn NicRxLanc(void *arg) - * \brief NIC receiver thread. - * - */ #if 1 +/*! + * \brief NIC receiver thread. + */ PROCESS_THREAD(lanc111_process, ev, data) /*THREAD(NicRxLanc, arg)*/ { @@ -1202,7 +1198,7 @@ PROCESS_THREAD(lanc111_process, ev, data) PROCESS_END(); } -#endif /* 0 */ +#endif /* 1 */ #if 0 /*! * \brief Send Ethernet packet. @@ -1245,7 +1241,7 @@ int LancOutput(NUTDEVICE * dev, NETBUF * nb) } return rc; } -#endif +#endif /* 0 */ #if 0 /*! * \brief Initialize Ethernet hardware. @@ -1340,7 +1336,7 @@ NUTDEVICE devSmsc111 = { }; /*@}*/ -#endif +#endif /* 0 */ int diff --git a/cpu/avr/minileds.c b/cpu/avr/minileds.c index 70694c5dc..5cce1bc88 100644 --- a/cpu/avr/minileds.c +++ b/cpu/avr/minileds.c @@ -27,6 +27,7 @@ * SUCH DAMAGE. * * + */ /** * \file * Dummy implementation of minileds module diff --git a/cpu/mc1322x/lib/printf.c b/cpu/mc1322x/lib/printf.c index c716b5893..b6dede7e6 100644 --- a/cpu/mc1322x/lib/printf.c +++ b/cpu/mc1322x/lib/printf.c @@ -34,7 +34,7 @@ */ /** - * \file printf-stdarg.c + * \file lib/printf.c * * \brief sprintf functions to replace newlib for AVR32 UC3. * diff --git a/cpu/stm32w108/hal/error.h b/cpu/stm32w108/hal/error.h index e719fee0c..5daeefc97 100644 --- a/cpu/stm32w108/hal/error.h +++ b/cpu/stm32w108/hal/error.h @@ -10,12 +10,12 @@ #ifndef ERRORS_H_ #define ERRORS_H_ +#ifndef __STSTATUS_TYPE__ +#define __STSTATUS_TYPE__ /** * @brief Return type for St functions. */ -#ifndef __STSTATUS_TYPE__ -#define __STSTATUS_TYPE__ - typedef uint8_t StStatus; +typedef uint8_t StStatus; #endif //__STSTATUS_TYPE__ /** @@ -27,7 +27,7 @@ * @brief Macro used by error-def.h to define all of the return codes. * * @param symbol The name of the constant being defined. All St returns - * begin with ST_. For example, ::ST_CONNECTION_OPEN. + * begin with ST_. For example, ::ST_ERR_FATAL. * * @param value The value of the return code. For example, 0x61. */ @@ -36,9 +36,7 @@ enum { -#ifndef DOXYGEN_SHOULD_SKIP_THIS #include "error-def.h" -#endif //DOXYGEN_SHOULD_SKIP_THIS /** Gets defined as a count of all the possible return codes in the * StZNet stack API. */ diff --git a/cpu/stm32w108/hal/micro/cortexm3/mfg-token.h b/cpu/stm32w108/hal/micro/cortexm3/mfg-token.h index 8344b5b3e..685a3bc72 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/mfg-token.h +++ b/cpu/stm32w108/hal/micro/cortexm3/mfg-token.h @@ -7,6 +7,7 @@ #ifndef MFG_TOKEN_H_ #define MFG_TOKEN_H_ +#ifndef DOXYGEN_SHOULD_SKIP_THIS // The manufacturing tokens live in the Info Blocks, while all other tokens // live in the Simulated EEPROM. This requires the token names to be defined @@ -20,10 +21,13 @@ * that point to the correct location in the Info Blocks. (This is the * extern, the actual definition is found in hal/micro/cortexm3/token.c) * - * \param name: The name of the token. - * - * \param TOKEN_##name##_ADDRESS: The address in EEPROM at which the token - * will be stored. This parameter is generated with a macro above. + * \param name: The name of the token. + * \param creator: The manufacturing creators. + * \param iscnt: + * \param isidx: + * \param type: The token type. The types are found in token-stack.h. + * \param arraysize: The number of elements in an indexed token (arraysize=1 + * for scalar tokens). */ #define TOKEN_MFG(name,creator,iscnt,isidx,type,arraysize,...) \ extern const uint16_t TOKEN_##name; @@ -34,9 +38,13 @@ * \brief Macro for translating token definitions into size variables. * This provides a convenience for abstracting the 'sizeof(type)' anywhere. * - * \param name: The name of the token. - * - * \param type: The token type. The types are found in token-stack.h. + * \param name: The name of the token. + * \param creator: The manufacturing creators. + * \param iscnt: + * \param isidx: + * \param type: The token type. The types are found in token-stack.h. + * \param arraysize: The number of elements in an indexed token (arraysize=1 + * for scalar tokens). */ #define TOKEN_MFG(name,creator,iscnt,isidx,type,arraysize,...) \ TOKEN_##name##_SIZE = sizeof(type), @@ -49,12 +57,16 @@ /** * \brief Macro for typedef'ing the CamelCase token type found in * token-stack.h to a capitalized TOKEN style name that ends in _TYPE. - * This macro allows other macros below to use 'token##_TYPE' to declare + * This macro allows other macros below to use 'token\#\#_TYPE' to declare * a local copy of that token. * - * \param name: The name of the token. - * - * \param type: The token type. The types are found in token-stack.h. + * \param name: The name of the token. + * \param creator: The manufacturing creators. + * \param iscnt: + * \param isidx: + * \param type: The token type. The types are found in token-stack.h. + * \param arraysize: The number of elements in an indexed token (arraysize=1 + * for scalar tokens). */ #define TOKEN_MFG(name,creator,iscnt,isidx,type,arraysize,...) \ typedef type TOKEN_##name##_TYPE; @@ -70,8 +82,7 @@ * subsequent tokens to align against. ( See hal/micro/cortexm3/token.c for * the instances of TOKEN_NEXT_ADDRESS() ); * - * \param region: The name to give to the element in the address enum.. - * + * \param region: The name to give to the element in the address enum. * \param address: The address in EEPROM where the region begins. */ #define TOKEN_NEXT_ADDRESS(region, address) \ @@ -80,14 +91,17 @@ /** * \brief Macro for creating ADDRESS and END elements for each token in * the enum below. The ADDRESS element is linked to from the the normal - * TOKEN_##name macro and provides the value passed into the internal token + * TOKEN_\#\#name macro and provides the value passed into the internal token * system calls. The END element is a placeholder providing the starting * point for the ADDRESS of the next dynamically positioned token. * - * \param name: The name of the token. - * - * \param arraysize: The number of elements in an indexed token (arraysize=1 - * for scalar tokens). + * \param name: The name of the token. + * \param creator: The manufacturing creators. + * \param iscnt: + * \param isidx: + * \param type: The token type. The types are found in token-stack.h. + * \param arraysize: The number of elements in an indexed token (arraysize=1 + * for scalar tokens). */ #define TOKEN_MFG(name,creator,iscnt,isidx,type,arraysize,...) \ TOKEN_##name##_ADDRESS, \ @@ -106,8 +120,6 @@ enum { #undef DEFINETOKENS - -#ifndef DOXYGEN_SHOULD_SKIP_THIS /** * \brief Copies the token value from non-volatile storage into a RAM * location. This is the internal function that the exposed API diff --git a/cpu/stm32w108/hal/micro/cortexm3/nvm.h b/cpu/stm32w108/hal/micro/cortexm3/nvm.h index d8accaed1..0592cf5f5 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/nvm.h +++ b/cpu/stm32w108/hal/micro/cortexm3/nvm.h @@ -14,8 +14,7 @@ * @addtogroup stm32w-cpu * @{ */ -/** @defgroup nvm - * @brief Cortex-M3 Non-Volatile Memory data storage system. +/** @defgroup nvm Cortex-M3 Non-Volatile Memory data storage system. * * This header defines the API for NVM data storage. This header also * describes the algorithm behind the NVM data storage system with notes diff --git a/cpu/stm32w108/hal/micro/cortexm3/uart.h b/cpu/stm32w108/hal/micro/cortexm3/uart.h index c15bf051d..28c56fbbe 100644 --- a/cpu/stm32w108/hal/micro/cortexm3/uart.h +++ b/cpu/stm32w108/hal/micro/cortexm3/uart.h @@ -32,8 +32,8 @@ typedef enum * * @param parity The type of parity used for communication. * See the SerialParity enum for possible values - * - * @return stopbits The number of stop bits used for communication. + * + * @param stopbits The number of stop bits used for communication. * Valid values are 1 or 2 */ void uartInit(uint32_t baudrate, uint8_t databits, SerialParity parity, uint8_t stopbits); diff --git a/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h b/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h index 24bbfceaf..21fe07526 100644 --- a/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h +++ b/cpu/stm32w108/hal/micro/generic/compiler/platform-common.h @@ -15,7 +15,7 @@ * @{ */ /** \file hal/micro/generic/compiler/platform-common.h - * See \ref platform_common for detailed documentation. + * See platform_common.h for detailed documentation. * * */ diff --git a/cpu/stm32w108/hal/micro/micro-common.h b/cpu/stm32w108/hal/micro/micro-common.h index 9cba68903..070de876e 100644 --- a/cpu/stm32w108/hal/micro/micro-common.h +++ b/cpu/stm32w108/hal/micro/micro-common.h @@ -70,38 +70,43 @@ void halInternalDisableWatchDog(uint8_t magicKey); */ boolean halInternalWatchDogEnabled( void ); -#ifdef DOXYGEN_SHOULD_SKIP_THIS /** @brief Enumerations for the possible microcontroller sleep modes. - * - SLEEPMODE_RUNNING - * Everything is active and running. In practice this mode is not - * used, but it is defined for completeness of information. - * - SLEEPMODE_IDLE - * Only the CPU is idled. The rest of the chip continues runing - * normally. The chip will wake from any interrupt. - * - SLEEPMODE_WAKETIMER - * The sleep timer clock sources remain running. The RC is always - * running and the 32kHz XTAL depends on the board header. Wakeup - * is possible from both GPIO and the sleep timer. System time - * is maintained. The sleep timer is assumed to be configured - * properly for wake events. - * - SLEEPMODE_MAINTAINTIMER - * The sleep timer clock sources remain running. The RC is always - * running and the 32kHz XTAL depends on the board header. Wakeup - * is possible from only GPIO. System time is maintained. - * - SLEEPMODE_NOTIMER - * The sleep timer clock sources (both RC and XTAL) are turned off. - * Wakeup is possible from only GPIO. System time is lost. */ +#ifdef DOXYGEN_SHOULD_SKIP_THIS enum SleepModes #else typedef uint8_t SleepModes; enum #endif { + /** + * Everything is active and running. In practice this mode is not + * used, but it is defined for completeness of information. + */ SLEEPMODE_RUNNING = 0, + /** + * Oly the CPU is idled. The rest of the chip continues runing + * normally. The chip will wake from any interrupt. + */ SLEEPMODE_IDLE = 1, + /** + * The sleep timer clock sources remain running. The RC is always + * running and the 32kHz XTAL depends on the board header. Wakeup + * is possible from both GPIO and the sleep timer. System time + * is maintained. The sleep timer is assumed to be configured + * properly for wake events. + */ SLEEPMODE_WAKETIMER = 2, + /** + * The sleep timer clock sources remain running. The RC is always + * running and the 32kHz XTAL depends on the board header. Wakeup + * is possible from only GPIO. System time is maintained. + */ SLEEPMODE_MAINTAINTIMER = 3, + /** + * The sleep timer clock sources (both RC and XTAL) are turned off. + * Wakeup is possible from only GPIO. System time is lost. + */ SLEEPMODE_NOTIMER = 4, }; @@ -128,15 +133,15 @@ void halCommonDelayMicroseconds(uint16_t us); * and if yes it will jump into it according to the user parameters. * * - * @param mode The bootloader mode, 0 UART mode, 1 RF mode. All other - * values are reserved + * @param mode The bootloader mode, 0 UART mode, 1 RF mode. All other + * values are reserved * @param channel The channel where the booloader will operate. 0 means - * default channel (only vaild for RF mode). - * @param panID The panID where the booloader will operate. 0xFFFF means - * default panID (only vaild for RF mode). + * default channel (only vaild for RF mode). + * @param panID The panID where the booloader will operate. 0xFFFF means + * default panID (only vaild for RF mode). * @return An error code or it will never return. */ -StStatus halBootloaderStart(uint8_t mode, uint8_t channel, uint16_t panId); +StStatus halBootloaderStart(uint8_t mode, uint8_t channel, uint16_t panID); #ifdef CORTEXM3_STM32F103 #include "micro/cortexm3/stm32f103ret/micro-specific.h" diff --git a/cpu/stm32w108/hal/micro/system-timer.h b/cpu/stm32w108/hal/micro/system-timer.h index 3a34ab453..8fd5ee91f 100644 --- a/cpu/stm32w108/hal/micro/system-timer.h +++ b/cpu/stm32w108/hal/micro/system-timer.h @@ -10,7 +10,7 @@ * @addtogroup stm32w-cpu * @{ */ -/** @defgroup system_timer +/** @defgroup system_timer System Timer * @brief Functions that provide access to the system clock. * * A single system tick (as returned by ::halCommonGetInt16uMillisecondTick() and diff --git a/doc/Doxyfile b/doc/Doxyfile index e0b0d232e..8d4db61ce 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -1959,6 +1959,11 @@ PREDEFINED = CC_FUNCTION_POINTER_ARGS:=1 \ UIP_TCP:=1 \ UIP_UDP:=1 \ UIP_CONF_ICMP6:=1 \ + UIP_ND6_DEF_MAXDADNS:=1 \ + UIP_CONF_IPV6_REASSEMBLY:=1 \ + RNG_CONF_USE_ADC:=0 \ + RNG_CONF_USE_RADIO_CLOCK:=1 \ + CLOCK_SECOND:=128 \ WITH_LOADER_ARCH:=1 \ __attribute__(x):= \ CC_ALIGN_ATTR(n):= \ diff --git a/doc/pics/raven3290p.jpg b/doc/pics/raven3290p.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a09dc0b176e75838665f8f9553b0276cec70433 GIT binary patch literal 34027 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 YfGg@hF(C2=aqUsWNR57iiYkEr*;F@R7ytkO literal 0 HcmV?d00001 diff --git a/platform/avr-ravenusb/cdc_task.c b/platform/avr-ravenusb/cdc_task.c index 64af3741e..11eca632d 100644 --- a/platform/avr-ravenusb/cdc_task.c +++ b/platform/avr-ravenusb/cdc_task.c @@ -75,6 +75,13 @@ #include #include +#if UIP_CONF_IPV6_RPL +// Include needs to be up here instead of embedded in the other +// UIP_CONF_IPV6_RPL block, as doxygen seems not to be compatible with +// #includes embedded in other functions and spits out a warning. +#include "rpl.h" +#endif + #if JACKDAW_CONF_USE_SETTINGS #include "settings.h" #endif @@ -579,7 +586,6 @@ void menu_process(char c) #if UIP_CONF_IPV6_RPL -#include "rpl.h" extern uip_ds6_netif_t uip_ds6_if; case 'N': { uint8_t i,j; diff --git a/platform/cooja-ip64/contiki-cooja-ip64-main.c b/platform/cooja-ip64/contiki-cooja-ip64-main.c index 1077162a7..0c866a404 100644 --- a/platform/cooja-ip64/contiki-cooja-ip64-main.c +++ b/platform/cooja-ip64/contiki-cooja-ip64-main.c @@ -283,6 +283,8 @@ process_run_thread_loop(void *data) /*---------------------------------------------------------------------------*/ /** * \brief Initialize a mote by starting processes etc. + * \param env JNI Environment interface pointer + * \param obj unused * * This function initializes a mote by starting certain * processes and setting up the environment. @@ -300,12 +302,15 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_init(JNIEnv *env, jobject obj) /*---------------------------------------------------------------------------*/ /** * \brief Get a segment from the process memory. - * \param start Start address of segment - * \param length Size of memory segment + * \param env JNI Environment interface pointer + * \param obj unused + * \param rel_addr Start address of segment + * \param length Size of memory segment + * \param mem_arr Byte array destination for the fetched memory segment * \return Java byte array containing a copy of memory segment. * * Fetches a memory segment from the process memory starting at - * (start), with size (length). This function does not perform + * (rel_addr), with size (length). This function does not perform * ANY error checking, and the process may crash if addresses are * not available/readable. * @@ -326,9 +331,11 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_getMemory(JNIEnv *env, jobject obj, /*---------------------------------------------------------------------------*/ /** * \brief Replace a segment of the process memory with given byte array. - * \param start Start address of segment - * \param length Size of memory segment - * \param mem_arr Byte array contaning new memory + * \param env JNI Environment interface pointer + * \param obj unused + * \param rel_addr Start address of segment + * \param length Size of memory segment + * \param mem_arr Byte array contaning new memory * * Replaces a process memory segment with given byte array. * This function does not perform ANY error checking, and the @@ -349,6 +356,8 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_setMemory(JNIEnv *env, jobject obj, /*---------------------------------------------------------------------------*/ /** * \brief Let mote execute one "block" of code (tick mote). + * \param env JNI Environment interface pointer + * \param obj unused * * Let mote defined by the active contiki processes and current * process memory execute some program code. This code must not block @@ -413,7 +422,9 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_tick(JNIEnv *env, jobject obj) /*---------------------------------------------------------------------------*/ /** * \brief Set the relative memory address of the reference variable. - * \return Relative memory address. + * \param env JNI Environment interface pointer + * \param obj unused + * \param addr Relative memory address * * This is a JNI function and should only be called via the * responsible Java part (MoteType.java). diff --git a/platform/cooja/contiki-cooja-main.c b/platform/cooja/contiki-cooja-main.c index eddfe1adf..e798fa714 100644 --- a/platform/cooja/contiki-cooja-main.c +++ b/platform/cooja/contiki-cooja-main.c @@ -359,6 +359,8 @@ process_run_thread_loop(void *data) /*---------------------------------------------------------------------------*/ /** * \brief Initialize a mote by starting processes etc. + * \param env JNI Environment interface pointer + * \param obj unused * * This function initializes a mote by starting certain * processes and setting up the environment. @@ -376,12 +378,15 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_init(JNIEnv *env, jobject obj) /*---------------------------------------------------------------------------*/ /** * \brief Get a segment from the process memory. - * \param start Start address of segment - * \param length Size of memory segment + * \param env JNI Environment interface pointer + * \param obj unused + * \param rel_addr Start address of segment + * \param length Size of memory segment + * \param mem_arr Byte array destination for the fetched memory segment * \return Java byte array containing a copy of memory segment. * * Fetches a memory segment from the process memory starting at - * (start), with size (length). This function does not perform + * (rel_addr), with size (length). This function does not perform * ANY error checking, and the process may crash if addresses are * not available/readable. * @@ -402,9 +407,11 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_getMemory(JNIEnv *env, jobject obj, /*---------------------------------------------------------------------------*/ /** * \brief Replace a segment of the process memory with given byte array. - * \param start Start address of segment - * \param length Size of memory segment - * \param mem_arr Byte array contaning new memory + * \param env JNI Environment interface pointer + * \param obj unused + * \param rel_addr Start address of segment + * \param length Size of memory segment + * \param mem_arr Byte array contaning new memory * * Replaces a process memory segment with given byte array. * This function does not perform ANY error checking, and the @@ -426,6 +433,8 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_setMemory(JNIEnv *env, jobject obj, /*---------------------------------------------------------------------------*/ /** * \brief Let mote execute one "block" of code (tick mote). + * \param env JNI Environment interface pointer + * \param obj unused * * Let mote defined by the active contiki processes and current * process memory execute some program code. This code must not block @@ -490,7 +499,9 @@ Java_org_contikios_cooja_corecomm_CLASSNAME_tick(JNIEnv *env, jobject obj) /*---------------------------------------------------------------------------*/ /** * \brief Set the relative memory address of the reference variable. - * \return Relative memory address. + * \param env JNI Environment interface pointer + * \param obj unused + * \param addr Relative memory address * * This is a JNI function and should only be called via the * responsible Java part (MoteType.java). diff --git a/platform/srf06-cc26xx/sensortag/bmp-280-sensor.c b/platform/srf06-cc26xx/sensortag/bmp-280-sensor.c index 067fe79b9..a10e86c5e 100644 --- a/platform/srf06-cc26xx/sensortag/bmp-280-sensor.c +++ b/platform/srf06-cc26xx/sensortag/bmp-280-sensor.c @@ -286,7 +286,7 @@ convert(uint8_t *data, int32_t *temp, uint32_t *press) /*---------------------------------------------------------------------------*/ /** * \brief Returns a reading from the sensor - * \param BMP_280_SENSOR_TYPE_TEMP or BMP_280_SENSOR_TYPE_PRESS + * \param type BMP_280_SENSOR_TYPE_TEMP or BMP_280_SENSOR_TYPE_PRESS * \return Temperature (centi degrees C) or Pressure (Pascal). */ static int diff --git a/platform/srf06-cc26xx/sensortag/opt-3001-sensor.c b/platform/srf06-cc26xx/sensortag/opt-3001-sensor.c index f1cbf695e..86047bb14 100644 --- a/platform/srf06-cc26xx/sensortag/opt-3001-sensor.c +++ b/platform/srf06-cc26xx/sensortag/opt-3001-sensor.c @@ -223,7 +223,7 @@ read_data(uint16_t *raw_data) /*---------------------------------------------------------------------------*/ /** * \brief Convert raw data to a value in lux - * \param data Pointer to a buffer with a raw sensor reading + * \param raw_data data Pointer to a buffer with a raw sensor reading * \return Converted value (lux) */ static float diff --git a/platform/wismote/dev/acc-sensor.c b/platform/wismote/dev/acc-sensor.c index 15ea5fd82..75c547c9b 100644 --- a/platform/wismote/dev/acc-sensor.c +++ b/platform/wismote/dev/acc-sensor.c @@ -42,8 +42,8 @@ static void activate(void) { /* This assumes that some other sensor system already did setup the ADC - /* (in the case of the sky platform it is sensors_light_init that does it) - + * (in the case of the sky platform it is sensors_light_init that does it) */ + #if 0 P6SEL |= 0x70; P6DIR = 0x00; P6OUT = 0x00; @@ -52,37 +52,40 @@ activate(void) P2OUT |= 0x48; - /* stop converting immediately + /* stop converting immediately */ ADC12CTL0 &= ~ENC; ADC12CTL1 &= ~CONSEQ_3; /* Configure ADC12_2 to sample channel 11 (voltage) and use - /* the Vref+ as reference (SREF_1) since it is a stable reference + * the Vref+ as reference (SREF_1) since it is a stable reference */ ADC12MCTL2 = (INCH_4 + SREF_1); ADC12MCTL3 = (INCH_5 + SREF_1); ADC12MCTL4 = (INCH_6 + SREF_1); - /* internal temperature can be read as value(3) + /* internal temperature can be read as value(3) */ ADC12MCTL5 = (INCH_10 + SREF_1); ADC12CTL1 |= CONSEQ_3; ADC12CTL0 |= ENC | ADC12SC; - /* Irq_adc12_activate(&acc_sensor, 6, (INCH_11 + SREF_1)); */ + Irq_adc12_activate(&acc_sensor, 6, (INCH_11 + SREF_1)); + #endif /* 0 */ active = 1; } /*---------------------------------------------------------------------------*/ static void deactivate(void) { - /* irq_adc12_deactivate(&acc_sensor, 6); - acc_value = 0;*/ + #if 0 + irq_adc12_deactivate(&acc_sensor, 6); + acc_value = 0; + #endif /* 0 */ active = 0; } /*---------------------------------------------------------------------------*/ static int value(int type) { -/* + #if 0 switch(type) { case 0: return ADC12MEM2; @@ -92,7 +95,8 @@ value(int type) return ADC12MEM4; case 3: return ADC12MEM5; - }*/ + } + #endif /* 0 */ return 0; } /*---------------------------------------------------------------------------*/ diff --git a/platform/wismote/dev/ext-sensor.c b/platform/wismote/dev/ext-sensor.c index a957e5232..0c2292469 100644 --- a/platform/wismote/dev/ext-sensor.c +++ b/platform/wismote/dev/ext-sensor.c @@ -43,8 +43,10 @@ static uint8_t active; static int value(int type) { - /* ADC0 corresponds to the port under the logo, ADC1 to the port over the logo, - ADC2 and ADC3 corresponds to port on the JCreate bottom expansion port) + #if 0 + /* ADC0 corresponds to the port under the logo, + * ADC1 to the port over the logo, + * ADC2 and ADC3 corresponds to port on the JCreate bottom expansion port) */ switch(type) { case ADC0: return ADC12MEM6; @@ -54,7 +56,8 @@ value(int type) return ADC12MEM8; case ADC3: return ADC12MEM9; - }*/ + } + #endif /* 0 */ return 0; } /*---------------------------------------------------------------------------*/ @@ -77,16 +80,17 @@ configure(int type, int c) case SENSORS_ACTIVE: if(c) { if(!status(SENSORS_ACTIVE)) { - /* SREF_1 is Vref+ - /* MemReg6 == P6.0/A0 == port "under" logo + #if 0 + /* SREF_1 is Vref+ */ + /* MemReg6 == P6.0/A0 == port "under" logo */ ADC12MCTL6 = (INCH_0 + SREF_0); - /* MemReg7 == P6.1/A1 == port "over" logo + /* MemReg7 == P6.1/A1 == port "over" logo */ ADC12MCTL7 = (INCH_1 + SREF_0); - /* MemReg8 == P6.2/A2, bottom expansion port + /* MemReg8 == P6.2/A2, bottom expansion port */ ADC12MCTL8 = (INCH_2 + SREF_0); - /* MemReg9 == P6.1/A3, bottom expansion port, End Of (ADC-)Sequence + /* MemReg9 == P6.1/A3, bottom expansion port, End Of (ADC-)Sequence */ ADC12MCTL9 = (INCH_3 + SREF_0); - */ + #endif /* 0 */ sky_sensors_activate(0x0F); active = 1; } From 8792ba16b3fe0646d4da69c8f26dc835fb6dc7fb Mon Sep 17 00:00:00 2001 From: Tommy Sparber Date: Sun, 15 Nov 2015 22:06:46 +1100 Subject: [PATCH 3/3] doxygen: Tried to fix documentation (sicslowpan-doc.txt, uip6-doc.txt) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit tries to also fix the documentations of sicslowpan and uip6 to reflect the current code state. I’m not sure if everything makes sense. sicslowpan: There are still some references to HC01, can this be replaced by HC06? uip6: Section about timers has changed, is this correct? Doxyfile: The documentations reference static functions, to link to them correctly EXTRACT_STATIC = YES is needed. Congratulations you fixed 134 of doxygen's warnings (old: 134 new: 0). --- doc/Doxyfile | 2 +- doc/sicslowpan-doc.txt | 28 ++++++++++++------------ doc/uip6-doc.txt | 48 +++++++++++++++++++----------------------- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/doc/Doxyfile b/doc/Doxyfile index 8d4db61ce..7c7c6637a 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -427,7 +427,7 @@ EXTRACT_PACKAGE = NO # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # locally in source files will be included in the documentation. If set to NO diff --git a/doc/sicslowpan-doc.txt b/doc/sicslowpan-doc.txt index 43f3ea71a..2a0e6e23d 100644 --- a/doc/sicslowpan-doc.txt +++ b/doc/sicslowpan-doc.txt @@ -100,8 +100,8 @@ the link-layer addresses. Address Autoconfiguration
The address autoconfiguration mechanism also depends on the format of -the link-layer address. The dependency is reflected in the -#uip_netif_addr_autoconf_set function in #uip-netif.c. +the link-layer address. The dependency is reflected in the +#uip_ds6_set_addr_iid function in uip-ds6.c. \code #if (UIP_LLADDR_LEN == 8) memcpy(ipaddr->u8 + 8, lladdr, UIP_LLADDR_LEN); @@ -157,28 +157,28 @@ the header 25 bytes long). Compression schemes
The #SICSLOWPAN_CONF_COMPRESSION compilation option defines the - compression scheme supported. We support HC1, HC01, and IPv6 compression. -HC1 and IPv6 compression are defined in RFC4944, HC01 in -draft-hui-6lowpan-hc. What we call IPv6 compression means sending packets + compression scheme supported. We support HC1, HC06, and IPv6 compression. +HC1 and IPv6 compression are defined in RFC4944, HC06 in +draft-hui-6lowpan-hc-06. What we call IPv6 compression means sending packets with no compression, and adding the IPv6 dispatch before the IPv6 header.
If at compile time IPv6 "compression" is chosen, packets sent will never be compressed, and compressed packets will not be processed at reception.
-If at compile time either HC1 or HC01 are chosen, we will try to compress -all fields at sending, and will accept packets compressed with the +If at compile time either HC1 or HC06 are chosen, we will try to compress +all fields at sending, and will accept packets compressed with the chosen scheme, as well as uncompressed packets.
-Note that HC1 and HC01 supports are mutually exclusive. HC01 should soon -deprecate HC1. +Note that HC1 and HC06 supports are mutually exclusive. HC06 should soon +deprecate HC1. Compression related functions
When a packet is received, the #input function is called. Fragmentation issues are handled, then we check the dispatch byte: if it is IPv6, we -treat the packet inline. If it is HC1 or HC01, the corresponding -decompression function (#uncompress_hdr_hc1 or #uncompress_hdr_hc01) +treat the packet inline. If it is HC1 or HC06, the corresponding +decompression function (#uncompress_hdr_hc1 or #uncompress_hdr_hc06) is called.
When a packet needs to be sent, we try to compress it. If only the IPv6 -compression support is enabled, we just add the IPv6 dispatch before the -802.15.4 payload. If HC1 or HC01 support is enabled, we call the -corresponding compression function (#compress_hdr_hc1 or #compress_hdr_hc01) +compression support is enabled, we just add the IPv6 dispatch before the +802.15.4 payload. If HC1 or HC06 support is enabled, we call the +corresponding compression function (#compress_hdr_hc1 or #compress_hdr_hc06) to compress the packet as much as possible. HC1 comments
diff --git a/doc/uip6-doc.txt b/doc/uip6-doc.txt index 1aec7b493..e47296f57 100644 --- a/doc/uip6-doc.txt +++ b/doc/uip6-doc.txt @@ -36,7 +36,7 @@ are part of the uIP IPv6 stack. A complete description can be found in the corresponding IETF standards which are available at http://www.ietf.org/rfc.html. -\note The #NETSTACK_CONF_WITH_IPV6 compilation flag is used to enable IPv6. +\note The NETSTACK_CONF_WITH_IPV6 compilation flag is used to enable IPv6. It is also recommended to set #UIP_CONF_IPV6_CHECKS to 1 if one cannot guarantee that the incoming packets are correctly formed. @@ -144,10 +144,10 @@ messages are also described in uip-nd6.h although the actual code is in uip-nd6-io.c. Neighbor discovery structures
-We use the following %neighbor discovery structures (declared in uip-nd6.c): -\li A %neighbor cache with entries of type #uip_nd6_neighbor -\li A prefix list with entries of type #uip_nd6_prefix -\li A default router list with entries of type #uip_nd6_defrouter +We use the following %neighbor discovery structures: +\li A %neighbor cache with entries of type #uip_ds6_nbr_t declared in uip-ds6-nbr.c. +\li A prefix list with entries of type #uip_ds6_prefix_t declared in uip-ds6.c. +\li A default router list with entries of type #uip_ds6_defrt_t declared in uip-ds6-route.c. Each of this structure has its own add, remove and lookup functions. To update an entry in a ND structure, we first do a lookup @@ -161,7 +161,7 @@ Determine the link-layer address of a %neighbor given its IPv6 address.\n \li Neighbor unreachability detection\n Verify that a neighbor is still reachable via a cached link-layer address.\n --> send a NS (done in #uip_nd6_periodic). +-> send a NS (done in #uip_ds6_neighbor_periodic). \li Next-hop determination\n Map an IPv6 destination address into the IPv6 address of the %neighbor to which traffic for the destination should be sent.\n @@ -170,18 +170,18 @@ choose a default router, else send directly (done in #tcpip_ipv6_output). \li Router, prefix, and parameter discovery\n Update the list of default routers, on-link prefixes, and the network parameters.\n --> receive a RA (see #uip_nd6_io_ra_input). +-> receive a RA (see #ra_input). \subsection autoconf Stateless Address Autoconfiguration (RFC 4862) RFC 4862 defines two main processes: \li Duplicate Address Detection (DAD)\n Make sure that an address the node wished to use is not already in use by another node.\n --> send a NS (done in #uip_netif_dad) +-> send a NS (done in #uip_ds6_dad) \li Address Autoconfiguration\n Configure an address for an interface by combining a received prefix -and the interface ID (see #uip_netif_addr_add). The interface ID is -obtained from the link-layer address using #uip_netif_get_interface_id.\n +and the interface ID (see #uip_ds6_addr_add). The interface ID is +obtained from the link-layer address using #uip_ds6_set_addr_iid.\n -> Receive a RA with a prefix information option that has the autonomous flag set. @@ -191,7 +191,7 @@ performed for this link-local address. Available routers are discovered by sending up to #UIP_ND6_MAX_RTR_SOLICITATIONS RS packets. Address autoconfiguration is then performed based on the prefix information received in the RA. The interface initialization is -performed in #uip_netif_init. +performed in #uip_ds6_init. \subsection icmpv6 ICMPv6 (RFC 4443) We support ICMPv6 Error messages as well as Echo Reply and Echo Request @@ -213,22 +213,18 @@ The IPv6 stack (like the IPv4 stack) is a Contiki process PROCESS(tcpip_process, "TCP/IP stack"); \endcode In addition to the \ref mainloop "periodic timer" that is used by TCP, -five IPv6 specific timers are attached to this %process: -\li The #uip_nd6_timer_periodic is used for periodic checking of the -%neighbor discovery structures. -\li The #uip_netif_timer_dad is used to properly paced the Neighbor -Solicitation packets sent for Duplicate Address Detection. -\li The #uip_netif_timer_rs is use to delay the sending of Router Solicitations +three IPv6 specific timers are attached to this %process: +\li The #uip_ds6_timer_rs is use to delay the sending of Router Solicitations packets in particular during the router discovery %process. -\li The #uip_netif_timer_periodic is used to periodically check the -validity of the addresses attached to the network interface. +\li The #uip_ds6_timer_periodic is used to periodically check the +validity of the addresses attached to the network interface, to +properly paced the Neighbor Solicitation packets sent for +Duplicate Address Detection and for periodic checking of the +%neighbor discovery structures. \li The #uip_reass_timer is used to time-out the fragment reassembly %process. \n -Both #uip_nd6_timer_periodic and #uip_netif_timer_periodic run continuously. -This could be avoided by using callback timers to handle ND and Netif structures timeouts. -


\section compileflags Compile time flags and variables @@ -249,8 +245,8 @@ NBR_TABLE_CONF_MAX_NEIGHBORS \section buffers IPv6 Buffers The IPv6 code uses the same \ref memory "single global buffer" as the -IPv4 code. This buffer should be large enough to contain one -packet of maximum size, i.e., #UIP_LINK_MTU = 1280 bytes. When \ref +IPv4 code. This buffer should be large enough to contain one +packet of maximum size, i.e., #UIP_LINK_MTU = 1280 bytes. When reass "fragment reassembly" is enabled an additional buffer of the same size is used. @@ -258,7 +254,7 @@ The only difference with the IPv4 code is the per %neighbor buffering that is available when #UIP_CONF_IPV6_QUEUE_PKT is set to 1. This additional buffering is used to queue one packet per %neighbor while performing address resolution for it. This is a very costly feature as -it increases the RAM usage by approximately #NBR_TABLE_CONF_MAX_NEIGHBORS * +it increases the RAM usage by approximately NBR_TABLE_CONF_MAX_NEIGHBORS * #UIP_LINK_MTU bytes.
@@ -314,7 +310,7 @@ link-layer function used to send a packet. Similarly, the link-layer should call #tcpip_input when an IP packet is received. The code corresponding to the desired link layer is selected at -compilation time (see for example the #UIP_LL_802154 flag). +compilation time (see for example the UIP_CONF_LL_802154 flag).