forked from Imagelibrary/rtems
@@ -26,7 +26,6 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include <rtems/blkdev.h>
|
#include <rtems/blkdev.h>
|
||||||
#include <rtems/diskdevs.h>
|
|
||||||
#include <rtems/nvdisk.h>
|
#include <rtems/nvdisk.h>
|
||||||
#include <rtems/thread.h>
|
#include <rtems/thread.h>
|
||||||
|
|
||||||
@@ -93,10 +92,8 @@ typedef struct rtems_nvdisk_device_ctl
|
|||||||
* The NV disk control structure for a single disk. There is one
|
* The NV disk control structure for a single disk. There is one
|
||||||
* for each minor disk in the system.
|
* for each minor disk in the system.
|
||||||
*/
|
*/
|
||||||
typedef struct rtems_mvdisk
|
typedef struct
|
||||||
{
|
{
|
||||||
rtems_device_major_number major; /**< The driver's major number. */
|
|
||||||
rtems_device_minor_number minor; /**< The driver's minor number. */
|
|
||||||
uint32_t flags; /**< configuration flags. */
|
uint32_t flags; /**< configuration flags. */
|
||||||
uint32_t block_size; /**< The block size for this disk. */
|
uint32_t block_size; /**< The block size for this disk. */
|
||||||
uint32_t block_count; /**< The number of available blocks. */
|
uint32_t block_count; /**< The number of available blocks. */
|
||||||
@@ -107,16 +104,6 @@ typedef struct rtems_mvdisk
|
|||||||
uint32_t info_level; /**< The info trace level. */
|
uint32_t info_level; /**< The info trace level. */
|
||||||
} rtems_nvdisk;
|
} rtems_nvdisk;
|
||||||
|
|
||||||
/**
|
|
||||||
* The array of NV disks we support.
|
|
||||||
*/
|
|
||||||
static rtems_nvdisk* rtems_nvdisks;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The number of NV disks we have.
|
|
||||||
*/
|
|
||||||
static uint32_t rtems_nvdisk_count;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The CRC16 factor table. Created during initialisation.
|
* The CRC16 factor table. Created during initialisation.
|
||||||
*/
|
*/
|
||||||
@@ -688,17 +675,10 @@ rtems_nvdisk_erase_disk (rtems_nvdisk* nvd)
|
|||||||
static int
|
static int
|
||||||
rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
||||||
{
|
{
|
||||||
dev_t dev = rtems_disk_get_device_identifier (dd);
|
rtems_nvdisk* nvd = rtems_disk_get_driver_data (dd);
|
||||||
rtems_device_minor_number minor = rtems_filesystem_dev_minor_t (dev);
|
|
||||||
rtems_blkdev_request* r = argp;
|
rtems_blkdev_request* r = argp;
|
||||||
|
|
||||||
if (minor >= rtems_nvdisk_count)
|
if (nvd->device_count == 0)
|
||||||
{
|
|
||||||
errno = ENODEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rtems_nvdisks[minor].device_count == 0)
|
|
||||||
{
|
{
|
||||||
errno = ENODEV;
|
errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
@@ -706,7 +686,7 @@ rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
|||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
rtems_mutex_lock (&rtems_nvdisks[minor].lock);
|
rtems_mutex_lock (&nvd->lock);
|
||||||
|
|
||||||
switch (req)
|
switch (req)
|
||||||
{
|
{
|
||||||
@@ -714,11 +694,11 @@ rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
|||||||
switch (r->req)
|
switch (r->req)
|
||||||
{
|
{
|
||||||
case RTEMS_BLKDEV_REQ_READ:
|
case RTEMS_BLKDEV_REQ_READ:
|
||||||
errno = rtems_nvdisk_read (&rtems_nvdisks[minor], r);
|
errno = rtems_nvdisk_read (nvd, r);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTEMS_BLKDEV_REQ_WRITE:
|
case RTEMS_BLKDEV_REQ_WRITE:
|
||||||
errno = rtems_nvdisk_write (&rtems_nvdisks[minor], r);
|
errno = rtems_nvdisk_write (nvd, r);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -728,11 +708,11 @@ rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RTEMS_NVDISK_IOCTL_ERASE_DISK:
|
case RTEMS_NVDISK_IOCTL_ERASE_DISK:
|
||||||
errno = rtems_nvdisk_erase_disk (&rtems_nvdisks[minor]);
|
errno = rtems_nvdisk_erase_disk (nvd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RTEMS_NVDISK_IOCTL_INFO_LEVEL:
|
case RTEMS_NVDISK_IOCTL_INFO_LEVEL:
|
||||||
rtems_nvdisks[minor].info_level = (uintptr_t) argp;
|
nvd->info_level = (uintptr_t) argp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -740,7 +720,7 @@ rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_mutex_unlock (&rtems_nvdisks[minor].lock);
|
rtems_mutex_unlock (&nvd->lock);
|
||||||
|
|
||||||
return errno == 0 ? 0 : -1;
|
return errno == 0 ? 0 : -1;
|
||||||
}
|
}
|
||||||
@@ -755,41 +735,31 @@ rtems_nvdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
|||||||
* @param arg Initialization argument, not applicable.
|
* @param arg Initialization argument, not applicable.
|
||||||
*/
|
*/
|
||||||
rtems_device_driver
|
rtems_device_driver
|
||||||
rtems_nvdisk_initialize (rtems_device_major_number major,
|
rtems_nvdisk_initialize (rtems_device_major_number major RTEMS_UNUSED,
|
||||||
rtems_device_minor_number minor,
|
rtems_device_minor_number minor RTEMS_UNUSED,
|
||||||
void* arg RTEMS_UNUSED)
|
void* arg RTEMS_UNUSED)
|
||||||
{
|
{
|
||||||
const rtems_nvdisk_config* c = rtems_nvdisk_configuration;
|
const rtems_nvdisk_config* c = rtems_nvdisk_configuration;
|
||||||
rtems_nvdisk* nvd;
|
rtems_nvdisk* nvd;
|
||||||
rtems_status_code sc;
|
rtems_status_code sc;
|
||||||
|
uint32_t i;
|
||||||
sc = rtems_disk_io_initialize ();
|
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
|
||||||
return sc;
|
|
||||||
|
|
||||||
sc = rtems_nvdisk_crc16_gen_factors (0x8408);
|
sc = rtems_nvdisk_crc16_gen_factors (0x8408);
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
if (sc != RTEMS_SUCCESSFUL)
|
||||||
return sc;
|
return sc;
|
||||||
|
|
||||||
rtems_nvdisks = calloc (rtems_nvdisk_configuration_size,
|
nvd = calloc (rtems_nvdisk_configuration_size, sizeof (*nvd));
|
||||||
sizeof (rtems_nvdisk));
|
if (!nvd)
|
||||||
|
|
||||||
if (!rtems_nvdisks)
|
|
||||||
return RTEMS_NO_MEMORY;
|
return RTEMS_NO_MEMORY;
|
||||||
|
|
||||||
for (minor = 0; minor < rtems_nvdisk_configuration_size; minor++, c++)
|
for (i = 0; i < rtems_nvdisk_configuration_size; i++, c++, nvd++)
|
||||||
{
|
{
|
||||||
char name[] = RTEMS_NVDISK_DEVICE_BASE_NAME "a";
|
char name[] = RTEMS_NVDISK_DEVICE_BASE_NAME "a";
|
||||||
dev_t dev = rtems_filesystem_make_dev_t (major, minor);
|
|
||||||
uint32_t device;
|
uint32_t device;
|
||||||
uint32_t blocks = 0;
|
uint32_t blocks = 0;
|
||||||
|
|
||||||
nvd = &rtems_nvdisks[minor];
|
name [sizeof(RTEMS_NVDISK_DEVICE_BASE_NAME)] += i;
|
||||||
|
|
||||||
name [sizeof(RTEMS_NVDISK_DEVICE_BASE_NAME)] += minor;
|
|
||||||
|
|
||||||
nvd->major = major;
|
|
||||||
nvd->minor = minor;
|
|
||||||
nvd->flags = c->flags;
|
nvd->flags = c->flags;
|
||||||
nvd->block_size = c->block_size;
|
nvd->block_size = c->block_size;
|
||||||
nvd->info_level = c->info_level;
|
nvd->info_level = c->info_level;
|
||||||
@@ -815,8 +785,8 @@ rtems_nvdisk_initialize (rtems_device_major_number major,
|
|||||||
nvd->block_count = blocks;
|
nvd->block_count = blocks;
|
||||||
nvd->device_count = c->device_count;
|
nvd->device_count = c->device_count;
|
||||||
|
|
||||||
sc = rtems_disk_create_phys(dev, c->block_size, blocks,
|
sc = rtems_blkdev_create(name, c->block_size, blocks,
|
||||||
rtems_nvdisk_ioctl, NULL, name);
|
rtems_nvdisk_ioctl, nvd);
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
if (sc != RTEMS_SUCCESSFUL)
|
||||||
{
|
{
|
||||||
rtems_nvdisk_error ("disk create phy failed");
|
rtems_nvdisk_error ("disk create phy failed");
|
||||||
@@ -826,7 +796,5 @@ rtems_nvdisk_initialize (rtems_device_major_number major,
|
|||||||
rtems_mutex_init (&nvd->lock, "NV Disk");
|
rtems_mutex_init (&nvd->lock, "NV Disk");
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_nvdisk_count = rtems_nvdisk_configuration_size;
|
|
||||||
|
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,58 +75,6 @@ const rtems_nvdisk_config rtems_nvdisk_configuration[] =
|
|||||||
*/
|
*/
|
||||||
uint32_t rtems_nvdisk_configuration_size = 1;
|
uint32_t rtems_nvdisk_configuration_size = 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the NV Disk Driver entry.
|
|
||||||
*/
|
|
||||||
rtems_driver_address_table rtems_nvdisk_io_ops = {
|
|
||||||
initialization_entry: rtems_nvdisk_initialize,
|
|
||||||
open_entry: rtems_blkdev_generic_open,
|
|
||||||
close_entry: rtems_blkdev_generic_close,
|
|
||||||
read_entry: rtems_blkdev_generic_read,
|
|
||||||
write_entry: rtems_blkdev_generic_write,
|
|
||||||
control_entry: rtems_blkdev_generic_ioctl
|
|
||||||
};
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int
|
|
||||||
setup_nvdisk (const char* mntpath)
|
|
||||||
{
|
|
||||||
rtems_device_major_number major;
|
|
||||||
rtems_status_code sc;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* For our test we do not have any static RAM or EEPROM devices so
|
|
||||||
* we allocate the memory from the heap.
|
|
||||||
*/
|
|
||||||
rtems_nv_heap_device_descriptor[0].base =
|
|
||||||
malloc (rtems_nv_heap_device_descriptor[0].size);
|
|
||||||
|
|
||||||
if (!rtems_nv_heap_device_descriptor[0].base)
|
|
||||||
{
|
|
||||||
printf ("error: no memory for NV disk\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Register the NV Disk driver.
|
|
||||||
*/
|
|
||||||
printf ("Register NV Disk Driver: ");
|
|
||||||
sc = rtems_io_register_driver (RTEMS_DRIVER_AUTO_MAJOR,
|
|
||||||
&rtems_nvdisk_io_ops,
|
|
||||||
&major);
|
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
|
||||||
{
|
|
||||||
printf ("error: nvdisk driver not initialised: %s\n",
|
|
||||||
rtems_status_text (sc));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("successful\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Table of FAT file systems that will be mounted
|
* Table of FAT file systems that will be mounted
|
||||||
* with the "fsmount" function.
|
* with the "fsmount" function.
|
||||||
@@ -473,7 +421,6 @@ create_ramdisk (int argc, char *argv[])
|
|||||||
static int
|
static int
|
||||||
create_nvdisk (int argc, char *argv[])
|
create_nvdisk (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
rtems_device_major_number major;
|
|
||||||
rtems_status_code sc;
|
rtems_status_code sc;
|
||||||
int arg;
|
int arg;
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
@@ -485,7 +432,7 @@ create_nvdisk (int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
if (argv[arg][0] == '-')
|
if (argv[arg][0] == '-')
|
||||||
{
|
{
|
||||||
switch (argv[arg][0])
|
switch (argv[arg][1])
|
||||||
{
|
{
|
||||||
case 's':
|
case 's':
|
||||||
++arg;
|
++arg;
|
||||||
@@ -546,9 +493,7 @@ create_nvdisk (int argc, char *argv[])
|
|||||||
rtems_nv_heap_device_descriptor[0].size,
|
rtems_nv_heap_device_descriptor[0].size,
|
||||||
rtems_nvdisk_configuration[0].block_size);
|
rtems_nvdisk_configuration[0].block_size);
|
||||||
|
|
||||||
sc = rtems_io_register_driver (RTEMS_DRIVER_AUTO_MAJOR,
|
sc = rtems_nvdisk_initialize (0, 0, NULL);
|
||||||
&rtems_nvdisk_io_ops,
|
|
||||||
&major);
|
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
if (sc != RTEMS_SUCCESSFUL)
|
||||||
{
|
{
|
||||||
printf ("error: nvdisk driver not initialised: %s\n",
|
printf ("error: nvdisk driver not initialised: %s\n",
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ rtems_task Init(
|
|||||||
#include <libchip/ide_ctrl.h> /* for general ide driver prototype */
|
#include <libchip/ide_ctrl.h> /* for general ide driver prototype */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_DRIVERS 4
|
|
||||||
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
|
||||||
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
|
||||||
#ifdef RTEMS_BSP_HAS_IDE_DRIVER
|
#ifdef RTEMS_BSP_HAS_IDE_DRIVER
|
||||||
|
|||||||
Reference in New Issue
Block a user