File indexing completed on 2025-05-11 08:24:31
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifdef HAVE_CONFIG_H
0037 #include "config.h"
0038 #endif
0039
0040 #include <sys/stat.h>
0041 #include <stdio.h>
0042 #include <fcntl.h>
0043 #include "tmacros.h"
0044
0045 #include <rtems.h>
0046 #include <rtems/ramdisk.h>
0047 #include <rtems/diskdevs.h>
0048
0049 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
0050
0051 const char rtems_test_name[] = "BLOCK 1";
0052
0053 #define ASSERT_SC(sc) rtems_test_assert((sc) == RTEMS_SUCCESSFUL)
0054
0055 #define ASSERT_SC_EQ(sc, sc_expected) rtems_test_assert((sc) == (sc_expected))
0056
0057 #define BLOCK_SIZE 512U
0058
0059 #define BLOCK_COUNT 16U
0060
0061 static const rtems_driver_address_table ramdisk_ops = {
0062 .initialization_entry = NULL,
0063 RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES
0064 };
0065
0066 static void test_block_io_control_api(dev_t dev, ramdisk *rd)
0067 {
0068 rtems_status_code sc = RTEMS_SUCCESSFUL;
0069 rtems_disk_device *dd = NULL;
0070 rtems_disk_device *fd_dd = NULL;
0071 int fd = -1;
0072 int rv = -1;
0073 uint32_t value = 0;
0074 rtems_blkdev_bnum block_count = 0;
0075
0076 sc = rtems_disk_create_phys(dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0077 ASSERT_SC(sc);
0078
0079 dd = rtems_disk_obtain(dev);
0080 rtems_test_assert(dd != NULL);
0081
0082 fd = open("/dev/rda", O_RDWR);
0083 rtems_test_assert(fd >= 0);
0084
0085 value = 0;
0086 rv = rtems_disk_fd_get_media_block_size(fd, &value);
0087 rtems_test_assert(rv == 0);
0088 rtems_test_assert(value == BLOCK_SIZE);
0089
0090 value = 0;
0091 rv = rtems_disk_fd_get_block_size(fd, &value);
0092 rtems_test_assert(rv == 0);
0093 rtems_test_assert(value == BLOCK_SIZE);
0094
0095 value = 1024;
0096 rv = rtems_disk_fd_set_block_size(fd, value);
0097 rtems_test_assert(rv == 0);
0098
0099 value = 0;
0100 rv = rtems_disk_fd_get_block_size(fd, &value);
0101 rtems_test_assert(rv == 0);
0102 rtems_test_assert(value == 1024);
0103
0104 block_count = 0;
0105 rv = rtems_disk_fd_get_block_count(fd, &block_count);
0106 rtems_test_assert(rv == 0);
0107 rtems_test_assert(block_count == BLOCK_COUNT);
0108
0109 rv = rtems_disk_fd_get_disk_device(fd, &fd_dd);
0110 rtems_test_assert(rv == 0);
0111 rtems_test_assert(fd_dd == dd);
0112
0113 rv = rtems_disk_fd_sync(fd);
0114 rtems_test_assert(rv == 0);
0115
0116 rv = close(fd);
0117 rtems_test_assert(rv == 0);
0118
0119 sc = rtems_disk_release(dd);
0120 ASSERT_SC(sc);
0121
0122 sc = rtems_disk_delete(dev);
0123 ASSERT_SC(sc);
0124 }
0125
0126 static void test_diskdevs(void)
0127 {
0128 rtems_status_code sc = RTEMS_SUCCESSFUL;
0129 rtems_device_major_number major = 0;
0130 rtems_device_minor_number minor = 0;
0131 rtems_disk_device *physical_dd = NULL;
0132 rtems_disk_device *logical_dd = NULL;
0133 rtems_disk_device *dd = NULL;
0134 dev_t physical_dev = 0;
0135 dev_t logical_dev = 0;
0136 dev_t logical_2_dev = 0;
0137 dev_t const big_major_dev = rtems_filesystem_make_dev_t((rtems_device_major_number) -2, 0);
0138 dev_t const big_minor_dev = rtems_filesystem_make_dev_t(0, (rtems_device_minor_number) -2);
0139 ramdisk *const rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false);
0140
0141 rtems_test_assert(rd != NULL);
0142
0143 sc = rtems_disk_io_initialize();
0144 ASSERT_SC(sc);
0145
0146 sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
0147 ASSERT_SC(sc);
0148
0149 physical_dev = rtems_filesystem_make_dev_t(major, minor);
0150 logical_dev = rtems_filesystem_make_dev_t(major, minor + 1);
0151 logical_2_dev = rtems_filesystem_make_dev_t(major, minor + 2);
0152
0153
0154
0155 sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, NULL, rd, "/dev/rda");
0156 ASSERT_SC_EQ(sc, RTEMS_INVALID_ADDRESS);
0157
0158 sc = rtems_disk_create_phys(physical_dev, 0, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0159 ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER);
0160
0161 sc = rtems_disk_create_phys(big_major_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0162 ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY);
0163
0164 sc = rtems_disk_create_phys(big_minor_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0165 ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY);
0166
0167 sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, NULL);
0168 ASSERT_SC(sc);
0169
0170 sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, NULL);
0171 ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE);
0172
0173 sc = rtems_disk_delete(physical_dev);
0174 ASSERT_SC(sc);
0175
0176
0177
0178 sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1");
0179 ASSERT_SC_EQ(sc, RTEMS_INVALID_ID);
0180
0181 sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0182 ASSERT_SC(sc);
0183
0184 sc = rtems_disk_create_log(big_major_dev, physical_dev, 0, 1, "/dev/rda1");
0185 ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY);
0186
0187 sc = rtems_disk_create_log(big_minor_dev, physical_dev, 0, 1, "/dev/rda1");
0188 ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY);
0189
0190 sc = rtems_disk_create_log(logical_dev, physical_dev, BLOCK_COUNT, 0, "/dev/rda1");
0191 ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER);
0192
0193 sc = rtems_disk_create_log(logical_dev, physical_dev, 0, BLOCK_COUNT + 1, "/dev/rda1");
0194 ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER);
0195
0196 sc = rtems_disk_create_log(logical_dev, physical_dev, 1, BLOCK_COUNT, "/dev/rda1");
0197 ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER);
0198
0199 sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1");
0200 ASSERT_SC(sc);
0201
0202 sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1");
0203 ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE);
0204
0205 sc = rtems_disk_create_log(logical_2_dev, logical_dev, 0, 1, "/dev/rda2");
0206 ASSERT_SC_EQ(sc, RTEMS_INVALID_ID);
0207
0208 sc = rtems_disk_delete(logical_dev);
0209 ASSERT_SC(sc);
0210
0211
0212
0213 sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1");
0214 ASSERT_SC(sc);
0215
0216 physical_dd = rtems_disk_obtain(physical_dev);
0217 rtems_test_assert(physical_dd != NULL && physical_dd->uses == 2);
0218
0219 sc = rtems_disk_release(physical_dd);
0220 ASSERT_SC(sc);
0221
0222 logical_dd = rtems_disk_obtain(logical_dev);
0223 rtems_test_assert(logical_dd != NULL && logical_dd->uses == 1);
0224
0225 sc = rtems_disk_delete(physical_dev);
0226 ASSERT_SC(sc);
0227
0228 sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda");
0229 ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE);
0230
0231 dd = rtems_disk_obtain(physical_dev);
0232 rtems_test_assert(dd == NULL);
0233
0234 dd = rtems_disk_obtain(logical_dev);
0235 rtems_test_assert(dd == NULL);
0236
0237 sc = rtems_disk_release(logical_dd);
0238 ASSERT_SC(sc);
0239
0240
0241
0242 test_block_io_control_api(physical_dev, rd);
0243
0244
0245
0246 sc = rtems_io_unregister_driver(major);
0247 ASSERT_SC(sc);
0248
0249 ramdisk_free(rd);
0250
0251 sc = rtems_disk_io_done();
0252 ASSERT_SC(sc);
0253 }
0254
0255 static rtems_task Init(rtems_task_argument argument)
0256 {
0257 TEST_BEGIN();
0258
0259 test_diskdevs();
0260
0261 TEST_END();
0262
0263 exit(0);
0264 }
0265
0266 #define CONFIGURE_INIT
0267
0268 #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
0269 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0270 #define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
0271
0272 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4
0273
0274 #define CONFIGURE_MAXIMUM_TASKS 1
0275 #define CONFIGURE_MAXIMUM_DRIVERS 2
0276
0277 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0278
0279 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0280
0281 #include <rtems/confdefs.h>