]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_sd.c
2 * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
4 * SPDX-License-Identifier: GPL-2.0+
14 #include "print-utils.h"
19 * status <pd#> - Show socket status
23 command_ret_t
do_status(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
28 (void) cmdtp
; (void) flag
;
33 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
34 res
= disk_status(dev
);
35 printf_P(PSTR("Socket status: %02x\n"), res
);
37 return CMD_RET_SUCCESS
;
41 * init <pd#> - Initialize disk
45 command_ret_t
do_init(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
50 (void) cmdtp
; (void) flag
;
55 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
57 if (disk_status(dev
) & STA_NODISK
) {
58 printf_P(PSTR("No Disk\n"));
59 return CMD_RET_FAILURE
;
62 res
= disk_initialize(dev
);
63 printf_P(PSTR("rc=%.2x\n"), res
);
65 if (res
& (STA_NODISK
| STA_NOINIT
))
66 return CMD_RET_FAILURE
;
68 return CMD_RET_SUCCESS
;
72 * info <pd#> - Show disk info
76 command_ret_t
do_info(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
82 unsigned char uca
[64];
87 (void) cmdtp
; (void) flag
;
92 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
94 res
= disk_status(dev
);
95 if (res
& (STA_NODISK
| STA_NOINIT
)) {
96 printf_P(res
& STA_NODISK
?
97 PSTR("No disk\n") : PSTR("Not initialized\n"));
98 return CMD_RET_FAILURE
;
101 if (disk_ioctl(dev
, GET_SECTOR_COUNT
, &dat
.ul
) == RES_OK
)
102 printf_P(PSTR("Drive size: %lu sectors\n"), dat
.ul
);
103 if (disk_ioctl(dev
, GET_BLOCK_SIZE
, &dat
.ul
) == RES_OK
)
104 printf_P(PSTR("Erase block: %lu sectors\n"), dat
.ul
);
105 if (disk_ioctl(dev
, MMC_GET_TYPE
, &dat
.uc
) == RES_OK
)
106 printf_P(PSTR("Card type: %u\n"), dat
.uc
);
107 if (disk_ioctl(dev
, MMC_GET_CSD
, dat
.uca
) == RES_OK
)
108 dump_ram(dat
.uca
, 0, 16, "CSD:");
109 if (disk_ioctl(dev
, MMC_GET_CID
, dat
.uca
) == RES_OK
)
110 dump_ram(dat
.uca
, 0, 16, "CID:");
111 if (disk_ioctl(dev
, MMC_GET_OCR
, dat
.uca
) == RES_OK
)
112 dump_ram(dat
.uca
, 0, 4, "OCR:");
113 if (disk_ioctl(dev
, MMC_GET_SDSTAT
, dat
.uca
) == RES_OK
)
114 dump_ram(dat
.uca
, 0, 64, "SD Status:");
116 return CMD_RET_SUCCESS
;
121 * dump <pd#> [<sector> [count]] - Dump sector
125 command_ret_t
do_dump(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
127 static BYTE dev_last
;
128 static DWORD sec_last
;
129 BYTE buffer
[_MAX_SS
];
137 (void) cmdtp
; (void) flag
;
140 return CMD_RET_USAGE
;
142 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
148 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
149 /* If another parameter, it is the sector to dump. */
151 sec
= eval_arg(argv
[2], NULL
);
153 count
= (UINT
) eval_arg(argv
[3], NULL
);
156 for ( ; count
; count
--, sec
++) {
157 res
= disk_read(dev
, buffer
, sec
, 1);
160 printf_P(PSTR("rc=%.2x\n"), res
);
161 return CMD_RET_FAILURE
;
164 sprintf_P(header
, PSTR("Sector: %lu"), sec
);
165 dump_ram(buffer
, 0, _MAX_SS
, header
);
170 return CMD_RET_SUCCESS
;
174 * read drive sector count memaddr - Read disk into memory
178 command_ret_t
do_read(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
185 BYTE buffer
[_MAX_SS
];
187 static DWORD sec_last
;
188 static uint32_t addr_last
;
193 return CMD_RET_USAGE
;
195 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
200 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
201 /* If another parameter, it is the sector to dump. */
203 sec
= eval_arg(argv
[2], NULL
);
205 count
= eval_arg(argv
[3], NULL
);
207 addr
= eval_arg(argv
[4], NULL
);
210 for (nr
= 0; nr
< count
;) {
212 if ((res
= disk_read(dev
, buffer
, sec
, 1)) == RES_OK
) {
213 if (!(z80_bus_cmd(Request
) & ZST_ACQUIRED
)) {
214 my_puts_P(PSTR("Bus timeout\n"));
215 return CMD_RET_FAILURE
;
217 z80_write_block(buffer
, addr
/*+ base*/, _MAX_SS
);
218 z80_bus_cmd(Release
);
219 sec
++; addr
+= _MAX_SS
;
224 printf_P(PSTR("Read %d sector(s), rc=%.2x.\n"), nr
, res
);
226 printf_P(PSTR("Last sector not written!\n"));
231 return res
? CMD_RET_FAILURE
: CMD_RET_SUCCESS
;
236 * write <pd#> <sector> <memaddr> [<n>] - Write memory to disk
240 command_ret_t
do_write(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
247 BYTE buffer
[_MAX_SS
];
249 static DWORD sec_last
;
250 static uint32_t addr_last
;
255 return CMD_RET_USAGE
;
257 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
262 if ((flag
& CMD_FLAG_REPEAT
) == 0) {
263 /* If another parameter, it is the sector to dump. */
265 sec
= eval_arg(argv
[2], NULL
);
267 count
= eval_arg(argv
[3], NULL
);
269 addr
= eval_arg(argv
[4], NULL
);
272 for (nr
= 0; nr
< count
;) {
274 if (!(z80_bus_cmd(Request
) & ZST_ACQUIRED
)) {
275 my_puts_P(PSTR("Bus timeout\n"));
276 return CMD_RET_FAILURE
;
278 z80_read_block(buffer
, addr
/*+ base*/, _MAX_SS
);
279 z80_bus_cmd(Release
);
281 res
= disk_write(dev
, buffer
, sec
, 1);
284 sec
++; addr
+= _MAX_SS
;
287 printf_P(PSTR("%d sector(s) written, rc=%.2x.\n"), nr
, res
);
292 return res
? CMD_RET_FAILURE
: CMD_RET_SUCCESS
;
299 * sync <pd#> - CTRL_SYNC
303 command_ret_t
do_ioctl_sync(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
307 (void) cmdtp
; (void) flag
;
310 return CMD_RET_USAGE
;
312 dev
= (BYTE
) eval_arg(argv
[1], NULL
);
313 printf_P(PSTR("rc=%.2x\n"), disk_ioctl(dev
, CTRL_SYNC
, 0));
315 return CMD_RET_SUCCESS
;
320 command_ret_t
do_help(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[]);
322 cmd_tbl_t cmd_sd_sub
[] = {
324 status
, 2, 1, do_status
,
339 dump
, CONFIG_SYS_MAXARGS
, 1, do_dump
,
341 "drive [sector [count ]]"
345 "Read disk sector(s) into meomory",
346 "drive [sector [count [memaddr]]]"
349 write
, 2, 1, do_write
,
350 "Write sector(s) from meomory to disk",
351 "drive [sector [count [memaddr]]]"
354 sync
, 2, 1, do_ioctl_sync
,
355 "Device control: SYNC",
360 help
, CONFIG_SYS_MAXARGS
, 1, do_help
,
361 "Print sub command description/usage",
363 " - print brief description of all sub commands\n"
364 "sd help command ...\n"
365 " - print detailed usage of sub cmd 'command'"
368 /* This does not use the CMD_TBL_ITEM macro as ? can't be used in symbol names */
369 {FSTR("?"), CONFIG_SYS_MAXARGS
, 1, do_help
,
370 FSTR("Alias for 'help'"),
371 #ifdef CONFIG_SYS_LONGHELP
373 #endif /* CONFIG_SYS_LONGHELP */
374 #ifdef CONFIG_AUTO_COMPLETE
381 command_ret_t
do_help(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
383 return _do_help(cmd_sd_sub
, ARRAY_SIZE(cmd_sd_sub
), cmdtp
, flag
, argc
, argv
);
387 command_ret_t
do_sd(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
392 return CMD_RET_USAGE
;
394 /* drop initial "sd" arg */
398 cp
= find_cmd_tbl(argv
[0], cmd_sd_sub
, ARRAY_SIZE(cmd_sd_sub
));
401 return cp
->cmd(cmdtp
, flag
, argc
, argv
);
403 return CMD_RET_USAGE
;