-#include "common.h"
-#include <stdlib.h>
+/*
+ * (C) Copyright 2014, 2018 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * 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"
-static const FLASH char * const FLASH rc_names[] = {
- FSTR("OK"),
- FSTR("DISK_ERR"),
- FSTR("INT_ERR"),
- FSTR("NOT_READY"),
- FSTR("NO_FILE"),
- FSTR("NO_PATH"),
- FSTR("INVALID_NAME"),
- FSTR("DENIED"),
- FSTR("EXIST"),
- FSTR("INVALID_OBJECT"),
- FSTR("WRITE_PROTECTED"),
- FSTR("INVALID_DRIVE"),
- FSTR("NOT_ENABLED"),
- FSTR("NO_FILE_SYSTEM"),
- FSTR("MKFS_ABORTED"),
- FSTR("TIMEOUT"),
- FSTR("LOCKED"),
- FSTR("NOT_ENOUGH_CORE"),
- FSTR("TOO_MANY_OPEN_FILES")
- };
-
+/*
+ * status <pd#> - Show socket status
+ *
+ */
static
-void put_rc (FRESULT rc)
+command_ret_t do_status(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
-#if 0
- printf_P(PSTR("rc=%u FR_%S\n"), rc, rc_names[rc]);
-#else
- printf_P(PSTR("rc=%u FR_"), rc);
- my_puts_P(rc_names[rc]);
- my_puts_P(PSTR("\n"));
+ DSTATUS res;
+ BYTE dev;
-#endif
+ (void) cmdtp; (void) flag;
-}
+ if (argc < 2)
+ return CMD_RET_USAGE;
+ dev = (BYTE) eval_arg(argv[1], NULL);
+ res = disk_status(dev);
+ printf_P(PSTR("Socket status: %02x\n"), res);
+
+ return CMD_RET_SUCCESS;
+}
/*
- * di <pd#> - Initialize disk
+ * init <pd#> - Initialize disk
*
*/
static
-command_ret_t do_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_init(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
{
DSTATUS res;
BYTE dev;
if (argc < 2)
return CMD_RET_USAGE;
- dev = (BYTE) strtoul(argv[1], 0, 10);
- res = disk_status(dev);
- printf_P(PSTR("disk_status=%.2x\n"), res);
+ dev = (BYTE) eval_arg(argv[1], NULL);
- if ((res & STA_NODISK) == 0) {
- res = disk_initialize(dev);
- }
+ 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 <pd#> - Show disk status
+ * info <pd#> - 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 {
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);
-
if (disk_ioctl(dev, GET_BLOCK_SIZE, &dat.ul) == RES_OK)
printf_P(PSTR("Erase block: %lu sectors\n"), dat.ul);
-
if (disk_ioctl(dev, MMC_GET_TYPE, &dat.uc) == RES_OK)
printf_P(PSTR("Card type: %u\n"), dat.uc);
-
if (disk_ioctl(dev, MMC_GET_CSD, dat.uca) == RES_OK)
dump_ram(dat.uca, 0, 16, "CSD:");
-
if (disk_ioctl(dev, MMC_GET_CID, dat.uca) == RES_OK)
dump_ram(dat.uca, 0, 16, "CID:");
-
if (disk_ioctl(dev, MMC_GET_OCR, dat.uca) == RES_OK)
dump_ram(dat.uca, 0, 4, "OCR:");
-
if (disk_ioctl(dev, MMC_GET_SDSTAT, dat.uca) == RES_OK)
dump_ram(dat.uca, 0, 64, "SD Status:");
- if (disk_ioctl(dev, ATA_GET_MODEL, dat.uca) == RES_OK) {
- dat.uca[40] = '\0';
- printf_P(PSTR("Model: %s\n"), dat.uca);
- }
- if (disk_ioctl(dev, ATA_GET_SN, dat.uca) == RES_OK) {
- dat.uca[20] = '\0'; printf_P(PSTR("S/N: %s\n"), dat.uca);
- }
-
return CMD_RET_SUCCESS;
}
*
*/
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;
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;
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;
*
*/
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;
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;
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;
}
*
*/
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;
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;
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);
/*
* Disk ioctl
- * dcs <pd#> - CTRL_SYNC
+ * sync <pd#> - 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;
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(
- init, 2, 1, do_init,
+ status, 2, CTBL_RPT, do_status,
+ "Socket status",
+ "drive"
+),
+CMD_TBL_ITEM(
+ 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"
/* 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;
}