summaryrefslogtreecommitdiffstats
path: root/cpukit/libdrvmgr/drvmgr_rw.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdrvmgr/drvmgr_rw.c')
-rw-r--r--cpukit/libdrvmgr/drvmgr_rw.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/cpukit/libdrvmgr/drvmgr_rw.c b/cpukit/libdrvmgr/drvmgr_rw.c
new file mode 100644
index 0000000000..6530cddc6d
--- /dev/null
+++ b/cpukit/libdrvmgr/drvmgr_rw.c
@@ -0,0 +1,52 @@
+/* Driver Manager Read/Write Interface Implementation.
+ *
+ * COPYRIGHT (c) 2009.
+ * Cobham Gaisler AB.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <string.h>
+#include <drvmgr/drvmgr.h>
+
+/* Set a range of memory in 128 byte chunks.
+ * This call will take 128 bytes for buffer on stack
+ */
+void drvmgr_rw_memset(
+ void *dstadr,
+ int c,
+ size_t n,
+ void *a,
+ drvmgr_wmem_arg wmem
+ )
+{
+ unsigned long long buf[16+1]; /* Extra bytes after data are reserved
+ * for optimizations by write_mem */
+ int txlen;
+ char *adr;
+
+ if (n <= 0)
+ return;
+
+ if (n > sizeof(unsigned long long)*16)
+ txlen = sizeof(unsigned long long)*16;
+ else
+ txlen = n;
+
+ memset(buf, c, txlen);
+
+ adr = dstadr;
+ do {
+ wmem(adr, (const void *)&buf[0], txlen, a);
+ adr += txlen;
+ n -= txlen;
+
+ /* next length to transmitt */
+ if (n > 16*sizeof(unsigned long long))
+ txlen = 16*sizeof(unsigned long long);
+ else
+ txlen = n;
+ } while (n > 0);
+}