00001
00012
00013
00014
00015
00016
00017 #include <Environment.h>
00018 #include <bite.h>
00019 #include <serial.h>
00020 #include <hal_wait.h>
00021 #include <set_hardware.h>
00022 #include <cc2420.h>
00023
00024 #include <reprogrammation.h>
00025
00026
00027
00028
00029
00030
00036
00037
00038 void init ( void )
00039 {
00040 WDTCTL = WDTPW|WDTHOLD;
00041
00042 setup_msp430();
00043 setup_ports();
00044 halSpiInit();
00045
00046 halWait(TIME_CONSTANT);
00047
00048 clock_init();
00049 cc2420_Init();
00050 serial_init();
00051
00052 srand (time (NULL));
00053
00054 halWait(TIME_CONSTANT);
00055
00056 cc2420_change_channel(CHANNEL_EXPLOITATION);
00057
00058 LED_TEST1_ON;
00059
00060 _EINT();
00061 }
00062
00063
00068
00069
00070 void main ( void )
00071 {
00072 static char soft_buffer[SIZE_SOFT_BUFFER];
00073 static UINT8 prev_pckt_id,i,type,load_state=0,time_out=0,nb_try=0;
00074 UINT16 nb_paquet,start_segment,current_valid_indice=0,*ptr,packet_id=0;
00075 static JUST_CRC buf_ack;
00076 static DATA_PACKET buf_pack;
00077 static REQ_PACKET buf_req;
00078
00079 init ();
00080
00081 serial_puts("Bootloader RF\n");
00082
00083 while(1){
00084 serial_puts("REQ VERS\n");
00085
00086 do{
00087 our_id = (UINT16) (rand() / (double)RAND_MAX * MAX_UINT16);
00088 }while(our_id == BROADCAST_ID);
00089
00090 wakeup_cc2420();
00091 if(check_online_code_version()){
00092
00093 load_state = 1;
00094
00095
00096 cc2420_change_channel(CHANNEL_REPROG);
00097
00098 MAC_send((char*)&buf_ack,TYPE_ACK,SEND_UNICAST);
00099
00100 nb_paquet = (((*ptr_info_prog).end_addr - (*ptr_info_prog).start_addr ) / SIZE_DATA_BUFFER)+1;
00101 start_segment = ((FLASH_BASE - (*ptr_info_prog).start_addr) / SEGMENT_SIZE) + 1;
00102
00103
00104 prev_pckt_id = 0;time_out=0;packet_id=0;current_valid_indice=0;
00105
00106 while(packet_id < nb_paquet && time_out < ERROR_THRESHOLD){
00107
00108 if(MAC_recept((char*)&buf_pack, &type , WAIT_ANSWER_CLIENT,DONT_MEMORISE_ADRESS) > 0 && type == TYPE_DATA && buf_pack.id == prev_pckt_id + 1){
00109
00110 packet_id = buf_pack.id;i=0;
00111
00112
00113 while ( current_valid_indice < SIZE_SOFT_BUFFER && i < SIZE_DATA_BUFFER ){
00114 soft_buffer[current_valid_indice] = buf_pack.data[i];
00115 current_valid_indice++;
00116 i++;
00117 }
00118
00119 if ( current_valid_indice == SIZE_SOFT_BUFFER && i == SIZE_DATA_BUFFER){
00120 erase_flash_segment(start_segment);
00121 flash_write(soft_buffer,SIZE_SOFT_BUFFER,start_segment,0);
00122 current_valid_indice=0;
00123 start_segment--;
00124
00125 } else if ( i != SIZE_DATA_BUFFER ){
00126 erase_flash_segment(start_segment);
00127 flash_write(soft_buffer,SIZE_SOFT_BUFFER,start_segment,0);
00128 current_valid_indice=0;
00129 start_segment--;
00130
00131
00132 while ( i < SIZE_DATA_BUFFER ){
00133 soft_buffer[current_valid_indice] = buf_pack.data[i];
00134 current_valid_indice++;
00135 i++;
00136 }
00137 }
00138
00139
00140
00141 if(packet_id == nb_paquet){
00142
00143 erase_flash_segment(start_segment);
00144 flash_write(soft_buffer,current_valid_indice,start_segment,0);
00145
00146 load_state=2;
00147
00148 }
00149
00150
00151 prev_pckt_id++;
00152
00153 }else{
00154 time_out++;
00155 buf_req.id = prev_pckt_id + 1;
00156 halWait(MAX_HAL_WAIT/5);
00157 MAC_send((char*)&buf_req,TYPE_REQ_PCKT,SEND_UNICAST);
00158 }
00159 }
00160 }
00161
00162 cc2420_change_channel(CHANNEL_EXPLOITATION);
00163 cc2420_powerdown();
00164
00165
00166 if( load_state == 0 && nb_try < NB_REPROG_TRY){
00167
00168 nb_try++;
00169
00170
00171
00172 for (i=0; i <= 40 ; i++)
00173 halWait(MAX_HAL_WAIT);
00174
00175 }else if(load_state == 1 ){
00176
00177
00178
00179 erase_info_memory(1);
00180
00181
00182
00183 for (i=0; i <= 40 ; i++)
00184 halWait(MAX_HAL_WAIT);
00185
00186 }else{
00187
00188
00189 _DINT();
00190 erase_interrupt_vector();
00191 ptr = (UINT16*)ptr_info_prog;
00192 for (i=0; i <= 15 ; i++){
00193
00194 if (*ptr != 0xFFFF)
00195 write_interrupt_vector(*ptr , i*2u - 2u);
00196
00197 ptr++;
00198 }
00199 WDTCTL = WDTHOLD;
00200 }
00201
00202 }
00203 }
00204