source: rtems/cpukit/libblock/src/ramdisk-driver.c @ 694c3ac6

4.104.115
Last change on this file since 694c3ac6 was 694c3ac6, checked in by Ralf Corsepius <ralf.corsepius@…>, on 03/28/10 at 03:14:08

Add HAVE_CONFIG_H support to let files receive configure defines.

  • Property mode set to 100644
File size: 3.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) 2001 OKTET Ltd., St.-Petersburg, Russia
11 * Author: Victor V. Vengerov <vvv@oktet.ru>
12 *
13 * @(#) $Id$
14 */
15
16#ifdef HAVE_CONFIG_H
17#include "config.h"
18#endif
19
20/* FIXME: How to set this define? */
21#if !defined(RTEMS_RAMDISK_TRACE)
22    #define RTEMS_RAMDISK_TRACE 0
23#endif
24
25#include <stdlib.h>
26#include <errno.h>
27#include <string.h>
28
29#if RTEMS_RAMDISK_TRACE
30    #include <stdio.h>
31#endif
32
33#include <rtems.h>
34#include <rtems/ramdisk.h>
35
36#if RTEMS_RAMDISK_TRACE
37    static void
38    rtems_ramdisk_printf (const ramdisk *rd, const char *format, ...)
39    {
40        if (rd->trace)
41        {
42            va_list args;
43            va_start (args, format);
44            printf ("ramdisk:");
45            vprintf (format, args);
46            printf ("\n");
47        }
48    }
49#endif
50
51static int
52ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
53{
54    uint8_t *from = rd->area;
55    uint32_t   i;
56    rtems_blkdev_sg_buffer *sg;
57
58#if RTEMS_RAMDISK_TRACE
59    rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
60                          req->bufs[0].block, req->bufnum);
61#endif
62
63    for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
64    {
65#if RTEMS_RAMDISK_TRACE
66        rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
67                              i, sg->block, sg->length, sg->block * rd->block_size,
68                              from + (sg->block * rd->block_size));
69#endif
70        memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
71    }
72    req->status = RTEMS_SUCCESSFUL;
73    req->req_done(req->done_arg, RTEMS_SUCCESSFUL);
74    return 0;
75}
76
77static int
78ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
79{
80    uint8_t *to = rd->area;
81    uint32_t   i;
82    rtems_blkdev_sg_buffer *sg;
83
84#if RTEMS_RAMDISK_TRACE
85    rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
86                          req->bufs[0].block, req->bufnum);
87#endif
88    for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
89    {
90#if RTEMS_RAMDISK_TRACE
91        rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
92                              i, sg->block, sg->length, sg->block * rd->block_size,
93                              to + (sg->block * rd->block_size));
94#endif
95        memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
96    }
97    req->status = RTEMS_SUCCESSFUL;
98    req->req_done(req->done_arg, RTEMS_SUCCESSFUL);
99    return 0;
100}
101
102int
103ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
104{
105    switch (req)
106    {
107        case RTEMS_BLKIO_REQUEST:
108        {
109            rtems_blkdev_request *r = argp;
110            struct ramdisk *rd = rtems_disk_get_driver_data(dd);
111
112            switch (r->req)
113            {
114                case RTEMS_BLKDEV_REQ_READ:
115                    return ramdisk_read(rd, r);
116
117                case RTEMS_BLKDEV_REQ_WRITE:
118                    return ramdisk_write(rd, r);
119
120                default:
121                    errno = EINVAL;
122                    return -1;
123            }
124            break;
125        }
126
127        default:
128            return rtems_blkdev_ioctl (dd, req, argp);
129            break;
130    }
131
132    errno = EINVAL;
133    return -1;
134}
Note: See TracBrowser for help on using the repository browser.