summaryrefslogtreecommitdiff
path: root/avr
diff options
context:
space:
mode:
authorLeo C2014-12-01 11:12:23 +0100
committerLeo C2014-12-01 11:12:23 +0100
commit4565be9a755c4de8ffdbc8b9a7b2d87c87f7a9e1 (patch)
tree65cc3402ed89d30ea058ed3244a36e7863110739 /avr
parent4f881b028b8e5f6d41efc430185db4d41cb48caa (diff)
downloadz180-stamp-4565be9a755c4de8ffdbc8b9a7b2d87c87f7a9e1.zip
merge do_fat_read() and do_fat_write() to do_fat_rw()
Diffstat (limited to 'avr')
-rw-r--r--avr/cmd_fat.c216
-rw-r--r--avr/cmd_gpio.c2
-rw-r--r--avr/command_tbl.c31
-rw-r--r--avr/debug.c11
4 files changed, 209 insertions, 51 deletions
diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c
index 1c46dd1..0232f5d 100644
--- a/avr/cmd_fat.c
+++ b/avr/cmd_fat.c
@@ -6,13 +6,17 @@
#include "command.h"
#include "ff.h"
#include "z80-if.h"
+#include "con-utils.h"
#include "print-utils.h"
#include "timer.h"
#include "debug.h"
+#define MAX_MEMORY (1ul << 20)
+
DWORD get_fattime (void)
{
+ /* TODO: */
return 0;
}
@@ -109,65 +113,70 @@ FRESULT scan_files (
*/
command_ret_t do_fat_stat(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
- FATFS FatFs, *fs;
- DWORD clusters;
+ FATFS *FatFs, *fs;
+ DWORD nfreeclst;
FRESULT res;
- char buffer[512];
+ char *buffer;
(void) cmdtp; (void) flag; (void) argc;
- res = f_mount(&FatFs, argv[1], 0);
- if (!res)
- res = f_getfree(argv[1], &clusters, &fs);
- if (res) {
- put_rc(res);
+ FatFs = (FATFS *) malloc(sizeof (FATFS));
+ buffer = (char *) malloc(512);
+ if (FatFs == NULL || buffer == NULL) {
+ printf_P(PSTR("fatstat: Out of Memory!\n"));
+ free(FatFs);
+ free(buffer);
return CMD_RET_FAILURE;
}
- printf_P(PSTR(
- "FAT type: %u\n"
- "Bytes/Cluster: %lu\n"
- "Number of FATs: %u\n"
- "Root DIR entries: %u\n"
- "Sectors/FAT: %lu\n"
- "Number of clusters: %lu\n"
- "FAT start (lba): %lu\n"
- "DIR start (lba,cluster): %lu\n"
- "Data start (lba): %lu\n"),
- fs->fs_type, (DWORD)fs->csize * 512, fs->n_fats,
- fs->n_rootdir, fs->fsize, fs->n_fatent - 2,
- fs->fatbase, fs->dirbase, fs->database);
+ res = f_mount(FatFs, argv[1], 0);
+ if (!res) {
+ res = f_getfree(argv[1], &nfreeclst, &fs);
+ if (!res) {
+ printf_P(PSTR(
+ "FAT type: %u\n"
+ "Bytes/Cluster: %lu\n"
+ "Number of FATs: %u\n"
+ "Root DIR entries: %u\n"
+ "Sectors/FAT: %lu\n"
+ "Number of clusters: %lu\n"
+ "FAT start (lba): %lu\n"
+ "DIR start (lba,cluster): %lu\n"
+ "Data start (lba): %lu\n"),
+ fs->fs_type, (DWORD)fs->csize * 512, fs->n_fats,
+ fs->n_rootdir, fs->fsize, fs->n_fatent - 2,
+ fs->fatbase, fs->dirbase, fs->database);
#if _USE_LABEL
- TCHAR label[12];
- DWORD serial;
- res = f_getlabel(argv[1], label, &serial);
- if (res) {
- put_rc(res);
- return CMD_RET_FAILURE;
- }
- printf_P(PSTR(
- "Volume name: %s\n"
- "Volume S/N: %04X-%04X\n"),
- label, (WORD)(serial >> 16), (WORD)(serial & 0xFFFF));
+ TCHAR label[12];
+ DWORD serial;
+ res = f_getlabel(argv[1], label, &serial);
+ if (!res) {
+ printf_P(PSTR(
+ "Volume name: %s\n"
+ "Volume S/N: %04X-%04X\n"),
+ label, (WORD)(serial >> 16), (WORD)(serial & 0xFFFF));
+ }
#endif
- my_puts_P(PSTR("\n..."));
- AccSize = AccFiles = AccDirs = 0;
+ if (!res) {
+ my_puts_P(PSTR("\n..."));
+ AccSize = AccFiles = AccDirs = 0;
- strcpy(buffer, argv[1]);
+ strcpy(buffer, argv[1]);
- res = scan_files(buffer);
- if (res) {
- put_rc(res);
- return CMD_RET_FAILURE;
+ res = scan_files(buffer);
+ }
+ if (!res) {
+ printf_P(PSTR("\r%u files, %lu bytes.\n%u folders.\n"
+ "%lu KB total disk space.\n%lu KB available.\n"),
+ AccFiles, AccSize, AccDirs,
+ (fs->n_fatent - 2) * (fs->csize / 2), nfreeclst * (fs->csize / 2)
+ );
+ }
+ }
}
- printf_P(PSTR("\r%u files, %lu bytes.\n%u folders.\n"
- "%lu KB total disk space.\n%lu KB available.\n"),
- AccFiles, AccSize, AccDirs,
- (fs->n_fatent - 2) * (fs->csize / 2), clusters * (fs->csize / 2)
- );
- res = f_mount(NULL, argv[1], 0);
+ f_mount(NULL, argv[1], 0);
if (res) {
put_rc(res);
return CMD_RET_FAILURE;
@@ -396,3 +405,120 @@ command_ret_t do_fat_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
return CMD_RET_SUCCESS;
}
+
+/*
+ * fatread/write - load binary file to/from a dos filesystem
+ * read <d:/path/filename> <addr> [bytes [pos]]
+ * write <d:/path/filename> <addr> <bytes>
+ */
+command_ret_t do_fat_rw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ FATFS FatFs;
+ FIL File;
+ uint32_t addr;
+ unsigned long bytes;
+ unsigned long pos;
+ unsigned long bytes_rw;
+
+ bool dowrite = (argv[0][3] == 'w');
+ FRESULT res;
+ bool buserr = 0;
+ uint32_t timer;
+ uint8_t buffer[512];
+
+ (void) cmdtp; (void) flag;
+
+ if (argc < (dowrite ? 4 : 3))
+ return CMD_RET_USAGE;
+
+ addr = strtoul(argv[2], 0, 16);
+ if (addr >= MAX_MEMORY) {
+ printf_P(PSTR("address too high: 0x%0lx\n"), addr);
+ return CMD_RET_FAILURE;
+ }
+ if (argc > 3)
+ bytes = strtoul(argv[3], 0, 16);
+ else
+ bytes = MAX_MEMORY;
+ if (argc > 4)
+ pos = strtoul(argv[4], 0, 16);
+ else
+ pos = 0;
+
+ if (addr + bytes > MAX_MEMORY)
+ bytes = MAX_MEMORY - addr;
+
+ res = f_mount(&FatFs, argv[1], 0);
+ if (!res) {
+ res = f_open(&File, argv[1], dowrite ? FA_WRITE | FA_CREATE_ALWAYS
+ : FA_READ );
+
+ if (!res) {
+ res = f_lseek(&File, pos);
+ if (!res) {
+ bytes_rw = 0;
+ timer = get_timer(0);
+ while (bytes) {
+ unsigned int cnt, br;
+
+ if (bytes >= sizeof buffer) {
+ cnt = sizeof buffer;
+ bytes -= sizeof buffer;
+ } else {
+ cnt = bytes; bytes = 0;
+ }
+ if (dowrite) {
+ if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+ buserr = 1;
+ break;
+ }
+ z80_read_block(buffer, addr, cnt);
+ z80_bus_cmd(Release);
+ res = f_write(&File, buffer, cnt, &br);
+ if (res != FR_OK)
+ break;
+ } else {
+ res = f_read(&File, buffer, cnt, &br);
+ if (res != FR_OK)
+ break;
+ if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+ buserr = 1;
+ break;
+ }
+ z80_write_block(buffer, addr, br);
+ z80_bus_cmd(Release);
+ }
+ addr += br;
+
+ bytes_rw += br;
+ if (cnt != br) {
+ if (dowrite)
+ printf_P(PSTR("Disk full?\n"));
+ break;
+ }
+ if (ctrlc()) {
+ printf_P(PSTR("Abort\n"));
+ break;
+ }
+ }
+
+ FRESULT fr = f_close(&File);
+ if (!res)
+ res = fr;
+ timer = get_timer(timer);
+ printf_P(PSTR("%lu (0x%lx) bytes read/written with %lu bytes/sec.\n"),
+ bytes_rw, bytes_rw, timer ? (bytes_rw * 1000 / timer) : 0);
+ }
+ }
+ f_mount(NULL, argv[1], 0);
+ }
+
+ if (buserr)
+ my_puts_P(PSTR("Bus timeout\n"));
+ if (res)
+ put_rc(res);
+ if (buserr || res)
+ return CMD_RET_FAILURE;
+
+ return CMD_RET_SUCCESS;
+}
diff --git a/avr/cmd_gpio.c b/avr/cmd_gpio.c
index 84723d2..f448e36 100644
--- a/avr/cmd_gpio.c
+++ b/avr/cmd_gpio.c
@@ -29,6 +29,8 @@ static void pinnames_get(void)
memset(pin_names, 0, sizeof(pin_names));
pin_names_width = 0;
+/* TODO: enters endless loop on wron parameters */
+
if ((lp = getenv(PSTR(ENV_PINALIAS))) != NULL) {
pin_names[namestr] = strdup(lp);
ptr = strtok_P(pin_names[namestr], delim1);
diff --git a/avr/command_tbl.c b/avr/command_tbl.c
index 02d8ac8..e5c6567 100644
--- a/avr/command_tbl.c
+++ b/avr/command_tbl.c
@@ -24,8 +24,10 @@ extern command_ret_t do_gpio(cmd_tbl_t *, int, int, char * const []);
extern command_ret_t do_sd(cmd_tbl_t *, int, int, char * const []);
extern command_ret_t do_fat_stat(cmd_tbl_t *, int, int, char * const []);
extern command_ret_t do_fat_ls(cmd_tbl_t *, int, int, char * const []);
-extern command_ret_t do_fat_read(cmd_tbl_t *, int, int, char * const []);
-extern command_ret_t do_fat_write(cmd_tbl_t *, int, int, char * const []);
+//extern command_ret_t do_fat_read(cmd_tbl_t *, int, int, char * const []);
+//extern command_ret_t do_fat_write(cmd_tbl_t *, int, int, char * const []);
+extern command_ret_t do_fat_rw(cmd_tbl_t *, int, int, char * const []);
+extern command_ret_t do_testarg(cmd_tbl_t *, int, int, char * const []);
#ifdef CONFIG_SYS_LONGHELP
const FLASH char sd_help_text[] =
@@ -47,6 +49,22 @@ CMD_TBL_ITEM(
#ifdef DEBUG
CMD_TBL_ITEM(
+ test, CONFIG_SYS_MAXARGS, 1, do_testarg,
+ "print arguments",
+ ""
+),
+CMD_TBL_ITEM(
+ tst1, CONFIG_SYS_MAXARGS, 1, do_testarg,
+ "print arguments",
+ ""
+),
+CMD_TBL_ITEM(
+ tst2, CONFIG_SYS_MAXARGS, 1, do_testarg,
+ "print arguments",
+ ""
+),
+
+CMD_TBL_ITEM(
!mdr, 3, 1, do_dump_mem,
"RAM dump",
"address [count]"
@@ -254,7 +272,7 @@ CMD_TBL_ITEM(
"path"
),
CMD_TBL_ITEM(
- fatload, 5, 0, do_fat_read,
+ fatload, 5, 0, do_fat_rw,
"load binary file from a dos filesystem",
"<d:/path/filename> <addr> [bytes [pos]]\n"
" - Load binary file 'path/filename' on logical drive 'd'\n"
@@ -265,11 +283,12 @@ CMD_TBL_ITEM(
" the load stops on end of file."
),
CMD_TBL_ITEM(
- fatwrite, 4, 0, do_fat_write,
+ fatwrite, 4, 0, do_fat_rw,
"write file into a dos filesystem",
"<d:/path/filename> <addr> <bytes>\n"
- " - write file 'filename' from the address 'addr' in RAM\n"
- " to 'dev' on 'interface'"
+ " - Write file to 'path/filename' on logical drive 'd' from RAM\n"
+ " starting at address 'addr'. 'bytes' gives the size to load.\n"
+ " If 'bytes' is 0 or omitted, the load stops on end of file."
),
CMD_TBL_ITEM(
diff --git a/avr/debug.c b/avr/debug.c
index 27b5329..796647b 100644
--- a/avr/debug.c
+++ b/avr/debug.c
@@ -112,6 +112,17 @@ command_ret_t do_eep_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
return CMD_RET_SUCCESS;
}
+
+/*------------------------------------------------------------------------------*/
+
+command_ret_t do_testarg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ my_puts_P(cmdtp->name);
+ printf_P(PSTR("\n%s\n"), argv[0]);
+
+ return CMD_RET_SUCCESS;
+}
+
/*------------------------------------------------------------------------------*/