X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/a2907f2e2b2725679d6b3b8d3231f3d94c325014..3d8c1907ca892b69c101e168c14b5161e25d4471:/avr/cmd_boot.c diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index b00d062..a83968f 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -11,7 +11,6 @@ * Misc boot support */ #include "common.h" -#include #include #include @@ -19,6 +18,7 @@ #include "cli_readline.h" /* console_buffer[] */ #include "cli.h" /* run_command() */ #include "env.h" +#include "eval_arg.h" #include "con-utils.h" #include "getopt-min.h" #include "z80-if.h" @@ -121,11 +121,11 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ uint8_t sec_cnt; uint8_t part_id; uint16_t timeout; - uint8_t stop_stage; + uint8_t stages; } boot_param; struct { - uint8_t stop_stage; + uint8_t stages; uint8_t done; uint8_t result; uint8_t ide_stat; @@ -133,14 +133,14 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ } boot_res; int_fast8_t verbosity = 0; - uint8_t stages; + uint8_t default_stages; uint32_t val; (void) cmdtp; (void) flag; /* get default values */ memcpy_P(&boot_param, cfboot, sizeof boot_param); - stages = boot_param.stop_stage; + default_stages = boot_param.stages; /* reset getopt() */ optind = 0; @@ -152,11 +152,11 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ verbosity++; break; case 'n': - if (boot_param.stop_stage > 0) - boot_param.stop_stage--; + if (boot_param.stages > 0) + boot_param.stages--; break; case 'a': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val < 0x100 || val > 0xFE00) { printf_P(PSTR("Address out of range: 0x%.4lX\n"), val); return CMD_RET_FAILURE; @@ -164,7 +164,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.loadaddr = val; break; case 's': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val > 255) { printf_P(PSTR("Start sector out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -172,7 +172,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.sec_start = val; break; case 'c': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val > 127) { printf_P(PSTR("Sector count out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -180,15 +180,15 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.sec_cnt = val; break; case 't': - val = strtoul(optarg, NULL, 10); + val = eval_arg(optarg, NULL); if (val < 0x1 || val > 0xFFFF) { printf_P(PSTR("Timeout value out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; } - boot_param.loadaddr = val; + boot_param.timeout = val; break; case 'i': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val < 0x01 || val > 0xFF) { printf_P(PSTR("Partition id out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -231,11 +231,11 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ cfboot_address[0], sizeof boot_param); z80_bus_cmd(Release); - if (boot_param.stop_stage == 0) { + if (boot_param.stages == 0) { printf_P(PSTR("Bootloader loaded at: 0x%.4X\n"), (uint16_t) cfboot_address[0]); } else { printf_P(PSTR("Executing %d of %d Bootloader stages...\n"), - boot_param.stop_stage, stages); + boot_param.stages, default_stages); z80_bus_cmd(Run); z80_bus_cmd(Release); @@ -257,12 +257,15 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ z80_bus_cmd(Reset); my_puts_P(PSTR("Abort\n")); } else { - if (boot_param.stop_stage == stages) { + if (boot_param.stages == default_stages && + boot_res.stages == 0 && + boot_res.result == 0) { my_puts_P(PSTR("Booting...\n")); } else { z80_bus_cmd(Reset); + boot_res.stages++; printf_P(PSTR("Bootloader stopped at stage %d, result: %d, IDE stat/error: 0x%.02x/0x%.02x\n"), - boot_param.stop_stage - boot_res.stop_stage, + boot_param.stages - boot_res.stages, boot_res.result, boot_res.ide_stat, boot_res.ide_error); } } @@ -283,7 +286,7 @@ command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const } if (argc > 1) - count = (uint16_t) strtoul(argv[1], NULL, 16); + count = (uint16_t) eval_arg(argv[1], NULL); z80_bus_cmd(Request); while (count--) @@ -301,7 +304,7 @@ command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 2) return CMD_RET_USAGE; - addr = strtoul(argv[1], NULL, 16); + addr = eval_arg(argv[1], NULL); if (addr >= (1UL<<16)) { printf_P(PSTR("## Startaddress 0x%05lx too high.\n" " (Out of logical address space (0x00000-0x0ffff))\n"),