summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-10-29 12:47:04 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-10-29 12:47:04 +0000
commit982ca110ca0b13d4adc5a329705d1b8c3c7b4b96 (patch)
tree525dc5337b66741f46780a266d1fb1b9c1b4a23d /cpukit/libblock
parent2009-10-29 Ralf Corsépius <ralf.corsepius@rtems.org> (diff)
downloadrtems-982ca110ca0b13d4adc5a329705d1b8c3c7b4b96.tar.bz2
Aded ramdisk_register().
Diffstat (limited to 'cpukit/libblock')
-rw-r--r--cpukit/libblock/include/rtems/ramdisk.h19
-rw-r--r--cpukit/libblock/src/ramdisk-init.c47
2 files changed, 66 insertions, 0 deletions
diff --git a/cpukit/libblock/include/rtems/ramdisk.h b/cpukit/libblock/include/rtems/ramdisk.h
index fc40816f54..68c5887abe 100644
--- a/cpukit/libblock/include/rtems/ramdisk.h
+++ b/cpukit/libblock/include/rtems/ramdisk.h
@@ -213,6 +213,25 @@ ramdisk *ramdisk_allocate(
void ramdisk_free(ramdisk *rd);
+/**
+ * @brief Allocates, initializes and registers a RAM disk.
+ *
+ * The block size will be @a block_size. The block count will be @a
+ * block_count. The disk storage will be allocated. Sets the trace enable to
+ * @a trace. Registers a device node with disk name path @a disk. The
+ * registered device number will be returned in @a dev.
+ *
+ * @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_UNSATISFIED Something is wrong.
+ */
+rtems_status_code ramdisk_register(
+ uint32_t block_size,
+ rtems_blkdev_bnum block_count,
+ bool trace,
+ const char *disk,
+ dev_t *dev
+);
+
/** @} */
/** @} */
diff --git a/cpukit/libblock/src/ramdisk-init.c b/cpukit/libblock/src/ramdisk-init.c
index 6ef89dc5a1..9c272b9ea1 100644
--- a/cpukit/libblock/src/ramdisk-init.c
+++ b/cpukit/libblock/src/ramdisk-init.c
@@ -73,3 +73,50 @@ void ramdisk_free(ramdisk *rd)
free(rd);
}
}
+
+rtems_status_code ramdisk_register(
+ uint32_t block_size,
+ rtems_blkdev_bnum block_count,
+ bool trace,
+ const char *disk,
+ dev_t *dev_ptr
+)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ rtems_device_major_number major = 0;
+ ramdisk *rd = NULL;
+ dev_t dev = 0;
+
+ sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
+ if (sc != RTEMS_SUCCESSFUL) {
+ return RTEMS_UNSATISFIED;
+ }
+
+ rd = ramdisk_allocate(NULL, block_size, block_count, trace);
+ if (rd == NULL) {
+ rtems_io_unregister_driver(major);
+
+ return RTEMS_UNSATISFIED;
+ }
+
+ dev = rtems_filesystem_make_dev_t(major, 0);
+
+ sc = rtems_disk_create_phys(
+ dev,
+ block_size,
+ block_count,
+ ramdisk_ioctl,
+ rd,
+ disk
+ );
+ if (sc != RTEMS_SUCCESSFUL) {
+ ramdisk_free(rd);
+ rtems_io_unregister_driver(major);
+
+ return RTEMS_UNSATISFIED;
+ }
+
+ *dev_ptr = dev;
+
+ return RTEMS_SUCCESSFUL;
+}