int IMFS_stat( const rtems_filesystem_location_info_t *loc, struct stat *buf ) { IMFS_fs_info_t *fs_info = loc->mt_entry->fs_info; IMFS_jnode_t *the_jnode = loc->node_access; /* * The device number of the IMFS is the major number and the minor is the * instance. */ buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; buf->st_uid = the_jnode->st_uid; buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; return 0; }
/* * ide_controller_initialize -- * Initializes all configured IDE controllers. Controllers configuration * table is provided by BSP * * PARAMETERS: * major - device major number * minor_arg - device minor number * args - arguments * * RETURNS: * RTEMS_SUCCESSFUL on success, or error code if * error occured */ rtems_device_driver ide_controller_initialize(rtems_device_major_number major, rtems_device_minor_number minor_arg, void *args) { unsigned long minor; /* FIXME: may be it should be done on compilation phase */ if (IDE_Controller_Count > IDE_CTRL_MAX_MINOR_NUMBER) rtems_fatal_error_occurred(RTEMS_TOO_MANY); for (minor=0; minor < IDE_Controller_Count; minor++) { IDE_Controller_Table[minor].status = IDE_CTRL_NON_INITIALIZED; if ((IDE_Controller_Table[minor].probe == NULL || IDE_Controller_Table[minor].probe(minor)) && (IDE_Controller_Table[minor].fns->ctrl_probe == NULL || IDE_Controller_Table[minor].fns->ctrl_probe(minor))) { dev_t dev; dev = rtems_filesystem_make_dev_t( major, minor ); if (mknod(IDE_Controller_Table[minor].name, 0777 | S_IFBLK, dev ) < 0) rtems_fatal_error_occurred(errno); IDE_Controller_Table[minor].fns->ctrl_initialize(minor); IDE_Controller_Table[minor].status = IDE_CTRL_INITIALIZED; } } return RTEMS_SUCCESSFUL; }
static void bdbuf_tests_task_0_test_7 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; rtems_chain_control buffers; dev_t device; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; /* * Clear any disk settings. */ bdbuf_clear_disk_driver_watch (tc); bdbuf_set_disk_driver_action (tc, BDBUF_DISK_NOOP); device = rtems_filesystem_make_dev_t (tc->major, tc->minor); /* * Get the blocks 0 -> 4 and hold them. */ rtems_chain_initialize_empty (&buffers); for (i = 0; (i < 5) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i); sc = rtems_bdbuf_get (device, i, &bd); if (!bdbuf_test_print_sc (sc, true)) passed = false; rtems_chain_append (&buffers, &bd->link); } for (i = 0; (i < 5) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: ", tc->name, i); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); passed = bdbuf_test_print_sc (rtems_bdbuf_release_modified (bd), true); } if (passed) { bdbuf_test_printf ("%s: rtems_bdbuf_syncdev[%d:%d]: ", tc->name, i, rtems_filesystem_dev_major_t (device), rtems_filesystem_dev_minor_t (device)); passed = bdbuf_test_print_sc (rtems_bdbuf_syncdev (device), true); } tc->passed = passed; tc->test = 0; }
static void disk_register( uint32_t block_size, rtems_blkdev_bnum block_count, rtems_disk_device **dd_ptr ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_device_major_number major = 0; dev_t dev = 0; sc = rtems_io_register_driver(0, &disk_ops, &major); ASSERT_SC(sc); dev = rtems_filesystem_make_dev_t(major, 0); sc = rtems_disk_create_phys( dev, block_size, block_count, disk_ioctl, NULL, NULL ); ASSERT_SC(sc); *dd_ptr = rtems_disk_obtain(dev); rtems_test_assert(*dd_ptr!= NULL); }
static rtems_status_code disk_register( uint32_t block_size, rtems_blkdev_bnum block_count, dev_t *dev_ptr ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_device_major_number major = 0; dev_t dev = 0; sc = rtems_io_register_driver(0, &disk_ops, &major); ASSERT_SC(sc); dev = rtems_filesystem_make_dev_t(major, 0); sc = rtems_disk_create_phys( dev, block_size, block_count, disk_ioctl, NULL, NULL ); ASSERT_SC(sc); *dev_ptr = dev; return RTEMS_SUCCESSFUL; }
/* * rtems_ide_part_table_initialize - initializes logical devices * on the physical IDE drive * * PARAMETERS: * dev_name - path to physical device in /dev filesystem * * RETURNS: * RTEMS_SUCCESSFUL if success, * RTEMS_NO_MEMOTY if cannot have not enough memory, * RTEMS_INTERNAL_ERROR if other error occurs. */ rtems_status_code rtems_ide_part_table_initialize(const char *dev_name) { int part_num; dev_t dev; rtems_disk_desc_t *disk_desc; rtems_device_major_number major; rtems_device_minor_number minor; rtems_status_code rc; rtems_part_desc_t *part_desc; /* logical device name /dev/hdxyy */ char name[RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX]; disk_desc = (rtems_disk_desc_t *) calloc(1, sizeof(rtems_disk_desc_t)); if (disk_desc == NULL) { return RTEMS_NO_MEMORY; } /* get partition table */ rc = partition_table_get(dev_name, disk_desc); if (rc != RTEMS_SUCCESSFUL) { free(disk_desc); return rc; } /* To avoid device numbers conflicts we have to use for logic disk the same * device major number as ATA device has, and minor number that equals to * sum of logic disk partition number and the minor number of physical disk */ rtems_filesystem_split_dev_t (disk_desc->dev, major, minor); /* create logical disks on the physical one */ for (part_num = 0; part_num < disk_desc->last_log_id; part_num++) { sprintf(name, "%s%d", dev_name, part_num + 1); dev = rtems_filesystem_make_dev_t(major, ++minor); part_desc = disk_desc->partitions[part_num]; if (part_desc == NULL) { continue; } rc = rtems_disk_create_log(dev, disk_desc->dev, part_desc->start, part_desc->size, name); if (rc != RTEMS_SUCCESSFUL) { fprintf(stdout,"Cannot create device %s, error code %d\n", name, rc); continue; } } partition_table_free(disk_desc); return RTEMS_SUCCESSFUL; }
/* ramdisk_initialize -- * RAM disk device driver initialization. Run through RAM disk * configuration information and configure appropriate RAM disks. * * PARAMETERS: * major - RAM disk major device number * minor - minor device number, not applicable * arg - initialization argument, not applicable * * RETURNS: * none */ rtems_device_driver ramdisk_initialize( rtems_device_major_number major, rtems_device_minor_number minor, void *arg) { rtems_device_minor_number i; rtems_ramdisk_config *c = rtems_ramdisk_configuration; struct ramdisk *r; rtems_status_code rc; rc = rtems_disk_io_initialize(); if (rc != RTEMS_SUCCESSFUL) return rc; r = ramdisk = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk)); for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++) { dev_t dev = rtems_filesystem_make_dev_t(major, i); char name[sizeof(RAMDISK_DEVICE_BASE_NAME "0123456789")]; snprintf(name, sizeof(name), RAMDISK_DEVICE_BASE_NAME "%" PRIu32, i); r->block_size = c->block_size; r->block_num = c->block_num; if (c->location == NULL) { r->malloced = TRUE; r->area = malloc(r->block_size * r->block_num); if (r->area == NULL) /* No enough memory for this disk */ { r->initialized = FALSE; continue; } else { r->initialized = TRUE; } } else { r->malloced = FALSE; r->initialized = TRUE; r->area = c->location; } rc = rtems_disk_create_phys(dev, c->block_size, c->block_num, ramdisk_ioctl, name); if (rc != RTEMS_SUCCESSFUL) { if (r->malloced) { free(r->area); } r->initialized = FALSE; } } nramdisks = rtems_ramdisk_configuration_size; return RTEMS_SUCCESSFUL; }
/** * Read the block 5 from the disk modify it then release it modified. */ static void bdbuf_tests_task_0_test_3 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; rtems_bdbuf_buffer* bd; dev_t device; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_disk_lock (&bdbuf_disks[tc->minor]); bdbuf_disks[tc->minor].driver_action = BDBUF_DISK_NOOP; bdbuf_disk_unlock (&bdbuf_disks[tc->minor]); /* * Read the buffer and then release it. */ bdbuf_test_printf ("%s: rtems_bdbuf_read[5]: ", tc->name); sc = rtems_bdbuf_read (device, 5, &bd); if ((passed = bdbuf_test_print_sc (sc, true))) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[5]: ", tc->name); sc = rtems_bdbuf_release_modified (bd); passed = bdbuf_test_print_sc (sc, true); } /* * Read the buffer again and then just release. The buffer should * be maintained as modified. */ bdbuf_test_printf ("%s: rtems_bdbuf_read[5]: ", tc->name); sc = rtems_bdbuf_read (device, 5, &bd); if ((passed = bdbuf_test_print_sc (sc, true))) { bdbuf_test_printf ("%s: rtems_bdbuf_release[5]: ", tc->name); sc = rtems_bdbuf_release (bd); passed = bdbuf_test_print_sc (sc, true); } /* * Set up a disk watch and wait for the write to happen. */ bdbuf_set_disk_driver_watch (tc, 1); passed = bdbuf_disk_driver_watch_wait (tc, BDBUF_SECONDS (5)); tc->passed = passed; tc->test = 0; }
static int IMFS_stat_device( const rtems_filesystem_location_info_t *loc, struct stat *buf ) { const IMFS_jnode_t *node = loc->node_access; const IMFS_device_t *io = &node->info.device; buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); return IMFS_stat( loc, buf ); }
/* * The stat() support is intended only for the cp shell command. Each request * will return that we have a regular file with read, write and execute * permissions for every one. The node index uses a global counter to support * a remote to remote copy. This is not a very sophisticated method. */ static int rtems_ftpfs_fstat( const rtems_filesystem_location_info_t *loc, struct stat *st ) { static unsigned ino = 0; /* FIXME */ st->st_ino = ++ino; st->st_dev = rtems_filesystem_make_dev_t(0xcc494cd6U, 0x1d970b4dU); st->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO; return 0; }
/** * BDBuf disk device driver initialization. * * @param major Disk major device number. * @param minor Minor device number, not applicable. * @param arg Initialization argument, not applicable. */ static rtems_device_driver bdbuf_disk_initialize (rtems_device_major_number major, rtems_device_minor_number minor, void* arg) { rtems_status_code sc; bdbuf_test_printf ("disk io init: "); sc = rtems_disk_io_initialize (); if (!bdbuf_test_print_sc (sc, true)) return sc; for (minor = 0; minor < BDBUF_DISKS; minor++) { char name[sizeof (BDBUF_DISK_DEVICE_BASE_NAME) + 10]; bdbuf_disk* bdd = &bdbuf_disks[minor]; rtems_status_code sc; snprintf (name, sizeof (name), BDBUF_DISK_DEVICE_BASE_NAME "%" PRIu32, minor); bdd->name = strdup (name); bdbuf_test_printf ("disk init: %s\n", bdd->name); bdbuf_test_printf ("disk lock: "); sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'D', 'K'), 1, RTEMS_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY, 0, &bdd->lock); if (!bdbuf_test_print_sc (sc, true)) return RTEMS_IO_ERROR; bdd->block_size = 512 * (minor + 1); bdd->block_count = BDBUF_SIZE * (minor + 1); sc = rtems_disk_create_phys(rtems_filesystem_make_dev_t (major, minor), bdd->block_size, bdd->block_count, bdbuf_disk_ioctl, bdd, name); if (sc != RTEMS_SUCCESSFUL) { bdbuf_test_printf ("disk init: create phys failed: "); bdbuf_test_print_sc (sc, true); return sc; } } return RTEMS_SUCCESSFUL; }
/** * Get the blocks 0 -> 4 and release them. Task 0 should be holding * each one. */ static void bdbuf_tests_ranged_get_release (bdbuf_task_control* tc, bool wake_master, int lower, int upper) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; for (i = lower; (i < upper) && passed; i++) { dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: blocking ...\n", tc->name, i); sc = rtems_bdbuf_get (device, i, &bd); bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: ", tc->name, i); sc = rtems_bdbuf_release (bd); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } /* * Wake the master to tell it we have finished. */ if (wake_master) bdbuf_send_wait_event (tc->name, "wake master", tc->master); } tc->passed = passed; tc->test = 0; }
int devFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { rtems_device_name_t *the_dev; the_dev = (rtems_device_name_t *)loc->node_access; if (!the_dev) rtems_set_errno_and_return_minus_one( EFAULT ); buf->st_rdev = rtems_filesystem_make_dev_t( the_dev->major, the_dev->minor ); buf->st_mode = the_dev->mode; return 0; }
int devFS_stat( const rtems_filesystem_location_info_t *loc, struct stat *buf ) { int rv = 0; const devFS_node *the_dev = loc->node_access; if (the_dev != NULL) { buf->st_rdev = rtems_filesystem_make_dev_t( the_dev->major, the_dev->minor ); buf->st_mode = the_dev->mode; } else { rv = rtems_filesystem_default_fstat(loc, buf); } return rv; }
/* blkdev_generic_open -- * Generic block device open primitive. */ rtems_device_driver rtems_blkdev_generic_open( rtems_device_major_number major, rtems_device_minor_number minor, void * arg) { rtems_libio_open_close_args_t *oc = arg; rtems_libio_t *iop = oc->iop; dev_t dev = rtems_filesystem_make_dev_t(major, minor); rtems_disk_device *dd = rtems_disk_obtain(dev); iop->data1 = dd; if (dd != NULL) return RTEMS_SUCCESSFUL; else return RTEMS_UNSATISFIED; }
rtems_status_code rtems_io_register_name( const char *device_name, rtems_device_major_number major, rtems_device_minor_number minor ) { int status; dev_t dev; dev = rtems_filesystem_make_dev_t( major, minor ); status = mknod( device_name, 0777 | S_IFCHR, dev ); /* this is the only error returned by the old version */ if ( status ) return RTEMS_TOO_MANY; return RTEMS_SUCCESSFUL; }
rtems_device_driver test_disk_initialize( rtems_device_major_number major, rtems_device_minor_number minor, void *arg) { rtems_status_code rc; dev_t dev; rc = rtems_disk_io_initialize(); if (rc != RTEMS_SUCCESSFUL) return rc; dev = rtems_filesystem_make_dev_t(major, minor); rc = rtems_disk_create_phys(dev, TEST_DISK_BLOCK_SIZE, TEST_DISK_BLOCK_NUM, test_disk_ioctl, NULL, TEST_DISK_NAME); if (rc != RTEMS_SUCCESSFUL) { printf("Failed to create %s disk\n", TEST_DISK_NAME); return rc; } rc = bdbuf_test_create_drv_rx_queue(&drvq_id); if (rc != RTEMS_SUCCESSFUL) { printk("%s() Failed to create Msg Queue for RX: %u\n", __FUNCTION__, rc); return rc; } rc = bdbuf_test_create_drv_tx_queue(&testq_id); if (rc != RTEMS_SUCCESSFUL) { printf("%s() Failed to get Msg Queue for TX: %u\n", __FUNCTION__, rc); return rc; } printk("TEST DISK - OK\n"); return RTEMS_SUCCESSFUL; }
int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { IMFS_jnode_t *the_jnode; IMFS_device_t *io; the_jnode = loc->node_access; switch ( the_jnode->type ) { case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_dev = rtems_filesystem_make_dev_t( io->major, io->minor ); break; case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; break; case IMFS_SYM_LINK: buf->st_size = 0; break; default: rtems_set_errno_and_return_minus_one( ENOTSUP ); break; } buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; buf->st_uid = the_jnode->st_uid; buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; return 0; }
/** * Get the block 0 buffer twice. The first time it is requested it * will be taken from the empty list and returned to the LRU list. * The second time it will be removed from the LRU list. */ static void bdbuf_tests_task_0_test_1 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; for (i = 0; (i < 2) && passed; i++) { dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_test_printf ("%s: rtems_bdbuf_get[0]: ", tc->name); sc = rtems_bdbuf_get (device, 0, &bd); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } bdbuf_test_printf ("%s: rtems_bdbuf_release[0]: ", tc->name); sc = rtems_bdbuf_release (bd); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } } tc->passed = passed; tc->test = 0; }
static bool bdbuf_tests_setup_disk (rtems_device_major_number *major, rtems_disk_device **dd_ptr) { rtems_status_code sc; bool ok; /* * Register the disk driver. */ bdbuf_test_printf ("register disk driver\n"); sc = rtems_io_register_driver (RTEMS_DRIVER_AUTO_MAJOR, &bdbuf_disk_io_ops, major); ok = sc == RTEMS_SUCCESSFUL; if (ok) { *dd_ptr = rtems_disk_obtain (rtems_filesystem_make_dev_t (*major, 0)); ok = *dd_ptr != NULL; } return ok; }
static void test_diskdevs(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; rtems_disk_device *physical_dd = NULL; rtems_disk_device *logical_dd = NULL; rtems_disk_device *dd = NULL; dev_t physical_dev = 0; dev_t logical_dev = 0; dev_t logical_2_dev = 0; dev_t const big_major_dev = rtems_filesystem_make_dev_t((rtems_device_major_number) -2, 0); dev_t const big_minor_dev = rtems_filesystem_make_dev_t(0, (rtems_device_minor_number) -2); ramdisk *const rd = ramdisk_allocate(NULL, BLOCK_SIZE, BLOCK_COUNT, false); rtems_test_assert(rd != NULL); sc = rtems_disk_io_initialize(); ASSERT_SC(sc); sc = rtems_io_register_driver(0, &ramdisk_ops, &major); ASSERT_SC(sc); physical_dev = rtems_filesystem_make_dev_t(major, minor); logical_dev = rtems_filesystem_make_dev_t(major, minor + 1); logical_2_dev = rtems_filesystem_make_dev_t(major, minor + 2); /* Consistency checks for physical disks creation */ sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, NULL, rd, "/dev/rda"); ASSERT_SC_EQ(sc, RTEMS_INVALID_ADDRESS); sc = rtems_disk_create_phys(physical_dev, 0, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda"); ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER); sc = rtems_disk_create_phys(big_major_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda"); ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY); sc = rtems_disk_create_phys(big_minor_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda"); ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY); sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, NULL); ASSERT_SC(sc); sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, NULL); ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE); sc = rtems_disk_delete(physical_dev); ASSERT_SC(sc); /* Consistency checks for logical disks creation */ sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_INVALID_ID); sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda"); ASSERT_SC(sc); sc = rtems_disk_create_log(big_major_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY); sc = rtems_disk_create_log(big_minor_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_NO_MEMORY); sc = rtems_disk_create_log(logical_dev, physical_dev, BLOCK_COUNT, 0, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER); sc = rtems_disk_create_log(logical_dev, physical_dev, 0, BLOCK_COUNT + 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER); sc = rtems_disk_create_log(logical_dev, physical_dev, 1, BLOCK_COUNT, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_INVALID_NUMBER); sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC(sc); sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE); sc = rtems_disk_create_log(logical_2_dev, logical_dev, 0, 1, "/dev/rda1"); ASSERT_SC_EQ(sc, RTEMS_INVALID_ID); sc = rtems_disk_delete(logical_dev); ASSERT_SC(sc); /* Consistency checks delete */ sc = rtems_disk_create_log(logical_dev, physical_dev, 0, 1, "/dev/rda1"); ASSERT_SC(sc); physical_dd = rtems_disk_obtain(physical_dev); rtems_test_assert(physical_dd != NULL && physical_dd->uses == 2); sc = rtems_disk_release(physical_dd); ASSERT_SC(sc); logical_dd = rtems_disk_obtain(logical_dev); rtems_test_assert(logical_dd != NULL && logical_dd->uses == 1); sc = rtems_disk_delete(physical_dev); ASSERT_SC(sc); sc = rtems_disk_create_phys(physical_dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, rd, "/dev/rda"); ASSERT_SC_EQ(sc, RTEMS_RESOURCE_IN_USE); dd = rtems_disk_obtain(physical_dev); rtems_test_assert(dd == NULL); dd = rtems_disk_obtain(logical_dev); rtems_test_assert(dd == NULL); sc = rtems_disk_release(logical_dd); ASSERT_SC(sc); /* Cleanup */ sc = rtems_io_unregister_driver(major); ASSERT_SC(sc); ramdisk_free(rd); sc = rtems_disk_io_done(); ASSERT_SC(sc); }
rtems_status_code rtems_bdpart_register( const char *disk_name, const rtems_bdpart_partition *pt, size_t count ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code esc = RTEMS_SUCCESSFUL; rtems_device_major_number major = 0; rtems_device_minor_number minor = 0; rtems_blkdev_bnum disk_end = 0; dev_t disk = 0; dev_t logical_disk = 0; char *logical_disk_name = NULL; char *logical_disk_marker = NULL; size_t disk_name_size = strlen( disk_name); size_t i = 0; int fd = -1; const rtems_disk_device *dd = NULL; /* Get disk data */ sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end); if (sc != RTEMS_SUCCESSFUL) { return sc; } disk = rtems_disk_get_device_identifier( dd); close( fd); /* Get the disk device identifier */ rtems_filesystem_split_dev_t( disk, major, minor); /* Create logical disk name */ logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE); if (logical_disk_name == NULL) { return RTEMS_NO_MEMORY; } strncpy( logical_disk_name, disk_name, disk_name_size); logical_disk_marker = logical_disk_name + disk_name_size; /* Create a logical disk for each partition */ for (i = 0; i < count; ++i) { const rtems_bdpart_partition *p = pt + i; int rv = 0; /* New minor number */ ++minor; /* Create a new device identifier */ logical_disk = rtems_filesystem_make_dev_t( major, minor); /* Set partition number for logical disk name */ rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1); if (rv >= RTEMS_BDPART_NUMBER_SIZE) { esc = RTEMS_INVALID_NAME; goto cleanup; } /* Create logical disk */ sc = rtems_disk_create_log( logical_disk, disk, p->begin, p->end - p->begin, logical_disk_name ); if (sc != RTEMS_SUCCESSFUL) { esc = sc; goto cleanup; } } cleanup: free( logical_disk_name); return esc; }
/** * Get all the blocks in the pool and hold them. Wake the master to tell it was * have the buffers then wait for the master to tell us to release them. */ static void bdbuf_tests_task_0_test_4 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; size_t i; rtems_bdbuf_buffer* bd; rtems_chain_control buffers; size_t num = bdbuf_test_buffer_count (); /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; /* * Clear any disk settings. */ bdbuf_clear_disk_driver_watch (tc); bdbuf_set_disk_driver_action (tc, BDBUF_DISK_NOOP); /* * Get the blocks 0 -> 4 and hold them. */ rtems_chain_initialize_empty (&buffers); for (i = 0; (i < num) && passed; i++) { dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i); sc = rtems_bdbuf_read (device, i, &bd); if (!bdbuf_test_print_sc (sc, true)) passed = false; rtems_chain_append (&buffers, &bd->link); } /* * Wake the master to tell it we have the buffers. */ bdbuf_send_wait_event (tc->name, "wake master", tc->master); if (passed) { bdbuf_sleep (250); bdbuf_set_disk_driver_watch (tc, num / 2); /* * Release half the buffers, wait 500msecs then release the * remainder. This tests the swap out timer on each buffer. */ bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[0]: unblocks task 1\n", tc->name); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release_modified (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[0]: ", tc->name); passed = bdbuf_test_print_sc (sc, true); if (passed) { for (i = 1; (i < (num / 2)) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: " \ "unblocks task 1\n", tc->name, i); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release_modified (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: ", tc->name, i); passed = bdbuf_test_print_sc (sc, true); if (!passed) break; } if (passed) { passed = bdbuf_disk_driver_watch_wait (tc, BDBUF_SECONDS (5)); if (passed) { bdbuf_sleep (500); bdbuf_set_disk_driver_watch (tc, num / 2); for (i = 0; (i < (num / 2)) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: ", tc->name, i + (num / 2)); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); passed = bdbuf_test_print_sc (rtems_bdbuf_release_modified (bd), true); if (!passed) break; } passed = bdbuf_disk_driver_watch_wait (tc, BDBUF_SECONDS (5)); if (passed) { if (!rtems_chain_is_empty (&buffers)) { passed = false; bdbuf_test_printf ("%s: buffer chain not empty\n", tc->name); } } } } } } tc->passed = passed; tc->test = 0; }
/** * Get the blocks 0 -> 4 and hold them. Wake the master to tell it was have the * buffers then wait for the master to tell us to release a single buffer. * Task 1 will be block waiting for each buffer. It is a higher priority. */ static void bdbuf_tests_task_0_test_2 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; rtems_chain_control buffers; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; /* * Get the blocks 0 -> 4 and hold them. */ rtems_chain_initialize_empty (&buffers); for (i = 0; (i < 5) && passed; i++) { dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i); sc = rtems_bdbuf_get (device, i, &bd); if (!bdbuf_test_print_sc (sc, true)) passed = false; rtems_chain_append (&buffers, &bd->link); } /* * Wake the master to tell it we have the buffers. */ bdbuf_send_wait_event (tc->name, "wake master", tc->master); if (passed) { /* * For each buffer we hold wait until the master wakes us * and then return it. Task 2 will block waiting for this * buffer. It is a higher priority task. */ for (i = 0; (i < 5) && passed; i++) { sc = bdbuf_wait (tc->name, BDBUF_SECONDS (5)); if (sc != RTEMS_SUCCESSFUL) { bdbuf_test_printf ("%s: wait failed: ", tc->name); bdbuf_test_print_sc (sc, true); passed = false; break; } else { bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: unblocks task 1\n", tc->name, i); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: ", tc->name, i); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } } } } tc->passed = passed; tc->test = 0; }
int BSP_i2c_initialize( void ) { int busno; /* Initialize the library */ if ( rtems_libi2c_initialize() ) { fprintf(stderr,"Initializing I2C library failed\n"); return -1; } /* Register our bus driver */ if ( (busno=rtems_libi2c_register_bus( BSP_I2C_BUS0_NAME, BSP_I2C_BUS_DESCRIPTOR) ) < 0 ) { perror("Registering gt64260 i2c bus driver"); return -1; } /* Now register higher level drivers; note that * the i2c address in the manual is actually left-shifted * by one bit, i.e., as it would go on the bus. */ /* Use read-only driver for VPD */ if ( rtems_libi2c_register_drv( BSP_I2C_VPD_EEPROM_NAME, i2c_2b_eeprom_ro_driver_descriptor, busno, BSP_VPD_I2C_ADDR) < 0 ) { perror("Registering i2c VPD eeprom driver failed"); return -1; } /* Use read-write driver for user eeprom -- you still might * have to disable HW write-protection on your board. */ if ( rtems_libi2c_register_drv( BSP_I2C_USR_EEPROM_NAME, i2c_2b_eeprom_driver_descriptor, busno, BSP_USR_I2C_ADDR) < 0 ) { perror("Registering i2c USR eeprom driver failed"); return -1; } /* The thermostat */ if ( rtems_libi2c_register_drv( BSP_I2C_DS1621_NAME, i2c_ds1621_driver_descriptor, busno, BSP_THM_I2C_ADDR) < 0 ) { perror("Registering i2c ds1621 temp sensor. driver failed"); return -1; } /* Finally, as an example, register raw access to the * ds1621. The driver above just reads the 8 msb of the * temperature but doesn't support anything else. Using * the raw device node you can write/read individual * control bytes yourself and e.g., program the thermostat... */ if ( mknod( BSP_I2C_DS1621_RAW_DEV_NAME, 0666 | S_IFCHR, rtems_filesystem_make_dev_t(rtems_libi2c_major, RTEMS_LIBI2C_MAKE_MINOR(busno,BSP_THM_I2C_ADDR))) ) { perror("Creating device node for raw ds1621 access failed"); return -1; } printf("I2C devices registered\n"); return 0; }
int rtems_rfs_rtems_fstat (const rtems_filesystem_location_info_t* pathloc, struct stat* buf) { rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc); rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc); rtems_rfs_inode_handle inode; rtems_rfs_file_shared* shared; uint16_t mode; int rc; if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT)) printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino); rc = rtems_rfs_inode_open (fs, ino, &inode, true); if (rc) { return rtems_rfs_rtems_error ("stat: opening inode", rc); } mode = rtems_rfs_inode_get_mode (&inode); if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK (mode)) { buf->st_rdev = rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0), rtems_rfs_inode_get_block (&inode, 1)); } buf->st_dev = rtems_rfs_fs_device (fs); buf->st_ino = rtems_rfs_inode_ino (&inode); buf->st_mode = rtems_rfs_rtems_mode (mode); buf->st_nlink = rtems_rfs_inode_get_links (&inode); buf->st_uid = rtems_rfs_inode_get_uid (&inode); buf->st_gid = rtems_rfs_inode_get_gid (&inode); /* * Need to check is the ino is an open file. If so we take the values from * the open file rather than the inode. */ shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (&inode)); if (shared) { buf->st_atime = rtems_rfs_file_shared_get_atime (shared); buf->st_mtime = rtems_rfs_file_shared_get_mtime (shared); buf->st_ctime = rtems_rfs_file_shared_get_ctime (shared); buf->st_blocks = rtems_rfs_file_shared_get_block_count (shared); if (S_ISLNK (buf->st_mode)) buf->st_size = rtems_rfs_file_shared_get_block_offset (shared); else buf->st_size = rtems_rfs_file_shared_get_size (fs, shared); } else { buf->st_atime = rtems_rfs_inode_get_atime (&inode); buf->st_mtime = rtems_rfs_inode_get_mtime (&inode); buf->st_ctime = rtems_rfs_inode_get_ctime (&inode); buf->st_blocks = rtems_rfs_inode_get_block_count (&inode); if (S_ISLNK (buf->st_mode)) buf->st_size = rtems_rfs_inode_get_block_offset (&inode); else buf->st_size = rtems_rfs_inode_get_size (fs, &inode); } buf->st_blksize = rtems_rfs_fs_block_size (fs); rc = rtems_rfs_inode_close (fs, &inode); if (rc > 0) { return rtems_rfs_rtems_error ("stat: closing inode", rc); } return 0; }
/* * Test the compatibility with a genuine MS Windows FAT file system. */ static void test_compatibility( void ) { int rc; rtems_status_code sc; dev_t dev; char diskpath[] = "/dev/ramdisk1"; rtems_dosfs_mount_options mount_opts; rtems_device_major_number major; FILE *fp; int buffer; unsigned int index_file = 0; unsigned int index_char; unsigned int offset; char content_buf[MAX_NAME_LENGTH + strlen( MOUNT_DIR ) + 1]; char file_path[MAX_NAME_LENGTH + strlen( MOUNT_DIR ) + 1]; DIR *dir_stream; struct dirent *dp; mount_opts.converter = rtems_dosfs_create_utf8_converter( "CP850" ); rtems_test_assert( mount_opts.converter != NULL ); sc = rtems_io_register_driver( 0, &ramdisk_ops, &major ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); dev = rtems_filesystem_make_dev_t( major, 1 ); sc = rtems_disk_create_phys( dev, BLOCK_SIZE, BLOCK_COUNT, ramdisk_ioctl, &disk_image, diskpath ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); rc = mount_and_make_target_path( diskpath, MOUNT_DIR, RTEMS_FILESYSTEM_TYPE_DOSFS, RTEMS_FILESYSTEM_READ_WRITE, &mount_opts ); rtems_test_assert( rc == 0 ); dir_stream = opendir( MOUNT_DIR ); rtems_test_assert( dir_stream != NULL ); dp = readdir( dir_stream ); rtems_test_assert( dp != NULL ); while ( dp != NULL ) { index_char = 0; size_t len = strlen( filenames[index_file] ); if ( filenames[index_file][len - 1] == '.' ) rtems_test_assert( ( len - 1 ) == dp->d_namlen ); else rtems_test_assert( len == dp->d_namlen ); rtems_test_assert( 0 == memcmp( &filenames[index_file][0], &dp->d_name[0], dp->d_namlen ) ); snprintf( file_path, sizeof( file_path ), "%s/%s", MOUNT_DIR, filenames[index_file] ); fp = fopen( file_path, "r" ); rtems_test_assert( fp != NULL ); /* These files should contain their own file names. */ while ( ( buffer = fgetc( fp ) ) != EOF ) { content_buf[index_char] = buffer; ++index_char; } if ( 0 == strncmp( content_buf, UTF8_BOM, UTF8_BOM_SIZE ) ) offset = UTF8_BOM_SIZE; else offset = 0; rtems_test_assert( 0 == memcmp( filenames[index_file], &content_buf[offset], index_char - offset ) ); rc = fclose( fp ); rtems_test_assert( rc == 0 ); ++index_file; dp = readdir( dir_stream ); } rtems_test_assert( index_file == FILES_FILENAMES_NUMBER_OF ); rc = closedir( dir_stream ); rtems_test_assert( rc == 0 ); rc = unmount( MOUNT_DIR ); rtems_test_assert( rc == 0 ); }