]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_boot.c
Merge branch 'fatfs-integration' into fatcommands
[z180-stamp.git] / avr / cmd_boot.c
index b00d0628f9077c01c7acf54ea1d6deb416117904..b4aa5c027c8e75f66ec1d68c7ecf4b4f9e499118 100644 (file)
 /*
  * 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"
@@ -59,7 +58,7 @@ static void z80_load_mem(int_fast8_t verbosity,
        }
 }
 
-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;
 
@@ -112,7 +111,7 @@ void print_vars(char *title)
  *             -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];
@@ -121,11 +120,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 +132,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 +151,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 +163,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 +171,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 +179,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 +230,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 +256,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);
                        }
                }
@@ -271,7 +273,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        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;
 
@@ -283,7 +285,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--)
@@ -293,7 +295,7 @@ command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const
 }
 
 
-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;
 
@@ -301,7 +303,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"),
@@ -345,7 +347,7 @@ void reset_cpu(bus_cmd_t mode)
 }
 
 
-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;
 
@@ -355,7 +357,7 @@ command_ret_t do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const 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;
 
@@ -380,7 +382,7 @@ void print_con_usage(char esc)
        ), 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;