X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/2f53dd651e4bc075376ade16897272b41fd08a14..aea51b6c4c93c56715f50e64d424e1181c6d0242:/avr/cmd_sd.c diff --git a/avr/cmd_sd.c b/avr/cmd_sd.c index 5494a13..344a197 100644 --- a/avr/cmd_sd.c +++ b/avr/cmd_sd.c @@ -1,19 +1,24 @@ -#include "common.h" -#include +/* + * (C) Copyright 2014, 2018 Leo C. + * + * SPDX-License-Identifier: GPL-2.0 + */ + +#include "cmd_sd.h" -#include "command.h" #include "diskio.h" #include "ff.h" -#include "z80-if.h" +#include "eval_arg.h" #include "print-utils.h" +#include "z80-if.h" /* - * di - Initialize disk + * status - Show socket status * */ static -command_ret_t do_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_status(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { DSTATUS res; BYTE dev; @@ -23,28 +28,50 @@ command_ret_t do_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], 0, 10); + dev = (BYTE) eval_arg(argv[1], NULL); res = disk_status(dev); - printf_P(PSTR("disk_status=%.2x\n"), res); + printf_P(PSTR("Socket status: %02x\n"), res); - if ((res & STA_NODISK) == 0) { - res = disk_initialize(dev); - } + return CMD_RET_SUCCESS; +} + +/* + * init - Initialize disk + * + */ +static +command_ret_t do_init(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +{ + DSTATUS res; + BYTE dev; + + (void) cmdtp; (void) flag; + + if (argc < 2) + return CMD_RET_USAGE; + + dev = (BYTE) eval_arg(argv[1], NULL); + + if (disk_status(dev) & STA_NODISK) + cmd_error(CMD_RET_FAILURE, 0, PSTR("No disk")); + + res = disk_initialize(dev); printf_P(PSTR("rc=%.2x\n"), res); - if (res) { + + if (res & (STA_NODISK | STA_NOINIT)) return CMD_RET_FAILURE; - } return CMD_RET_SUCCESS; } /* - * ds - Show disk status + * info - Show disk info * */ static -command_ret_t do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_info(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { + DSTATUS res; BYTE dev; union { @@ -58,8 +85,14 @@ command_ret_t do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], 0, 10); + dev = (BYTE) eval_arg(argv[1], NULL); + res = disk_status(dev); + if (res & (STA_NODISK | STA_NOINIT)) { + printf_P(res & STA_NODISK ? + PSTR("No disk\n") : PSTR("Not initialized\n")); + return CMD_RET_FAILURE; + } if (disk_ioctl(dev, GET_SECTOR_COUNT, &dat.ul) == RES_OK) printf_P(PSTR("Drive size: %lu sectors\n"), dat.ul); @@ -85,11 +118,11 @@ command_ret_t do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ * */ static -command_ret_t do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_dump(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { static BYTE dev_last; static DWORD sec_last; - BYTE buffer[_MAX_SS]; + BYTE buffer[FF_MAX_SS]; char header[20]; DRESULT res; @@ -102,7 +135,7 @@ command_ret_t do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], NULL, 10); + dev = (BYTE) eval_arg(argv[1], NULL); if (dev != dev_last) sec_last = 0; sec = sec_last; @@ -111,21 +144,19 @@ command_ret_t do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if ((flag & CMD_FLAG_REPEAT) == 0) { /* If another parameter, it is the sector to dump. */ if (argc > 2) - sec = strtoul(argv[2], 0, 10); + sec = eval_arg(argv[2], NULL); if (argc > 3) - count = (UINT) strtoul(argv[3], 0, 10); + count = (UINT) eval_arg(argv[3], NULL); } for ( ; count; count--, sec++) { res = disk_read(dev, buffer, sec, 1); - if (res) { - printf_P(PSTR("rc=%.2x\n"), res); - return CMD_RET_FAILURE; - } + if (res) + cmd_error(CMD_RET_FAILURE, 0, PSTR("rc=%.2x"), res); sprintf_P(header, PSTR("Sector: %lu"), sec); - dump_ram(buffer, 0, _MAX_SS, header); + dump_ram(buffer, 0, FF_MAX_SS, header); } dev_last = dev; sec_last = sec; @@ -138,14 +169,14 @@ command_ret_t do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * */ static -command_ret_t do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_read(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { DRESULT res; BYTE dev; DWORD sec; uint32_t addr; int count, nr; - BYTE buffer[_MAX_SS]; + BYTE buffer[FF_MAX_SS]; static DWORD sec_last; static uint32_t addr_last; @@ -155,7 +186,7 @@ command_ret_t do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], NULL, 10); + dev = (BYTE) eval_arg(argv[1], NULL); sec = sec_last; count = 1; addr = addr_last; @@ -163,23 +194,20 @@ command_ret_t do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if ((flag & CMD_FLAG_REPEAT) == 0) { /* If another parameter, it is the sector to dump. */ if (argc > 2) - sec = strtoul(argv[2], 0, 10); + sec = eval_arg(argv[2], NULL); if (argc > 3) - count = strtoul(argv[3], 0, 10); + count = eval_arg(argv[3], NULL); if (argc > 4) - addr = strtoul(argv[4], 0, 16); + addr = eval_arg(argv[4], NULL); } for (nr = 0; nr < count;) { nr++; if ((res = disk_read(dev, buffer, sec, 1)) == RES_OK) { - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; - } - z80_write_block(buffer, addr /*+ base*/, _MAX_SS); + z80_bus_request_or_exit(); + z80_write_block(buffer, addr /*+ base*/, FF_MAX_SS); z80_bus_cmd(Release); - sec++; addr += _MAX_SS; + sec++; addr += FF_MAX_SS; } else break; } @@ -200,14 +228,14 @@ command_ret_t do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * */ static -command_ret_t do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_write(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { DRESULT res; BYTE dev; DWORD sec; uint32_t addr; int count, nr; - BYTE buffer[_MAX_SS]; + BYTE buffer[FF_MAX_SS]; static DWORD sec_last; static uint32_t addr_last; @@ -217,7 +245,7 @@ command_ret_t do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], NULL, 10); + dev = (BYTE) eval_arg(argv[1], NULL); sec = sec_last; addr = addr_last; count = 1; @@ -225,26 +253,23 @@ command_ret_t do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] if ((flag & CMD_FLAG_REPEAT) == 0) { /* If another parameter, it is the sector to dump. */ if (argc > 2) - sec = strtoul(argv[2], 0, 10); + sec = eval_arg(argv[2], NULL); if (argc > 3) - count = strtoul(argv[3], 0, 10); + count = eval_arg(argv[3], NULL); if (argc > 4) - addr = strtoul(argv[4], 0, 16); + addr = eval_arg(argv[4], NULL); } for (nr = 0; nr < count;) { nr++; - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; - } - z80_read_block(buffer, addr /*+ base*/, _MAX_SS); + z80_bus_request_or_exit(); + z80_read_block(buffer, addr /*+ base*/, FF_MAX_SS); z80_bus_cmd(Release); res = disk_write(dev, buffer, sec, 1); if (res != RES_OK) break; - sec++; addr += _MAX_SS; + sec++; addr += FF_MAX_SS; } printf_P(PSTR("%d sector(s) written, rc=%.2x.\n"), nr, res); @@ -259,11 +284,11 @@ command_ret_t do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] /* * Disk ioctl - * dcs - CTRL_SYNC + * sync - CTRL_SYNC * */ static -command_ret_t do_ioctl_sync(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_ioctl_sync(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { BYTE dev; @@ -272,51 +297,53 @@ command_ret_t do_ioctl_sync(cmd_tbl_t *cmdtp, int flag, int argc, char * const a if (argc < 2) return CMD_RET_USAGE; - dev = (BYTE) strtoul(argv[1], 0, 10); + dev = (BYTE) eval_arg(argv[1], NULL); printf_P(PSTR("rc=%.2x\n"), disk_ioctl(dev, CTRL_SYNC, 0)); return CMD_RET_SUCCESS; } -static -command_ret_t do_help(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); - -cmd_tbl_t cmd_sd_sub[] = { +cmd_tbl_t cmd_tbl_sd[] = { +CMD_TBL_ITEM( + status, 2, CTBL_RPT, do_status, + "Socket status", + "drive" +), CMD_TBL_ITEM( - init, 2, 1, do_init, + init, 2, CTBL_RPT, do_init, "Initialize disk", - "" + "drive" ), CMD_TBL_ITEM( - status, 2, 1, do_status, - "Disk status", - "" + info, 2, CTBL_RPT, do_info, + "Disk info", + "drive" ), CMD_TBL_ITEM( - dump, CONFIG_SYS_MAXARGS, 1, do_dump, - "Dump sector", - "" + dump, CONFIG_SYS_MAXARGS, CTBL_RPT, do_dump, + "Dump sector(s)", + "drive [sector [count ]]" ), CMD_TBL_ITEM( - read, 2, 1, do_read, - "read disk sector(s) into meomory", + read, 2, CTBL_RPT, do_read, + "Read disk sector(s) into meomory", "drive [sector [count [memaddr]]]" ), CMD_TBL_ITEM( - write, 2, 1, do_write, - "write sector(s) from meomory to disk", + write, 2, CTBL_RPT, do_write, + "Write sector(s) from meomory to disk", "drive [sector [count [memaddr]]]" ), CMD_TBL_ITEM( - sync, 2, 1, do_ioctl_sync, + sync, 2, CTBL_RPT, do_ioctl_sync, "Device control: SYNC", - "" + "drive" ), CMD_TBL_ITEM( - help, CONFIG_SYS_MAXARGS, 1, do_help, - "print sub command description/usage", + help, CONFIG_SYS_MAXARGS, CTBL_RPT, do_help, + "Print sub command description/usage", "\n" " - print brief description of all sub commands\n" "sd help command ...\n" @@ -325,38 +352,22 @@ CMD_TBL_ITEM( /* This does not use the CMD_TBL_ITEM macro as ? can't be used in symbol names */ {FSTR("?"), CONFIG_SYS_MAXARGS, 1, do_help, - FSTR("alias for 'help'"), + NULL, #ifdef CONFIG_SYS_LONGHELP FSTR(""), #endif /* CONFIG_SYS_LONGHELP */ + NULL, #ifdef CONFIG_AUTO_COMPLETE - 0, + NULL, #endif }, +/* Mark end of table */ +CMD_TBL_END(cmd_tbl_sd) }; -static -command_ret_t do_help(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - return _do_help(cmd_sd_sub, ARRAY_SIZE(cmd_sd_sub), cmdtp, flag, argc, argv); -} - -command_ret_t do_sd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_sd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - cmd_tbl_t *cp; - - if (argc < 2) - return CMD_RET_USAGE; - - /* drop initial "sd" arg */ - argc--; - argv++; - - cp = find_cmd_tbl(argv[0], cmd_sd_sub, ARRAY_SIZE(cmd_sd_sub)); - - if (cp) - return cp->cmd(cmdtp, flag, argc, argv); - + puts_P(PSTR("Huch?")); return CMD_RET_USAGE; }