summaryrefslogtreecommitdiffstats
path: root/doc/bsp_howto/nvmem.t
diff options
context:
space:
mode:
Diffstat (limited to 'doc/bsp_howto/nvmem.t')
-rw-r--r--doc/bsp_howto/nvmem.t225
1 files changed, 224 insertions, 1 deletions
diff --git a/doc/bsp_howto/nvmem.t b/doc/bsp_howto/nvmem.t
index 070621ddca..eda65f93a5 100644
--- a/doc/bsp_howto/nvmem.t
+++ b/doc/bsp_howto/nvmem.t
@@ -8,5 +8,228 @@
@chapter Non-Volatile Memory Driver
-XXX FILL ME IN
+The Non-Volatile driver is responsible for providing an
+interface to various types of non-volatile memory. These
+types of memory include, but are not limited to, Flash, EEPROM,
+and battery backed RAM. The capabilities provided
+by this class of device driver are:
+
+@itemize @bullet
+@item Initialize the Non-Volatile Memory Driver
+@item Optional Disable Read and Write Handlers
+@item Open a Particular Memory Partition
+@item Close a Particular Memory Partition
+@item Read from a Particular Memory Partition
+@item Write to a Particular Memory Partition
+@item Erase the Non-Volatile Memory Area
+@end itemize
+
+There is currently only one non-volatile device driver included in the
+RTEMS source tree and it does not adhere to this device driver model.
+The information provided in this chapter is based on drivers developed
+by OAR Corporation personnel for applications using RTEMS. It is
+hoped that this driver model information can form the basis for a standard
+non-volatile memory driver model that can be supported in future RTEMS
+distribution.
+
+@section Major and Minor Numbers
+
+The @b{major} number of a device driver is its index in the
+RTEMS Device Address Table.
+
+A @b{minor} number is associated with each device instance
+managed by a particular device driver. An RTEMS minor number
+is an @code{unsigned32} entity. Convention calls
+dividing the bits in the minor number down into categories
+that specify an area of non-volatile memory and a partition
+with that area. This results in categories
+like the following:
+
+@itemize @bullet
+
+@item @b{area} - indicates a block of non-volatile memory
+@item @b{partition} - indicates a particular address range with an area
+
+@end itemize
+
+From the above, it should be clear that a single device driver
+can support multiple types of non-volatile memory in a single system.
+The minor number is used to distinguish the types of memory and
+blocks of memory used for different purposes.
+
+@section Non-Volatile Memory Driver Configuration
+
+There is not a standard non-volatile driver configuration table but some
+fields are common across different drivers. The non-volatile memory driver
+configuration table is typically an array of structures with each
+structure containing the information for a particular area of
+non-volatile memory.
+The following is a list of the type of information normally required
+to configure each area of non-volatile memory
+
+@table @b
+@item memory_type
+is the type of memory device in this area. Choices are battery backed RAM,
+EEPROM, Flash, or an optional user-supplied type. If the user-supplied type
+is configured, then the user is responsible for providing a set of
+routines to program the memory.
+
+@item memory
+is the base address of this memory area.
+
+@item attributes
+is a pointer to a memory type specific attribute block. Some of
+the fields commonly contained in this memory type specific attribute
+structure area:
+
+@table @b
+@item use_protection_algorithm
+is set to TRUE to indicate that the protection (i.e. locking) algorithm
+should be used for this area of non-volatile memory. A particular
+type of non-volatile memory may not have a protection algorithm.
+
+@item access
+is an enumerated type to indicate the organization of the memory
+devices in this memory area. The following is a list of the
+access types supported by the current driver implementation:
+
+@itemize @bullet
+@item simple unsigned8
+@item simple unsigned16
+@item simple unsigned32
+@item simple unsigned64
+@item single unsigned8 at offset 0 in an unsigned16
+@item single unsigned8 at offset 1 in an unsigned16
+@item single unsigned8 at offset 0 in an unsigned32
+@item single unsigned8 at offset 1 in an unsigned32
+@item single unsigned8 at offset 2 in an unsigned32
+@item single unsigned8 at offset 3 in an unsigned32
+@end itemize
+
+@item depth
+is the depth of the progamming FIFO on this particular chip. Some
+chips, particularly EEPROMs, have the same programming algorithm but
+vary in the depth of the amount of data that can be programmed in a single
+block.
+
+@end table
+
+@item number_of_partitions
+is the number of logical partitions within this area.
+
+@item Partitions
+is the address of table that contains an entry to describe each
+partition in this area. Fields within each element of this
+table are defined as follows:
+
+@table @b
+
+@item offset
+is the offset of this partition from the base address of this area.
+
+@item length
+is the length of this partition.
+
+@end table
+@end table
+
+By dividing an area of memory into multiple partitions, it is possible
+to easily divide the non-volatile memory for different purposes.
+
+@section Initialize the Non-Volatile Memory Driver
+
+At system initialization, the non-volatile memory driver's
+initialization entry point will be invoked. As part of
+initialization, the driver will perform
+whatever initializatin is required on each non-volatile memory area.
+
+The discrete I/O driver may register devices name for memory
+partitions of particular interest to the system. Normally this
+will be restricted to the device "/dev/nv_memory" to indicate
+the entire device driver.
+
+@section Disable Read and Write Handlers
+
+Depending on the target's non-volatile memory configuration, it may be
+possible to write to a status register and make the memory area completely
+inaccessible. This is target dependent and beyond the standard capabilities
+of any memory type. The user has the optional capability to provide
+handlers to disable and enable access to a partiticular memory area.
+
+@section Open a Particular Memory Partition
+
+This is the driver open call. Usually this call does nothing other than
+validate the minor number.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is often the place
+to do this operation.
+
+@section Close a Particular Memory Partition
+
+This is the driver close call. Usually this call does nothing.
+
+With some drivers, it may be necessary to allocate memory when a particular
+device is opened. If that is the case, then this is the place
+where that memory should be deallocated.
+
+@section Read from a Particular Memory Partition
+
+This corresponds to the driver read call. After validating the minor
+number and arguments, this call enables reads from the specified
+memory area by invoking the user supplied "enable reads handler"
+and then reads the indicated memory area. When
+invoked the @code{argument_block} is actually a pointer to the following
+structure type:
+
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 offset;
+ void *buffer;
+ rtems_unsigned32 length;
+ rtems_unsigned32 status;
+@} Non_volatile_memory_Driver_arguments;
+@end group
+@end example
+
+The driver reads @code{length} bytes starting at @code{offset} into
+the partition and places them at @code{buffer}. The result is returned
+in @code{status}.
+
+After the read operation is complete, the user supplied "disable reads handler"
+is invoked to protect the memory area again.
+
+@section Write to a Particular Memory Partition
+
+This corresponds to the driver write call. After validating the minor
+number and arguments, this call enables writes to the specified
+memory area by invoking the "enable writes handler", then unprotecting
+the memory area, and finally actually writing to the indicated memory
+area. When invoked the @code{argument_block} is actually a pointer to
+the following structure type:
+
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 offset;
+ void *buffer;
+ rtems_unsigned32 length;
+ rtems_unsigned32 status;
+@} Non_volatile_memory_Driver_arguments;
+@end group
+@end example
+
+The driver writes @code{length} bytes from @code{buffer} and
+writes them to the non-volatile memory starting at @code{offset} into
+the partition. The result is returned in @code{status}.
+
+After the write operation is complete, the "disable writes handler"
+is invoked to protect the memory area again.
+
+@section Erase the Non-Volatile Memory Area
+
+This is one of the IOCTL functions supported by the I/O control
+device driver entry point. When this IOCTL function is invoked,
+the specified area of non-volatile memory is erased.