converting tabs to spaces in drivers (#1439)
This PR converts tabs to white spaces.
The statement I used for the conversion:
```find . -name "*.[ch]" -exec zsh -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;```
Afterwards, I had a quick overview of the converted files to prevent odd indentation.
This commit is contained in:
parent
ae4a668695
commit
c0f80c7f75
@ -14,13 +14,13 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @ingroup LPC2387
|
* @ingroup LPC2387
|
||||||
* @brief CC1100 LPC2387 dependend functions
|
* @brief CC1100 LPC2387 dependend functions
|
||||||
*
|
*
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1775 $
|
* @version $Revision: 1775 $
|
||||||
*
|
*
|
||||||
* @note $Id: arch_cc1100.h 1775 2010-01-26 09:37:03Z hillebra $
|
* @note $Id: arch_cc1100.h 1775 2010-01-26 09:37:03Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|||||||
@ -14,14 +14,14 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @brief ScatterWeb MSB-A2 mac-layer
|
* @brief ScatterWeb MSB-A2 mac-layer
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 2128 $
|
* @version $Revision: 2128 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-csmaca-mac.c 2128 2010-05-12 12:07:59Z hillebra $
|
* @note $Id: cc1100-csmaca-mac.c 2128 2010-05-12 12:07:59Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -139,16 +139,16 @@ int cc1100_send_csmaca(radio_address_t address, protocol_t protocol, int priorit
|
|||||||
min_window_size *= 4;
|
min_window_size *= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t windowSize = min_window_size; /* Start with window size of PRIO_XXX_MIN_WINDOW_SIZE */
|
uint16_t windowSize = min_window_size; /* Start with window size of PRIO_XXX_MIN_WINDOW_SIZE */
|
||||||
uint16_t backoff = 0; /* Backoff between 1 and windowSize */
|
uint16_t backoff = 0; /* Backoff between 1 and windowSize */
|
||||||
uint32_t total; /* Holds the total wait time before send try */
|
uint32_t total; /* Holds the total wait time before send try */
|
||||||
uint32_t cs_timeout; /* Current carrier sense timeout value */
|
uint32_t cs_timeout; /* Current carrier sense timeout value */
|
||||||
|
|
||||||
if (protocol == 0) {
|
if (protocol == 0) {
|
||||||
return RADIO_INVALID_PARAM; /* Not allowed, protocol id must be greater zero */
|
return RADIO_INVALID_PARAM; /* Not allowed, protocol id must be greater zero */
|
||||||
}
|
}
|
||||||
|
|
||||||
cc1100_phy_mutex_lock(); /* Lock radio for exclusive access */
|
cc1100_phy_mutex_lock(); /* Lock radio for exclusive access */
|
||||||
|
|
||||||
/* Get carrier sense timeout based on overall error rate till now */
|
/* Get carrier sense timeout based on overall error rate till now */
|
||||||
send_csmaca_calls++;
|
send_csmaca_calls++;
|
||||||
@ -164,7 +164,7 @@ int cc1100_send_csmaca(radio_address_t address, protocol_t protocol, int priorit
|
|||||||
cs_timeout = CARRIER_SENSE_TIMEOUT_MIN;
|
cs_timeout = CARRIER_SENSE_TIMEOUT_MIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
cc1100_cs_init(); /* Initialize carrier sensing */
|
cc1100_cs_init(); /* Initialize carrier sensing */
|
||||||
|
|
||||||
window:
|
window:
|
||||||
|
|
||||||
@ -172,36 +172,36 @@ window:
|
|||||||
goto cycle; /* If backoff was 0 */
|
goto cycle; /* If backoff was 0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
windowSize *= 2; /* ...double the current window size */
|
windowSize *= 2; /* ...double the current window size */
|
||||||
|
|
||||||
if (windowSize > max_window_size) {
|
if (windowSize > max_window_size) {
|
||||||
windowSize = max_window_size; /* This is the maximum size allowed */
|
windowSize = max_window_size; /* This is the maximum size allowed */
|
||||||
}
|
}
|
||||||
|
|
||||||
backoff = rand() % windowSize; /* ...and choose new backoff */
|
backoff = rand() % windowSize; /* ...and choose new backoff */
|
||||||
|
|
||||||
backoff += (uint16_t) 1;
|
backoff += (uint16_t) 1;
|
||||||
cycle:
|
cycle:
|
||||||
cs_timeout_flag = 0; /* Carrier sense timeout flag */
|
cs_timeout_flag = 0; /* Carrier sense timeout flag */
|
||||||
cs_hwtimer_id = hwtimer_set(cs_timeout, /* Set hwtimer to set CS timeout flag */
|
cs_hwtimer_id = hwtimer_set(cs_timeout, /* Set hwtimer to set CS timeout flag */
|
||||||
cs_timeout_cb, NULL);
|
cs_timeout_cb, NULL);
|
||||||
|
|
||||||
while (cc1100_cs_read()) { /* Wait until air is free */
|
while (cc1100_cs_read()) { /* Wait until air is free */
|
||||||
if (cs_timeout_flag) {
|
if (cs_timeout_flag) {
|
||||||
send_csmaca_calls_cs_timeout++;
|
send_csmaca_calls_cs_timeout++;
|
||||||
#ifndef CSMACA_MAC_AGGRESSIVE_MODE
|
#ifndef CSMACA_MAC_AGGRESSIVE_MODE
|
||||||
cc1100_phy_mutex_unlock();
|
cc1100_phy_mutex_unlock();
|
||||||
cc1100_go_after_tx(); /* Go from RX to default mode */
|
cc1100_go_after_tx(); /* Go from RX to default mode */
|
||||||
return RADIO_CS_TIMEOUT; /* Return immediately */
|
return RADIO_CS_TIMEOUT; /* Return immediately */
|
||||||
#endif
|
#endif
|
||||||
#ifdef CSMACA_MAC_AGGRESSIVE_MODE
|
#ifdef CSMACA_MAC_AGGRESSIVE_MODE
|
||||||
goto send; /* Send anyway */
|
goto send; /* Send anyway */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hwtimer_remove(cs_hwtimer_id); /* Remove hwtimer */
|
hwtimer_remove(cs_hwtimer_id); /* Remove hwtimer */
|
||||||
cc1100_cs_write_cca(1); /* Air is free now */
|
cc1100_cs_write_cca(1); /* Air is free now */
|
||||||
cc1100_cs_set_enabled(true);
|
cc1100_cs_set_enabled(true);
|
||||||
|
|
||||||
if (cc1100_cs_read()) {
|
if (cc1100_cs_read()) {
|
||||||
@ -213,18 +213,18 @@ cycle:
|
|||||||
backoff--; /* Decrement backoff counter */
|
backoff--; /* Decrement backoff counter */
|
||||||
}
|
}
|
||||||
|
|
||||||
total = slottime; /* Calculate total wait time */
|
total = slottime; /* Calculate total wait time */
|
||||||
total *= (uint32_t)backoff; /* Slot vector set */
|
total *= (uint32_t)backoff; /* Slot vector set */
|
||||||
total += difs; /* ...and standard DIFS wait time */
|
total += difs; /* ...and standard DIFS wait time */
|
||||||
cs_timeout_flag = 0; /* Carrier sense timeout flag */
|
cs_timeout_flag = 0; /* Carrier sense timeout flag */
|
||||||
cs_hwtimer_id = hwtimer_set(total, /* Set hwtimer to set CS timeout flag */
|
cs_hwtimer_id = hwtimer_set(total, /* Set hwtimer to set CS timeout flag */
|
||||||
cs_timeout_cb, NULL);
|
cs_timeout_cb, NULL);
|
||||||
|
|
||||||
while (!cs_timeout_flag
|
while (!cs_timeout_flag
|
||||||
|| !cc1100_cs_read_cca()) { /* Wait until timeout is finished */
|
|| !cc1100_cs_read_cca()) { /* Wait until timeout is finished */
|
||||||
if (cc1100_cs_read_cca() == 0) { /* Is the air still free? */
|
if (cc1100_cs_read_cca() == 0) { /* Is the air still free? */
|
||||||
hwtimer_remove(cs_hwtimer_id);
|
hwtimer_remove(cs_hwtimer_id);
|
||||||
goto window; /* No. Go back to new wait period. */
|
goto window; /* No. Go back to new wait period. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,14 +14,14 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @brief ScatterWeb MSB-A2 mac-layer
|
* @brief ScatterWeb MSB-A2 mac-layer
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1999 $
|
* @version $Revision: 1999 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-csmaca-mac.h 1999 2010-03-16 15:48:18Z hillebra $
|
* @note $Id: cc1100-csmaca-mac.h 1999 2010-03-16 15:48:18Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CC1100_CSMACA_MAC_
|
#ifndef CC1100_CSMACA_MAC_
|
||||||
@ -29,26 +29,26 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
|
|
||||||
#include "cc1100-defaultSettings.h"
|
#include "cc1100-defaultSettings.h"
|
||||||
|
|
||||||
//#define CSMACA_MAC_AGGRESSIVE_MODE // MAC aggressive mode on/off switch
|
//#define CSMACA_MAC_AGGRESSIVE_MODE // MAC aggressive mode on/off switch
|
||||||
|
|
||||||
#define CARRIER_SENSE_TIMEOUT (200000) // Carrier Sense timeout ~ 2 seconds
|
#define CARRIER_SENSE_TIMEOUT (200000) // Carrier Sense timeout ~ 2 seconds
|
||||||
#define CARRIER_SENSE_TIMEOUT_MIN (2000) // Minimum Carrier Sense timeout ~ 20 milliseconds
|
#define CARRIER_SENSE_TIMEOUT_MIN (2000) // Minimum Carrier Sense timeout ~ 20 milliseconds
|
||||||
#define CS_TX_SWITCH_TIME (80) // Carrier Sense to TX switch time (measured ~ 350 us)
|
#define CS_TX_SWITCH_TIME (80) // Carrier Sense to TX switch time (measured ~ 350 us)
|
||||||
|
|
||||||
/** All values are in ticks (x10 us) */
|
/** All values are in ticks (x10 us) */
|
||||||
#define PRIO_ALARM_DIFS (200) // DIFS for ALARM packets, the default wait time
|
#define PRIO_ALARM_DIFS (200) // DIFS for ALARM packets, the default wait time
|
||||||
#define PRIO_ALARM_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
#define PRIO_ALARM_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
||||||
#define PRIO_ALARM_MIN_WINDOW_SIZE (2) // Minimum window size of backoff algorithm
|
#define PRIO_ALARM_MIN_WINDOW_SIZE (2) // Minimum window size of backoff algorithm
|
||||||
#define PRIO_ALARM_MAX_WINDOW_SIZE (8) // Maximum window size of backoff algorithm
|
#define PRIO_ALARM_MAX_WINDOW_SIZE (8) // Maximum window size of backoff algorithm
|
||||||
|
|
||||||
#define PRIO_WARN_DIFS (1000) // DIFS for WARN packets, the default wait time
|
#define PRIO_WARN_DIFS (1000) // DIFS for WARN packets, the default wait time
|
||||||
#define PRIO_WARN_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
#define PRIO_WARN_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
||||||
#define PRIO_WARN_MIN_WINDOW_SIZE (2) // Minimum window size of backoff algorithm
|
#define PRIO_WARN_MIN_WINDOW_SIZE (2) // Minimum window size of backoff algorithm
|
||||||
#define PRIO_WARN_MAX_WINDOW_SIZE (16) // Maximum window size of backoff algorithm
|
#define PRIO_WARN_MAX_WINDOW_SIZE (16) // Maximum window size of backoff algorithm
|
||||||
|
|
||||||
#define PRIO_DATA_DIFS (2500) // DIFS for normal data packets, the default wait time
|
#define PRIO_DATA_DIFS (2500) // DIFS for normal data packets, the default wait time
|
||||||
#define PRIO_DATA_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
#define PRIO_DATA_SLOTTIME (CS_TX_SWITCH_TIME) // Time of one additional wait slot
|
||||||
#define PRIO_DATA_MIN_WINDOW_SIZE (4) // Minimum window size of backoff algorithm
|
#define PRIO_DATA_MIN_WINDOW_SIZE (4) // Minimum window size of backoff algorithm
|
||||||
#define PRIO_DATA_MAX_WINDOW_SIZE (32) // Maximum window size of backoff algorithm
|
#define PRIO_DATA_MAX_WINDOW_SIZE (32) // Maximum window size of backoff algorithm
|
||||||
|
|
||||||
#endif /*CC1100_CSMACA_MAC_*/
|
#endif /*CC1100_CSMACA_MAC_*/
|
||||||
|
|||||||
@ -13,19 +13,19 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @brief TI Chipcon CC110x default settings
|
* @brief TI Chipcon CC110x default settings
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 2058 $
|
* @version $Revision: 2058 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-defaultSettings.c 2058 2010-03-31 08:59:31Z hillebra $
|
* @note $Id: cc1100-defaultSettings.c 2058 2010-03-31 08:59:31Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cc1100-defaultSettings.h"
|
#include "cc1100-defaultSettings.h"
|
||||||
@ -38,7 +38,7 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
* -----------------------------------------
|
* -----------------------------------------
|
||||||
* 0 | 0 | 869.525
|
* 0 | 0 | 869.525
|
||||||
* 1 | 10 | 871.61
|
* 1 | 10 | 871.61
|
||||||
* 2 | 20 | 873.58 ~ seems to be bad (hang-ups with this channel)
|
* 2 | 20 | 873.58 ~ seems to be bad (hang-ups with this channel)
|
||||||
* 3 | 30 | 875.61
|
* 3 | 30 | 875.61
|
||||||
* 4 | 40 | 877.58
|
* 4 | 40 | 877.58
|
||||||
* 5 | 50 | 879.61
|
* 5 | 50 | 879.61
|
||||||
@ -71,9 +71,9 @@ char cc1100_conf[] = {
|
|||||||
0x0F, /* FIFOTHR */
|
0x0F, /* FIFOTHR */
|
||||||
0x9B, /* SYNC1 */
|
0x9B, /* SYNC1 */
|
||||||
0xAD, /* SYNC0 */
|
0xAD, /* SYNC0 */
|
||||||
0x3D, /* PKTLEN (maximum value of packet length byte = 61) */
|
0x3D, /* PKTLEN (maximum value of packet length byte = 61) */
|
||||||
0x06, /* PKTCTRL1 */
|
0x06, /* PKTCTRL1 */
|
||||||
0x45, /* PKTCTRL0 (variable packet length) */
|
0x45, /* PKTCTRL0 (variable packet length) */
|
||||||
0xFF, /* ADDR */
|
0xFF, /* ADDR */
|
||||||
CC1100_DEFAULT_CHANNR * 10, /* CHANNR */
|
CC1100_DEFAULT_CHANNR * 10, /* CHANNR */
|
||||||
0x0B, /* FSCTRL1 */
|
0x0B, /* FSCTRL1 */
|
||||||
|
|||||||
@ -16,19 +16,19 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
#define CC1100_DEFAULTSETTINGS_H
|
#define CC1100_DEFAULTSETTINGS_H
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @brief TI Chipcon CC110x default settings
|
* @brief TI Chipcon CC110x default settings
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 2139 $
|
* @version $Revision: 2139 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-defaultSettings.h 2139 2010-05-26 08:04:04Z hillebra $
|
* @note $Id: cc1100-defaultSettings.h 2139 2010-05-26 08:04:04Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hwtimer.h"
|
#include "hwtimer.h"
|
||||||
@ -36,61 +36,61 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
// returns hwtimer ticks per us
|
// returns hwtimer ticks per us
|
||||||
#define RTIMER_TICKS(us) HWTIMER_TICKS(us)
|
#define RTIMER_TICKS(us) HWTIMER_TICKS(us)
|
||||||
|
|
||||||
#define TIMER_TICK_USEC_RES (122)
|
#define TIMER_TICK_USEC_RES (122)
|
||||||
|
|
||||||
// Default PA table index (output power)
|
// Default PA table index (output power)
|
||||||
#define PATABLE (11)
|
#define PATABLE (11)
|
||||||
|
|
||||||
// Watchdog cycle time in seconds, set 0 to disable watchdog
|
// Watchdog cycle time in seconds, set 0 to disable watchdog
|
||||||
#define CC1100_WATCHDOG_PERIOD (5)
|
#define CC1100_WATCHDOG_PERIOD (5)
|
||||||
|
|
||||||
// Number of transmission retries for unicast packets (constant RX mode)
|
// Number of transmission retries for unicast packets (constant RX mode)
|
||||||
#define TRANSMISSION_RETRIES_CRX_UC (5)
|
#define TRANSMISSION_RETRIES_CRX_UC (5)
|
||||||
|
|
||||||
// Number of transmission retries for unicast packets (WOR mode)
|
// Number of transmission retries for unicast packets (WOR mode)
|
||||||
#define TRANSMISSION_RETRIES_WOR_UC (1)
|
#define TRANSMISSION_RETRIES_WOR_UC (1)
|
||||||
|
|
||||||
// Number of transmission retries for broadcast packets (constant RX mode)
|
// Number of transmission retries for broadcast packets (constant RX mode)
|
||||||
#define TRANSMISSION_RETRIES_CRX_BC (0)
|
#define TRANSMISSION_RETRIES_CRX_BC (0)
|
||||||
|
|
||||||
// Number of transmission retries for broadcast packets (WOR mode)
|
// Number of transmission retries for broadcast packets (WOR mode)
|
||||||
#define TRANSMISSION_RETRIES_WOR_BC (0)
|
#define TRANSMISSION_RETRIES_WOR_BC (0)
|
||||||
|
|
||||||
// Time before chip goes back to RX (= stays in PWD after incoming packet)
|
// Time before chip goes back to RX (= stays in PWD after incoming packet)
|
||||||
#define WOR_TIMEOUT_1 (3200) // ~ 32 milliseconds
|
#define WOR_TIMEOUT_1 (3200) // ~ 32 milliseconds
|
||||||
|
|
||||||
// Time before chip goes back to WOR (= stays in RX after elapsed WOR_TIMEOUT_1)
|
// Time before chip goes back to WOR (= stays in RX after elapsed WOR_TIMEOUT_1)
|
||||||
#define WOR_TIMEOUT_2 (800) // ~ 8 milliseconds
|
#define WOR_TIMEOUT_2 (800) // ~ 8 milliseconds
|
||||||
|
|
||||||
// XOSC startup + FS calibration (300 + 809 us ~ 1.38 ms)
|
// XOSC startup + FS calibration (300 + 809 us ~ 1.38 ms)
|
||||||
#define FS_CAL_TIME RTIMER_TICKS(12 * TIMER_TICK_USEC_RES)
|
#define FS_CAL_TIME RTIMER_TICKS(12 * TIMER_TICK_USEC_RES)
|
||||||
|
|
||||||
// Manual FS calibration (721 us)
|
// Manual FS calibration (721 us)
|
||||||
#define MANUAL_FS_CAL_TIME RTIMER_TICKS(7 * TIMER_TICK_USEC_RES)
|
#define MANUAL_FS_CAL_TIME RTIMER_TICKS(7 * TIMER_TICK_USEC_RES)
|
||||||
|
|
||||||
// Reset wait time (in reset procedure)
|
// Reset wait time (in reset procedure)
|
||||||
#define RESET_WAIT_TIME RTIMER_TICKS(4 * TIMER_TICK_USEC_RES)
|
#define RESET_WAIT_TIME RTIMER_TICKS(4 * TIMER_TICK_USEC_RES)
|
||||||
|
|
||||||
// Time chip needs to go to RX
|
// Time chip needs to go to RX
|
||||||
#define IDLE_TO_RX_TIME RTIMER_TICKS(1 * TIMER_TICK_USEC_RES)
|
#define IDLE_TO_RX_TIME RTIMER_TICKS(1 * TIMER_TICK_USEC_RES)
|
||||||
|
|
||||||
// Time chip needs to go to RX and CS signal is ready
|
// Time chip needs to go to RX and CS signal is ready
|
||||||
#define CS_READY_TIME RTIMER_TICKS(3 * TIMER_TICK_USEC_RES)
|
#define CS_READY_TIME RTIMER_TICKS(3 * TIMER_TICK_USEC_RES)
|
||||||
|
|
||||||
// Default RX interval for WOR in milliseconds
|
// Default RX interval for WOR in milliseconds
|
||||||
#define T_RX_INTERVAL (542)
|
#define T_RX_INTERVAL (542)
|
||||||
|
|
||||||
// Time of packet interval in microseconds (at 400 kbps)
|
// Time of packet interval in microseconds (at 400 kbps)
|
||||||
#define T_PACKET_INTERVAL (3800)
|
#define T_PACKET_INTERVAL (3800)
|
||||||
|
|
||||||
// The size of the configuration array for CC1100 in bytes
|
// The size of the configuration array for CC1100 in bytes
|
||||||
#define CC1100_CONF_SIZE (39)
|
#define CC1100_CONF_SIZE (39)
|
||||||
|
|
||||||
// The default channel number (0-24) for CC1100
|
// The default channel number (0-24) for CC1100
|
||||||
#define CC1100_DEFAULT_CHANNR (0)
|
#define CC1100_DEFAULT_CHANNR (0)
|
||||||
|
|
||||||
// Burst retry to TX switch time (measured ~ 230 us)
|
// Burst retry to TX switch time (measured ~ 230 us)
|
||||||
#define BURST_RETRY_TX_SWITCH_TIME (23)
|
#define BURST_RETRY_TX_SWITCH_TIME (23)
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -16,33 +16,33 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
#define CC1100_INTERNAL_H
|
#define CC1100_INTERNAL_H
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC110x internal hardware constants
|
* @brief TI Chipcon CC110x internal hardware constants
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1231 $
|
* @version $Revision: 1231 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-internal.h 1231 2009-08-20 08:31:32Z baar $
|
* @note $Id: cc1100-internal.h 1231 2009-08-20 08:31:32Z baar $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FIXED_PKTLEN (0x00) ///< Fixed length packets, length configured in PKTLEN register.
|
#define FIXED_PKTLEN (0x00) ///< Fixed length packets, length configured in PKTLEN register.
|
||||||
#define VARIABLE_PKTLEN (0x01) ///< Variable length packets, packet length configured by the first
|
#define VARIABLE_PKTLEN (0x01) ///< Variable length packets, packet length configured by the first
|
||||||
///< byte after synch word.
|
///< byte after synch word.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Bitmasks for reading out status register values
|
* @name Bitmasks for reading out status register values
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Bitmask (=10000000) for reading CRC_OK.
|
* @brief Bitmask (=10000000) for reading CRC_OK.
|
||||||
*
|
*
|
||||||
* If CRC_OK == 1: CRC for received data OK (or CRC disabled).
|
* If CRC_OK == 1: CRC for received data OK (or CRC disabled).
|
||||||
* If CRC_OK == 0: CRC error in received data.
|
* If CRC_OK == 0: CRC error in received data.
|
||||||
@ -53,42 +53,42 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*
|
*
|
||||||
* The Link Quality Indicator estimates how easily a received signal can be demodulated.
|
* The Link Quality Indicator estimates how easily a received signal can be demodulated.
|
||||||
*/
|
*/
|
||||||
#define LQI_EST (0x7F)
|
#define LQI_EST (0x7F)
|
||||||
#define I_RSSI (0x00) ///< Index 0 contains RSSI information (from optionally appended packet status bytes).
|
#define I_RSSI (0x00) ///< Index 0 contains RSSI information (from optionally appended packet status bytes).
|
||||||
#define I_LQI (0x01) ///< Index 1 contains LQI & CRC_OK information (from optionally appended packet status bytes).
|
#define I_LQI (0x01) ///< Index 1 contains LQI & CRC_OK information (from optionally appended packet status bytes).
|
||||||
#define MARC_STATE (0x1F) ///< Bitmask (=00011111) for reading MARC_STATE in MARCSTATE status register.
|
#define MARC_STATE (0x1F) ///< Bitmask (=00011111) for reading MARC_STATE in MARCSTATE status register.
|
||||||
#define CS (0x40) ///< Bitmask (=01000000) for reading CS (Carrier Sense) in PKTSTATUS status register.
|
#define CS (0x40) ///< Bitmask (=01000000) for reading CS (Carrier Sense) in PKTSTATUS status register.
|
||||||
#define PQT_REACHED (0x20) ///< Bitmask (=00100000) for reading PQT_REACHED (Preamble Quality reached) in PKTSTATUS status register.
|
#define PQT_REACHED (0x20) ///< Bitmask (=00100000) for reading PQT_REACHED (Preamble Quality reached) in PKTSTATUS status register.
|
||||||
#define CCA (0x10) ///< Bitmask (=00010000) for reading CCA (clear channel assessment) in PKTSTATUS status register.
|
#define CCA (0x10) ///< Bitmask (=00010000) for reading CCA (clear channel assessment) in PKTSTATUS status register.
|
||||||
#define SFD (0x08) ///< Bitmask (=00001000) for reading SFD (Sync word found) in PKTSTATUS status register.
|
#define SFD (0x08) ///< Bitmask (=00001000) for reading SFD (Sync word found) in PKTSTATUS status register.
|
||||||
#define GDO2 (0x04) ///< Bitmask (=00000100) for reading GDO2 (current value on GDO2 pin) in PKTSTATUS status register.
|
#define GDO2 (0x04) ///< Bitmask (=00000100) for reading GDO2 (current value on GDO2 pin) in PKTSTATUS status register.
|
||||||
#define GDO1 (0x02) ///< Bitmask (=00000010) for reading GDO1 (current value on GDO1 pin) in PKTSTATUS status register.
|
#define GDO1 (0x02) ///< Bitmask (=00000010) for reading GDO1 (current value on GDO1 pin) in PKTSTATUS status register.
|
||||||
#define GDO0 (0x01) ///< Bitmask (=00000001) for reading GDO0 (current value on GDO0 pin) in PKTSTATUS status register.
|
#define GDO0 (0x01) ///< Bitmask (=00000001) for reading GDO0 (current value on GDO0 pin) in PKTSTATUS status register.
|
||||||
#define TXFIFO_UNDERFLOW (0x80) ///< Bitmask (=10000000) for reading TXFIFO_UNDERFLOW in TXBYTES status register.
|
#define TXFIFO_UNDERFLOW (0x80) ///< Bitmask (=10000000) for reading TXFIFO_UNDERFLOW in TXBYTES status register.
|
||||||
#define BYTES_IN_TXFIFO (0x7F) ///< Bitmask (=01111111) for reading NUM_TXBYTES in TXBYTES status register.
|
#define BYTES_IN_TXFIFO (0x7F) ///< Bitmask (=01111111) for reading NUM_TXBYTES in TXBYTES status register.
|
||||||
#define RXFIFO_OVERFLOW (0x80) ///< Bitmask (=10000000) for reading RXFIFO_OVERFLOW in RXBYTES status register.
|
#define RXFIFO_OVERFLOW (0x80) ///< Bitmask (=10000000) for reading RXFIFO_OVERFLOW in RXBYTES status register.
|
||||||
#define BYTES_IN_RXFIFO (0x7F) ///< Bitmask (=01111111) for reading NUM_RXBYTES in RXBYTES status register.
|
#define BYTES_IN_RXFIFO (0x7F) ///< Bitmask (=01111111) for reading NUM_RXBYTES in RXBYTES status register.
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Bitmasks for reading out configuration register values
|
* @name Bitmasks for reading out configuration register values
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define PKT_LENGTH_CONFIG (0x03) ///< Bitmask (=00000011) for reading LENGTH_CONFIG in PKTCTRL0 configuration register.
|
#define PKT_LENGTH_CONFIG (0x03) ///< Bitmask (=00000011) for reading LENGTH_CONFIG in PKTCTRL0 configuration register.
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Definitions to support burst/single access
|
* @name Definitions to support burst/single access
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define CC1100_WRITE_BURST (0x40) ///< Offset for burst write.
|
#define CC1100_WRITE_BURST (0x40) ///< Offset for burst write.
|
||||||
#define CC1100_READ_SINGLE (0x80) ///< Offset for read single byte.
|
#define CC1100_READ_SINGLE (0x80) ///< Offset for read single byte.
|
||||||
#define CC1100_READ_BURST (0xC0) ///< Offset for read burst.
|
#define CC1100_READ_BURST (0xC0) ///< Offset for read burst.
|
||||||
#define CC1100_NOBYTE (0x00) ///< No command (for reading).
|
#define CC1100_NOBYTE (0x00) ///< No command (for reading).
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Configuration Registers (47x)
|
* @name Configuration Registers (47x)
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define CC1100_IOCFG2 (0x00) ///< GDO2 output pin configuration
|
#define CC1100_IOCFG2 (0x00) ///< GDO2 output pin configuration
|
||||||
@ -141,12 +141,12 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Strobe commands (14x)
|
* @name Strobe commands (14x)
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define CC1100_SRES (0x30) ///< Reset chip.
|
#define CC1100_SRES (0x30) ///< Reset chip.
|
||||||
/**
|
/**
|
||||||
* @brief Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
|
* @brief Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
|
||||||
*
|
*
|
||||||
* If in RX/TX: Go to a wait state where only the synthesizer is running (for quick RX / TX turnaround).
|
* If in RX/TX: Go to a wait state where only the synthesizer is running (for quick RX / TX turnaround).
|
||||||
*/
|
*/
|
||||||
@ -170,35 +170,35 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Status registers (12x)
|
* @name Status registers (12x)
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define CC1100_PARTNUM (0x30) ///< Part number of CC1100.
|
#define CC1100_PARTNUM (0x30) ///< Part number of CC1100.
|
||||||
#define CC1100_VERSION (0x31) ///< Current version number.
|
#define CC1100_VERSION (0x31) ///< Current version number.
|
||||||
#define CC1100_FREQEST (0x32) ///< Frequency Offset Estimate.
|
#define CC1100_FREQEST (0x32) ///< Frequency Offset Estimate.
|
||||||
#define CC1100_LQI (0x33) ///< Demodulator estimate for Link Quality.
|
#define CC1100_LQI (0x33) ///< Demodulator estimate for Link Quality.
|
||||||
#define CC1100_RSSI (0x34) ///< Received signal strength indication.
|
#define CC1100_RSSI (0x34) ///< Received signal strength indication.
|
||||||
#define CC1100_MARCSTATE (0x35) ///< Control state machine state.
|
#define CC1100_MARCSTATE (0x35) ///< Control state machine state.
|
||||||
#define CC1100_WORTIME1 (0x36) ///< High byte of WOR timer.
|
#define CC1100_WORTIME1 (0x36) ///< High byte of WOR timer.
|
||||||
#define CC1100_WORTIME0 (0x37) ///< Low byte of WOR timer.
|
#define CC1100_WORTIME0 (0x37) ///< Low byte of WOR timer.
|
||||||
#define CC1100_PKTSTATUS (0x38) ///< Current GDOx status and packet status.
|
#define CC1100_PKTSTATUS (0x38) ///< Current GDOx status and packet status.
|
||||||
#define CC1100_VCO_VC_DAC (0x39) ///< Current setting from PLL calibration module.
|
#define CC1100_VCO_VC_DAC (0x39) ///< Current setting from PLL calibration module.
|
||||||
#define CC1100_TXBYTES (0x3A) ///< Underflow and number of bytes in the TX FIFO.
|
#define CC1100_TXBYTES (0x3A) ///< Underflow and number of bytes in the TX FIFO.
|
||||||
#define CC1100_RXBYTES (0x3B) ///< Overflow and number of bytes in the RX FIFO.
|
#define CC1100_RXBYTES (0x3B) ///< Overflow and number of bytes in the RX FIFO.
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Multi byte registers
|
* @name Multi byte registers
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @brief Register for eight user selected output power settings.
|
* @brief Register for eight user selected output power settings.
|
||||||
*
|
*
|
||||||
* 3-bit FREND0.PA_POWER value selects the PATABLE entry to use.
|
* 3-bit FREND0.PA_POWER value selects the PATABLE entry to use.
|
||||||
*/
|
*/
|
||||||
#define CC1100_PATABLE (0x3E)
|
#define CC1100_PATABLE (0x3E)
|
||||||
#define CC1100_TXFIFO (0x3F) ///< TX FIFO: Write operations write to the TX FIFO (SB: +0x00; BURST: +0x40)
|
#define CC1100_TXFIFO (0x3F) ///< TX FIFO: Write operations write to the TX FIFO (SB: +0x00; BURST: +0x40)
|
||||||
#define CC1100_RXFIFO (0x3F) ///< RX FIFO: Read operations read from the RX FIFO (SB: +0x80; BURST: +0xC0)
|
#define CC1100_RXFIFO (0x3F) ///< RX FIFO: Read operations read from the RX FIFO (SB: +0x80; BURST: +0xC0)
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|||||||
@ -10,20 +10,20 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC110x Radio driver
|
* @brief TI Chipcon CC110x Radio driver
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 2283 $
|
* @version $Revision: 2283 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100.c 2283 2010-06-15 14:02:27Z hillebra $
|
* @note $Id: cc1100.c 2283 2010-06-15 14:02:27Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -53,12 +53,12 @@
|
|||||||
#include "lpc2387.h"
|
#include "lpc2387.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PACKET_LENGTH (0x3E) ///< Packet length = 62 Bytes.
|
#define PACKET_LENGTH (0x3E) ///< Packet length = 62 Bytes.
|
||||||
#define CC1100_SYNC_WORD_TX_TIME (90000) /* loop count (max. timeout ~ 15 ms) to wait for */
|
#define CC1100_SYNC_WORD_TX_TIME (90000) /* loop count (max. timeout ~ 15 ms) to wait for */
|
||||||
/* sync word to be transmitted (GDO2 from low to high) */
|
/* sync word to be transmitted (GDO2 from low to high) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Virtual Radio Device methods (see vdevice_radio_methods)
|
* @name Virtual Radio Device methods (see vdevice_radio_methods)
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
static int rd_set_mode(int mode);
|
static int rd_set_mode(int mode);
|
||||||
@ -67,49 +67,49 @@ static int rd_set_mode(int mode);
|
|||||||
static void switch_to_wor(void);
|
static void switch_to_wor(void);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Power control data structures
|
// Power control data structures
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static uint8_t pa_table_index = PATABLE; ///< Current PATABLE Index
|
static uint8_t pa_table_index = PATABLE; ///< Current PATABLE Index
|
||||||
static uint8_t pa_table[] = { ///< PATABLE with available output powers
|
static uint8_t pa_table[] = { ///< PATABLE with available output powers
|
||||||
0x00, ///< -52 dBm
|
0x00, ///< -52 dBm
|
||||||
0x03, ///< -30 dBm
|
0x03, ///< -30 dBm
|
||||||
0x0D, ///< -20 dBm
|
0x0D, ///< -20 dBm
|
||||||
0x1C, ///< -15 dBm
|
0x1C, ///< -15 dBm
|
||||||
0x34, ///< -10 dBm
|
0x34, ///< -10 dBm
|
||||||
0x57, ///< - 5 dBm
|
0x57, ///< - 5 dBm
|
||||||
0x3F, ///< - 1 dBm
|
0x3F, ///< - 1 dBm
|
||||||
0x8E, ///< 0 dBm
|
0x8E, ///< 0 dBm
|
||||||
0x85, ///< + 5 dBm
|
0x85, ///< + 5 dBm
|
||||||
0xCC, ///< + 7 dBm
|
0xCC, ///< + 7 dBm
|
||||||
0xC6, ///< + 9 dBm
|
0xC6, ///< + 9 dBm
|
||||||
0xC3 ///< +10 dBm
|
0xC3 ///< +10 dBm
|
||||||
}; /* If PATABLE is changed in size, adjust MAX_OUTPUT_POWER definition in CC1100 interface!*/
|
}; /* If PATABLE is changed in size, adjust MAX_OUTPUT_POWER definition in CC1100 interface!*/
|
||||||
|
|
||||||
static int8_t pa_table_dBm[] = { ///< Values of the PATABLE in dBm
|
static int8_t pa_table_dBm[] = { ///< Values of the PATABLE in dBm
|
||||||
-52,
|
-52,
|
||||||
-30,
|
-30,
|
||||||
-20,
|
-20,
|
||||||
-15,
|
-15,
|
||||||
-10,
|
-10,
|
||||||
-5,
|
-5,
|
||||||
-1,
|
-1,
|
||||||
0,
|
0,
|
||||||
5,
|
5,
|
||||||
7,
|
7,
|
||||||
9,
|
9,
|
||||||
10
|
10
|
||||||
};
|
};
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Main radio data structures
|
// Main radio data structures
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
volatile cc1100_flags rflags; ///< Radio control flags
|
volatile cc1100_flags rflags; ///< Radio control flags
|
||||||
static uint8_t radio_address; ///< Radio address
|
static uint8_t radio_address; ///< Radio address
|
||||||
static uint8_t radio_channel; ///< Radio channel number
|
static uint8_t radio_channel; ///< Radio channel number
|
||||||
|
|
||||||
const radio_t radio_cc1100 = { ///< Radio driver API
|
const radio_t radio_cc1100 = { ///< Radio driver API
|
||||||
"CC1100",
|
"CC1100",
|
||||||
CC1100_BROADCAST_ADDRESS,
|
CC1100_BROADCAST_ADDRESS,
|
||||||
MAX_OUTPUT_POWER,
|
MAX_OUTPUT_POWER,
|
||||||
@ -125,21 +125,21 @@ const radio_t radio_cc1100 = { ///< Radio driver API
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Data structures for mode control
|
// Data structures for mode control
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
volatile uint8_t radio_mode; ///< Radio mode
|
volatile uint8_t radio_mode; ///< Radio mode
|
||||||
volatile uint8_t radio_state = RADIO_UNKNOWN; ///< Radio state
|
volatile uint8_t radio_state = RADIO_UNKNOWN; ///< Radio state
|
||||||
|
|
||||||
volatile cc1100_mode_callback_t cc1100_go_idle; ///< Function for going IDLE
|
volatile cc1100_mode_callback_t cc1100_go_idle; ///< Function for going IDLE
|
||||||
volatile cc1100_mode_callback_t cc1100_go_receive; ///< Function for going RX
|
volatile cc1100_mode_callback_t cc1100_go_receive; ///< Function for going RX
|
||||||
volatile cc1100_mode_callback_t cc1100_go_after_tx; ///< Function to call after TX (burst send)
|
volatile cc1100_mode_callback_t cc1100_go_after_tx; ///< Function to call after TX (burst send)
|
||||||
volatile cc1100_mode_callback_t cc1100_setup_mode; ///< Function to set up selected mode (RX or WOR)
|
volatile cc1100_mode_callback_t cc1100_setup_mode; ///< Function to set up selected mode (RX or WOR)
|
||||||
|
|
||||||
volatile int wor_hwtimer_id = -1;
|
volatile int wor_hwtimer_id = -1;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Low-level hardware access */
|
/* Low-level hardware access */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_disable_interrupts(void)
|
void cc1100_disable_interrupts(void)
|
||||||
@ -162,8 +162,8 @@ void cc110x_gdo2_irq(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* High level CC1100 SPI functions for transferring packet out */
|
/* High level CC1100 SPI functions for transferring packet out */
|
||||||
// of RX FIFO (don't call when in WOR mode)
|
// of RX FIFO (don't call when in WOR mode)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static bool spi_receive_packet_variable(uint8_t *rxBuffer, uint8_t length)
|
static bool spi_receive_packet_variable(uint8_t *rxBuffer, uint8_t length)
|
||||||
@ -230,7 +230,7 @@ bool cc1100_spi_receive_packet(uint8_t *rxBuffer, uint8_t length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 mode functionality */
|
/* CC1100 mode functionality */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_set_idle(void)
|
void cc1100_set_idle(void)
|
||||||
@ -296,20 +296,20 @@ static void wakeup_from_wor(void)
|
|||||||
*/
|
*/
|
||||||
void switch_to_wor2(void)
|
void switch_to_wor2(void)
|
||||||
{
|
{
|
||||||
// if (cc110x_get_gdo2()) return; /* If incoming packet, then don't go to WOR now */
|
// if (cc110x_get_gdo2()) return; /* If incoming packet, then don't go to WOR now */
|
||||||
cc1100_spi_strobe(CC1100_SIDLE); /* Put CC1100 to IDLE */
|
cc1100_spi_strobe(CC1100_SIDLE); /* Put CC1100 to IDLE */
|
||||||
radio_state = RADIO_IDLE; /* Radio state now IDLE */
|
radio_state = RADIO_IDLE; /* Radio state now IDLE */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM2,
|
cc1100_spi_write_reg(CC1100_MCSM2,
|
||||||
cc1100_wor_config.rx_time_reg); /* Configure RX_TIME (for use in WOR) */
|
cc1100_wor_config.rx_time_reg); /* Configure RX_TIME (for use in WOR) */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x18); /* Turn on FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x18); /* Turn on FS-Autocal */
|
||||||
|
|
||||||
if (rflags.WOR_RST) {
|
if (rflags.WOR_RST) {
|
||||||
cc1100_spi_strobe(CC1100_SWORRST); /* Resets the real time clock */
|
cc1100_spi_strobe(CC1100_SWORRST); /* Resets the real time clock */
|
||||||
rflags.WOR_RST = false;
|
rflags.WOR_RST = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cc1100_spi_strobe(CC1100_SWOR); /* Put radio back to sleep/WOR (must be in IDLE when this is done) */
|
cc1100_spi_strobe(CC1100_SWOR); /* Put radio back to sleep/WOR (must be in IDLE when this is done) */
|
||||||
radio_state = RADIO_WOR; /* Radio state now WOR */
|
radio_state = RADIO_WOR; /* Radio state now WOR */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -318,7 +318,7 @@ void switch_to_wor2(void)
|
|||||||
static void hwtimer_switch_to_wor2_wrapper(void *ptr)
|
static void hwtimer_switch_to_wor2_wrapper(void *ptr)
|
||||||
{
|
{
|
||||||
(void) ptr;
|
(void) ptr;
|
||||||
wor_hwtimer_id = -1; /* kernel timer handler function called, clear timer id */
|
wor_hwtimer_id = -1; /* kernel timer handler function called, clear timer id */
|
||||||
|
|
||||||
if (rflags.TX) {
|
if (rflags.TX) {
|
||||||
return; /* Stability: don't allow WOR timers at this point */
|
return; /* Stability: don't allow WOR timers at this point */
|
||||||
@ -401,8 +401,8 @@ static void setup_wor_mode(void)
|
|||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x18);
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x18);
|
||||||
|
|
||||||
/* Put the radio to SLEEP by starting Wake-on-Radio. */
|
/* Put the radio to SLEEP by starting Wake-on-Radio. */
|
||||||
cc1100_spi_strobe(CC1100_SWORRST); /* Resets the real time clock */
|
cc1100_spi_strobe(CC1100_SWORRST); /* Resets the real time clock */
|
||||||
cc1100_spi_strobe(CC1100_SWOR); /* Starts Wake-on-Radio */
|
cc1100_spi_strobe(CC1100_SWOR); /* Starts Wake-on-Radio */
|
||||||
radio_state = RADIO_WOR;
|
radio_state = RADIO_WOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,7 +563,7 @@ void cc1100_hwtimer_go_receive_wrapper(void *ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 reset functionality */
|
/* CC1100 reset functionality */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void reset(void)
|
static void reset(void)
|
||||||
@ -585,7 +585,7 @@ static void power_up_reset(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 low level send function */
|
/* CC1100 low level send function */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_send_raw(uint8_t *tx_buffer, uint8_t size)
|
void cc1100_send_raw(uint8_t *tx_buffer, uint8_t size)
|
||||||
@ -636,7 +636,7 @@ void cc1100_send_raw(uint8_t *tx_buffer, uint8_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Various functions (mode safe - they can be called in any radio mode) */
|
/* Various functions (mode safe - they can be called in any radio mode) */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
uint8_t
|
uint8_t
|
||||||
read_register(uint8_t r)
|
read_register(uint8_t r)
|
||||||
@ -789,14 +789,14 @@ char *cc1100_get_marc_state(void)
|
|||||||
static int8_t
|
static int8_t
|
||||||
rssi_2_dbm(uint8_t rssi)
|
rssi_2_dbm(uint8_t rssi)
|
||||||
{
|
{
|
||||||
if (rssi >= 128) rssi -= 256;
|
if (rssi >= 128) rssi -= 256;
|
||||||
rssi /= 2;
|
rssi /= 2;
|
||||||
rssi -= 78;
|
rssi -= 78;
|
||||||
return rssi;
|
return rssi;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Radio Driver API */
|
/* Radio Driver API */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void cc1100_init(void)
|
void cc1100_init(void)
|
||||||
{
|
{
|
||||||
@ -890,13 +890,13 @@ rd_set_mode(int mode)
|
|||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case RADIO_MODE_ON:
|
case RADIO_MODE_ON:
|
||||||
cc110x_init_interrupts(); /* Enable interrupts */
|
cc110x_init_interrupts(); /* Enable interrupts */
|
||||||
cc1100_setup_mode(); /* Set chip to desired mode */
|
cc1100_setup_mode(); /* Set chip to desired mode */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RADIO_MODE_OFF:
|
case RADIO_MODE_OFF:
|
||||||
cc1100_disable_interrupts(); /* Disable interrupts */
|
cc1100_disable_interrupts(); /* Disable interrupts */
|
||||||
switch_to_pwd(); /* Set chip to power down mode */
|
switch_to_pwd(); /* Set chip to power down mode */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RADIO_MODE_GET:
|
case RADIO_MODE_GET:
|
||||||
@ -912,24 +912,24 @@ rd_set_mode(int mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Carrier sense interface functions */
|
/* Carrier sense interface functions */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_cs_init(void)
|
void cc1100_cs_init(void)
|
||||||
{
|
{
|
||||||
cc1100_go_idle(); /* Wake CC1100 up from Wake-On-Radio mode */
|
cc1100_go_idle(); /* Wake CC1100 up from Wake-On-Radio mode */
|
||||||
|
|
||||||
if (radio_state == RADIO_RX) { /* If radio in RX mode */
|
if (radio_state == RADIO_RX) { /* If radio in RX mode */
|
||||||
cc1100_spi_strobe(CC1100_SIDLE); /* Go back to IDLE for calibration */
|
cc1100_spi_strobe(CC1100_SIDLE); /* Go back to IDLE for calibration */
|
||||||
}
|
}
|
||||||
|
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
||||||
cc1100_spi_strobe(CC1100_SCAL); /* Calibrate manually (721 us) */
|
cc1100_spi_strobe(CC1100_SCAL); /* Calibrate manually (721 us) */
|
||||||
hwtimer_wait(MANUAL_FS_CAL_TIME); /* Wait for calibration to finish before packet burst can start */
|
hwtimer_wait(MANUAL_FS_CAL_TIME); /* Wait for calibration to finish before packet burst can start */
|
||||||
radio_state = RADIO_AIR_FREE_WAITING; /* Set status "waiting for air free" */
|
radio_state = RADIO_AIR_FREE_WAITING; /* Set status "waiting for air free" */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM2, 0x07); /* Configure RX_TIME = Until end of packet (no timeout) */
|
cc1100_spi_write_reg(CC1100_MCSM2, 0x07); /* Configure RX_TIME = Until end of packet (no timeout) */
|
||||||
cc1100_spi_strobe(CC1100_SRX); /* Switch to RX (88.4 us) (Carrier Sense) */
|
cc1100_spi_strobe(CC1100_SRX); /* Switch to RX (88.4 us) (Carrier Sense) */
|
||||||
hwtimer_wait(CS_READY_TIME); /* Wait until CC1100 is in RX + carrier sense ready (GDO0 ready for readout -> data rate dependent!!!) */
|
hwtimer_wait(CS_READY_TIME); /* Wait until CC1100 is in RX + carrier sense ready (GDO0 ready for readout -> data rate dependent!!!) */
|
||||||
}
|
}
|
||||||
|
|
||||||
void cc1100_cs_set_enabled(bool enabled)
|
void cc1100_cs_set_enabled(bool enabled)
|
||||||
|
|||||||
@ -13,21 +13,21 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC110x physical radio driver
|
* @brief TI Chipcon CC110x physical radio driver
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @author Oliver Hahm <oliver.hahm@inria.fr>
|
* @author Oliver Hahm <oliver.hahm@inria.fr>
|
||||||
* @version $Revision: 2130 $
|
* @version $Revision: 2130 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100_phy.c 2130 2010-05-12 13:19:07Z hillebra $
|
* @note $Id: cc1100_phy.c 2130 2010-05-12 13:19:07Z hillebra $
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -52,12 +52,12 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
|
|
||||||
#define MSG_POLL 12346
|
#define MSG_POLL 12346
|
||||||
|
|
||||||
#define FLAGS_IDENTIFICATION (0x01) ///< Bit mask for reading the identification out of the flags field
|
#define FLAGS_IDENTIFICATION (0x01) ///< Bit mask for reading the identification out of the flags field
|
||||||
#define R_FLAGS_PROTOCOL(x) ((x & 0x0E)>>1) ///< Macro for reading the protocol out of the flags field
|
#define R_FLAGS_PROTOCOL(x) ((x & 0x0E)>>1) ///< Macro for reading the protocol out of the flags field
|
||||||
#define W_FLAGS_PROTOCOL(x) ((x<<1) & 0x0E) ///< Macro for writing the protocol in the flags field
|
#define W_FLAGS_PROTOCOL(x) ((x<<1) & 0x0E) ///< Macro for writing the protocol in the flags field
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* RX/TX buffer data structures */
|
/* RX/TX buffer data structures */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -65,18 +65,18 @@ typedef struct {
|
|||||||
packet_info_t info;
|
packet_info_t info;
|
||||||
} rx_buffer_t;
|
} rx_buffer_t;
|
||||||
|
|
||||||
#define RX_BUFF_SIZE (10) ///< Size of RX queue
|
#define RX_BUFF_SIZE (10) ///< Size of RX queue
|
||||||
static volatile uint8_t rx_buffer_head; ///< RX queue head
|
static volatile uint8_t rx_buffer_head; ///< RX queue head
|
||||||
static volatile uint8_t rx_buffer_tail; ///< RX queue tail
|
static volatile uint8_t rx_buffer_tail; ///< RX queue tail
|
||||||
static volatile uint8_t rx_buffer_size; ///< RX queue size
|
static volatile uint8_t rx_buffer_size; ///< RX queue size
|
||||||
static rx_buffer_t rx_buffer[RX_BUFF_SIZE]; ///< RX buffer
|
static rx_buffer_t rx_buffer[RX_BUFF_SIZE]; ///< RX buffer
|
||||||
static cc1100_packet_layer0_t tx_buffer; ///< TX buffer (for one packet)
|
static cc1100_packet_layer0_t tx_buffer; ///< TX buffer (for one packet)
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Process/Event management data structures */
|
/* Process/Event management data structures */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#define MAX_PACKET_HANDLERS (5)
|
#define MAX_PACKET_HANDLERS (5)
|
||||||
static packet_monitor_t packet_monitor;
|
static packet_monitor_t packet_monitor;
|
||||||
static handler_entry_t handlers[MAX_PACKET_HANDLERS];
|
static handler_entry_t handlers[MAX_PACKET_HANDLERS];
|
||||||
static const pm_table_t handler_table;
|
static const pm_table_t handler_table;
|
||||||
@ -92,19 +92,19 @@ static void *cc1100_event_handler_function(void *);
|
|||||||
static char event_handler_stack[KERNEL_CONF_STACKSIZE_MAIN];
|
static char event_handler_stack[KERNEL_CONF_STACKSIZE_MAIN];
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Sequence number buffer management data structures */
|
/* Sequence number buffer management data structures */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Sequence Buffer
|
* @name Sequence Buffer
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define MAX_SEQ_BUFFER_SIZE (20) ///< Maximum size of the sequence number buffer
|
#define MAX_SEQ_BUFFER_SIZE (20) ///< Maximum size of the sequence number buffer
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t m_ticks; ///< 64-bit timestamp
|
uint64_t m_ticks; ///< 64-bit timestamp
|
||||||
uint8_t source; ///< Source address
|
uint8_t source; ///< Source address
|
||||||
uint8_t identification; ///< Identification (1-bit)
|
uint8_t identification; ///< Identification (1-bit)
|
||||||
} seq_buffer_entry_t;
|
} seq_buffer_entry_t;
|
||||||
|
|
||||||
//* Sequence number buffer for this layer */
|
//* Sequence number buffer for this layer */
|
||||||
@ -114,42 +114,42 @@ static seq_buffer_entry_t seq_buffer[MAX_SEQ_BUFFER_SIZE];
|
|||||||
static uint8_t seq_buffer_pos = 0;
|
static uint8_t seq_buffer_pos = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Last sequence number this node has seen
|
* @brief Last sequence number this node has seen
|
||||||
*
|
*
|
||||||
* @note (phySrc + flags.identification) - for speedup in ISR.
|
* @note (phySrc + flags.identification) - for speedup in ISR.
|
||||||
*/
|
*/
|
||||||
static volatile uint16_t last_seq_num = 0;
|
static volatile uint16_t last_seq_num = 0;
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// WOR configuration data structures
|
// WOR configuration data structures
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#define EVENT0_MAX (60493) ///< Maximum RX polling interval in milliseconds
|
#define EVENT0_MAX (60493) ///< Maximum RX polling interval in milliseconds
|
||||||
#define WOR_RES_SWITCH (1891) ///< Switching point value in milliseconds between
|
#define WOR_RES_SWITCH (1891) ///< Switching point value in milliseconds between
|
||||||
///< WOR_RES = 0 and WOR_RES = 1
|
///< WOR_RES = 0 and WOR_RES = 1
|
||||||
#define DUTY_CYCLE_SIZE (7) ///< Length of duty cycle array
|
#define DUTY_CYCLE_SIZE (7) ///< Length of duty cycle array
|
||||||
|
|
||||||
cc1100_wor_config_t cc1100_wor_config; ///< CC1100 WOR configuration
|
cc1100_wor_config_t cc1100_wor_config; ///< CC1100 WOR configuration
|
||||||
|
|
||||||
uint16_t cc1100_burst_count; ///< Burst count, number of packets in a burst transfer
|
uint16_t cc1100_burst_count; ///< Burst count, number of packets in a burst transfer
|
||||||
uint8_t cc1100_retransmission_count_uc; ///< Number of retransmissions for unicast
|
uint8_t cc1100_retransmission_count_uc; ///< Number of retransmissions for unicast
|
||||||
uint8_t cc1100_retransmission_count_bc; ///< Number of retransmissions for broadcast
|
uint8_t cc1100_retransmission_count_bc; ///< Number of retransmissions for broadcast
|
||||||
|
|
||||||
static const double duty_cycle[2][DUTY_CYCLE_SIZE] = { ///< Duty cycle values from AN047
|
static const double duty_cycle[2][DUTY_CYCLE_SIZE] = { ///< Duty cycle values from AN047
|
||||||
{12.5, 6.25, 3.125, 1.563, 0.781, 0.391, 0.195},
|
{12.5, 6.25, 3.125, 1.563, 0.781, 0.391, 0.195},
|
||||||
{1.95, 0.9765, 0.4883, 0.2441, 0.1221, 0.061035, 0.030518}
|
{1.95, 0.9765, 0.4883, 0.2441, 0.1221, 0.061035, 0.030518}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Data structures for statistic
|
// Data structures for statistic
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
cc1100_statistic_t cc1100_statistic;
|
cc1100_statistic_t cc1100_statistic;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Initialization of physical layer
|
// Initialization of physical layer
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_phy_init(void)
|
void cc1100_phy_init(void)
|
||||||
@ -190,7 +190,7 @@ void cc1100_phy_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 mutual exclusion */
|
/* CC1100 mutual exclusion */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_phy_mutex_lock(void)
|
void cc1100_phy_mutex_lock(void)
|
||||||
@ -208,7 +208,7 @@ void cc1100_phy_mutex_unlock(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Statistical functions
|
// Statistical functions
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_reset_statistic(void)
|
void cc1100_reset_statistic(void)
|
||||||
@ -271,7 +271,7 @@ void cc1100_print_config(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Change of RX polling interval (T_EVENT0)
|
// Change of RX polling interval (T_EVENT0)
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
inline uint16_t iround(double d)
|
inline uint16_t iround(double d)
|
||||||
@ -355,7 +355,7 @@ int cc1100_phy_calc_wor_settings(uint16_t millis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Sequence number buffer management
|
// Sequence number buffer management
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static bool contains_seq_entry(uint8_t src, uint8_t id)
|
static bool contains_seq_entry(uint8_t src, uint8_t id)
|
||||||
@ -415,26 +415,26 @@ static void add_seq_entry(uint8_t src, uint8_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 physical layer send functions */
|
/* CC1100 physical layer send functions */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void send_link_level_ack(uint8_t dest)
|
static void send_link_level_ack(uint8_t dest)
|
||||||
{
|
{
|
||||||
uint8_t oldState = radio_state; /* Save old state */
|
uint8_t oldState = radio_state; /* Save old state */
|
||||||
cc1100_packet_layer0_t ack; /* Local packet, don't overwrite */
|
cc1100_packet_layer0_t ack; /* Local packet, don't overwrite */
|
||||||
|
|
||||||
radio_state = RADIO_SEND_ACK; /* Set state to "Sending ACK" */
|
radio_state = RADIO_SEND_ACK; /* Set state to "Sending ACK" */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM1, 0x00); /* TX_OFFMODE = IDLE */
|
cc1100_spi_write_reg(CC1100_MCSM1, 0x00); /* TX_OFFMODE = IDLE */
|
||||||
ack.length = 3; /* possible packet in txBuffer!*/
|
ack.length = 3; /* possible packet in txBuffer!*/
|
||||||
ack.address = dest;
|
ack.address = dest;
|
||||||
ack.phy_src = rflags.RSSI;
|
ack.phy_src = rflags.RSSI;
|
||||||
ack.flags = (LAYER_1_PROTOCOL_LL_ACK << 1);
|
ack.flags = (LAYER_1_PROTOCOL_LL_ACK << 1);
|
||||||
cc1100_send_raw((uint8_t *)&ack, /* IDLE -> TX (88.4 us) */
|
cc1100_send_raw((uint8_t *)&ack, /* IDLE -> TX (88.4 us) */
|
||||||
ack.length + 1);
|
ack.length + 1);
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x18); /* Turn on FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x18); /* Turn on FS-Autocal */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM1, 0x03); /* TX_OFFMODE = RX */
|
cc1100_spi_write_reg(CC1100_MCSM1, 0x03); /* TX_OFFMODE = RX */
|
||||||
radio_state = oldState; /* Restore state */
|
radio_state = oldState; /* Restore state */
|
||||||
cc1100_statistic.acks_send++;
|
cc1100_statistic.acks_send++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,7 +452,7 @@ static bool send_burst(cc1100_packet_layer0_t *packet, uint8_t retries, uint8_t
|
|||||||
*/
|
*/
|
||||||
extern unsigned long hwtimer_now(void);
|
extern unsigned long hwtimer_now(void);
|
||||||
timer_tick_t t = hwtimer_now() + RTIMER_TICKS(T_PACKET_INTERVAL);
|
timer_tick_t t = hwtimer_now() + RTIMER_TICKS(T_PACKET_INTERVAL);
|
||||||
cc1100_send_raw((uint8_t *)packet, packet->length + 1); /* RX -> TX (9.6 us) */
|
cc1100_send_raw((uint8_t *)packet, packet->length + 1); /* RX -> TX (9.6 us) */
|
||||||
|
|
||||||
cc1100_statistic.raw_packets_out++;
|
cc1100_statistic.raw_packets_out++;
|
||||||
|
|
||||||
@ -555,25 +555,25 @@ int cc1100_send(radio_address_t addr, protocol_t protocol, int priority, char *p
|
|||||||
retries = (address == CC1100_BROADCAST_ADDRESS) ?
|
retries = (address == CC1100_BROADCAST_ADDRESS) ?
|
||||||
cc1100_retransmission_count_bc : cc1100_retransmission_count_uc;
|
cc1100_retransmission_count_bc : cc1100_retransmission_count_uc;
|
||||||
|
|
||||||
memset(tx_buffer.data, 0, MAX_DATA_LENGTH); /* Clean data */
|
memset(tx_buffer.data, 0, MAX_DATA_LENGTH); /* Clean data */
|
||||||
|
|
||||||
/* TODO: If packets are shorter than max packet size, WOR interval is too long.
|
/* TODO: If packets are shorter than max packet size, WOR interval is too long.
|
||||||
* This must be solved in some way. */
|
* This must be solved in some way. */
|
||||||
tx_buffer.length = 3 + payload_len; /* 3 bytes (A&PS&F) + data length */
|
tx_buffer.length = 3 + payload_len; /* 3 bytes (A&PS&F) + data length */
|
||||||
tx_buffer.address = address; /* Copy destination address */
|
tx_buffer.address = address; /* Copy destination address */
|
||||||
tx_buffer.flags = 0x00; /* Set clean state */
|
tx_buffer.flags = 0x00; /* Set clean state */
|
||||||
tx_buffer.flags = W_FLAGS_PROTOCOL(protocol); /* Copy protocol identifier */
|
tx_buffer.flags = W_FLAGS_PROTOCOL(protocol); /* Copy protocol identifier */
|
||||||
tx_buffer.phy_src = (uint8_t) cc1100_get_address(); /* Copy sender address */
|
tx_buffer.phy_src = (uint8_t) cc1100_get_address(); /* Copy sender address */
|
||||||
|
|
||||||
/* Set identification number of packet */
|
/* Set identification number of packet */
|
||||||
tx_buffer.flags |= rflags.SEQ; /* Set flags.identification (bit 0) */
|
tx_buffer.flags |= rflags.SEQ; /* Set flags.identification (bit 0) */
|
||||||
rflags.SEQ = !rflags.SEQ; /* Toggle value of layer 0 sequence number bit */
|
rflags.SEQ = !rflags.SEQ; /* Toggle value of layer 0 sequence number bit */
|
||||||
|
|
||||||
memcpy(tx_buffer.data, payload, payload_len); /* Copy data */
|
memcpy(tx_buffer.data, payload, payload_len); /* Copy data */
|
||||||
|
|
||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
||||||
result = send_burst(&tx_buffer, retries, 0); /* Send raw burst */
|
result = send_burst(&tx_buffer, retries, 0); /* Send raw burst */
|
||||||
return_code = result ? payload_len : RADIO_OP_FAILED;
|
return_code = result ? payload_len : RADIO_OP_FAILED;
|
||||||
|
|
||||||
/* Collect statistics */
|
/* Collect statistics */
|
||||||
@ -602,7 +602,7 @@ final:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* RX Event Handler */
|
/* RX Event Handler */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
bool cc1100_set_packet_monitor(packet_monitor_t monitor)
|
bool cc1100_set_packet_monitor(packet_monitor_t monitor)
|
||||||
@ -698,7 +698,7 @@ static void *cc1100_event_handler_function(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* CC1100 packet (RX) ISR */
|
/* CC1100 packet (RX) ISR */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void cc1100_phy_rx_handler(void)
|
void cc1100_phy_rx_handler(void)
|
||||||
@ -835,8 +835,8 @@ void cc1100_phy_rx_handler(void)
|
|||||||
/* Valid packet. After a wake-up, the radio should be in IDLE.
|
/* Valid packet. After a wake-up, the radio should be in IDLE.
|
||||||
* So put CC1100 to RX for WOR_TIMEOUT (have to manually put
|
* So put CC1100 to RX for WOR_TIMEOUT (have to manually put
|
||||||
* the radio back to sleep/WOR).*/
|
* the radio back to sleep/WOR).*/
|
||||||
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
cc1100_spi_write_reg(CC1100_MCSM0, 0x08); /* Turn off FS-Autocal */
|
||||||
cc1100_spi_write_reg(CC1100_MCSM2, 0x07); /* Configure RX_TIME (until end of packet) */
|
cc1100_spi_write_reg(CC1100_MCSM2, 0x07); /* Configure RX_TIME (until end of packet) */
|
||||||
|
|
||||||
if (radio_mode == CC1100_MODE_CONSTANT_RX) {
|
if (radio_mode == CC1100_MODE_CONSTANT_RX) {
|
||||||
cc1100_spi_strobe(CC1100_SRX);
|
cc1100_spi_strobe(CC1100_SRX);
|
||||||
@ -864,9 +864,9 @@ void cc1100_phy_rx_handler(void)
|
|||||||
rflags.TOF = 0;
|
rflags.TOF = 0;
|
||||||
|
|
||||||
/* CRC false or RX buffer full -> clear RX FIFO in both cases */
|
/* CRC false or RX buffer full -> clear RX FIFO in both cases */
|
||||||
last_seq_num = 0; /* Reset for correct burst detection */
|
last_seq_num = 0; /* Reset for correct burst detection */
|
||||||
cc1100_spi_strobe(CC1100_SIDLE); /* Switch to IDLE (should already be)... */
|
cc1100_spi_strobe(CC1100_SIDLE); /* Switch to IDLE (should already be)... */
|
||||||
cc1100_spi_strobe(CC1100_SFRX); /* ...for flushing the RX FIFO */
|
cc1100_spi_strobe(CC1100_SFRX); /* ...for flushing the RX FIFO */
|
||||||
|
|
||||||
/* If packet interrupted this nodes send call,
|
/* If packet interrupted this nodes send call,
|
||||||
* don't change anything after this point. */
|
* don't change anything after this point. */
|
||||||
|
|||||||
@ -13,20 +13,20 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC110x physical radio driver
|
* @brief TI Chipcon CC110x physical radio driver
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1285 $
|
* @version $Revision: 1285 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100_phy.h 1285 2009-08-27 13:22:42Z hillebra $
|
* @note $Id: cc1100_phy.h 1285 2009-08-27 13:22:42Z hillebra $
|
||||||
*/
|
*/
|
||||||
#ifndef CC1100_PHY_H_
|
#ifndef CC1100_PHY_H_
|
||||||
#define CC1100_PHY_H_
|
#define CC1100_PHY_H_
|
||||||
@ -37,10 +37,10 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
#include "cc1100-internal.h"
|
#include "cc1100-internal.h"
|
||||||
#include "cc110x.h"
|
#include "cc110x.h"
|
||||||
|
|
||||||
#define MAX_DATA_LENGTH (0x3A) ///< Maximum data length of layer 0 = 58 Bytes.
|
#define MAX_DATA_LENGTH (0x3A) ///< Maximum data length of layer 0 = 58 Bytes.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief CC1100 layer 0 protocol
|
* @brief CC1100 layer 0 protocol
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
---------------------------------------------------
|
---------------------------------------------------
|
||||||
@ -51,36 +51,36 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
1 byte 1 byte 1 byte 1 byte <= 58 bytes
|
1 byte 1 byte 1 byte 1 byte <= 58 bytes
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
Bit | Meaning
|
Bit | Meaning
|
||||||
--------------------
|
--------------------
|
||||||
7:4 | -
|
7:4 | -
|
||||||
3:1 | Protocol
|
3:1 | Protocol
|
||||||
0 | Identification
|
0 | Identification
|
||||||
</pre>
|
</pre>
|
||||||
Notes:
|
Notes:
|
||||||
\li length & address are given by CC1100
|
\li length & address are given by CC1100
|
||||||
\li Identification is increased is used to scan duplicates. It must be increased
|
\li Identification is increased is used to scan duplicates. It must be increased
|
||||||
for each new packet and kept for packet retransmissions.
|
for each new packet and kept for packet retransmissions.
|
||||||
*/
|
*/
|
||||||
typedef struct __attribute__((packed)) cc1100_packet_layer0_t {
|
typedef struct __attribute__((packed)) cc1100_packet_layer0_t {
|
||||||
uint8_t length; ///< Length of the packet (without length byte)
|
uint8_t length; ///< Length of the packet (without length byte)
|
||||||
uint8_t address; ///< Destination address
|
uint8_t address; ///< Destination address
|
||||||
uint8_t phy_src; ///< Source address (physical source)
|
uint8_t phy_src; ///< Source address (physical source)
|
||||||
uint8_t flags; ///< Flags
|
uint8_t flags; ///< Flags
|
||||||
uint8_t data[MAX_DATA_LENGTH]; ///< Data (high layer protocol)
|
uint8_t data[MAX_DATA_LENGTH]; ///< Data (high layer protocol)
|
||||||
} cc1100_packet_layer0_t;
|
} cc1100_packet_layer0_t;
|
||||||
|
|
||||||
typedef struct cc1100_wor_config_t {
|
typedef struct cc1100_wor_config_t {
|
||||||
uint16_t rx_interval; ///< RX polling interval in milliseconds
|
uint16_t rx_interval; ///< RX polling interval in milliseconds
|
||||||
float rx_time_ms; ///< WOR_RX_TIME in milliseconds
|
float rx_time_ms; ///< WOR_RX_TIME in milliseconds
|
||||||
uint8_t rx_time_reg; ///< WOR_RX_TIME (CC1100 "MCSM2.RX_TIME" register value)
|
uint8_t rx_time_reg; ///< WOR_RX_TIME (CC1100 "MCSM2.RX_TIME" register value)
|
||||||
uint8_t wor_evt_0; ///< CC1100 WOREVT0 register value
|
uint8_t wor_evt_0; ///< CC1100 WOREVT0 register value
|
||||||
uint8_t wor_evt_1; ///< CC1100 WOREVT1 register value
|
uint8_t wor_evt_1; ///< CC1100 WOREVT1 register value
|
||||||
uint8_t wor_ctrl; ///< CC1100 WORCTRL register value
|
uint8_t wor_ctrl; ///< CC1100 WORCTRL register value
|
||||||
} cc1100_wor_config_t;
|
} cc1100_wor_config_t;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// CC1100 Wake-On-Radio configuration
|
// CC1100 Wake-On-Radio configuration
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
extern uint16_t cc1100_burst_count;
|
extern uint16_t cc1100_burst_count;
|
||||||
@ -89,11 +89,11 @@ extern uint8_t cc1100_retransmission_count_bc;
|
|||||||
extern cc1100_wor_config_t cc1100_wor_config;
|
extern cc1100_wor_config_t cc1100_wor_config;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// CC1100 physical radio driver API
|
// CC1100 physical radio driver API
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize the physical radio layer.
|
* @brief Initialize the physical radio layer.
|
||||||
*/
|
*/
|
||||||
void cc1100_phy_init(void);
|
void cc1100_phy_init(void);
|
||||||
|
|
||||||
@ -114,22 +114,22 @@ void cc1100_phy_mutex_lock(void);
|
|||||||
void cc1100_phy_mutex_unlock(void);
|
void cc1100_phy_mutex_unlock(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Calculate and store Wake-On-Radio settings.
|
* @brief Calculate and store Wake-On-Radio settings.
|
||||||
*
|
*
|
||||||
* Calculates WOR settings for a given RX interval in
|
* Calculates WOR settings for a given RX interval in
|
||||||
* milliseconds and stores the values in global configuration.
|
* milliseconds and stores the values in global configuration.
|
||||||
* <p>
|
* <p>
|
||||||
* Does not change settings if not applicable.
|
* Does not change settings if not applicable.
|
||||||
*
|
*
|
||||||
* @param millis Desired RX interval in milliseconds [50..60000].
|
* @param millis Desired RX interval in milliseconds [50..60000].
|
||||||
*
|
*
|
||||||
* @return The burst count (number of packets in a burst transfer)
|
* @return The burst count (number of packets in a burst transfer)
|
||||||
* or -1 if an error occurred (e.g. RX interval invalid).
|
* or -1 if an error occurred (e.g. RX interval invalid).
|
||||||
*/
|
*/
|
||||||
int cc1100_phy_calc_wor_settings(uint16_t millis);
|
int cc1100_phy_calc_wor_settings(uint16_t millis);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Handler function for incoming packets.
|
* @brief Handler function for incoming packets.
|
||||||
*
|
*
|
||||||
* This handler function must be called in the receive
|
* This handler function must be called in the receive
|
||||||
* interrupt service routine.
|
* interrupt service routine.
|
||||||
|
|||||||
@ -13,20 +13,20 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC1100 SPI driver
|
* @brief TI Chipcon CC1100 SPI driver
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1775 $
|
* @version $Revision: 1775 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100_spi.c 1775 2010-01-26 09:37:03Z hillebra $
|
* @note $Id: cc1100_spi.c 1775 2010-01-26 09:37:03Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -38,7 +38,7 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
#include "cc1100-internal.h"
|
#include "cc1100-internal.h"
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// CC1100 SPI access
|
// CC1100 SPI access
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
uint8_t
|
uint8_t
|
||||||
|
|||||||
@ -13,20 +13,20 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @internal
|
* @internal
|
||||||
* @brief TI Chipcon CC1100 SPI driver
|
* @brief TI Chipcon CC1100 SPI driver
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @version $Revision: 1775 $
|
* @version $Revision: 1775 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100_spi.h 1775 2010-01-26 09:37:03Z hillebra $
|
* @note $Id: cc1100_spi.h 1775 2010-01-26 09:37:03Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CC1100_SPI_H_
|
#ifndef CC1100_SPI_H_
|
||||||
|
|||||||
@ -14,10 +14,10 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @ingroup CC2420
|
* @ingroup CC2420
|
||||||
* @brief CC2420 dependend functions
|
* @brief CC2420 dependend functions
|
||||||
*
|
*
|
||||||
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
* @author Heiko Will <hwill@inf.fu-berlin.de>
|
||||||
* @author Milan Babel <babel@inf.fu-berlin.de>
|
* @author Milan Babel <babel@inf.fu-berlin.de>
|
||||||
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
|
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
/* @{ */
|
/* @{ */
|
||||||
uint8_t length; /** < the length of the frame of the frame including fcs*/
|
uint8_t length; /** < the length of the frame of the frame including fcs*/
|
||||||
ieee802154_frame_t frame; /** < the ieee802154 frame */
|
ieee802154_frame_t frame; /** < the ieee802154 frame */
|
||||||
int8_t rssi; /** < the rssi value */
|
int8_t rssi; /** < the rssi value */
|
||||||
uint8_t crc; /** < 1 if crc was successfull, 0 otherwise */
|
uint8_t crc; /** < 1 if crc was successfull, 0 otherwise */
|
||||||
|
|||||||
@ -13,18 +13,18 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup dev_cc110x
|
* @ingroup dev_cc110x
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @brief TI Chipcon CC110x public interface
|
* @brief TI Chipcon CC110x public interface
|
||||||
*
|
*
|
||||||
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
* @author Thomas Hillebrandt <hillebra@inf.fu-berlin.de>
|
||||||
* @version $Revision: 2283 $
|
* @version $Revision: 2283 $
|
||||||
*
|
*
|
||||||
* @note $Id: cc1100-interface.h 2283 2010-06-15 14:02:27Z hillebra $
|
* @note $Id: cc1100-interface.h 2283 2010-06-15 14:02:27Z hillebra $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CC1100INTERFACE_H_
|
#ifndef CC1100INTERFACE_H_
|
||||||
@ -33,19 +33,19 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "radio/radio.h"
|
#include "radio/radio.h"
|
||||||
|
|
||||||
#define CC1100_BROADCAST_ADDRESS (0x00) ///< CC1100 broadcast address
|
#define CC1100_BROADCAST_ADDRESS (0x00) ///< CC1100 broadcast address
|
||||||
|
|
||||||
#define MAX_UID (0xFF) ///< Maximum UID of a node is 255
|
#define MAX_UID (0xFF) ///< Maximum UID of a node is 255
|
||||||
#define MIN_UID (0x01) ///< Minimum UID of a node is 1
|
#define MIN_UID (0x01) ///< Minimum UID of a node is 1
|
||||||
|
|
||||||
#define MIN_CHANNR (0) ///< Minimum channel number
|
#define MIN_CHANNR (0) ///< Minimum channel number
|
||||||
#define MAX_CHANNR (24) ///< Maximum channel number
|
#define MAX_CHANNR (24) ///< Maximum channel number
|
||||||
|
|
||||||
#define MIN_OUTPUT_POWER (0) ///< Minimum output power value
|
#define MIN_OUTPUT_POWER (0) ///< Minimum output power value
|
||||||
#define MAX_OUTPUT_POWER (11) ///< Maximum output power value
|
#define MAX_OUTPUT_POWER (11) ///< Maximum output power value
|
||||||
|
|
||||||
#define CC1100_MODE_WOR (0) ///< Usable radio mode: Wake-On-Radio
|
#define CC1100_MODE_WOR (0) ///< Usable radio mode: Wake-On-Radio
|
||||||
#define CC1100_MODE_CONSTANT_RX (1) ///< Usable radio mode: Constant receive
|
#define CC1100_MODE_CONSTANT_RX (1) ///< Usable radio mode: Constant receive
|
||||||
|
|
||||||
#define CC1100_MAX_DATA_LENGTH (58)
|
#define CC1100_MAX_DATA_LENGTH (58)
|
||||||
|
|
||||||
@ -62,21 +62,21 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
extern const radio_t radio_cc1100;
|
extern const radio_t radio_cc1100;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize radio layer.
|
* @brief Initialize radio layer.
|
||||||
*
|
*
|
||||||
* Initialize the radio layer, must be called before radio can be used.
|
* Initialize the radio layer, must be called before radio can be used.
|
||||||
*/
|
*/
|
||||||
void cc1100_init(void);
|
void cc1100_init(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the radio mode.
|
* @brief Get the radio mode.
|
||||||
*
|
*
|
||||||
* @return Either CC1100_MODE_CONSTANT_RX or CC1100_MODE_WOR.
|
* @return Either CC1100_MODE_CONSTANT_RX or CC1100_MODE_WOR.
|
||||||
*/
|
*/
|
||||||
uint8_t cc1100_get_mode(void);
|
uint8_t cc1100_get_mode(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the radio mode.
|
* @brief Set the radio mode.
|
||||||
*
|
*
|
||||||
* Sets the radio mode with optional mode data. If the radio mode is WOR,
|
* Sets the radio mode with optional mode data. If the radio mode is WOR,
|
||||||
* the optional mode data is the RX interval in milliseconds. Must be called
|
* the optional mode data is the RX interval in milliseconds. Must be called
|
||||||
@ -90,116 +90,116 @@ uint8_t cc1100_get_mode(void);
|
|||||||
bool cc1100_set_mode(uint8_t mode, uint16_t opt_mode_data);
|
bool cc1100_set_mode(uint8_t mode, uint16_t opt_mode_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the average transmission duration (till ACK received).
|
* @brief Get the average transmission duration (till ACK received).
|
||||||
*
|
*
|
||||||
* @return The average transmission duration of one packet in milliseconds.
|
* @return The average transmission duration of one packet in milliseconds.
|
||||||
*/
|
*/
|
||||||
int cc1100_get_avg_transmission_duration(void);
|
int cc1100_get_avg_transmission_duration(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the radio address.
|
* @brief Get the radio address.
|
||||||
*
|
*
|
||||||
* @return The current address of the radio.
|
* @return The current address of the radio.
|
||||||
*/
|
*/
|
||||||
radio_address_t cc1100_get_address(void);
|
radio_address_t cc1100_get_address(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the radio address.
|
* @brief Set the radio address.
|
||||||
*
|
*
|
||||||
* @param address The new radio address.
|
* @param address The new radio address.
|
||||||
*
|
*
|
||||||
* @return true if address could be set; false otherwise.
|
* @return true if address could be set; false otherwise.
|
||||||
*/
|
*/
|
||||||
bool cc1100_set_address(radio_address_t address);
|
bool cc1100_set_address(radio_address_t address);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the current channel number.
|
* @brief Get the current channel number.
|
||||||
*
|
*
|
||||||
* @return The current channel number used.
|
* @return The current channel number used.
|
||||||
*/
|
*/
|
||||||
uint8_t cc1100_get_channel(void);
|
uint8_t cc1100_get_channel(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the channel to use.
|
* @brief Set the channel to use.
|
||||||
*
|
*
|
||||||
* @param channr The new channel number (between MIN_CHANNR and MAX_CHANNR) to use.
|
* @param channr The new channel number (between MIN_CHANNR and MAX_CHANNR) to use.
|
||||||
*
|
*
|
||||||
* @return true if channel could be set; false otherwise.
|
* @return true if channel could be set; false otherwise.
|
||||||
*/
|
*/
|
||||||
bool cc1100_set_channel(uint8_t channr);
|
bool cc1100_set_channel(uint8_t channr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set current output power in dBm.
|
* @brief Set current output power in dBm.
|
||||||
*
|
*
|
||||||
* @param pa_idx New output power setting, valid values
|
* @param pa_idx New output power setting, valid values
|
||||||
* are from MIN_OUTPUT_POWER (lowest output power, -52 dBm)
|
* are from MIN_OUTPUT_POWER (lowest output power, -52 dBm)
|
||||||
* to MAX_OUTPUT_POWER (highest output power, +10 dBm).
|
* to MAX_OUTPUT_POWER (highest output power, +10 dBm).
|
||||||
*
|
*
|
||||||
* @return true if output power could be set; false otherwise.
|
* @return true if output power could be set; false otherwise.
|
||||||
*/
|
*/
|
||||||
bool cc1100_set_output_power(uint8_t pa_idx);
|
bool cc1100_set_output_power(uint8_t pa_idx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set a packet monitor at this layer.
|
* @brief Set a packet monitor at this layer.
|
||||||
*
|
*
|
||||||
* All incoming packets will be passed to this packet monitor before
|
* All incoming packets will be passed to this packet monitor before
|
||||||
* packet gets processed by a specific handler. The work in the monitor
|
* packet gets processed by a specific handler. The work in the monitor
|
||||||
* should take as less time as possible (no waiting or intense I/O).
|
* should take as less time as possible (no waiting or intense I/O).
|
||||||
*
|
*
|
||||||
* @param monitor The packet monitor or NULL if the current packet
|
* @param monitor The packet monitor or NULL if the current packet
|
||||||
* monitor should be removed.
|
* monitor should be removed.
|
||||||
*
|
*
|
||||||
* @return true if this layer supports packet monitoring; false otherwise.
|
* @return true if this layer supports packet monitoring; false otherwise.
|
||||||
*/
|
*/
|
||||||
bool cc1100_set_packet_monitor(packet_monitor_t monitor);
|
bool cc1100_set_packet_monitor(packet_monitor_t monitor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set a packet handler for a given protocol.
|
* @brief Set a packet handler for a given protocol.
|
||||||
*
|
*
|
||||||
* @param protocol The protocol identifier (3-bit value > 0, 1 reserved for LL-ACK).
|
* @param protocol The protocol identifier (3-bit value > 0, 1 reserved for LL-ACK).
|
||||||
* @param handler The packet handler called if a packet of given protocol is received.
|
* @param handler The packet handler called if a packet of given protocol is received.
|
||||||
*
|
*
|
||||||
* @return -1 if an error occurs (e.g. handler table full) else >= 0.
|
* @return -1 if an error occurs (e.g. handler table full) else >= 0.
|
||||||
*/
|
*/
|
||||||
int cc1100_set_packet_handler(protocol_t protocol, packet_handler_t handler);
|
int cc1100_set_packet_handler(protocol_t protocol, packet_handler_t handler);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Send data to given destination address with acknowledgment.
|
* @brief Send data to given destination address with acknowledgment.
|
||||||
*
|
*
|
||||||
* The maximum payload length are 58 bytes!
|
* The maximum payload length are 58 bytes!
|
||||||
*
|
*
|
||||||
* @param addr The destination address.
|
* @param addr The destination address.
|
||||||
* @param protocol The protocol identifier of the transmitted data.
|
* @param protocol The protocol identifier of the transmitted data.
|
||||||
* @param priority Ignored (always highest).
|
* @param priority Ignored (always highest).
|
||||||
* @param payload The data to be send.
|
* @param payload The data to be send.
|
||||||
* @param payload_len The length of the data in bytes.
|
* @param payload_len The length of the data in bytes.
|
||||||
*
|
*
|
||||||
* @return A negative value if operation failed; if operation succeeded (ACK received) the number of transmitted bytes.
|
* @return A negative value if operation failed; if operation succeeded (ACK received) the number of transmitted bytes.
|
||||||
*/
|
*/
|
||||||
int cc1100_send(radio_address_t addr, protocol_t protocol, int priority, char *payload, int payload_len);
|
int cc1100_send(radio_address_t addr, protocol_t protocol, int priority, char *payload, int payload_len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Send data to given destination address with acknowledgment and CSMA/CA.
|
* @brief Send data to given destination address with acknowledgment and CSMA/CA.
|
||||||
*
|
*
|
||||||
* The maximum payload length are 58 bytes!
|
* The maximum payload length are 58 bytes!
|
||||||
*
|
*
|
||||||
* @param address The destination address.
|
* @param address The destination address.
|
||||||
* @param protocol The protocol identifier of the transmitted data.
|
* @param protocol The protocol identifier of the transmitted data.
|
||||||
* @param priority The MAC priority to send with. One of {PRIORITY_ALARM, PRIORITY_WARNING, PRIORITY_DATA}.
|
* @param priority The MAC priority to send with. One of {PRIORITY_ALARM, PRIORITY_WARNING, PRIORITY_DATA}.
|
||||||
* @param payload The data to be send.
|
* @param payload The data to be send.
|
||||||
* @param payload_len The length of the data in bytes.
|
* @param payload_len The length of the data in bytes.
|
||||||
*
|
*
|
||||||
* @return A negative value if operation failed; if operation succeeded (ACK received) else the number of transmitted bytes.
|
* @return A negative value if operation failed; if operation succeeded (ACK received) else the number of transmitted bytes.
|
||||||
*/
|
*/
|
||||||
int cc1100_send_csmaca(radio_address_t address, protocol_t protocol, int priority, char *payload, int payload_len);
|
int cc1100_send_csmaca(radio_address_t address, protocol_t protocol, int priority, char *payload, int payload_len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Print current radio configuration.
|
* @brief Print current radio configuration.
|
||||||
*/
|
*/
|
||||||
void cc1100_print_config(void);
|
void cc1100_print_config(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Print radio statistics.
|
* @brief Print radio statistics.
|
||||||
*/
|
*/
|
||||||
void cc1100_print_statistic(void);
|
void cc1100_print_statistic(void);
|
||||||
|
|
||||||
|
|||||||
@ -39,17 +39,17 @@ FCS contain a hardware generated CRC sum with the polynom x^16+x^12+x^5+1
|
|||||||
When receiving a package FCS will be checked by hardware, the first FCS byte will be replaced by RSSI,
|
When receiving a package FCS will be checked by hardware, the first FCS byte will be replaced by RSSI,
|
||||||
followed by a CRC OK bit and the unsigned 7 bit correlation value.
|
followed by a CRC OK bit and the unsigned 7 bit correlation value.
|
||||||
FCF:
|
FCF:
|
||||||
Bit | Meaning
|
Bit | Meaning
|
||||||
--------------------
|
--------------------
|
||||||
0-2 | Frame Type
|
0-2 | Frame Type
|
||||||
3 | Security Enabled
|
3 | Security Enabled
|
||||||
4 | Frame Pending
|
4 | Frame Pending
|
||||||
5 | Acknowledge request
|
5 | Acknowledge request
|
||||||
6 | PAN ID Compression Field
|
6 | PAN ID Compression Field
|
||||||
7-9 | Reserved
|
7-9 | Reserved
|
||||||
10-11 | Destination addressing mode
|
10-11 | Destination addressing mode
|
||||||
12-13 | Reserved
|
12-13 | Reserved
|
||||||
14-15 | Source addressing mode
|
14-15 | Source addressing mode
|
||||||
|
|
||||||
For the cc2420 bit 0 is the most right bit and bit 15 is the most left bit.
|
For the cc2420 bit 0 is the most right bit and bit 15 is the most left bit.
|
||||||
But the 2 FCF bytes have to be transmitted littel endian (byte 15 to 8 first than 7 to 0)
|
But the 2 FCF bytes have to be transmitted littel endian (byte 15 to 8 first than 7 to 0)
|
||||||
@ -97,8 +97,8 @@ Frame type value:
|
|||||||
* Structure to represent a cc2420 packet.
|
* Structure to represent a cc2420 packet.
|
||||||
*/
|
*/
|
||||||
typedef struct __attribute__ ((packed)) {
|
typedef struct __attribute__ ((packed)) {
|
||||||
/* @{ */
|
/* @{ */
|
||||||
uint8_t length; /** < the length of the frame of the frame including fcs*/
|
uint8_t length; /** < the length of the frame of the frame including fcs*/
|
||||||
ieee802154_frame_t frame; /** < the ieee802154 frame */
|
ieee802154_frame_t frame; /** < the ieee802154 frame */
|
||||||
int8_t rssi; /** < the rssi value */
|
int8_t rssi; /** < the rssi value */
|
||||||
uint8_t lqi; /** < the link quality indicator */
|
uint8_t lqi; /** < the link quality indicator */
|
||||||
|
|||||||
@ -13,19 +13,19 @@ and Telematics group (http://cst.mi.fu-berlin.de).
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup sht11 SHT11
|
* @defgroup sht11 SHT11
|
||||||
* @ingroup drivers
|
* @ingroup drivers
|
||||||
* @brief Driver for the Sensirion SHT11 humidity and temperature sensor
|
* @brief Driver for the Sensirion SHT11 humidity and temperature sensor
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* @brief SHT11 Device Driver
|
* @brief SHT11 Device Driver
|
||||||
*
|
*
|
||||||
* @version $Revision: 2396 $
|
* @version $Revision: 2396 $
|
||||||
*
|
*
|
||||||
* @note $Id: sht11.c 2396 2010-07-06 15:12:35Z ziegert $
|
* @note $Id: sht11.c 2396 2010-07-06 15:12:35Z ziegert $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user