diff --git a/board/msba2/board_init.c b/board/msba2/board_init.c index 4996b07785..aea2c5093d 100644 --- a/board/msba2/board_init.c +++ b/board/msba2/board_init.c @@ -167,7 +167,6 @@ void bl_config_init(void) { extern char configmem[]; if (*((uint16_t*) configmem) == CONFIG_KEY) { memcpy(&sysconfig, (configmem + sizeof(CONFIG_KEY)), sizeof(sysconfig)); - LED_GREEN_TOGGLE; } else { config_save(); diff --git a/cpu/arm_common/iap.c b/cpu/arm_common/iap.c index 8b6428a856..5802b28762 100644 --- a/cpu/arm_common/iap.c +++ b/cpu/arm_common/iap.c @@ -1,277 +1,277 @@ -/* iap driver - * - * based on iap driver for LPC2148 Controller made by Andreas Weschenfelder, 2008 - * see: - * - */ - -#include -#include -#include - -#define ENABLE_DEBUG -#include - -/* pointer to reserved flash rom section for configuration data */ -__attribute ((aligned(256))) char configmem[256] __attribute__ ((section (".configmem"))); - -static unsigned int iap_command[5]; // contains parameters for IAP command -static unsigned int iap_result[2]; // contains results -typedef void (*IAP) (unsigned int[],unsigned int[]); // typedefinition for IAP entry function -IAP IAP_Entry; - -/* some function prototypes */ -static uint32_t blank_check_sector(uint32_t tmp_sect1, uint32_t tmp_sect2); -static uint32_t prepare_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2); -static uint32_t erase_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2); -static uint32_t copy_ram_to_flash(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size); -static uint32_t compare(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size); -static uint32_t iap(uint32_t code, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4); - -/****************************************************************************** - * P U B L I C F U N C T I O N S - *****************************************************************************/ -uint8_t flashrom_write(uint32_t dst, char *src, uint32_t size) { - char err; - unsigned intstate; - uint8_t sec; - - //buffer_vic = VICIntEnable; // save interrupt enable - //VICIntEnClr = 0xFFFFFFFF; // clear vic - - sec = flashrom_get_sector(dst); - if (sec == INVALID_ADDRESS) { - DEBUG("Invalid address\n"); - return 0; - } - - /* check sector */ - if(blank_check_sector(sec, sec) == SECTOR_NOT_BLANK) { - DEBUG("Warning: Sector %i not blank\n", sec); - } - - /* prepare sector */ - err = prepare_sectors(sec, sec); - if (err) { - DEBUG("\n-- ERROR: PREPARE_SECTOR_FOR_WRITE_OPERATION: %u\n", err); - /* set interrupts back and return */ -// VICIntEnable = buffer_vic; - return 0; - } - /* write flash */ - else { - intstate = disableIRQ(); - err = copy_ram_to_flash(dst, (uint32_t) src, 256); - restoreIRQ(intstate); - if(err) { - DEBUG("ERROR: COPY_RAM_TO_FLASH: %u\n", err); - /* set interrupts back and return */ - restoreIRQ(intstate); -// VICIntEnable = buffer_vic; - return 0; - } - /* check result */ - else { - err = compare(dst, (uint32_t) src, 256); - if (err) { - DEBUG("ERROR: COMPARE: %i (at position %u)\n", err, iap_result[1]); - /* set interrupts back and return */ -// VICIntEnable = buffer_vic; - return 0; - } - else - { - DEBUG("Data successfully written!\n"); - /* set interrupts back and return */ -// VICIntEnable = buffer_vic; - return 1; - } - } - } -} - - -uint8_t flashrom_erase(uint32_t addr) { - uint8_t sec = flashrom_get_sector(addr); - unsigned intstate; - - if (sec == INVALID_ADDRESS) { - DEBUG("Invalid address\n"); - return 0; - } - - /* check sector */ - if (!blank_check_sector(sec, sec)) { - DEBUG("Sector already blank!\n"); - return 1; - } - /* prepare sector */ - if (prepare_sectors(sec, sec)) { - DEBUG("-- ERROR: PREPARE_SECTOR_FOR_WRITE_OPERATION --\n"); - return 0; - } - intstate = disableIRQ(); - /* erase sector */ - if (erase_sectors(sec, sec)) { - DEBUG("-- ERROR: ERASE SECTOR --\n"); - restoreIRQ(intstate); - return 0; - } - restoreIRQ(intstate); - /* check again */ - if (blank_check_sector(sec, sec)) { - DEBUG("-- ERROR: BLANK_CHECK_SECTOR\n"); - return 0; - } - DEBUG("Sector successfully erased.\n"); - return 1; -} - - -/****************************************************************************** - * PRIVATE FUNCTIONS - *****************************************************************************/ - -static uint32_t iap(uint32_t code, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { - iap_command[0] = code; // set command code - iap_command[1] = p1; // set 1st param - iap_command[2] = p2; // set 2nd param - iap_command[3] = p3; // set 3rd param - iap_command[4] = p4; // set 4th param - - ((void (*)())0x7ffffff1)(iap_command, iap_result); // IAP entry point - return *iap_result; -} - -/****************************************************************************** - * Function: blank_check_sector - * - * Description: This command is used to blank check a sector or multiple sectors - * of on-chip Flash memory. To blank check a single sector use the - * same "Start" and "End" sector numbers. - * Command: 53 - * Param0: Start Sector Number - * Param1: End Sector Number (should be greater than equal to the start - * sector number) - * - * Parameters: long tmp_sect1: Param0 - * long tmp_sect2: Param1 - * - * Return: Code CMD_SUCCESS | - * BUSY | - * SECTOR_NOT_BLANK | - * INVALID_SECTOR - * Result0: Offset of the first non blank word location if the status code is SECTOR_NOT_BLANK. - * Result1: Contents of non blank wird location. - *****************************************************************************/ -uint32_t blank_check_sector(uint32_t tmp_sect1, uint32_t tmp_sect2) { - return iap(BLANK_CHECK_SECTOR, tmp_sect1, tmp_sect2, 0 , 0); -} - - -/****************************************************************************** - * Function: copy_ram_to_flash - * - * Description: This command is used to programm the flash memory. the affected should be - * prepared first by calling "Prepare Sector for Write Operation" command. the - * affected sectors are automatically protected again once the copy command is - * successfully executed. the boot sector cannot be written by this command. - * Command: 51 - * Param0: (DST) Destination Flash adress where data bytes are to be written. - * This address should be a 512 byte boundary. - * Param1: (SRC) Source RAM adress from which data byre are to be read. - * Param2: Number of bytes to be written. Should be 512 | 1024 | 4096 | 8192. - * Param3: System Clock Frequency (CCLK) in KHz. - * - * Parameters: long tmp_adr_dst: Param0 - * long tmp_adr_src: Param1 - * long tmp_size: Param2 - * - * Return: Code CMD_SUCCESS | - * SRC_ADDR_ERROR (Address not on word boundary) | - * DST_ADDR_ERROR (Address not on correct boundary) | - * SRC_ADDR_NOT_MAPPED | - * DST_ADDR_NOT_MAPPED | - * COUNT_ERROR (Byte count is not 512 | 1024 | 4096 | 8192) | - * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION | - * BUSY - *****************************************************************************/ -uint32_t copy_ram_to_flash(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size) { - return iap(COPY_RAM_TO_FLASH, tmp_adr_dst, tmp_adr_src, tmp_size, _XTAL); -} - - -/****************************************************************************** - * Function: Prepare_Sector - * - * Description: This command must be executed before executing "Copy RAM to Flash" or "Erase Sector(s)" - * command. Successful execution of the "Copy RAM to Flash" or "Erase Sector(s)" command causes - * relevant sectors to be protected again. The boot sector can not be prepared by this command. To - * prepare a single sector use the same "Start" and "End" sector numbers.. - * Command code: 50 - * Param0: Start Sector Number - * Param1: End Sector Number: Should be greater than or equal to start sector number. - * - * Parameters: long tmp_sect1: Param0 - * long tmp_sect2: Param1 - * - * Return: Code CMD_SUCCESS | - * BUSY | - * INVALID_SECTOR - *****************************************************************************/ -uint32_t prepare_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2) { - return iap(PREPARE_SECTOR_FOR_WRITE_OPERATION, tmp_sect1, tmp_sect2, 0 , 0); -} - - -/****************************************************************************** - * Function: erase_sectors - * - * Description: This command is used to erase a sector or multiple sectors of on-chip Flash memory. The boot - * sector can not be erased by this command. To erase a single sector use the same "Start" and "End" - * sector numbers. - * Command code: 52 - * Param0: Start Sector Number - * Param1: End Sector Number: Should be greater than or equal to start sector number. - * Param2: System Clock Frequency (CCLK) in KHz. - * - * Parameters: long tmp_sect1: Param0 - * long tmp_sect2: Param1 - * - * Return: Code CMD_SUCCESS | - * BUSY | - * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION | - * INVALID_SECTOR - *****************************************************************************/ -uint32_t erase_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2) { - return iap(ERASE_SECTOR, tmp_sect1, tmp_sect2, _XTAL, 0); -} - - -/****************************************************************************** - * Function: compare - * - * Description: This command is used to compare the memory contents at two locations. compare result may not - * be correct when source or destination address contains any of the first 64 bytes starting - * from address zero. First 64 bytes can be re-mapped to RAM. - * Command Code: 56 - * Param0(DST): Starting Flash or RAM address from where data bytes are to be - * address should be a word boundary. - * Param1(SRC): Starting Flash or RAM address from where data bytes are to be - * address should be a word boundary. - * Param2: Number of bytes to be compared. Count should be in multiple of 4. - * - * Parameters: long tmp_adr_dst - * long tmp_adr_src - * long tmp_size - * - * Return: Code CMD_SUCCESS | - * COMPARE_ERROR | - * COUNT_ERROR (Byte count is not multiple of 4) | - * ADDR_ERROR | - * ADDR_NOT_MAPPED - * Result0: Offset of the first mismatch if the Status Code is COMPARE_ERROR. - *****************************************************************************/ -uint32_t compare(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size) { - return iap(COMPARE, tmp_adr_dst, tmp_adr_src, tmp_size, 0); -} +/* iap driver + * + * based on iap driver for LPC2148 Controller made by Andreas Weschenfelder, 2008 + * see: + * + */ + +#include +#include +#include + +//#define ENABLE_DEBUG +#include + +/* pointer to reserved flash rom section for configuration data */ +__attribute ((aligned(256))) char configmem[256] __attribute__ ((section (".configmem"))); + +static unsigned int iap_command[5]; // contains parameters for IAP command +static unsigned int iap_result[2]; // contains results +typedef void (*IAP) (unsigned int[],unsigned int[]); // typedefinition for IAP entry function +IAP IAP_Entry; + +/* some function prototypes */ +static uint32_t blank_check_sector(uint32_t tmp_sect1, uint32_t tmp_sect2); +static uint32_t prepare_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2); +static uint32_t erase_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2); +static uint32_t copy_ram_to_flash(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size); +static uint32_t compare(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size); +static uint32_t iap(uint32_t code, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4); + +/****************************************************************************** + * P U B L I C F U N C T I O N S + *****************************************************************************/ +uint8_t flashrom_write(uint32_t dst, char *src, uint32_t size) { + char err; + unsigned intstate; + uint8_t sec; + + //buffer_vic = VICIntEnable; // save interrupt enable + //VICIntEnClr = 0xFFFFFFFF; // clear vic + + sec = flashrom_get_sector(dst); + if (sec == INVALID_ADDRESS) { + DEBUG("Invalid address\n"); + return 0; + } + + /* check sector */ + if(blank_check_sector(sec, sec) == SECTOR_NOT_BLANK) { + DEBUG("Warning: Sector %i not blank\n", sec); + } + + /* prepare sector */ + err = prepare_sectors(sec, sec); + if (err) { + DEBUG("\n-- ERROR: PREPARE_SECTOR_FOR_WRITE_OPERATION: %u\n", err); + /* set interrupts back and return */ +// VICIntEnable = buffer_vic; + return 0; + } + /* write flash */ + else { + intstate = disableIRQ(); + err = copy_ram_to_flash(dst, (uint32_t) src, 256); + restoreIRQ(intstate); + if(err) { + DEBUG("ERROR: COPY_RAM_TO_FLASH: %u\n", err); + /* set interrupts back and return */ + restoreIRQ(intstate); +// VICIntEnable = buffer_vic; + return 0; + } + /* check result */ + else { + err = compare(dst, (uint32_t) src, 256); + if (err) { + DEBUG("ERROR: COMPARE: %i (at position %u)\n", err, iap_result[1]); + /* set interrupts back and return */ +// VICIntEnable = buffer_vic; + return 0; + } + else + { + DEBUG("Data successfully written!\n"); + /* set interrupts back and return */ +// VICIntEnable = buffer_vic; + return 1; + } + } + } +} + + +uint8_t flashrom_erase(uint32_t addr) { + uint8_t sec = flashrom_get_sector(addr); + unsigned intstate; + + if (sec == INVALID_ADDRESS) { + DEBUG("Invalid address\n"); + return 0; + } + + /* check sector */ + if (!blank_check_sector(sec, sec)) { + DEBUG("Sector already blank!\n"); + return 1; + } + /* prepare sector */ + if (prepare_sectors(sec, sec)) { + DEBUG("-- ERROR: PREPARE_SECTOR_FOR_WRITE_OPERATION --\n"); + return 0; + } + intstate = disableIRQ(); + /* erase sector */ + if (erase_sectors(sec, sec)) { + DEBUG("-- ERROR: ERASE SECTOR --\n"); + restoreIRQ(intstate); + return 0; + } + restoreIRQ(intstate); + /* check again */ + if (blank_check_sector(sec, sec)) { + DEBUG("-- ERROR: BLANK_CHECK_SECTOR\n"); + return 0; + } + DEBUG("Sector successfully erased.\n"); + return 1; +} + + +/****************************************************************************** + * PRIVATE FUNCTIONS + *****************************************************************************/ + +static uint32_t iap(uint32_t code, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) { + iap_command[0] = code; // set command code + iap_command[1] = p1; // set 1st param + iap_command[2] = p2; // set 2nd param + iap_command[3] = p3; // set 3rd param + iap_command[4] = p4; // set 4th param + + ((void (*)())0x7ffffff1)(iap_command, iap_result); // IAP entry point + return *iap_result; +} + +/****************************************************************************** + * Function: blank_check_sector + * + * Description: This command is used to blank check a sector or multiple sectors + * of on-chip Flash memory. To blank check a single sector use the + * same "Start" and "End" sector numbers. + * Command: 53 + * Param0: Start Sector Number + * Param1: End Sector Number (should be greater than equal to the start + * sector number) + * + * Parameters: long tmp_sect1: Param0 + * long tmp_sect2: Param1 + * + * Return: Code CMD_SUCCESS | + * BUSY | + * SECTOR_NOT_BLANK | + * INVALID_SECTOR + * Result0: Offset of the first non blank word location if the status code is SECTOR_NOT_BLANK. + * Result1: Contents of non blank wird location. + *****************************************************************************/ +uint32_t blank_check_sector(uint32_t tmp_sect1, uint32_t tmp_sect2) { + return iap(BLANK_CHECK_SECTOR, tmp_sect1, tmp_sect2, 0 , 0); +} + + +/****************************************************************************** + * Function: copy_ram_to_flash + * + * Description: This command is used to programm the flash memory. the affected should be + * prepared first by calling "Prepare Sector for Write Operation" command. the + * affected sectors are automatically protected again once the copy command is + * successfully executed. the boot sector cannot be written by this command. + * Command: 51 + * Param0: (DST) Destination Flash adress where data bytes are to be written. + * This address should be a 512 byte boundary. + * Param1: (SRC) Source RAM adress from which data byre are to be read. + * Param2: Number of bytes to be written. Should be 512 | 1024 | 4096 | 8192. + * Param3: System Clock Frequency (CCLK) in KHz. + * + * Parameters: long tmp_adr_dst: Param0 + * long tmp_adr_src: Param1 + * long tmp_size: Param2 + * + * Return: Code CMD_SUCCESS | + * SRC_ADDR_ERROR (Address not on word boundary) | + * DST_ADDR_ERROR (Address not on correct boundary) | + * SRC_ADDR_NOT_MAPPED | + * DST_ADDR_NOT_MAPPED | + * COUNT_ERROR (Byte count is not 512 | 1024 | 4096 | 8192) | + * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION | + * BUSY + *****************************************************************************/ +uint32_t copy_ram_to_flash(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size) { + return iap(COPY_RAM_TO_FLASH, tmp_adr_dst, tmp_adr_src, tmp_size, _XTAL); +} + + +/****************************************************************************** + * Function: Prepare_Sector + * + * Description: This command must be executed before executing "Copy RAM to Flash" or "Erase Sector(s)" + * command. Successful execution of the "Copy RAM to Flash" or "Erase Sector(s)" command causes + * relevant sectors to be protected again. The boot sector can not be prepared by this command. To + * prepare a single sector use the same "Start" and "End" sector numbers.. + * Command code: 50 + * Param0: Start Sector Number + * Param1: End Sector Number: Should be greater than or equal to start sector number. + * + * Parameters: long tmp_sect1: Param0 + * long tmp_sect2: Param1 + * + * Return: Code CMD_SUCCESS | + * BUSY | + * INVALID_SECTOR + *****************************************************************************/ +uint32_t prepare_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2) { + return iap(PREPARE_SECTOR_FOR_WRITE_OPERATION, tmp_sect1, tmp_sect2, 0 , 0); +} + + +/****************************************************************************** + * Function: erase_sectors + * + * Description: This command is used to erase a sector or multiple sectors of on-chip Flash memory. The boot + * sector can not be erased by this command. To erase a single sector use the same "Start" and "End" + * sector numbers. + * Command code: 52 + * Param0: Start Sector Number + * Param1: End Sector Number: Should be greater than or equal to start sector number. + * Param2: System Clock Frequency (CCLK) in KHz. + * + * Parameters: long tmp_sect1: Param0 + * long tmp_sect2: Param1 + * + * Return: Code CMD_SUCCESS | + * BUSY | + * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION | + * INVALID_SECTOR + *****************************************************************************/ +uint32_t erase_sectors(uint32_t tmp_sect1, uint32_t tmp_sect2) { + return iap(ERASE_SECTOR, tmp_sect1, tmp_sect2, _XTAL, 0); +} + + +/****************************************************************************** + * Function: compare + * + * Description: This command is used to compare the memory contents at two locations. compare result may not + * be correct when source or destination address contains any of the first 64 bytes starting + * from address zero. First 64 bytes can be re-mapped to RAM. + * Command Code: 56 + * Param0(DST): Starting Flash or RAM address from where data bytes are to be + * address should be a word boundary. + * Param1(SRC): Starting Flash or RAM address from where data bytes are to be + * address should be a word boundary. + * Param2: Number of bytes to be compared. Count should be in multiple of 4. + * + * Parameters: long tmp_adr_dst + * long tmp_adr_src + * long tmp_size + * + * Return: Code CMD_SUCCESS | + * COMPARE_ERROR | + * COUNT_ERROR (Byte count is not multiple of 4) | + * ADDR_ERROR | + * ADDR_NOT_MAPPED + * Result0: Offset of the first mismatch if the Status Code is COMPARE_ERROR. + *****************************************************************************/ +uint32_t compare(uint32_t tmp_adr_dst, uint32_t tmp_adr_src, uint32_t tmp_size) { + return iap(COMPARE, tmp_adr_dst, tmp_adr_src, tmp_size, 0); +} diff --git a/drivers/cc110x_ng/cc1100-config.h b/drivers/cc110x_ng/cc1100-config.h index e7e039d882..2069375a19 100644 --- a/drivers/cc110x_ng/cc1100-config.h +++ b/drivers/cc110x_ng/cc1100-config.h @@ -1,6 +1,8 @@ #ifndef CC1100_CONFIG_H #define CC1100_CONFIG_H +#include + /** CC1100 register configuration */ typedef struct { uint8_t IOCFG2; @@ -56,6 +58,7 @@ typedef struct { typedef struct { uint32_t TOF; ///< Time of flight of the last packet and last ACK + timex_t TOA; ///< Time of packet arriveal uint32_t TCP; ///< Time to compute packet unsigned RPS : 16; ///< Raw packets sent to transmit last packet unsigned RTC : 8; ///< Retransmission count of last send packet @@ -82,10 +85,8 @@ typedef struct cc1100_statistic { uint32_t packets_in_dups; uint32_t packets_in_up; uint32_t packets_out; - uint32_t packets_out_acked; uint32_t packets_out_broadcast; uint32_t raw_packets_out; - uint32_t raw_packets_out_acked; uint32_t acks_send; uint32_t rx_buffer_max; uint32_t watch_dog_resets; diff --git a/drivers/cc110x_ng/cc1100-tx.c b/drivers/cc110x_ng/cc1100-tx.c index d8a79b37cb..47ce43a6ac 100644 --- a/drivers/cc110x_ng/cc1100-tx.c +++ b/drivers/cc110x_ng/cc1100-tx.c @@ -60,6 +60,7 @@ uint8_t cc1100_send(cc1100_packet_t *packet) { restoreIRQ(cpsr); // Wait for GDO2 to be cleared -> end of packet while (cc1100_get_gdo2() != 0); + LED_GREEN_TOGGLE; // Experimental - TOF Measurement cc1100_after_send(); diff --git a/drivers/cc110x_ng/cc1100.c b/drivers/cc110x_ng/cc1100.c index 1fd378c9dc..8fc5d176a0 100644 --- a/drivers/cc110x_ng/cc1100.c +++ b/drivers/cc110x_ng/cc1100.c @@ -202,14 +202,14 @@ char* cc1100_state_to_text(uint8_t state) { } } - void cc1100_print_config(void) { printf("Current radio state: %s\r\n", cc1100_state_to_text(radio_state)); printf("Current MARC state: %s\r\n", cc1100_get_marc_state()); printf("Current channel number: %u\r\n", sysconfig.radio_channel); } -void switch_to_pwd(void) { +void cc1100_switch_to_pwd(void) { + DEBUG("[cc110x_ng] switching to powerdown\n"); cc1100_wakeup_from_rx(); cc1100_spi_strobe(CC1100_SPWD); radio_state = RADIO_PWD; diff --git a/projects/laser/Jamfile b/projects/laser/Jamfile index 562d4305a7..9a9c559502 100644 --- a/projects/laser/Jamfile +++ b/projects/laser/Jamfile @@ -1,5 +1,5 @@ SubDir TOP projects laser ; -Module laser : main.c : sht11 swtimer auto_init ; +Module laser : main.c : sht11 ltc4150 swtimer auto_init ; UseModule laser ; diff --git a/projects/test_cc110x_ng/main.c b/projects/test_cc110x_ng/main.c index dda0a7a3d3..baf042dfd1 100644 --- a/projects/test_cc110x_ng/main.c +++ b/projects/test_cc110x_ng/main.c @@ -18,7 +18,7 @@ #define SND_BUFFER_SIZE (100) #define RCV_BUFFER_SIZE (64) -#define SENDING_DELAY (1000) +#define SENDING_DELAY (5 * 1000) char shell_stack_buffer[SHELL_STACK_SIZE]; char radio_stack_buffer[RADIO_STACK_SIZE]; @@ -31,12 +31,20 @@ static msg mesg; static transceiver_command_t tcmd; static radio_packet_t p; +static uint32_t sending_delay = SENDING_DELAY; + void sender(char *count); void print_buffer(char *unused); +void switch2rx(char *unused); +void powerdown(char *unused); +void set_delay(char *delay); shell_t shell; const shell_command_t sc[] = { + {"on", "", switch2rx}, + {"off", "", powerdown}, {"snd", "", sender}, + {"delay", "", set_delay}, {"buffer", "", print_buffer}, {NULL, NULL, NULL}}; @@ -63,7 +71,7 @@ void sender(char *count) { puts("."); p.data = snd_buffer[i % SND_BUFFER_SIZE]; msg_send(&mesg, transceiver_pid, 1); - swtimer_usleep(SENDING_DELAY); + swtimer_usleep(sending_delay); } } @@ -79,6 +87,39 @@ void print_buffer(char *unused) { } } +void switch2rx(char *unused) { + mesg.type = SWITCH_RX; + mesg.content.ptr = (char*) &tcmd; + + tcmd.transceivers = TRANSCEIVER_CC1100; + puts("Turning transceiver on"); + if (msg_send(&mesg, transceiver_pid, 1)) { + puts("\tsuccess"); + } +} + +void powerdown(char *unused) { + mesg.type = POWERDOWN; + mesg.content.ptr = (char*) &tcmd; + + tcmd.transceivers = TRANSCEIVER_CC1100; + puts("Turning transceiver off"); + if (msg_send(&mesg, transceiver_pid, 1)) { + puts("\tsuccess"); + } +} + +void set_delay(char *delay) { + uint32_t d; + + if (sscanf(delay, "delay %lu", &d) == 1) { + sending_delay = d; + } + else { + puts("Usage:\tdelay <µs>"); + } +} + void radio(void) { msg m; radio_packet_t *p; diff --git a/sys/include/radio/types.h b/sys/include/radio/types.h index f5b88c9c0e..c84a12e097 100644 --- a/sys/include/radio/types.h +++ b/sys/include/radio/types.h @@ -40,6 +40,7 @@ and the mailinglist (subscription via web site) #include #include +#include typedef uint8_t protocol_t; ///< Packet protocol type typedef uint16_t radio_address_t; ///< Radio layer address type @@ -83,6 +84,7 @@ typedef struct __attribute__ ((packed)) { uint16_t dst; ///< Radio destination address uint8_t rssi; ///< Radio Signal Strength Indication uint8_t lqi; ///< Link Quality Indicator + timex_t toa; ///< Time of Arrival uint8_t length; ///< Length of payload uint8_t *data; ///< Payload } radio_packet_t; diff --git a/sys/shell/cc1100_ng.c b/sys/shell/cc1100_ng.c index 3ae631520c..3fe0d1f49d 100644 --- a/sys/shell/cc1100_ng.c +++ b/sys/shell/cc1100_ng.c @@ -82,5 +82,3 @@ void _cc1100_ng_monitor_handler(char *mode) { puts("Usage:\nmonitor "); } } - - diff --git a/sys/transceiver.c b/sys/transceiver.c index d3828d1861..d0d5920e5f 100644 --- a/sys/transceiver.c +++ b/sys/transceiver.c @@ -19,7 +19,7 @@ #endif #endif -#define ENABLE_DEBUG (1) +//#define ENABLE_DEBUG (1) #include /*------------------------------------------------------------------------------------*/ @@ -57,6 +57,8 @@ static int16_t set_channel(transceiver_type_t t, void *channel); static int16_t get_address(transceiver_type_t t); static int16_t set_address(transceiver_type_t t, void *address); static void set_monitor(transceiver_type_t t, void *mode); +static void powerdown(transceiver_type_t t); +static void switch_to_rx(transceiver_type_t t); /*------------------------------------------------------------------------------------*/ /* Transceiver init */ @@ -122,6 +124,7 @@ void run(void) { msg_receive(&m); /* only makes sense for messages for upper layers */ cmd = (transceiver_command_t*) m.content.ptr; + DEBUG("Transceiver: Message received\n"); switch (m.type) { case RCV_PKT_CC1020: @@ -152,6 +155,12 @@ void run(void) { case SET_MONITOR: set_monitor(cmd->transceivers, cmd->data); break; + case POWERDOWN: + powerdown(cmd->transceivers); + break; + case SWITCH_RX: + switch_to_rx(cmd->transceivers); + break; default: DEBUG("Unknown message received\n"); break; @@ -219,7 +228,7 @@ static void receive_packet(uint16_t type, uint8_t pos) { if (reg[i].transceivers & t) { m.content.ptr = (char*) &(transceiver_buffer[transceiver_buffer_pos]); DEBUG("Notify thread %i\n", reg[i].pid); - if (msg_send(&m, reg[i].pid, false)) { + if (msg_send(&m, reg[i].pid, false) && (m.type != ENOBUFFER)) { transceiver_buffer[transceiver_buffer_pos].processing++; } } @@ -364,3 +373,24 @@ static void set_monitor(transceiver_type_t t, void *mode) { break; } } +/*------------------------------------------------------------------------------------*/ +static void powerdown(transceiver_type_t t) { + switch (t) { + case TRANSCEIVER_CC1100: + cc1100_switch_to_pwd(); + break; + default: + break; + } +} + +/*------------------------------------------------------------------------------------*/ +static void switch_to_rx(transceiver_type_t t) { + switch (t) { + case TRANSCEIVER_CC1100: + cc1100_switch_to_rx(); + break; + default: + break; + } +}