ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/uboot/fs/fdos/fdos.c b/marvell/uboot/fs/fdos/fdos.c
new file mode 100644
index 0000000..4e2f479
--- /dev/null
+++ b/marvell/uboot/fs/fdos/fdos.c
@@ -0,0 +1,156 @@
+/*
+ * (C) Copyright 2002
+ * Stäubli Faverges - <www.staubli.com>
+ * Pierre AUBERT  p.aubert@staubli.com
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <config.h>
+#include <malloc.h>
+
+#include "dos.h"
+#include "fdos.h"
+
+
+const char *month [] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+Fs_t    fs;
+File_t  file;
+
+/*-----------------------------------------------------------------------------
+ * dos_open --
+ *-----------------------------------------------------------------------------
+ */
+int dos_open(char *name)
+{
+    int lg;
+    int entry;
+    char *fname;
+
+    /* We need to suppress the " char around the name                        */
+    if (name [0] == '"') {
+	name ++;
+    }
+    lg = strlen (name);
+    if (name [lg - 1] == '"') {
+	name [lg - 1] = '\0';
+    }
+
+    /* Open file system                                                      */
+    if (fs_init (&fs) < 0) {
+	return -1;
+    }
+
+    /* Init the file descriptor                                              */
+    file.name = name;
+    file.fs = &fs;
+
+    /* find the subdirectory containing the file                             */
+    if (open_subdir (&file) < 0) {
+	return (-1);
+    }
+
+    fname = basename (name);
+
+    /* if we try to open root directory                                      */
+    if (*fname == '\0') {
+	file.file = file.subdir;
+	return (0);
+    }
+
+    /* find the file in the subdir                                           */
+    entry = 0;
+    if (vfat_lookup (&file.subdir,
+		     file.fs,
+		     &file.file.dir,
+		     &entry,
+		     0,
+		     fname,
+		     ACCEPT_DIR | ACCEPT_PLAIN | SINGLE | DO_OPEN,
+		     0,
+		     &file.file) != 0) {
+	/* File not found                                                    */
+	printf ("File not found\n");
+	return (-1);
+    }
+
+    return 0;
+}
+
+/*-----------------------------------------------------------------------------
+ * dos_read --
+ *-----------------------------------------------------------------------------
+ */
+int dos_read (ulong addr)
+{
+    int read = 0, nb;
+
+    /* Try to boot a directory ?                                             */
+    if (file.file.dir.attr & (ATTR_DIRECTORY | ATTR_VOLUME)) {
+	printf ("Unable to boot %s !!\n", file.name);
+	return (-1);
+    }
+    while (read < file.file.FileSize) {
+	PRINTF ("read_file (%ld)\n", (file.file.FileSize - read));
+	nb = read_file (&fs,
+			&file.file,
+			(char *)addr + read,
+			read,
+			(file.file.FileSize - read));
+	PRINTF ("read_file -> %d\n", nb);
+	if (nb < 0) {
+	    printf ("read error\n");
+	    return (-1);
+	}
+	read += nb;
+    }
+    return (read);
+}
+/*-----------------------------------------------------------------------------
+ * dos_dir --
+ *-----------------------------------------------------------------------------
+ */
+int dos_dir (void)
+{
+    int entry;
+    Directory_t dir;
+    char *name;
+
+
+    if ((file.file.dir.attr & ATTR_DIRECTORY) == 0) {
+	printf ("%s: not a directory !!\n", file.name);
+	return (1);
+    }
+    entry = 0;
+    if ((name = malloc (MAX_VNAMELEN + 1)) == NULL) {
+	PRINTF ("Allcation error\n");
+	return (1);
+    }
+
+    while (vfat_lookup (&file.file,
+			file.fs,
+			&dir,
+			&entry,
+			0,
+			NULL,
+			ACCEPT_DIR | ACCEPT_PLAIN | MATCH_ANY,
+			name,
+			NULL) == 0) {
+	/* Display file info                                                 */
+	printf ("%3.3s %9d %s %02d %04d %02d:%02d:%02d %s\n",
+		(dir.attr & ATTR_DIRECTORY) ? "dir" : "   ",
+		__le32_to_cpu (dir.size),
+		month [DOS_MONTH (&dir) - 1],
+		DOS_DAY (&dir),
+		DOS_YEAR (&dir),
+		DOS_HOUR (&dir),
+		DOS_MINUTE (&dir),
+		DOS_SEC (&dir),
+		name);
+
+    }
+    free (name);
+    return (0);
+}