]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_sd.c
2 * (C) Copyright 2014, 2018 Leo C. <erbl259-lmu@yahoo.de>
4 * SPDX-License-Identifier: GPL-2.0
12 #include "print-utils.h"
17 * status <pd#> - Show socket status
21 command_ret_t
do_status(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
26 (void) cmdtp
; (void) flag
;
31 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
32 res
= disk_status(dev
);
33 printf_P(PSTR("Socket status: %02x\n"), res
);
35 return CMD_RET_SUCCESS
;
39 * init <pd#> - Initialize disk
43 command_ret_t
do_init(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
48 (void) cmdtp
; (void) flag
;
53 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
55 if (disk_status(dev
) & STA_NODISK
)
56 cmd_error(CMD_RET_FAILURE
, 0, PSTR("No disk"));
58 res
= disk_initialize(dev
);
59 printf_P(PSTR("rc=%.2x\n"), res
);
61 if (res
& (STA_NODISK
| STA_NOINIT
))
62 return CMD_RET_FAILURE
;
64 return CMD_RET_SUCCESS
;
68 * info <pd#> - Show disk info
72 command_ret_t
do_info(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
78 unsigned char uca
[64];
83 (void) cmdtp
; (void) flag
;
88 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
90 res
= disk_status(dev
);
91 if (res
& (STA_NODISK
| STA_NOINIT
)) {
92 printf_P(res
& STA_NODISK
?
93 PSTR("No disk\n") : PSTR("Not initialized\n"));
94 return CMD_RET_FAILURE
;
97 if (disk_ioctl(dev
, GET_SECTOR_COUNT
, &dat
.ul
) == RES_OK
)
98 printf_P(PSTR("Drive size: %lu sectors\n"), dat
.ul
);
99 if (disk_ioctl(dev
, GET_BLOCK_SIZE
, &dat
.ul
) == RES_OK
)
100 printf_P(PSTR("Erase block: %lu sectors\n"), dat
.ul
);
101 if (disk_ioctl(dev
, MMC_GET_TYPE
, &dat
.uc
) == RES_OK
)
102 printf_P(PSTR("Card type: %u\n"), dat
.uc
);
103 if (disk_ioctl(dev
, MMC_GET_CSD
, dat
.uca
) == RES_OK
)
104 dump_ram(dat
.uca
, 0, 16, "CSD:");
105 if (disk_ioctl(dev
, MMC_GET_CID
, dat
.uca
) == RES_OK
)
106 dump_ram(dat
.uca
, 0, 16, "CID:");
107 if (disk_ioctl(dev
, MMC_GET_OCR
, dat
.uca
) == RES_OK
)
108 dump_ram(dat
.uca
, 0, 4, "OCR:");
109 if (disk_ioctl(dev
, MMC_GET_SDSTAT
, dat
.uca
) == RES_OK
)
110 dump_ram(dat
.uca
, 0, 64, "SD Status:");
112 return CMD_RET_SUCCESS
;
117 * dump <pd#> [<sector> [count]] - Dump sector
121 command_ret_t
do_dump(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
123 static BYTE dev_last
;
124 static DWORD sec_last
;
125 BYTE buffer
[FF_MAX_SS
];
133 (void) cmdtp
; (void) flag
;
136 return CMD_RET_USAGE
;
138 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
144 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
145 /* If another parameter, it is the sector to dump. */
147 sec
= eval_arg(argv
[2], NULL
);
149 count
= (UINT
) eval_arg(argv
[3], NULL
);
152 for ( ; count
; count
--, sec
++) {
153 res
= disk_read(dev
, buffer
, sec
, 1);
156 cmd_error(CMD_RET_FAILURE
, 0, PSTR("rc=%.2x"), res
);
158 sprintf_P(header
, PSTR("Sector: %lu"), sec
);
159 dump_ram(buffer
, 0, FF_MAX_SS
, header
);
164 return CMD_RET_SUCCESS
;
168 * read drive sector count memaddr - Read disk into memory
172 command_ret_t
do_read(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
179 BYTE buffer
[FF_MAX_SS
];
181 static DWORD sec_last
;
182 static uint32_t addr_last
;
187 return CMD_RET_USAGE
;
189 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
194 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
195 /* If another parameter, it is the sector to dump. */
197 sec
= eval_arg(argv
[2], NULL
);
199 count
= eval_arg(argv
[3], NULL
);
201 addr
= eval_arg(argv
[4], NULL
);
204 for (nr
= 0; nr
< count
;) {
206 if ((res
= disk_read(dev
, buffer
, sec
, 1)) == RES_OK
) {
207 if (!(z80_bus_cmd(Request
) & ZST_ACQUIRED
))
208 cmd_error(CMD_RET_FAILURE
, EBUSTO
, NULL
);
210 z80_write_block(buffer
, addr
/*+ base*/, FF_MAX_SS
);
211 z80_bus_cmd(Release
);
212 sec
++; addr
+= FF_MAX_SS
;
217 printf_P(PSTR("Read %d sector(s), rc=%.2x.\n"), nr
, res
);
219 printf_P(PSTR("Last sector not written!\n"));
224 return res
? CMD_RET_FAILURE
: CMD_RET_SUCCESS
;
229 * write <pd#> <sector> <memaddr> [<n>] - Write memory to disk
233 command_ret_t
do_write(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
240 BYTE buffer
[FF_MAX_SS
];
242 static DWORD sec_last
;
243 static uint32_t addr_last
;
248 return CMD_RET_USAGE
;
250 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
255 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
256 /* If another parameter, it is the sector to dump. */
258 sec
= eval_arg(argv
[2], NULL
);
260 count
= eval_arg(argv
[3], NULL
);
262 addr
= eval_arg(argv
[4], NULL
);
265 for (nr
= 0; nr
< count
;) {
267 if (!(z80_bus_cmd(Request
) & ZST_ACQUIRED
))
268 cmd_error(CMD_RET_FAILURE
, EBUSTO
, NULL
);
270 z80_read_block(buffer
, addr
/*+ base*/, FF_MAX_SS
);
271 z80_bus_cmd(Release
);
273 res
= disk_write(dev
, buffer
, sec
, 1);
276 sec
++; addr
+= FF_MAX_SS
;
279 printf_P(PSTR("%d sector(s) written, rc=%.2x.\n"), nr
, res
);
284 return res
? CMD_RET_FAILURE
: CMD_RET_SUCCESS
;
291 * sync <pd#> - CTRL_SYNC
295 command_ret_t
do_ioctl_sync(cmd_tbl_t
*cmdtp
, uint_fast8_t flag
, int argc
, char * const argv
[])
299 (void) cmdtp
; (void) flag
;
302 return CMD_RET_USAGE
;
304 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
305 printf_P(PSTR("rc=%.2x\n"), disk_ioctl(dev
, CTRL_SYNC
, 0));
307 return CMD_RET_SUCCESS
;
311 cmd_tbl_t cmd_tbl_sd
[] = {
313 status
, 2, CTBL_RPT
, do_status
,
318 init
, 2, CTBL_RPT
, do_init
,
323 info
, 2, CTBL_RPT
, do_info
,
328 dump
, CONFIG_SYS_MAXARGS
, CTBL_RPT
, do_dump
,
330 "drive [sector [count ]]"
333 read
, 2, CTBL_RPT
, do_read
,
334 "Read disk sector(s) into meomory",
335 "drive [sector [count [memaddr]]]"
338 write
, 2, CTBL_RPT
, do_write
,
339 "Write sector(s) from meomory to disk",
340 "drive [sector [count [memaddr]]]"
343 sync
, 2, CTBL_RPT
, do_ioctl_sync
,
344 "Device control: SYNC",
349 help
, CONFIG_SYS_MAXARGS
, CTBL_RPT
, do_help
,
350 "Print sub command description/usage",
352 " - print brief description of all sub commands\n"
353 "sd help command ...\n"
354 " - print detailed usage of sub cmd 'command'"
357 /* This does not use the CMD_TBL_ITEM macro as ? can't be used in symbol names */
358 {FSTR("?"), CONFIG_SYS_MAXARGS
, 1, do_help
,
360 #ifdef CONFIG_SYS_LONGHELP
362 #endif /* CONFIG_SYS_LONGHELP */
364 #ifdef CONFIG_AUTO_COMPLETE
368 /* Mark end of table */
369 CMD_TBL_END(cmd_tbl_sd
)
373 command_ret_t
do_sd(cmd_tbl_t
*cmdtp UNUSED
, uint_fast8_t flag UNUSED
, int argc UNUSED
, char * const argv
[] UNUSED
)
375 puts_P(PSTR("Huch?"));
376 return CMD_RET_USAGE
;