added state machine
This commit is contained in:
parent
917aa733ff
commit
a94c55d4a6
35
bootloader.c
35
bootloader.c
@ -21,12 +21,22 @@
|
|||||||
|
|
||||||
error_code status;
|
error_code status;
|
||||||
|
|
||||||
|
enum States
|
||||||
|
{
|
||||||
|
S1,
|
||||||
|
S2,
|
||||||
|
S3
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
is_even_assembly:
|
is_even_assembly:
|
||||||
ldr sp, [r0]
|
ldr sp, [r0]
|
||||||
ret
|
ret
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum States state = S1;
|
||||||
|
|
||||||
char* argvs[3][10];
|
char* argvs[3][10];
|
||||||
|
|
||||||
cmd_t cmd;
|
cmd_t cmd;
|
||||||
@ -92,36 +102,49 @@ void manage_bootloader(){
|
|||||||
while(1){
|
while(1){
|
||||||
uart_receive_command(buff);
|
uart_receive_command(buff);
|
||||||
uart_parse_command(buff, &cmd);
|
uart_parse_command(buff, &cmd);
|
||||||
if (strncmp("GETID", cmd.argv[0], 5)==0){
|
if ((state == S1) && (strncmp("GETID", cmd.argv[0], 5)==0)){
|
||||||
uart_commands_getid(&status);
|
uart_commands_getid(&status);
|
||||||
|
|
||||||
}else if(strncmp("GETSE", cmd.argv[0], 5)==0){
|
}else if((state == S1) && (strncmp("GETSE", cmd.argv[0], 5)==0)){
|
||||||
uart_commands_getserial(&status);
|
uart_commands_getserial(&status);
|
||||||
|
|
||||||
}else if(strncmp("PROG", cmd.argv[0], 4)==0){
|
}else if((state == S1) && (strncmp("PROG", cmd.argv[0], 4)==0)){
|
||||||
crc_prog = uart_string_to_int(cmd.argv[3]);
|
crc_prog = uart_string_to_int(cmd.argv[3]);
|
||||||
total_size = uart_string_to_int(cmd.argv[2]);
|
total_size = uart_string_to_int(cmd.argv[2]);
|
||||||
offset = uart_string_to_int(cmd.argv[1]);
|
offset = uart_string_to_int(cmd.argv[1]);
|
||||||
write_app_info(&crc_prog, (unsigned int *)&total_size);
|
write_app_info(&crc_prog, (unsigned int *)&total_size);
|
||||||
crc_data = uart_commands_prog(&status, total_size);
|
crc_data = uart_commands_prog(&status, total_size);
|
||||||
|
if(status == ok){
|
||||||
|
state = S2;
|
||||||
|
}
|
||||||
offset_pointer = offset;
|
offset_pointer = offset;
|
||||||
|
|
||||||
}else if(strcmp("DATA", cmd.argv[0])==0){
|
}else if(((state == S2) || (state = S3)) && (strcmp("DATA", cmd.argv[0])==0)){
|
||||||
int size = uart_string_to_int(cmd.argv[1]);
|
int size = uart_string_to_int(cmd.argv[1]);
|
||||||
crc_t local_checksum = uart_string_to_int(cmd.argv[2]);
|
crc_t local_checksum = uart_string_to_int(cmd.argv[2]);
|
||||||
uart_commands_data(&status, size, &crc_data, local_checksum, offset_pointer);
|
uart_commands_data(&status, size, &crc_data, local_checksum, offset_pointer);
|
||||||
if(status == 0) offset_pointer += size;
|
if(status == ok){
|
||||||
|
offset_pointer += size;
|
||||||
|
state = S3;
|
||||||
|
}else{
|
||||||
|
state = S2;
|
||||||
|
}
|
||||||
|
|
||||||
}else if(strncmp("CHECK", cmd.argv[0], 5)==0){
|
}else if((state == S3) && (strncmp("CHECK", cmd.argv[0], 5)==0)){
|
||||||
error_code is_error = uart_commands_check(crc_prog, crc_data);
|
error_code is_error = uart_commands_check(crc_prog, crc_data);
|
||||||
if(is_error == ok){
|
if(is_error == ok){
|
||||||
|
state = S1;
|
||||||
uart_send_ok();
|
uart_send_ok();
|
||||||
uart_send("bla\r\n", 5);//putting bla here so OK will show up
|
uart_send("bla\r\n", 5);//putting bla here so OK will show up
|
||||||
//removing bla for the moment will make ok not show up
|
//removing bla for the moment will make ok not show up
|
||||||
launch_program();
|
launch_program();
|
||||||
}else{
|
}else{
|
||||||
|
state = S2;
|
||||||
uart_send_err();
|
uart_send_err();
|
||||||
|
//flash LED red
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
uart_send_cmd_illeg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ static uint8_t data[1024];
|
|||||||
|
|
||||||
char OK[5] = "OK\r\n";
|
char OK[5] = "OK\r\n";
|
||||||
char ERR[6] = "ERR\r\n";
|
char ERR[6] = "ERR\r\n";
|
||||||
|
char CMD_ILLEGAL[13] = "CMD_ILLEGAL\r\n";
|
||||||
|
|
||||||
void digit_to_str(char* str, uint32_t number, int base){
|
void digit_to_str(char* str, uint32_t number, int base){
|
||||||
itoa(number,str,16);
|
itoa(number,str,16);
|
||||||
@ -245,3 +246,7 @@ void uart_send_ok(){
|
|||||||
void uart_send_err(){
|
void uart_send_err(){
|
||||||
uart_send(ERR, 6);
|
uart_send(ERR, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uart_send_cmd_illeg(){
|
||||||
|
uart_send(CMD_ILLEGAL, 13);
|
||||||
|
}
|
||||||
|
@ -37,6 +37,8 @@ void uart_send_ok();
|
|||||||
|
|
||||||
void uart_send_err();
|
void uart_send_err();
|
||||||
|
|
||||||
|
void uart_send_cmd_illeg();
|
||||||
|
|
||||||
|
|
||||||
void digit_to_str(char* str, uint32_t number, int base);
|
void digit_to_str(char* str, uint32_t number, int base);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user