/*
* Misc boot support
*/
-#include "common.h"
-#include <stdlib.h>
+#include "cmd_boot.h"
#include <ctype.h>
#include <util/atomic.h>
-#include "command.h"
#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"
}
}
-command_ret_t do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_loadf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
(void) cmdtp; (void) flag; (void) argc; (void) argv;
* -v verbose
*/
-command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
struct {
uint8_t jr[2];
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;
} 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;
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;
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;
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;
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;
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);
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);
}
}
return CMD_RET_SUCCESS;
}
-command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
uint16_t count=1;
}
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--)
}
-command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_go(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
uint32_t addr;
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"),
}
-command_ret_t do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_reset(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
(void) cmdtp; (void) flag; (void) argc; (void) argv;
return CMD_RET_SUCCESS;
}
-command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_restart(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
(void) cmdtp; (void) flag; (void) argc; (void) argv;
), esc + 0x40);
}
-command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_console(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
int ch;
uint8_t pending;