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