source: rtems/cpukit/libblock/src/ramdisk-init.c @ 3d5515b

4.104.115
Last change on this file since 3d5515b was 982ca110, checked in by Thomas Doerfler <Thomas.Doerfler@…>, on 10/29/09 at 12:47:04

Aded ramdisk_register().

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup rtems_ramdisk
5 *
6 * @brief RAM disk block device implementation.
7 */
8
9/*
10 * Copyright (c) 2009
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * <rtems@embedded-brains.de>
16 *
17 * The license and distribution terms for this file may be
18 * found in the file LICENSE in this distribution or at
19 * http://www.rtems.com/license/LICENSE.
20 *
21 * $Id$
22 */
23
24#include <stdlib.h>
25
26#include <rtems.h>
27#include <rtems/ramdisk.h>
28
29const rtems_driver_address_table ramdisk_ops = {
30  .initialization_entry = NULL,
31  RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES
32};
33
34ramdisk *ramdisk_allocate(
35  void *area_begin,
36  uint32_t block_size,
37  rtems_blkdev_bnum block_count,
38  bool trace
39)
40{
41  struct ramdisk *rd = malloc(sizeof(struct ramdisk));
42
43  if (rd == NULL) {
44    return NULL;
45  }
46
47  if (area_begin == NULL) {
48    area_begin = calloc(block_count, block_size);
49    if (area_begin == NULL) {
50      free(rd);
51
52      return NULL;
53    }
54    rd->malloced = true;
55  } else {
56    rd->malloced = false;
57  }
58  rd->block_size = block_size;
59  rd->block_num = block_count;
60  rd->area = area_begin;
61  rd->trace = trace;
62  rd->initialized = true;
63
64  return rd;
65}
66
67void ramdisk_free(ramdisk *rd)
68{
69  if (rd != NULL) {
70    if (rd->malloced) {
71      free(rd->area);
72    }
73    free(rd);
74  }
75}
76
77rtems_status_code ramdisk_register(
78  uint32_t block_size,
79  rtems_blkdev_bnum block_count,
80  bool trace,
81  const char *disk,
82  dev_t *dev_ptr
83)
84{
85  rtems_status_code sc = RTEMS_SUCCESSFUL;
86  rtems_device_major_number major = 0;
87  ramdisk *rd = NULL;
88  dev_t dev = 0;
89
90  sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
91  if (sc != RTEMS_SUCCESSFUL) {
92    return RTEMS_UNSATISFIED;
93  }
94
95  rd = ramdisk_allocate(NULL, block_size, block_count, trace);
96  if (rd == NULL) {
97    rtems_io_unregister_driver(major);
98
99    return RTEMS_UNSATISFIED;
100  }
101
102  dev = rtems_filesystem_make_dev_t(major, 0);
103
104  sc = rtems_disk_create_phys(
105    dev,
106    block_size,
107    block_count,
108    ramdisk_ioctl,
109    rd,
110    disk
111  );
112  if (sc != RTEMS_SUCCESSFUL) {
113    ramdisk_free(rd);
114    rtems_io_unregister_driver(major);
115
116    return RTEMS_UNSATISFIED;
117  }
118
119  *dev_ptr = dev;
120
121  return RTEMS_SUCCESSFUL;
122}
Note: See TracBrowser for help on using the repository browser.