/** * @file * * @brief Non-volatile Disk Block Device Implementation */ /* * Copyright (C) 2007 Chris Johns * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. */ /** * The Non-volatile disk provides a simple directly mapped disk * driver with checksums for each. It is designed to provied a * disk that can survive a restart. Examples are EEPROM devices * which have byte writeable locations, or a battery backed up * RAM disk. * * The low level driver provides the physical access to the * hardware. */ #if !defined (_RTEMS_NVDISK_H_) #define _RTEMS_NVDISK_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * The base name of the nv disks. */ #define RTEMS_NVDISK_DEVICE_BASE_NAME "/dev/nvd" /** * NV disk specific ioctl request types. To use open the * device and issue the ioctl call. * * @code * int fd = open ("/dev/nvdisk0", O_WRONLY, 0); * if (fd < 0) * { * printf ("driver open failed: %s\n", strerror (errno)); * exit (1); * } * if (ioctl (fd, RTEMS_NVDISK_IOCTL_ERASE_DISK) < 0) * { * printf ("driver erase failed: %s\n", strerror (errno)); * exit (1); * } * close (fd); * @endcode */ #define RTEMS_NVDISK_IOCTL_ERASE_DISK _IO('B', 128) #define RTEMS_NVDISK_IOCTL_MONITORING _IO('B', 129) #define RTEMS_NVDISK_IOCTL_INFO_LEVEL _IO('B', 130) #define RTEMS_NVDISK_IOCTL_PRINT_STATUS _IO('B', 131) /** * NV Disk Monitoring Data allows a user to obtain * the current status of the disk. */ typedef struct rtems_nvdisk_monitor_data { uint32_t block_size; uint32_t block_count; uint32_t page_count; uint32_t pages_available; uint32_t pages_used; uint32_t info_level; } rtems_nvdisk_monitor_data; /** * Return the number of kilo-bytes. */ #define RTEMS_NVDISK_KBYTES(_k) ((_k) * 1024) /** * NV Low Level driver handlers. * Typically this structure is part of a table of handlers in the * device which is referenced in the nvdisk configuration table. * The reference is kept in the driver and used all the time to * manage the nv device, therefore it must always exist. */ typedef struct rtems_nvdisk_driver_handlers { /** * Read data from the device into the buffer. Return an errno * error number if the data cannot be read. * * @param device The device to read data from. * @param flags Device specific flags for the driver. * @param base The base address of the device. * @param offset The offset in the segment to read. * @param buffer The buffer to read the data into. * @param size The amount of data to read. * @retval 0 No error. * @retval EIO The read did not complete. */ int (*read) (uint32_t device, uint32_t flags, void* base, uint32_t offset, void* buffer, size_t size); /** * Write data from the buffer to the device. Return an errno * error number if the device cannot be written to. * * @param device The device to write data to. * @param flags Device specific flags for the driver. * @param base The base address of the device. * @param offset The offset in the device to write to. * @param buffer The buffer to write the data from. * @param size The amount of data to write. * @retval 0 No error. * @retval EIO The write did not complete or verify. */ int (*write) (uint32_t device, uint32_t flags, void* base, uint32_t offset, const void* buffer, size_t size); /** * Verify data in the buffer to the data in the device. Return an * errno error number if the device cannot be read or the data verified. * * @param device The device to verify the data with. * @param flags Device specific flags for the driver. * @param base The base address of the device. * @param offset The offset in the device to verify. * @param buffer The buffer to verify the data in the device with. * @param size The amount of data to verify. * @retval 0 No error. * @retval EIO The data did not verify. */ int (*verify) (uint32_t device, uint32_t flags, void* base, uint32_t offset, const void* buffer, size_t size); } rtems_nvdisk_driver_handlers; /** * NV Device Descriptor holds the description of a device that is * part of the NV disk. * * Typically this structure is part of a table of the device which * is referenced in the nvdisk configuration table. * The reference is kept in the driver and used all the time to * manage the nv device, therefore it must always exist. */ typedef struct rtems_nvdisk_device_desc { uint32_t flags; /**< Private user flags. */ void* base; /**< Base address of the device. */ uint32_t size; /**< Size of the device. */ const rtems_nvdisk_driver_handlers* nv_ops; /**< Device handlers. */ } rtems_nvdisk_device_desc; /** * RTEMS Non-Volatile Disk configuration table used to initialise the * driver. */ typedef struct rtems_nvdisk_config { uint32_t block_size; /**< The block size. */ uint32_t device_count; /**< The number of devices. */ const rtems_nvdisk_device_desc* devices; /**< The device descriptions. */ uint32_t flags; /**< Set of flags to control driver. */ uint32_t info_level; /**< Default info level. */ } rtems_nvdisk_config; /* * Driver flags. */ /** * Check the pages during initialisation to see which pages are * valid and which are not. This could slow down initialising the * disk driver. */ #define RTEMS_NVDISK_CHECK_PAGES (1 << 0) /** * Non-volatile disk device driver initialization. Place in a table as the * initialisation entry and remainder of the entries are the RTEMS block * device generic handlers. * * @param major NV disk major device number. * @param minor Minor device number, not applicable. * @param arg Initialization argument, not applicable. * @return The rtems_device_driver is actually just * rtems_status_code. */ rtems_device_driver rtems_nvdisk_initialize (rtems_device_major_number major, rtems_device_minor_number minor, void* arg); /** * External reference to the configuration. Please supply. * Support is present in confdefs.h for providing this variable. */ extern const rtems_nvdisk_config rtems_nvdisk_configuration[]; /** * External reference to the number of configurations. Please supply. * Support is present in confdefs.h for providing this variable. */ extern uint32_t rtems_nvdisk_configuration_size; #ifdef __cplusplus } #endif /* __cplusplus */ #endif