[Cryptech-Commits] [sw/stm32] 02/02: Generalize the sdram-based file system

git at cryptech.is git at cryptech.is
Tue Jun 21 23:31:05 UTC 2016


This is an automated email from the git hooks/post-receive script.

paul at psgd.org pushed a commit to branch ekermit
in repository sw/stm32.

commit 6c32e2df4c4b4ee70885fcd729e68bf25fdd8ada
Author: Paul Selkirk <paul at psgd.org>
AuthorDate: Tue Jun 21 19:25:40 2016 -0400

    Generalize the sdram-based file system
---
 sdram-fs.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sdram-fs.h |  23 ++++++++++++++
 2 files changed, 129 insertions(+)

diff --git a/sdram-fs.c b/sdram-fs.c
new file mode 100644
index 0000000..c0fcc09
--- /dev/null
+++ b/sdram-fs.c
@@ -0,0 +1,106 @@
+#include "sdram-malloc.h"
+#include "sdram-fs.h"
+
+/* maximum number of files */
+#ifndef SDFS_NFILE
+#define SDFS_NFILE 4
+#endif
+
+__attribute__((section(".sdram1"))) filetab_t filetab[SDFS_NFILE];
+static filetab_t *curfile;
+static int nfile;
+static int initialized = 0;
+
+/* Initialize the SDRAM file system
+ */
+int sdfs_init(void)
+{
+    if (initialized && nfile)
+        sdram_free(filetab[0].loc);
+    memset((void *)filetab, 0, sizeof(filetab));
+    curfile = NULL;
+    nfile = 0;
+    initialized = 1;
+}
+
+/* Return the number of entries in the file table
+ */
+int sdfs_count(void)
+{
+    return nfile;
+}
+
+/* Return the first entry in the file table
+ */
+filetab_t *sdfs_first(void)
+{
+    curfile = filetab;
+    return nfile ? curfile : NULL;
+}
+
+/* Return the next entry in the file table
+ */
+filetab_t *sdfs_next(void)
+{
+    return (++curfile < &filetab[nfile]) ? curfile : NULL;
+}
+
+/* Open (create) a new file
+ */
+int sdfs_open(unsigned char *name)
+{
+    if (nfile == SDFS_NFILE) {
+        curfile = NULL;
+        return -1;
+    }
+    curfile = &filetab[nfile];
+    strncpy(curfile->name, (char *)name, sizeof(curfile->name));
+    curfile->loc = sdram_malloc(0);
+    if (curfile->loc == NULL) {
+        curfile = NULL;
+        return -1;
+    }
+    curfile->len = 0;
+    ++nfile;
+    return 0;
+}
+
+/* Write data to the open file
+ */
+int sdfs_write(unsigned char *buf, int len)
+{
+    if (curfile == NULL)
+        return -1;
+    uint8_t *writeptr = sdram_malloc(len);
+    if (writeptr == NULL)
+        return -1;
+    memcpy(writeptr, buf, len);
+    curfile->len += len;
+    return 0;
+}
+
+/* Close the open file
+ */
+int sdfs_close(void)
+{
+    if (curfile == NULL)
+        return -1;
+    int pad = ALIGN - (curfile->len & (ALIGN - 1));
+    if (sdram_malloc(pad) == NULL)
+        return -1;
+    curfile = NULL;
+    return 0;
+}
+
+/* Close and remove the open file
+ */
+int sdfs_cancel(void)
+{
+    if (curfile == NULL)
+        return -1;
+    sdram_free(curfile->loc);
+    memset(curfile, 0, sizeof(*curfile));
+    --nfile;
+    return 0;
+}
+
diff --git a/sdram-fs.h b/sdram-fs.h
new file mode 100644
index 0000000..6bab0bb
--- /dev/null
+++ b/sdram-fs.h
@@ -0,0 +1,23 @@
+#include <stdint.h>
+#include <stddef.h>
+
+/* alignment for file allocations */
+#define SDFS_ALIGN 16
+
+/* maximum length of file name */
+#define SDFS_NAMELEN 32
+
+typedef struct {
+  char name[SDFS_NAMELEN];
+  uint8_t *loc;
+  size_t len;
+} filetab_t;
+
+extern int sdfs_init(void);
+extern int sdfs_count(void);
+extern filetab_t *sdfs_first(void);
+extern filetab_t *sdfs_next(void);
+extern int sdfs_open(unsigned char *name);
+extern int sdfs_write(unsigned char *buf, int len);
+extern int sdfs_close(void);
+extern int sdfs_cancel(void);



More information about the Commits mailing list