Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:14

0001 /**
0002  * @file
0003  *
0004  * @ingroup rtems_ramdisk
0005  *
0006  * @brief RAM disk block device implementation.
0007  */
0008 
0009 /*
0010  * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
0011  * Author: Victor V. Vengerov <vvv@oktet.ru>
0012  */
0013 
0014 #ifdef HAVE_CONFIG_H
0015 #include "config.h"
0016 #endif
0017 
0018 /* FIXME: How to set this define? */
0019 #if !defined(RTEMS_RAMDISK_TRACE)
0020     #define RTEMS_RAMDISK_TRACE 0
0021 #endif
0022 
0023 #include <stdlib.h>
0024 #include <errno.h>
0025 #include <string.h>
0026 
0027 #if RTEMS_RAMDISK_TRACE
0028     #include <stdio.h>
0029 #endif
0030 
0031 #include <rtems.h>
0032 #include <rtems/ramdisk.h>
0033 
0034 #if RTEMS_RAMDISK_TRACE
0035     static void
0036     rtems_ramdisk_printf (const ramdisk *rd, const char *format, ...)
0037     {
0038         if (rd->trace)
0039         {
0040             va_list args;
0041             va_start (args, format);
0042             printf ("ramdisk:");
0043             vprintf (format, args);
0044             printf ("\n");
0045         }
0046     }
0047 #endif
0048 
0049 static int
0050 ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
0051 {
0052     uint8_t *from = rd->area;
0053     uint32_t   i;
0054     rtems_blkdev_sg_buffer *sg;
0055 
0056 #if RTEMS_RAMDISK_TRACE
0057     rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
0058                           req->bufs[0].block, req->bufnum);
0059 #endif
0060 
0061     for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
0062     {
0063 #if RTEMS_RAMDISK_TRACE
0064         rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
0065                               i, sg->block, sg->length, sg->block * rd->block_size,
0066                               from + (sg->block * rd->block_size));
0067 #endif
0068         memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
0069     }
0070     rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
0071     return 0;
0072 }
0073 
0074 static int
0075 ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
0076 {
0077     uint8_t *to = rd->area;
0078     uint32_t   i;
0079     rtems_blkdev_sg_buffer *sg;
0080 
0081 #if RTEMS_RAMDISK_TRACE
0082     rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
0083                           req->bufs[0].block, req->bufnum);
0084 #endif
0085     for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
0086     {
0087 #if RTEMS_RAMDISK_TRACE
0088         rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
0089                               i, sg->block, sg->length, sg->block * rd->block_size,
0090                               to + (sg->block * rd->block_size));
0091 #endif
0092         memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
0093     }
0094     rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
0095     return 0;
0096 }
0097 
0098 int
0099 ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
0100 {
0101     struct ramdisk *rd = rtems_disk_get_driver_data(dd);
0102 
0103     switch (req)
0104     {
0105         case RTEMS_BLKIO_REQUEST:
0106         {
0107             rtems_blkdev_request *r = argp;
0108 
0109             switch (r->req)
0110             {
0111                 case RTEMS_BLKDEV_REQ_READ:
0112                     return ramdisk_read(rd, r);
0113 
0114                 case RTEMS_BLKDEV_REQ_WRITE:
0115                     return ramdisk_write(rd, r);
0116 
0117                 default:
0118                     errno = EINVAL;
0119                     return -1;
0120             }
0121             break;
0122         }
0123 
0124         case RTEMS_BLKIO_DELETED:
0125             if (rd->free_at_delete_request) {
0126               ramdisk_free(rd);
0127             }
0128             break;
0129 
0130         default:
0131             return rtems_blkdev_ioctl (dd, req, argp);
0132             break;
0133     }
0134 
0135     errno = EINVAL;
0136     return -1;
0137 }