mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -04:00
Update Reliance Edge fail safe file system to the latest version.
This commit is contained in:
parent
8d041c8e21
commit
67def3c14b
|
@ -1,5 +1,7 @@
|
||||||
/* THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION
|
/* THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION
|
||||||
UTILITY. DO NOT MODIFY.
|
UTILITY. DO NOT MODIFY.
|
||||||
|
|
||||||
|
Generated by configuration utility version 2.0
|
||||||
*/
|
*/
|
||||||
/** @file
|
/** @file
|
||||||
*/
|
*/
|
||||||
|
@ -11,5 +13,5 @@
|
||||||
|
|
||||||
const VOLCONF gaRedVolConf[REDCONF_VOLUME_COUNT] =
|
const VOLCONF gaRedVolConf[REDCONF_VOLUME_COUNT] =
|
||||||
{
|
{
|
||||||
{ 512U, 65536U, false, 256U, 0, "" }
|
{ 512U, 65536U, false, 256U, 0U, "" }
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/* THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION
|
/* THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION
|
||||||
UTILITY. DO NOT MODIFY.
|
UTILITY. DO NOT MODIFY.
|
||||||
|
|
||||||
|
Generated by configuration utility version 2.0
|
||||||
*/
|
*/
|
||||||
/** @file
|
/** @file
|
||||||
*/
|
*/
|
||||||
|
@ -97,8 +99,14 @@
|
||||||
|
|
||||||
#define REDCONF_IMAP_EXTERNAL 1
|
#define REDCONF_IMAP_EXTERNAL 1
|
||||||
|
|
||||||
|
#define REDCONF_DISCARDS 0
|
||||||
|
|
||||||
#define REDCONF_IMAGE_BUILDER 0
|
#define REDCONF_IMAGE_BUILDER 0
|
||||||
|
|
||||||
#define REDCONF_CHECKER 0
|
#define REDCONF_CHECKER 0
|
||||||
|
|
||||||
|
#define RED_CONFIG_UTILITY_VERSION 0x2000000U
|
||||||
|
|
||||||
|
#define RED_CONFIG_MINCOMPAT_VER 0x1000200U
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1563,5 +1563,5 @@ const char *pcAttrib;
|
||||||
|
|
||||||
/* Create a string that includes the file name, the file size and the
|
/* Create a string that includes the file name, the file size and the
|
||||||
attributes string. */
|
attributes string. */
|
||||||
sprintf( pcBuffer, "%s [%s] [size=%d]", pxDirent->d_name, pcAttrib, pxDirent->d_stat.st_size );
|
sprintf( pcBuffer, "%s [%s] [size=%lld]", pxDirent->d_name, pcAttrib, pxDirent->d_stat.st_size );
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,9 +45,6 @@
|
||||||
/* If Win32 port */
|
/* If Win32 port */
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
||||||
#undef _WIN32_WINNT
|
|
||||||
#define _WIN32_WINNT 0x0600
|
|
||||||
|
|
||||||
/* Standard includes. */
|
/* Standard includes. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -237,9 +234,9 @@
|
||||||
#define HWTC_COUNT (*((uint32_t*)0xE000E018))
|
#define HWTC_COUNT (*((uint32_t*)0xE000E018))
|
||||||
#define HWTC_PERIOD ((*(uint32_t*)0xE000E014) + 1)
|
#define HWTC_PERIOD ((*(uint32_t*)0xE000E014) + 1)
|
||||||
#define HWTC_DIVISOR 2
|
#define HWTC_DIVISOR 2
|
||||||
|
|
||||||
#define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant
|
#define IRQ_PRIORITY_ORDER 0 // lower IRQ priority values are more significant
|
||||||
|
|
||||||
#elif (SELECTED_PORT == PORT_Renesas_RX600)
|
#elif (SELECTED_PORT == PORT_Renesas_RX600)
|
||||||
|
|
||||||
#include "iodefine.h"
|
#include "iodefine.h"
|
||||||
|
|
|
@ -222,7 +222,7 @@ static void vInitStartMarkers()
|
||||||
volatile int recorder_busy = 0;
|
volatile int recorder_busy = 0;
|
||||||
|
|
||||||
/* Gives the last error message of the recorder. NULL if no error message. */
|
/* Gives the last error message of the recorder. NULL if no error message. */
|
||||||
char* traceErrorMessage = NULL;
|
const char* traceErrorMessage = NULL;
|
||||||
|
|
||||||
void* xTraceNextFreeEventBufferSlot(void)
|
void* xTraceNextFreeEventBufferSlot(void)
|
||||||
{
|
{
|
||||||
|
@ -468,7 +468,7 @@ void vTraceError(const char* msg)
|
||||||
|
|
||||||
if (traceErrorMessage == NULL)
|
if (traceErrorMessage == NULL)
|
||||||
{
|
{
|
||||||
traceErrorMessage = (char*)msg;
|
traceErrorMessage = msg;
|
||||||
(void)strncpy(RecorderDataPtr->systemInfo, traceErrorMessage, 80);
|
(void)strncpy(RecorderDataPtr->systemInfo, traceErrorMessage, 80);
|
||||||
RecorderDataPtr->internalErrorOccured = 1;
|
RecorderDataPtr->internalErrorOccured = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,21 @@
|
||||||
Reliance Edge Credits
|
Reliance Edge Credits
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
This is a list (or partial list) of people who have made non-trivial or
|
This is a list (or partial list) of people who have made non-trivial or
|
||||||
noteworthy contributions to the Reliance Edge project. It is sorted by name.
|
noteworthy contributions to the Reliance Edge project. It is sorted by name.
|
||||||
Entries are formatted as below:
|
Entries are formatted as below:
|
||||||
|
|
||||||
Real Name (githubaccount)
|
Real Name (githubaccount)
|
||||||
Short description of how Real Name contributed to Reliance Edge.
|
Short description of how Real Name contributed to Reliance Edge.
|
||||||
|
|
||||||
The real name may be withheld by request and the GitHub account name might be
|
The real name may be withheld by request and the GitHub account name might be
|
||||||
missing if the contributor does not use GitHub.
|
missing if the contributor does not use GitHub.
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
-------
|
-------
|
||||||
|
|
||||||
None yet! ;)
|
Jean-Christophe Dubois (jcdubois)
|
||||||
|
Created a user-space Linux port of Reliance Edge, ported the open-source host
|
||||||
|
tools (including the formatter and image builder) to Linux, and created a FUSE
|
||||||
|
(File System in User Space) implementation for Reliance Edge.
|
||||||
|
|
||||||
|
|
|
@ -1,340 +1,340 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
License is intended to guarantee your freedom to share and change free
|
License is intended to guarantee your freedom to share and change free
|
||||||
software--to make sure the software is free for all its users. This
|
software--to make sure the software is free for all its users. This
|
||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
have the freedom to distribute copies of free software (and charge for
|
have the freedom to distribute copies of free software (and charge for
|
||||||
this service if you wish), that you receive source code or can get it
|
this service if you wish), that you receive source code or can get it
|
||||||
if you want it, that you can change the software or use pieces of it
|
if you want it, that you can change the software or use pieces of it
|
||||||
in new free programs; and that you know you can do these things.
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
To protect your rights, we need to make restrictions that forbid
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
These restrictions translate to certain responsibilities for you if you
|
These restrictions translate to certain responsibilities for you if you
|
||||||
distribute copies of the software, or if you modify it.
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
For example, if you distribute copies of such a program, whether
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
you have. You must make sure that they, too, receive or can get the
|
you have. You must make sure that they, too, receive or can get the
|
||||||
source code. And you must show them these terms so they know their
|
source code. And you must show them these terms so they know their
|
||||||
rights.
|
rights.
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
distribute and/or modify the software.
|
distribute and/or modify the software.
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
Also, for each author's protection and ours, we want to make certain
|
||||||
that everyone understands that there is no warranty for this free
|
that everyone understands that there is no warranty for this free
|
||||||
software. If the software is modified by someone else and passed on, we
|
software. If the software is modified by someone else and passed on, we
|
||||||
want its recipients to know that what they have is not the original, so
|
want its recipients to know that what they have is not the original, so
|
||||||
that any problems introduced by others will not reflect on the original
|
that any problems introduced by others will not reflect on the original
|
||||||
authors' reputations.
|
authors' reputations.
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
Finally, any free program is threatened constantly by software
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
program will individually obtain patent licenses, in effect making the
|
program will individually obtain patent licenses, in effect making the
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
under the terms of this General Public License. The "Program", below,
|
under the terms of this General Public License. The "Program", below,
|
||||||
refers to any such program or work, and a "work based on the Program"
|
refers to any such program or work, and a "work based on the Program"
|
||||||
means either the Program or any derivative work under copyright law:
|
means either the Program or any derivative work under copyright law:
|
||||||
that is to say, a work containing the Program or a portion of it,
|
that is to say, a work containing the Program or a portion of it,
|
||||||
either verbatim or with modifications and/or translated into another
|
either verbatim or with modifications and/or translated into another
|
||||||
language. (Hereinafter, translation is included without limitation in
|
language. (Hereinafter, translation is included without limitation in
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
Activities other than copying, distribution and modification are not
|
||||||
covered by this License; they are outside its scope. The act of
|
covered by this License; they are outside its scope. The act of
|
||||||
running the Program is not restricted, and the output from the Program
|
running the Program is not restricted, and the output from the Program
|
||||||
is covered only if its contents constitute a work based on the
|
is covered only if its contents constitute a work based on the
|
||||||
Program (independent of having been made by running the Program).
|
Program (independent of having been made by running the Program).
|
||||||
Whether that is true depends on what the Program does.
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
source code as you receive it, in any medium, provided that you
|
source code as you receive it, in any medium, provided that you
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
notices that refer to this License and to the absence of any warranty;
|
notices that refer to this License and to the absence of any warranty;
|
||||||
and give any other recipients of the Program a copy of this License
|
and give any other recipients of the Program a copy of this License
|
||||||
along with the Program.
|
along with the Program.
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
of it, thus forming a work based on the Program, and copy and
|
of it, thus forming a work based on the Program, and copy and
|
||||||
distribute such modifications or work under the terms of Section 1
|
distribute such modifications or work under the terms of Section 1
|
||||||
above, provided that you also meet all of these conditions:
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
a) You must cause the modified files to carry prominent notices
|
||||||
stating that you changed the files and the date of any change.
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
b) You must cause any work that you distribute or publish, that in
|
||||||
whole or in part contains or is derived from the Program or any
|
whole or in part contains or is derived from the Program or any
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
parties under the terms of this License.
|
parties under the terms of this License.
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
c) If the modified program normally reads commands interactively
|
||||||
when run, you must cause it, when started running for such
|
when run, you must cause it, when started running for such
|
||||||
interactive use in the most ordinary way, to print or display an
|
interactive use in the most ordinary way, to print or display an
|
||||||
announcement including an appropriate copyright notice and a
|
announcement including an appropriate copyright notice and a
|
||||||
notice that there is no warranty (or else, saying that you provide
|
notice that there is no warranty (or else, saying that you provide
|
||||||
a warranty) and that users may redistribute the program under
|
a warranty) and that users may redistribute the program under
|
||||||
these conditions, and telling the user how to view a copy of this
|
these conditions, and telling the user how to view a copy of this
|
||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
themselves, then this License, and its terms, do not apply to those
|
themselves, then this License, and its terms, do not apply to those
|
||||||
sections when you distribute them as separate works. But when you
|
sections when you distribute them as separate works. But when you
|
||||||
distribute the same sections as part of a whole which is a work based
|
distribute the same sections as part of a whole which is a work based
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
this License, whose permissions for other licensees extend to the
|
this License, whose permissions for other licensees extend to the
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
exercise the right to control the distribution of derivative or
|
exercise the right to control the distribution of derivative or
|
||||||
collective works based on the Program.
|
collective works based on the Program.
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
In addition, mere aggregation of another work not based on the Program
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
a storage or distribution medium does not bring the other work under
|
a storage or distribution medium does not bring the other work under
|
||||||
the scope of this License.
|
the scope of this License.
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
under Section 2) in object code or executable form under the terms of
|
under Section 2) in object code or executable form under the terms of
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
source code, which must be distributed under the terms of Sections
|
source code, which must be distributed under the terms of Sections
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
b) Accompany it with a written offer, valid for at least three
|
||||||
years, to give any third party, for a charge no more than your
|
years, to give any third party, for a charge no more than your
|
||||||
cost of physically performing source distribution, a complete
|
cost of physically performing source distribution, a complete
|
||||||
machine-readable copy of the corresponding source code, to be
|
machine-readable copy of the corresponding source code, to be
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
customarily used for software interchange; or,
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
c) Accompany it with the information you received as to the offer
|
||||||
to distribute corresponding source code. (This alternative is
|
to distribute corresponding source code. (This alternative is
|
||||||
allowed only for noncommercial distribution and only if you
|
allowed only for noncommercial distribution and only if you
|
||||||
received the program in object code or executable form with such
|
received the program in object code or executable form with such
|
||||||
an offer, in accord with Subsection b above.)
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
The source code for a work means the preferred form of the work for
|
||||||
making modifications to it. For an executable work, complete source
|
making modifications to it. For an executable work, complete source
|
||||||
code means all the source code for all modules it contains, plus any
|
code means all the source code for all modules it contains, plus any
|
||||||
associated interface definition files, plus the scripts used to
|
associated interface definition files, plus the scripts used to
|
||||||
control compilation and installation of the executable. However, as a
|
control compilation and installation of the executable. However, as a
|
||||||
special exception, the source code distributed need not include
|
special exception, the source code distributed need not include
|
||||||
anything that is normally distributed (in either source or binary
|
anything that is normally distributed (in either source or binary
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
operating system on which the executable runs, unless that component
|
operating system on which the executable runs, unless that component
|
||||||
itself accompanies the executable.
|
itself accompanies the executable.
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
If distribution of executable or object code is made by offering
|
||||||
access to copy from a designated place, then offering equivalent
|
access to copy from a designated place, then offering equivalent
|
||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
void, and will automatically terminate your rights under this License.
|
void, and will automatically terminate your rights under this License.
|
||||||
However, parties who have received copies, or rights, from you under
|
However, parties who have received copies, or rights, from you under
|
||||||
this License will not have their licenses terminated so long as such
|
this License will not have their licenses terminated so long as such
|
||||||
parties remain in full compliance.
|
parties remain in full compliance.
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
5. You are not required to accept this License, since you have not
|
||||||
signed it. However, nothing else grants you permission to modify or
|
signed it. However, nothing else grants you permission to modify or
|
||||||
distribute the Program or its derivative works. These actions are
|
distribute the Program or its derivative works. These actions are
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
modifying or distributing the Program (or any work based on the
|
modifying or distributing the Program (or any work based on the
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
all its terms and conditions for copying, distributing or modifying
|
all its terms and conditions for copying, distributing or modifying
|
||||||
the Program or works based on it.
|
the Program or works based on it.
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
Program), the recipient automatically receives a license from the
|
Program), the recipient automatically receives a license from the
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
these terms and conditions. You may not impose any further
|
these terms and conditions. You may not impose any further
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
You are not responsible for enforcing compliance by third parties to
|
You are not responsible for enforcing compliance by third parties to
|
||||||
this License.
|
this License.
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
infringement or for any other reason (not limited to patent issues),
|
infringement or for any other reason (not limited to patent issues),
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
excuse you from the conditions of this License. If you cannot
|
excuse you from the conditions of this License. If you cannot
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
License and any other pertinent obligations, then as a consequence you
|
License and any other pertinent obligations, then as a consequence you
|
||||||
may not distribute the Program at all. For example, if a patent
|
may not distribute the Program at all. For example, if a patent
|
||||||
license would not permit royalty-free redistribution of the Program by
|
license would not permit royalty-free redistribution of the Program by
|
||||||
all those who receive copies directly or indirectly through you, then
|
all those who receive copies directly or indirectly through you, then
|
||||||
the only way you could satisfy both it and this License would be to
|
the only way you could satisfy both it and this License would be to
|
||||||
refrain entirely from distribution of the Program.
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
If any portion of this section is held invalid or unenforceable under
|
||||||
any particular circumstance, the balance of the section is intended to
|
any particular circumstance, the balance of the section is intended to
|
||||||
apply and the section as a whole is intended to apply in other
|
apply and the section as a whole is intended to apply in other
|
||||||
circumstances.
|
circumstances.
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
It is not the purpose of this section to induce you to infringe any
|
||||||
patents or other property right claims or to contest validity of any
|
patents or other property right claims or to contest validity of any
|
||||||
such claims; this section has the sole purpose of protecting the
|
such claims; this section has the sole purpose of protecting the
|
||||||
integrity of the free software distribution system, which is
|
integrity of the free software distribution system, which is
|
||||||
implemented by public license practices. Many people have made
|
implemented by public license practices. Many people have made
|
||||||
generous contributions to the wide range of software distributed
|
generous contributions to the wide range of software distributed
|
||||||
through that system in reliance on consistent application of that
|
through that system in reliance on consistent application of that
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
to distribute software through any other system and a licensee cannot
|
to distribute software through any other system and a licensee cannot
|
||||||
impose that choice.
|
impose that choice.
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
may add an explicit geographical distribution limitation excluding
|
may add an explicit geographical distribution limitation excluding
|
||||||
those countries, so that distribution is permitted only in or among
|
those countries, so that distribution is permitted only in or among
|
||||||
countries not thus excluded. In such case, this License incorporates
|
countries not thus excluded. In such case, this License incorporates
|
||||||
the limitation as if written in the body of this License.
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
of the General Public License from time to time. Such new versions will
|
of the General Public License from time to time. Such new versions will
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
address new problems or concerns.
|
address new problems or concerns.
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
Each version is given a distinguishing version number. If the Program
|
||||||
specifies a version number of this License which applies to it and "any
|
specifies a version number of this License which applies to it and "any
|
||||||
later version", you have the option of following the terms and conditions
|
later version", you have the option of following the terms and conditions
|
||||||
either of that version or of any later version published by the Free
|
either of that version or of any later version published by the Free
|
||||||
Software Foundation. If the Program does not specify a version number of
|
Software Foundation. If the Program does not specify a version number of
|
||||||
this License, you may choose any version ever published by the Free Software
|
this License, you may choose any version ever published by the Free Software
|
||||||
Foundation.
|
Foundation.
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
programs whose distribution conditions are different, write to the author
|
programs whose distribution conditions are different, write to the author
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
REPAIR OR CORRECTION.
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
free software which everyone can redistribute and change under these terms.
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
To do so, attach the following notices to the program. It is safest
|
||||||
to attach them to the start of each source file to most effectively
|
to attach them to the start of each source file to most effectively
|
||||||
convey the exclusion of warranty; and each file should have at least
|
convey the exclusion of warranty; and each file should have at least
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) <year> <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
parts of the General Public License. Of course, the commands you use may
|
parts of the General Public License. Of course, the commands you use may
|
||||||
be called something other than `show w' and `show c'; they could even be
|
be called something other than `show w' and `show c'; they could even be
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
You should also get your employer (if you work as a programmer) or your
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
necessary. Here is a sample; alter the names:
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
<signature of Ty Coon>, 1 April 1989
|
||||||
Ty Coon, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|
||||||
|
|
|
@ -1,115 +1,123 @@
|
||||||
# Reliance Edge
|
# Reliance Edge
|
||||||
|
|
||||||
Reliance Edge is a small, portable, highly reliable power-fail safe file system
|
Reliance Edge is a small, portable, highly reliable power-fail safe file system
|
||||||
for resource-constrained embedded systems like microcontrollers. It is written
|
for resource-constrained embedded systems like microcontrollers. It is written
|
||||||
in C and provides a familiar POSIX-like file system API, making it easy to use
|
in C and provides a familiar POSIX-like file system API, making it easy to use
|
||||||
in your application; or an alternate minimalist API if your application has
|
in your application; or an alternate minimalist API if your application has
|
||||||
simple storage needs. Reliance Edge is highly configurable and can be tuned to
|
simple storage needs. Reliance Edge is highly configurable and can be tuned to
|
||||||
the precise needs of your application.
|
the precise needs of your application.
|
||||||
|
|
||||||
## Documentation
|
## Getting Help
|
||||||
|
|
||||||
The complete documentation for Reliance Edge is distributed separately. It
|
You will find this section later in our readme as well - but we wanted to tell
|
||||||
includes an API reference and detailed discussions of various aspects of using
|
you up front: DATALIGHT WANTS TO HEAR FROM YOU! Whether it's just to make
|
||||||
Reliance Edge, including porting, building, configuring, and testing. This
|
comments about the product, to suggest new features, or to tell us what you
|
||||||
complete documentation, called the _Developer's Guide_, can be obtained for free
|
don't like - reach out! All comments and inquiries can be directed to
|
||||||
from here:
|
<RelianceEdgeSupport@datalight.com>.
|
||||||
|
|
||||||
<http://www.datalight.com/reliance-edge>
|
## Documentation
|
||||||
|
|
||||||
In addition this README, see [doc/release_notes.md](doc/release_notes.md) for a
|
The complete documentation for Reliance Edge is distributed separately. It
|
||||||
list of updates to Reliance Edge and a list of known issues. There is also a
|
includes an API reference and detailed discussions of various aspects of using
|
||||||
quick-start guide in the doc/ directory that describes step-by-step how to
|
Reliance Edge, including porting, building, configuring, and testing. This
|
||||||
compile and run Reliance Edge in a simulated Windows environment.
|
complete documentation, called the _Developer's Guide_, can be obtained for free
|
||||||
|
from here:
|
||||||
## Why Use Reliance Edge?
|
|
||||||
|
<http://www.datalight.com/reliance-edge>
|
||||||
Reliance Edge is ideal for small embedded systems with data storage
|
|
||||||
requirements, especially if there is a chance of sudden power loss or other
|
In addition this README, see doc/release_notes.md for a list of updates
|
||||||
system failures. Compared to "raw" disk access, using a file system like
|
to Reliance Edge and a list of known issues. There is also a quick-start
|
||||||
Reliance Edge removes the burden of tracking which sectors belong to which
|
guide in the doc/ directory that describes step-by-step how to compile
|
||||||
objects, and allows data to be updated more reliably. Compared to the FAT file
|
and run Reliance Edge in a simulated Windows environment.
|
||||||
system, using Reliance Edge eliminates the possibility that file system data
|
|
||||||
will be left in an inconsistent state, corrupting the disk; Reliance Edge does
|
## Why Use Reliance Edge?
|
||||||
not need a fsck/CHKDSK utility. Compared to journaling file systems, Reliance
|
|
||||||
Edge has less overhead and results in less storage media wear for longer device
|
Reliance Edge is ideal for small embedded systems with data storage
|
||||||
lifetimes.
|
requirements, especially if there is a chance of sudden power loss or other
|
||||||
|
system failures. Compared to "raw" disk access, using a file system like
|
||||||
Reliance Edge uses a unique transactional model that not only prevents file
|
Reliance Edge removes the burden of tracking which sectors belong to which
|
||||||
system corruption but also allows a set of changes to be made in an atomic "all
|
objects, and allows data to be updated more reliably. Compared to the FAT file
|
||||||
or nothing" fashion. This is very useful for applications that make sets of
|
system, using Reliance Edge eliminates the possibility that file system data
|
||||||
interrelated changes. By using the features of Reliance Edge, a set of changes
|
will be left in an inconsistent state, corrupting the disk; Reliance Edge does
|
||||||
can be incorporated into a single atomic transaction, which is committed in its
|
not need a fsck/CHKDSK utility. Compared to journaling file systems, Reliance
|
||||||
entirety or not at all even if interrupted by power loss; this means the
|
Edge has less overhead and results in less storage media wear for longer device
|
||||||
application does not need code to recover from partially-finished updates.
|
lifetimes.
|
||||||
|
|
||||||
## Hardware
|
Reliance Edge uses a unique transactional model that not only prevents file
|
||||||
|
system corruption but also allows a set of changes to be made in an atomic "all
|
||||||
The typical hardware for Reliance Edge is a 32-bit microcontroller, but other
|
or nothing" fashion. This is very useful for applications that make sets of
|
||||||
targets are possible. In its typical configurations, Reliance Edge needs at
|
interrelated changes. By using the features of Reliance Edge, a set of changes
|
||||||
least 4 KB to 5 KB of RAM, 11 to 18 KB of code space (on the ROM or NOR flash),
|
can be incorporated into a single atomic transaction, which is committed in its
|
||||||
and 500 to 700 bytes of stack.
|
entirety or not at all even if interrupted by power loss; this means the
|
||||||
|
application does not need code to recover from partially-finished updates.
|
||||||
Reliance Edge is not designed for high-end embedded systems that run complicated
|
|
||||||
operating systems like Linux or Windows Embedded Compact. Embedded systems of
|
## Hardware
|
||||||
that variety are better served by other file systems, like Datalight's
|
|
||||||
[Reliance Nitro](http://www.datalight.com/products/embedded-file-systems/reliance-nitro).
|
The typical hardware for Reliance Edge is a 32-bit microcontroller, but other
|
||||||
|
targets are possible. In its typical configurations, Reliance Edge needs at
|
||||||
## Getting Reliance Edge Working
|
least 4 KB to 5 KB of RAM, 11 to 18 KB of code space (on the ROM or NOR flash),
|
||||||
|
and 500 to 700 bytes of stack.
|
||||||
Before you can use Reliance Edge, it must be ported and configured. At a
|
|
||||||
minimum, porting includes filling-in functions so that Reliance Edge can issue
|
Reliance Edge is not designed for high-end embedded systems that run complicated
|
||||||
commands to your storage medium; depending on your needs, other functions may
|
operating systems like Linux or Windows Embedded Compact. Embedded systems of
|
||||||
need to be filled in as well. These functions reside in a subdirectory in the
|
that variety are better served by other file systems, like Datalight's
|
||||||
os/ directory; see os/stub/ for a blank set of functions. Configuring includes
|
[Reliance Nitro](http://www.datalight.com/products/embedded-file-systems/reliance-nitro).
|
||||||
creating a project directory (start by copying projects/newproj) and creating
|
|
||||||
the two configuration files (redconf.h/redconf.c) using the Reliance Edge
|
## Getting Reliance Edge Working
|
||||||
Configuration Utility (which can be downloaded from
|
|
||||||
<http://www.datalight.com/reliance-edge>).
|
Before you can use Reliance Edge, it must be ported and configured. At a
|
||||||
|
minimum, porting includes filling-in functions so that Reliance Edge can issue
|
||||||
These topics are covered in much greater detail in the _Developer's Guide_,
|
commands to your storage medium; depending on your needs, other functions may
|
||||||
linked above.
|
need to be filled in as well. These functions reside in a subdirectory in the
|
||||||
|
os/ directory; see os/stub/ for a blank set of functions. Configuring includes
|
||||||
## Using Reliance Edge
|
creating a project directory (start by copying projects/newproj) and creating
|
||||||
|
the two configuration files (redconf.h/redconf.c) using the Reliance Edge
|
||||||
Using Reliance Edge is a simple matter of including the primary Reliance Edge
|
Configuration Utility (which can be downloaded from
|
||||||
application header in your application (either include/redposix.h or
|
<http://www.datalight.com/reliance-edge>).
|
||||||
include/redfse.h) and compiling and linking against Reliance Edge binaries.
|
|
||||||
The Reliance Edge driver must be initialized before it is used (via the
|
These topics are covered in much greater detail in the _Developer's Guide_,
|
||||||
red\_init() or RedFseInit() functions) and then volumes can be mounted and file
|
linked above.
|
||||||
and directory functions invoked. The Reliance Edge API is documented in the
|
|
||||||
_Developer's Guide_ (linked above) and also via comments in the source code.
|
## Using Reliance Edge
|
||||||
|
|
||||||
## Licensing
|
Using Reliance Edge is a simple matter of including the primary Reliance Edge
|
||||||
|
application header in your application (either include/redposix.h or
|
||||||
Reliance Edge is an open-source project licensed under the GNU General Public
|
include/redfse.h) and compiling and linking against Reliance Edge binaries.
|
||||||
License v2 (GPLv2). Businesses and individuals that for commercial or other
|
The Reliance Edge driver must be initialized before it is used (via the
|
||||||
reasons cannot comply with the terms of the GPLv2 license may obtain a
|
red\_init() or RedFseInit() functions) and then volumes can be mounted and file
|
||||||
commercial license before incorporating Reliance Edge into proprietary software
|
and directory functions invoked. The Reliance Edge API is documented in the
|
||||||
for distribution in any form. Visit <http://www.datalight.com/reliance-edge>
|
_Developer's Guide_ (linked above) and also via comments in the source code.
|
||||||
for more information. The commercial distribution also includes extra tests and
|
|
||||||
tools not distributed with the GPLv2 version.
|
## Licensing
|
||||||
|
|
||||||
See LICENSE.txt for the full license terms of this distribution of the product.
|
Reliance Edge is an open-source project licensed under the GNU General Public
|
||||||
|
License v2 (GPLv2). Businesses and individuals that for commercial or other
|
||||||
## Getting Help
|
reasons cannot comply with the terms of the GPLv2 license may obtain a
|
||||||
|
commercial license before incorporating Reliance Edge into proprietary software
|
||||||
If you need assistance using Reliance Edge, and you have already consulted the
|
for distribution in any form. Visit <http://www.datalight.com/reliance-edge>
|
||||||
_Developer's Guide_, contact <RelianceEdgeSupport@datalight.com>.
|
for more information. The commercial distribution also includes extra tests and
|
||||||
|
tools not distributed with the GPLv2 version.
|
||||||
In the near future, a community forum or message board will be set up to
|
|
||||||
facilitate discussion of Reliance Edge and allow users to get help from
|
See LICENSE.txt for the full license terms of this distribution of the product.
|
||||||
Datalight and from each other. In the meantime, please use the email address
|
|
||||||
given above.
|
## Getting Help
|
||||||
|
|
||||||
## Contributing
|
If you need assistance using Reliance Edge, and you have already consulted the
|
||||||
|
_Developer's Guide_, contact <RelianceEdgeSupport@datalight.com>.
|
||||||
Contributions to Reliance Edge are welcome. Our policy is that Datalight must
|
|
||||||
own the copyright of all code incorporated into Reliance Edge; if contributing a
|
In the near future, a community forum or message board will be set up to
|
||||||
significant amount of code, you will be asked to file a copyright assignment
|
facilitate discussion of Reliance Edge and allow users to get help from
|
||||||
agreement. See CONTRIBUTING.txt for further details and contribution
|
Datalight and from each other. In the meantime, please use the email address
|
||||||
guidelines.
|
given above.
|
||||||
|
|
||||||
To report bugs, please create a GitHub issue or contact
|
## Contributing
|
||||||
<RelianceEdgeSupport@datalight.com>.
|
|
||||||
|
Contributions to Reliance Edge are welcome. Our policy is that Datalight must
|
||||||
|
own the copyright of all code incorporated into Reliance Edge; if contributing a
|
||||||
|
significant amount of code, you will be asked to file a copyright assignment
|
||||||
|
agreement. See CONTRIBUTING.txt for further details and contribution
|
||||||
|
guidelines.
|
||||||
|
|
||||||
|
To report bugs, please create a GitHub issue or contact
|
||||||
|
<RelianceEdgeSupport@datalight.com>.
|
||||||
|
|
||||||
|
|
|
@ -1,131 +1,140 @@
|
||||||
|
|
||||||
|
|
||||||
RELIANCE EDGE
|
RELIANCE EDGE
|
||||||
|
|
||||||
|
|
||||||
Reliance Edge is a small, portable, highly reliable power-fail safe file
|
Reliance Edge is a small, portable, highly reliable power-fail safe file
|
||||||
system for resource-constrained embedded systems like microcontrollers.
|
system for resource-constrained embedded systems like microcontrollers.
|
||||||
It is written in C and provides a familiar POSIX-like file system API,
|
It is written in C and provides a familiar POSIX-like file system API,
|
||||||
making it easy to use in your application; or an alternate minimalist
|
making it easy to use in your application; or an alternate minimalist
|
||||||
API if your application has simple storage needs. Reliance Edge is
|
API if your application has simple storage needs. Reliance Edge is
|
||||||
highly configurable and can be tuned to the precise needs of your
|
highly configurable and can be tuned to the precise needs of your
|
||||||
application.
|
application.
|
||||||
|
|
||||||
|
|
||||||
Documentation
|
Getting Help
|
||||||
|
|
||||||
The complete documentation for Reliance Edge is distributed separately.
|
You will find this section later in our readme as well - but we wanted
|
||||||
It includes an API reference and detailed discussions of various aspects
|
to tell you up front: DATALIGHT WANTS TO HEAR FROM YOU! Whether it's
|
||||||
of using Reliance Edge, including porting, building, configuring, and
|
just to make comments about the product, to suggest new features, or to
|
||||||
testing. This complete documentation, called the _Developer's Guide_,
|
tell us what you don't like - reach out! All comments and inquiries can
|
||||||
can be obtained for free from here:
|
be directed to RelianceEdgeSupport@datalight.com.
|
||||||
|
|
||||||
http://www.datalight.com/reliance-edge
|
|
||||||
|
Documentation
|
||||||
In addition this README, see doc/release_notes.md for a list of updates
|
|
||||||
to Reliance Edge and a list of known issues. There is also a quick-start
|
The complete documentation for Reliance Edge is distributed separately.
|
||||||
guide in the doc/ directory that describes step-by-step how to compile
|
It includes an API reference and detailed discussions of various aspects
|
||||||
and run Reliance Edge in a simulated Windows environment.
|
of using Reliance Edge, including porting, building, configuring, and
|
||||||
|
testing. This complete documentation, called the _Developer's Guide_,
|
||||||
|
can be obtained for free from here:
|
||||||
Why Use Reliance Edge?
|
|
||||||
|
http://www.datalight.com/reliance-edge
|
||||||
Reliance Edge is ideal for small embedded systems with data storage
|
|
||||||
requirements, especially if there is a chance of sudden power loss or
|
In addition this README, see doc/release_notes.md for a list of updates
|
||||||
other system failures. Compared to "raw" disk access, using a file
|
to Reliance Edge and a list of known issues. There is also a quick-start
|
||||||
system like Reliance Edge removes the burden of tracking which sectors
|
guide in the doc/ directory that describes step-by-step how to compile
|
||||||
belong to which objects, and allows data to be updated more reliably.
|
and run Reliance Edge in a simulated Windows environment.
|
||||||
Compared to the FAT file system, using Reliance Edge eliminates the
|
|
||||||
possibility that file system data will be left in an inconsistent state,
|
|
||||||
corrupting the disk; Reliance Edge does not need a fsck/CHKDSK utility.
|
Why Use Reliance Edge?
|
||||||
Compared to journaling file systems, Reliance Edge has less overhead and
|
|
||||||
results in less storage media wear for longer device lifetimes.
|
Reliance Edge is ideal for small embedded systems with data storage
|
||||||
|
requirements, especially if there is a chance of sudden power loss or
|
||||||
Reliance Edge uses a unique transactional model that not only prevents
|
other system failures. Compared to "raw" disk access, using a file
|
||||||
file system corruption but also allows a set of changes to be made in an
|
system like Reliance Edge removes the burden of tracking which sectors
|
||||||
atomic "all or nothing" fashion. This is very useful for applications
|
belong to which objects, and allows data to be updated more reliably.
|
||||||
that make sets of interrelated changes. By using the features of
|
Compared to the FAT file system, using Reliance Edge eliminates the
|
||||||
Reliance Edge, a set of changes can be incorporated into a single atomic
|
possibility that file system data will be left in an inconsistent state,
|
||||||
transaction, which is committed in its entirety or not at all even if
|
corrupting the disk; Reliance Edge does not need a fsck/CHKDSK utility.
|
||||||
interrupted by power loss; this means the application does not need code
|
Compared to journaling file systems, Reliance Edge has less overhead and
|
||||||
to recover from partially-finished updates.
|
results in less storage media wear for longer device lifetimes.
|
||||||
|
|
||||||
|
Reliance Edge uses a unique transactional model that not only prevents
|
||||||
Hardware
|
file system corruption but also allows a set of changes to be made in an
|
||||||
|
atomic "all or nothing" fashion. This is very useful for applications
|
||||||
The typical hardware for Reliance Edge is a 32-bit microcontroller, but
|
that make sets of interrelated changes. By using the features of
|
||||||
other targets are possible. In its typical configurations, Reliance Edge
|
Reliance Edge, a set of changes can be incorporated into a single atomic
|
||||||
needs at least 4 KB to 5 KB of RAM, 11 to 18 KB of code space (on the
|
transaction, which is committed in its entirety or not at all even if
|
||||||
ROM or NOR flash), and 500 to 700 bytes of stack.
|
interrupted by power loss; this means the application does not need code
|
||||||
|
to recover from partially-finished updates.
|
||||||
Reliance Edge is not designed for high-end embedded systems that run
|
|
||||||
complicated operating systems like Linux or Windows Embedded Compact.
|
|
||||||
Embedded systems of that variety are better served by other file
|
Hardware
|
||||||
systems, like Datalight's Reliance Nitro.
|
|
||||||
|
The typical hardware for Reliance Edge is a 32-bit microcontroller, but
|
||||||
|
other targets are possible. In its typical configurations, Reliance Edge
|
||||||
Getting Reliance Edge Working
|
needs at least 4 KB to 5 KB of RAM, 11 to 18 KB of code space (on the
|
||||||
|
ROM or NOR flash), and 500 to 700 bytes of stack.
|
||||||
Before you can use Reliance Edge, it must be ported and configured. At a
|
|
||||||
minimum, porting includes filling-in functions so that Reliance Edge can
|
Reliance Edge is not designed for high-end embedded systems that run
|
||||||
issue commands to your storage medium; depending on your needs, other
|
complicated operating systems like Linux or Windows Embedded Compact.
|
||||||
functions may need to be filled in as well. These functions reside in a
|
Embedded systems of that variety are better served by other file
|
||||||
subdirectory in the os/ directory; see os/stub/ for a blank set of
|
systems, like Datalight's Reliance Nitro.
|
||||||
functions. Configuring includes creating a project directory (start by
|
|
||||||
copying projects/newproj) and creating the two configuration files
|
|
||||||
(redconf.h/redconf.c) using the Reliance Edge Configuration Utility
|
Getting Reliance Edge Working
|
||||||
(which can be downloaded from http://www.datalight.com/reliance-edge).
|
|
||||||
|
Before you can use Reliance Edge, it must be ported and configured. At a
|
||||||
These topics are covered in much greater detail in the _Developer's
|
minimum, porting includes filling-in functions so that Reliance Edge can
|
||||||
Guide_, linked above.
|
issue commands to your storage medium; depending on your needs, other
|
||||||
|
functions may need to be filled in as well. These functions reside in a
|
||||||
|
subdirectory in the os/ directory; see os/stub/ for a blank set of
|
||||||
Using Reliance Edge
|
functions. Configuring includes creating a project directory (start by
|
||||||
|
copying projects/newproj) and creating the two configuration files
|
||||||
Using Reliance Edge is a simple matter of including the primary Reliance
|
(redconf.h/redconf.c) using the Reliance Edge Configuration Utility
|
||||||
Edge application header in your application (either include/redposix.h
|
(which can be downloaded from http://www.datalight.com/reliance-edge).
|
||||||
or include/redfse.h) and compiling and linking against Reliance Edge
|
|
||||||
binaries. The Reliance Edge driver must be initialized before it is used
|
These topics are covered in much greater detail in the _Developer's
|
||||||
(via the red_init() or RedFseInit() functions) and then volumes can be
|
Guide_, linked above.
|
||||||
mounted and file and directory functions invoked. The Reliance Edge API
|
|
||||||
is documented in the _Developer's Guide_ (linked above) and also via
|
|
||||||
comments in the source code.
|
Using Reliance Edge
|
||||||
|
|
||||||
|
Using Reliance Edge is a simple matter of including the primary Reliance
|
||||||
Licensing
|
Edge application header in your application (either include/redposix.h
|
||||||
|
or include/redfse.h) and compiling and linking against Reliance Edge
|
||||||
Reliance Edge is an open-source project licensed under the GNU General
|
binaries. The Reliance Edge driver must be initialized before it is used
|
||||||
Public License v2 (GPLv2). Businesses and individuals that for
|
(via the red_init() or RedFseInit() functions) and then volumes can be
|
||||||
commercial or other reasons cannot comply with the terms of the GPLv2
|
mounted and file and directory functions invoked. The Reliance Edge API
|
||||||
license may obtain a commercial license before incorporating Reliance
|
is documented in the _Developer's Guide_ (linked above) and also via
|
||||||
Edge into proprietary software for distribution in any form. Visit
|
comments in the source code.
|
||||||
http://www.datalight.com/reliance-edge for more information. The
|
|
||||||
commercial distribution also includes extra tests and tools not
|
|
||||||
distributed with the GPLv2 version.
|
Licensing
|
||||||
|
|
||||||
See LICENSE.txt for the full license terms of this distribution of the
|
Reliance Edge is an open-source project licensed under the GNU General
|
||||||
product.
|
Public License v2 (GPLv2). Businesses and individuals that for
|
||||||
|
commercial or other reasons cannot comply with the terms of the GPLv2
|
||||||
|
license may obtain a commercial license before incorporating Reliance
|
||||||
Getting Help
|
Edge into proprietary software for distribution in any form. Visit
|
||||||
|
http://www.datalight.com/reliance-edge for more information. The
|
||||||
If you need assistance using Reliance Edge, and you have already
|
commercial distribution also includes extra tests and tools not
|
||||||
consulted the _Developer's Guide_, contact
|
distributed with the GPLv2 version.
|
||||||
RelianceEdgeSupport@datalight.com.
|
|
||||||
|
See LICENSE.txt for the full license terms of this distribution of the
|
||||||
In the near future, a community forum or message board will be set up to
|
product.
|
||||||
facilitate discussion of Reliance Edge and allow users to get help from
|
|
||||||
Datalight and from each other. In the meantime, please use the email
|
|
||||||
address given above.
|
Getting Help
|
||||||
|
|
||||||
|
If you need assistance using Reliance Edge, and you have already
|
||||||
Contributing
|
consulted the _Developer's Guide_, contact
|
||||||
|
RelianceEdgeSupport@datalight.com.
|
||||||
Contributions to Reliance Edge are welcome. Our policy is that Datalight
|
|
||||||
must own the copyright of all code incorporated into Reliance Edge; if
|
In the near future, a community forum or message board will be set up to
|
||||||
contributing a significant amount of code, you will be asked to file a
|
facilitate discussion of Reliance Edge and allow users to get help from
|
||||||
copyright assignment agreement. See CONTRIBUTING.txt for further details
|
Datalight and from each other. In the meantime, please use the email
|
||||||
and contribution guidelines.
|
address given above.
|
||||||
|
|
||||||
To report bugs, please create a GitHub issue or contact
|
|
||||||
RelianceEdgeSupport@datalight.com.
|
Contributing
|
||||||
|
|
||||||
|
Contributions to Reliance Edge are welcome. Our policy is that Datalight
|
||||||
|
must own the copyright of all code incorporated into Reliance Edge; if
|
||||||
|
contributing a significant amount of code, you will be asked to file a
|
||||||
|
copyright assignment agreement. See CONTRIBUTING.txt for further details
|
||||||
|
and contribution guidelines.
|
||||||
|
|
||||||
|
To report bugs, please create a GitHub issue or contact
|
||||||
|
RelianceEdgeSupport@datalight.com.
|
||||||
|
|
|
@ -65,7 +65,7 @@ VOLUME * CONST_IF_ONE_VOLUME gpRedVolume = &gaRedVolume[0U];
|
||||||
COREVOLUME * CONST_IF_ONE_VOLUME gpRedCoreVol = &gaCoreVol[0U];
|
COREVOLUME * CONST_IF_ONE_VOLUME gpRedCoreVol = &gaCoreVol[0U];
|
||||||
METAROOT *gpRedMR = &gaCoreVol[0U].aMR[0U];
|
METAROOT *gpRedMR = &gaCoreVol[0U].aMR[0U];
|
||||||
|
|
||||||
CONST_IF_ONE_VOLUME uint8_t gbRedVolNum;
|
CONST_IF_ONE_VOLUME uint8_t gbRedVolNum = 0;
|
||||||
|
|
||||||
|
|
||||||
/** @brief Initialize the Reliance Edge file system driver.
|
/** @brief Initialize the Reliance Edge file system driver.
|
||||||
|
@ -1235,7 +1235,7 @@ REDSTATUS RedCoreLookup(
|
||||||
@param pszSrcName The name of the file or directory to rename.
|
@param pszSrcName The name of the file or directory to rename.
|
||||||
@param ulDstPInode The new parent directory inode number of the file or
|
@param ulDstPInode The new parent directory inode number of the file or
|
||||||
directory after the rename.
|
directory after the rename.
|
||||||
@param pszNewPath The new name of the file or directory after the rename.
|
@param pszDstName The new name of the file or directory after the rename.
|
||||||
|
|
||||||
@return A negated ::REDSTATUS code indicating the operation result.
|
@return A negated ::REDSTATUS code indicating the operation result.
|
||||||
|
|
||||||
|
@ -1314,7 +1314,7 @@ REDSTATUS RedCoreRename(
|
||||||
@param pszSrcName The name of the file or directory to rename.
|
@param pszSrcName The name of the file or directory to rename.
|
||||||
@param ulDstPInode The new parent directory inode number of the file or
|
@param ulDstPInode The new parent directory inode number of the file or
|
||||||
directory after the rename.
|
directory after the rename.
|
||||||
@param pszNewPath The new name of the file or directory after the rename.
|
@param pszDstName The new name of the file or directory after the rename.
|
||||||
|
|
||||||
@return A negated ::REDSTATUS code indicating the operation result.
|
@return A negated ::REDSTATUS code indicating the operation result.
|
||||||
|
|
||||||
|
|
|
@ -199,21 +199,23 @@ REDSTATUS RedDirEntryDelete(
|
||||||
}
|
}
|
||||||
else if((DirEntryIndexToOffset(ulDeleteIdx) + DIRENT_SIZE) == pPInode->pInodeBuf->ullSize)
|
else if((DirEntryIndexToOffset(ulDeleteIdx) + DIRENT_SIZE) == pPInode->pInodeBuf->ullSize)
|
||||||
{
|
{
|
||||||
uint32_t ulTruncIdx = ulDeleteIdx;
|
/* Start searching one behind the index to be deleted.
|
||||||
|
*/
|
||||||
|
uint32_t ulTruncIdx = ulDeleteIdx - 1U;
|
||||||
bool fDone = false;
|
bool fDone = false;
|
||||||
|
|
||||||
/* We are deleting the last dirent in the directory, so search
|
/* We are deleting the last dirent in the directory, so search
|
||||||
backwards to find the last populated dirent, allowing us to truncate
|
backwards to find the last populated dirent, allowing us to truncate
|
||||||
the directory to that point.
|
the directory to that point.
|
||||||
*/
|
*/
|
||||||
while((ret == 0) && (ulTruncIdx > 0U) && !fDone)
|
while((ret == 0) && (ulTruncIdx != UINT32_MAX) && !fDone)
|
||||||
{
|
{
|
||||||
ret = RedInodeDataSeekAndRead(pPInode, ulTruncIdx / DIRENTS_PER_BLOCK);
|
ret = RedInodeDataSeekAndRead(pPInode, ulTruncIdx / DIRENTS_PER_BLOCK);
|
||||||
|
|
||||||
if(ret == 0)
|
if(ret == 0)
|
||||||
{
|
{
|
||||||
const DIRENT *pDirents = CAST_CONST_DIRENT_PTR(pPInode->pbData);
|
const DIRENT *pDirents = CAST_CONST_DIRENT_PTR(pPInode->pbData);
|
||||||
uint32_t ulBlockIdx = (ulTruncIdx - 1U) % DIRENTS_PER_BLOCK;
|
uint32_t ulBlockIdx = ulTruncIdx % DIRENTS_PER_BLOCK;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -242,6 +244,12 @@ REDSTATUS RedDirEntryDelete(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Currently ulTruncIdx represents the last valid dirent index, or
|
||||||
|
UINT32_MAX if the directory is now empty. Increment it so that it
|
||||||
|
represents the first invalid entry, which will be truncated.
|
||||||
|
*/
|
||||||
|
ulTruncIdx++;
|
||||||
|
|
||||||
/* Truncate the directory, deleting the requested entry and any empty
|
/* Truncate the directory, deleting the requested entry and any empty
|
||||||
dirents at the end of the directory.
|
dirents at the end of the directory.
|
||||||
*/
|
*/
|
||||||
|
@ -449,7 +457,7 @@ REDSTATUS RedDirEntryLookup(
|
||||||
#if (REDCONF_API_POSIX_READDIR == 1) || (REDCONF_CHECKER == 1)
|
#if (REDCONF_API_POSIX_READDIR == 1) || (REDCONF_CHECKER == 1)
|
||||||
/** @brief Read the next entry from a directory, given a starting index.
|
/** @brief Read the next entry from a directory, given a starting index.
|
||||||
|
|
||||||
@param pInode A pointer to the cached inode structure of the directory to
|
@param pPInode A pointer to the cached inode structure of the directory to
|
||||||
read from.
|
read from.
|
||||||
@param pulIdx On entry, the directory index to start reading from. On
|
@param pulIdx On entry, the directory index to start reading from. On
|
||||||
successful return, populated with the directory index to use
|
successful return, populated with the directory index to use
|
||||||
|
|
|
@ -158,6 +158,7 @@ REDSTATUS RedImapBlockSet(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust the free/almost free block count if the block was allocable.
|
/* Adjust the free/almost free block count if the block was allocable.
|
||||||
|
Discard the block if required.
|
||||||
*/
|
*/
|
||||||
if((ret == 0) && (ulBlock >= gpRedCoreVol->ulFirstAllocableBN))
|
if((ret == 0) && (ulBlock >= gpRedCoreVol->ulFirstAllocableBN))
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,6 +63,10 @@ REDSTATUS RedVolMount(void)
|
||||||
|
|
||||||
if(ret != 0)
|
if(ret != 0)
|
||||||
{
|
{
|
||||||
|
/* If we fail to mount, invalidate the buffers to prevent any
|
||||||
|
confusion that could be caused by stale or corrupt metadata.
|
||||||
|
*/
|
||||||
|
(void)RedBufferDiscardRange(0U, gpRedVolume->ulBlockCount);
|
||||||
(void)RedOsBDevClose(gbRedVolNum);
|
(void)RedOsBDevClose(gbRedVolNum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,39 @@ recent releases and a list of known issues.
|
||||||
|
|
||||||
## Release History and Changes
|
## Release History and Changes
|
||||||
|
|
||||||
|
### Reliance Edge v2.0, January 2017
|
||||||
|
|
||||||
|
- Added support for Linux as a host environment
|
||||||
|
- All "host" projects may now be built in either Windows or Linux using the
|
||||||
|
`make` command. The formatter and image builder are built, and the checker
|
||||||
|
and image copier are also built in the commercial kit.
|
||||||
|
- An additional host tool has been added for Linux only: `redfuse`. It is a
|
||||||
|
File System in User Space (FUSE) implementation, allowing a Reliance Edge
|
||||||
|
volume to be mounted directly on Linux for easy access. It is built from
|
||||||
|
the host project folder using the command `make redfuse`.
|
||||||
|
- The OS-specific API test (commercial kit only) is now ported to run on Linux
|
||||||
|
for the purpose of verifying the FUSE implementation.
|
||||||
|
- Fixed a bug that could leave a directory in an invalid state after removing
|
||||||
|
files. For example, an affected directory might report a non-zero length even
|
||||||
|
after all files had been deleted.
|
||||||
|
- Fixed a bug that would leave the driver in a bad state if a mount operation
|
||||||
|
failed due to missing or corrupt metaroot blocks.
|
||||||
|
|
||||||
|
### Reliance Edge v1.1 (Beta), November 2016
|
||||||
|
|
||||||
|
- Added support for a discard (trim) interface in the commercial kit. While
|
||||||
|
discards are not integral to the behavior of the filesystem, they allow
|
||||||
|
certain types of Flash drivers and media to perform at optimal speed and
|
||||||
|
efficiency. The commercial version of Reliance Edge now allows the user to
|
||||||
|
implement this interface for compatible storage media.
|
||||||
|
- This change added new fields to the configuration files redconf.h and
|
||||||
|
redconf.c. The configuration utility has been updated to version 1.1 and
|
||||||
|
existing configuration files must be updated using the updated utility.
|
||||||
|
- The configuration utility now has keyboard shortcuts for opening and saving
|
||||||
|
the configuration.
|
||||||
|
- The configuration utility now adds version macros to easily identify when an
|
||||||
|
outdated configuration file is used with Reliance Edge or vice versa.
|
||||||
|
|
||||||
### Reliance Edge v1.0.4, July 2016
|
### Reliance Edge v1.0.4, July 2016
|
||||||
|
|
||||||
- Added ARM mbed and ARM mbed OS support in the commercial kit, with an example
|
- Added ARM mbed and ARM mbed OS support in the commercial kit, with an example
|
||||||
|
@ -23,7 +56,7 @@ recent releases and a list of known issues.
|
||||||
number of times to retry a block device read, write or flush operation before
|
number of times to retry a block device read, write or flush operation before
|
||||||
returning a failure. The configuration tool has been updated to version 1.0.2
|
returning a failure. The configuration tool has been updated to version 1.0.2
|
||||||
with this change.
|
with this change.
|
||||||
- This added a new field to the volume configuration in to redconf.c: existing
|
- This added a new field to the volume configuration in redconf.c: existing
|
||||||
redconf.c files from v1.0.1 and earlier must be updated to work with v1.0.2.
|
redconf.c files from v1.0.1 and earlier must be updated to work with v1.0.2.
|
||||||
Open redconf.h and redconf.c with the configuration tool, enable
|
Open redconf.h and redconf.c with the configuration tool, enable
|
||||||
"Retry block device I/O on failure" for any volumes if desired, and save the
|
"Retry block device I/O on failure" for any volumes if desired, and save the
|
||||||
|
|
|
@ -9,6 +9,44 @@ course of recent releases and a list of known issues.
|
||||||
|
|
||||||
Release History and Changes
|
Release History and Changes
|
||||||
|
|
||||||
|
Reliance Edge v2.0, January 2017
|
||||||
|
|
||||||
|
- Added support for Linux as a host environment
|
||||||
|
- All "host" projects may now be built in either Windows or Linux
|
||||||
|
using the make command. The formatter and image builder are built,
|
||||||
|
and the checker and image copier are also built in the
|
||||||
|
commercial kit.
|
||||||
|
- An additional host tool has been added for Linux only: redfuse. It
|
||||||
|
is a File System in User Space (FUSE) implementation, allowing a
|
||||||
|
Reliance Edge volume to be mounted directly on Linux for
|
||||||
|
easy access. It is built from the host project folder using the
|
||||||
|
command make redfuse.
|
||||||
|
- The OS-specific API test (commercial kit only) is now ported to run
|
||||||
|
on Linux for the purpose of verifying the FUSE implementation.
|
||||||
|
- Fixed a bug that could leave a directory in an invalid state after
|
||||||
|
removing files. For example, an affected directory might report a
|
||||||
|
non-zero length even after all files had been deleted.
|
||||||
|
- Fixed a bug that would leave the driver in a bad state if a mount
|
||||||
|
operation failed due to missing or corrupt metaroot blocks.
|
||||||
|
|
||||||
|
Reliance Edge v1.1 (Beta), November 2016
|
||||||
|
|
||||||
|
- Added support for a discard (trim) interface in the commercial kit.
|
||||||
|
While discards are not integral to the behavior of the filesystem,
|
||||||
|
they allow certain types of Flash drivers and media to perform at
|
||||||
|
optimal speed and efficiency. The commercial version of Reliance
|
||||||
|
Edge now allows the user to implement this interface for compatible
|
||||||
|
storage media.
|
||||||
|
- This change added new fields to the configuration files redconf.h
|
||||||
|
and redconf.c. The configuration utility has been updated to version
|
||||||
|
1.1 and existing configuration files must be updated using the
|
||||||
|
updated utility.
|
||||||
|
- The configuration utility now has keyboard shortcuts for opening and
|
||||||
|
saving the configuration.
|
||||||
|
- The configuration utility now adds version macros to easily identify
|
||||||
|
when an outdated configuration file is used with Reliance Edge or
|
||||||
|
vice versa.
|
||||||
|
|
||||||
Reliance Edge v1.0.4, July 2016
|
Reliance Edge v1.0.4, July 2016
|
||||||
|
|
||||||
- Added ARM mbed and ARM mbed OS support in the commercial kit, with
|
- Added ARM mbed and ARM mbed OS support in the commercial kit, with
|
||||||
|
@ -29,7 +67,7 @@ Common Code Changes
|
||||||
specify a number of times to retry a block device read, write or
|
specify a number of times to retry a block device read, write or
|
||||||
flush operation before returning a failure. The configuration tool
|
flush operation before returning a failure. The configuration tool
|
||||||
has been updated to version 1.0.2 with this change.
|
has been updated to version 1.0.2 with this change.
|
||||||
- This added a new field to the volume configuration in to redconf.c:
|
- This added a new field to the volume configuration in redconf.c:
|
||||||
existing redconf.c files from v1.0.1 and earlier must be updated to
|
existing redconf.c files from v1.0.1 and earlier must be updated to
|
||||||
work with v1.0.2. Open redconf.h and redconf.c with the
|
work with v1.0.2. Open redconf.h and redconf.c with the
|
||||||
configuration tool, enable "Retry block device I/O on failure" for
|
configuration tool, enable "Retry block device I/O on failure" for
|
||||||
|
|
|
@ -1,317 +1,349 @@
|
||||||
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
||||||
|
|
||||||
Copyright (c) 2014-2015 Datalight, Inc.
|
Copyright (c) 2014-2015 Datalight, Inc.
|
||||||
All Rights Reserved Worldwide.
|
All Rights Reserved Worldwide.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; use version 2 of the License.
|
the Free Software Foundation; use version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
/* Businesses and individuals that for commercial or other reasons cannot
|
/* Businesses and individuals that for commercial or other reasons cannot
|
||||||
comply with the terms of the GPLv2 license may obtain a commercial license
|
comply with the terms of the GPLv2 license may obtain a commercial license
|
||||||
before incorporating Reliance Edge into proprietary software for
|
before incorporating Reliance Edge into proprietary software for
|
||||||
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
||||||
more information.
|
more information.
|
||||||
*/
|
*/
|
||||||
/** @file
|
/** @file
|
||||||
@brief Compile-time validity checks for the REDCONF macros.
|
@brief Compile-time validity checks for the REDCONF macros.
|
||||||
*/
|
*/
|
||||||
#ifndef REDCONFIGCHK_H
|
#ifndef REDCONFIGCHK_H
|
||||||
#define REDCONFIGCHK_H
|
#define REDCONFIGCHK_H
|
||||||
|
|
||||||
#ifndef REDCONF_READ_ONLY
|
#ifdef RED_CONFIG_MINCOMPAT_VER
|
||||||
#error "Configuration error: REDCONF_READ_ONLY must be defined."
|
#if (RED_VERSION_VAL & 0xFFFFFF00U) < (RED_CONFIG_MINCOMPAT_VER & 0xFFFFFF00U)
|
||||||
#endif
|
/* This indicates that your configuration files were generated by a
|
||||||
#ifndef REDCONF_API_POSIX
|
version of the Reliance Edge Configuration Utility that is designed
|
||||||
#error "Configuration error: REDCONF_API_POSIX must be defined."
|
for a more recent version of Reliance Edge and is no longer compatible
|
||||||
#endif
|
with this version. You can update to the most recent version of
|
||||||
#ifndef REDCONF_API_FSE
|
Reliance Edge or contact RelianceEdgeSupport@datalight.com to obtain
|
||||||
#error "Configuration error: REDCONF_API_FSE must be defined."
|
the correct legacy version of the Configuration Utility.
|
||||||
#endif
|
*/
|
||||||
|
#error "Your configuration is not compatible with this version of Reliance Edge. Please download the latest version of Reliance Edge or recreate your configuration with an older version of the Configuration Utility."
|
||||||
#if REDCONF_API_POSIX == 1
|
#endif
|
||||||
#ifndef REDCONF_API_POSIX_FORMAT
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_FORMAT must be defined."
|
|
||||||
#endif
|
#ifndef REDCONF_READ_ONLY
|
||||||
#ifndef REDCONF_API_POSIX_UNLINK
|
#error "Configuration error: REDCONF_READ_ONLY must be defined."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_UNLINK must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_API_POSIX
|
||||||
#ifndef REDCONF_API_POSIX_MKDIR
|
#error "Configuration error: REDCONF_API_POSIX must be defined."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_MKDIR must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_API_FSE
|
||||||
#ifndef REDCONF_API_POSIX_RMDIR
|
#error "Configuration error: REDCONF_API_FSE must be defined."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_RMDIR must be defined."
|
#endif
|
||||||
#endif
|
|
||||||
#ifndef REDCONF_API_POSIX_RENAME
|
#if REDCONF_API_POSIX == 1
|
||||||
#error "Configuration error: REDCONF_API_POSIX_RENAME must be defined."
|
#ifndef REDCONF_API_POSIX_FORMAT
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_FORMAT must be defined."
|
||||||
#ifndef REDCONF_API_POSIX_LINK
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_LINK must be defined."
|
#ifndef REDCONF_API_POSIX_UNLINK
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_UNLINK must be defined."
|
||||||
#ifndef REDCONF_API_POSIX_FTRUNCATE
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_FTRUNCATE must be defined."
|
#ifndef REDCONF_API_POSIX_MKDIR
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_MKDIR must be defined."
|
||||||
#ifndef REDCONF_API_POSIX_READDIR
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_READDIR must be defined."
|
#ifndef REDCONF_API_POSIX_RMDIR
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_RMDIR must be defined."
|
||||||
#ifndef REDCONF_NAME_MAX
|
#endif
|
||||||
#error "Configuration error: REDCONF_NAME_MAX must be defined."
|
#ifndef REDCONF_API_POSIX_RENAME
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_RENAME must be defined."
|
||||||
#ifndef REDCONF_PATH_SEPARATOR
|
#endif
|
||||||
#error "Configuration error: REDCONF_PATH_SEPARATOR must be defined."
|
#ifndef REDCONF_API_POSIX_LINK
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_LINK must be defined."
|
||||||
#ifndef REDCONF_RENAME_ATOMIC
|
#endif
|
||||||
#error "Configuration error: REDCONF_RENAME_ATOMIC must be defined."
|
#ifndef REDCONF_API_POSIX_FTRUNCATE
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_FTRUNCATE must be defined."
|
||||||
#ifndef REDCONF_HANDLE_COUNT
|
#endif
|
||||||
#error "Configuration error: REDCONF_HANDLE_COUNT must be defined."
|
#ifndef REDCONF_API_POSIX_READDIR
|
||||||
#endif
|
#error "Configuration error: REDCONF_API_POSIX_READDIR must be defined."
|
||||||
#endif
|
#endif
|
||||||
#if REDCONF_API_FSE == 1
|
#ifndef REDCONF_NAME_MAX
|
||||||
#ifndef REDCONF_API_FSE_FORMAT
|
#error "Configuration error: REDCONF_NAME_MAX must be defined."
|
||||||
#error "Configuration error: REDCONF_API_FSE_FORMAT must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_PATH_SEPARATOR
|
||||||
#ifndef REDCONF_API_FSE_TRUNCATE
|
#error "Configuration error: REDCONF_PATH_SEPARATOR must be defined."
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRUNCATE must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_RENAME_ATOMIC
|
||||||
#ifndef REDCONF_API_FSE_TRANSMASKSET
|
#error "Configuration error: REDCONF_RENAME_ATOMIC must be defined."
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRANSMASKSET must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_HANDLE_COUNT
|
||||||
#ifndef REDCONF_API_FSE_TRANSMASKGET
|
#error "Configuration error: REDCONF_HANDLE_COUNT must be defined."
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRANSMASKGET must be defined."
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#if REDCONF_API_FSE == 1
|
||||||
|
#ifndef REDCONF_API_FSE_FORMAT
|
||||||
#ifndef REDCONF_TASK_COUNT
|
#error "Configuration error: REDCONF_API_FSE_FORMAT must be defined."
|
||||||
#error "Configuration error: REDCONF_TASK_COUNT must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_API_FSE_TRUNCATE
|
||||||
#ifndef REDCONF_ENDIAN_BIG
|
#error "Configuration error: REDCONF_API_FSE_TRUNCATE must be defined."
|
||||||
#error "Configuration error: REDCONF_ENDIAN_BIG must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_API_FSE_TRANSMASKSET
|
||||||
#ifndef REDCONF_ALIGNMENT_SIZE
|
#error "Configuration error: REDCONF_API_FSE_TRANSMASKSET must be defined."
|
||||||
#error "Configuration error: REDCONF_ALIGNMENT_SIZE must be defined."
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_API_FSE_TRANSMASKGET
|
||||||
#ifndef REDCONF_CRC_ALGORITHM
|
#error "Configuration error: REDCONF_API_FSE_TRANSMASKGET must be defined."
|
||||||
#error "Configuration error: REDCONF_CRC_ALGORITHM must be defined."
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifndef REDCONF_INODE_TIMESTAMPS
|
|
||||||
#error "Configuration error: REDCONF_INODE_TIMESTAMPS must be defined."
|
#ifndef REDCONF_TASK_COUNT
|
||||||
#endif
|
#error "Configuration error: REDCONF_TASK_COUNT must be defined."
|
||||||
#ifndef REDCONF_ATIME
|
#endif
|
||||||
#error "Configuration error: REDCONF_ATIME must be defined."
|
#ifndef REDCONF_ENDIAN_BIG
|
||||||
#endif
|
#error "Configuration error: REDCONF_ENDIAN_BIG must be defined."
|
||||||
#ifndef REDCONF_DIRECT_POINTERS
|
#endif
|
||||||
#error "Configuration error: REDCONF_DIRECT_POINTERS must be defined."
|
#ifndef REDCONF_ALIGNMENT_SIZE
|
||||||
#endif
|
#error "Configuration error: REDCONF_ALIGNMENT_SIZE must be defined."
|
||||||
#ifndef REDCONF_INDIRECT_POINTERS
|
#endif
|
||||||
#error "Configuration error: REDCONF_INDIRECT_POINTERS must be defined."
|
#ifndef REDCONF_CRC_ALGORITHM
|
||||||
#endif
|
#error "Configuration error: REDCONF_CRC_ALGORITHM must be defined."
|
||||||
#ifndef REDCONF_INODE_BLOCKS
|
#endif
|
||||||
#error "Configuration error: REDCONF_INODE_BLOCKS must be defined."
|
#ifndef REDCONF_INODE_TIMESTAMPS
|
||||||
#endif
|
#error "Configuration error: REDCONF_INODE_TIMESTAMPS must be defined."
|
||||||
#ifndef REDCONF_IMAP_EXTERNAL
|
#endif
|
||||||
#error "Configuration error: REDCONF_IMAP_EXTERNAL must be defined."
|
#ifndef REDCONF_ATIME
|
||||||
#endif
|
#error "Configuration error: REDCONF_ATIME must be defined."
|
||||||
#ifndef REDCONF_IMAP_INLINE
|
#endif
|
||||||
#error "Configuration error: REDCONF_IMAP_INLINE must be defined."
|
#ifndef REDCONF_DIRECT_POINTERS
|
||||||
#endif
|
#error "Configuration error: REDCONF_DIRECT_POINTERS must be defined."
|
||||||
#ifndef REDCONF_OUTPUT
|
#endif
|
||||||
#error "Configuration error: REDCONF_OUTPUT must be defined."
|
#ifndef REDCONF_INDIRECT_POINTERS
|
||||||
#endif
|
#error "Configuration error: REDCONF_INDIRECT_POINTERS must be defined."
|
||||||
#ifndef REDCONF_ASSERTS
|
#endif
|
||||||
#error "Configuration error: REDCONF_ASSERTS must be defined."
|
#ifndef REDCONF_INODE_BLOCKS
|
||||||
#endif
|
#error "Configuration error: REDCONF_INODE_BLOCKS must be defined."
|
||||||
#ifndef REDCONF_TRANSACT_DEFAULT
|
#endif
|
||||||
#error "Configuration error: REDCONF_TRANSACT_DEFAULT must be defined."
|
#ifndef REDCONF_IMAP_EXTERNAL
|
||||||
#endif
|
#error "Configuration error: REDCONF_IMAP_EXTERNAL must be defined."
|
||||||
#ifndef REDCONF_BUFFER_COUNT
|
#endif
|
||||||
#error "Configuration error: REDCONF_BUFFER_COUNT must be defined."
|
#ifndef REDCONF_IMAP_INLINE
|
||||||
#endif
|
#error "Configuration error: REDCONF_IMAP_INLINE must be defined."
|
||||||
#ifndef REDCONF_BLOCK_SIZE
|
#endif
|
||||||
#error "Configuration error: REDCONF_BLOCK_SIZE must be defined."
|
#ifndef REDCONF_OUTPUT
|
||||||
#endif
|
#error "Configuration error: REDCONF_OUTPUT must be defined."
|
||||||
#ifndef REDCONF_VOLUME_COUNT
|
#endif
|
||||||
#error "Configuration error: REDCONF_VOLUME_COUNT must be defined."
|
#ifndef REDCONF_ASSERTS
|
||||||
#endif
|
#error "Configuration error: REDCONF_ASSERTS must be defined."
|
||||||
#ifndef REDCONF_IMAGE_BUILDER
|
#endif
|
||||||
#error "Configuration error: REDCONF_IMAGE_BUILDER must be defined."
|
#ifndef REDCONF_TRANSACT_DEFAULT
|
||||||
#endif
|
#error "Configuration error: REDCONF_TRANSACT_DEFAULT must be defined."
|
||||||
#ifndef REDCONF_CHECKER
|
#endif
|
||||||
#error "Configuration error: REDCONF_CHECKER must be defined."
|
#ifndef REDCONF_BUFFER_COUNT
|
||||||
#endif
|
#error "Configuration error: REDCONF_BUFFER_COUNT must be defined."
|
||||||
|
#endif
|
||||||
|
#ifndef REDCONF_BLOCK_SIZE
|
||||||
#if (REDCONF_READ_ONLY != 0) && (REDCONF_READ_ONLY != 1)
|
#error "Configuration error: REDCONF_BLOCK_SIZE must be defined."
|
||||||
#error "Configuration error: REDCONF_READ_ONLY must be either 0 or 1"
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_VOLUME_COUNT
|
||||||
|
#error "Configuration error: REDCONF_VOLUME_COUNT must be defined."
|
||||||
#if (REDCONF_API_POSIX != 0) && (REDCONF_API_POSIX != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX must be either 0 or 1."
|
#ifndef REDCONF_DISCARDS
|
||||||
#endif
|
/* Reliance Edge 1.0.5 and below did not have REDCONF_DISCARDS. You can
|
||||||
#if (REDCONF_API_FSE != 0) && (REDCONF_API_FSE != 1)
|
fix this error by downloading the latest version of the Configuration
|
||||||
#error "Configuration error: REDCONF_API_FSE must be either 0 or 1."
|
Utility (assuming you are using the latest version of Reliance Edge)
|
||||||
#endif
|
from http://www.datalight.com/reliance-edge, loading your redconf.c
|
||||||
|
and redconf.h files, and saving them again, replacing the original
|
||||||
#if (REDCONF_API_FSE == 0) && (REDCONF_API_POSIX == 0)
|
files.
|
||||||
#error "Configuration error: either REDCONF_API_FSE or REDCONF_API_POSIX must be set to 1."
|
*/
|
||||||
#endif
|
#error "Configuration error: your redconf.h is not compatible. Update your redconf files with a compatible version of the configuration utility."
|
||||||
|
#endif
|
||||||
#if REDCONF_API_POSIX == 1
|
#ifndef REDCONF_IMAGE_BUILDER
|
||||||
#if REDCONF_API_FSE != 0
|
#error "Configuration error: REDCONF_IMAGE_BUILDER must be defined."
|
||||||
#error "Configuration error: REDCONF_API_FSE must be 0 if REDCONF_API_POSIX is 1"
|
#endif
|
||||||
#endif
|
#ifndef REDCONF_CHECKER
|
||||||
|
#error "Configuration error: REDCONF_CHECKER must be defined."
|
||||||
#if (REDCONF_API_POSIX_FORMAT != 0) && (REDCONF_API_POSIX_FORMAT != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_FORMAT must be either 0 or 1."
|
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_READ_ONLY != 0) && (REDCONF_READ_ONLY != 1)
|
||||||
#if (REDCONF_API_POSIX_UNLINK != 0) && (REDCONF_API_POSIX_UNLINK != 1)
|
#error "Configuration error: REDCONF_READ_ONLY must be either 0 or 1"
|
||||||
#error "Configuration error: REDCONF_API_POSIX_UNLINK must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX != 0) && (REDCONF_API_POSIX != 1)
|
||||||
#if (REDCONF_API_POSIX_MKDIR != 0) && (REDCONF_API_POSIX_MKDIR != 1)
|
#error "Configuration error: REDCONF_API_POSIX must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_MKDIR must be either 0 or 1."
|
#endif
|
||||||
#endif
|
#if (REDCONF_API_FSE != 0) && (REDCONF_API_FSE != 1)
|
||||||
|
#error "Configuration error: REDCONF_API_FSE must be either 0 or 1."
|
||||||
#if (REDCONF_API_POSIX_RMDIR != 0) && (REDCONF_API_POSIX_RMDIR != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_RMDIR must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_API_FSE == 0) && (REDCONF_API_POSIX == 0)
|
||||||
|
#error "Configuration error: either REDCONF_API_FSE or REDCONF_API_POSIX must be set to 1."
|
||||||
#if (REDCONF_API_POSIX_RENAME != 0) && (REDCONF_API_POSIX_RENAME != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_POSIX_RENAME must be either 0 or 1."
|
|
||||||
#endif
|
#if REDCONF_API_POSIX == 1
|
||||||
|
#if REDCONF_API_FSE != 0
|
||||||
#if (REDCONF_API_POSIX_LINK != 0) && (REDCONF_API_POSIX_LINK != 1)
|
#error "Configuration error: REDCONF_API_FSE must be 0 if REDCONF_API_POSIX is 1"
|
||||||
#error "Configuration error: REDCONF_API_POSIX_LINK must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_FORMAT != 0) && (REDCONF_API_POSIX_FORMAT != 1)
|
||||||
#if (REDCONF_API_POSIX_FTRUNCATE != 0) && (REDCONF_API_POSIX_FTRUNCATE != 1)
|
#error "Configuration error: REDCONF_API_POSIX_FORMAT must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_FTRUNCATE must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_UNLINK != 0) && (REDCONF_API_POSIX_UNLINK != 1)
|
||||||
#if (REDCONF_API_POSIX_READDIR != 0) && (REDCONF_API_POSIX_READDIR != 1)
|
#error "Configuration error: REDCONF_API_POSIX_UNLINK must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_API_POSIX_READDIR must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_MKDIR != 0) && (REDCONF_API_POSIX_MKDIR != 1)
|
||||||
#if (REDCONF_NAME_MAX < 1U) || (REDCONF_NAME_MAX > (REDCONF_BLOCK_SIZE - 4U))
|
#error "Configuration error: REDCONF_API_POSIX_MKDIR must be either 0 or 1."
|
||||||
#error "Configuration error: invalid value of REDCONF_NAME_MAX"
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_RMDIR != 0) && (REDCONF_API_POSIX_RMDIR != 1)
|
||||||
#if (REDCONF_PATH_SEPARATOR < 1) || (REDCONF_PATH_SEPARATOR > 127)
|
#error "Configuration error: REDCONF_API_POSIX_RMDIR must be either 0 or 1."
|
||||||
#error "Configuration error: invalid value of REDCONF_PATH_SEPARATOR"
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_RENAME != 0) && (REDCONF_API_POSIX_RENAME != 1)
|
||||||
#if (REDCONF_RENAME_ATOMIC != 0) && (REDCONF_RENAME_ATOMIC != 1)
|
#error "Configuration error: REDCONF_API_POSIX_RENAME must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_RENAME_ATOMIC must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_POSIX_LINK != 0) && (REDCONF_API_POSIX_LINK != 1)
|
||||||
#if (REDCONF_HANDLE_COUNT < 1U) || (REDCONF_HANDLE_COUNT > 4096U)
|
#error "Configuration error: REDCONF_API_POSIX_LINK must be either 0 or 1."
|
||||||
#error "Configuration error: invalid value of REDCONF_HANDLE_COUNT"
|
#endif
|
||||||
#endif
|
|
||||||
#endif
|
#if (REDCONF_API_POSIX_FTRUNCATE != 0) && (REDCONF_API_POSIX_FTRUNCATE != 1)
|
||||||
#if REDCONF_API_FSE == 1
|
#error "Configuration error: REDCONF_API_POSIX_FTRUNCATE must be either 0 or 1."
|
||||||
#if (REDCONF_API_FSE_FORMAT != 0) && (REDCONF_API_FSE_FORMAT != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_FSE_FORMAT must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_API_POSIX_READDIR != 0) && (REDCONF_API_POSIX_READDIR != 1)
|
||||||
|
#error "Configuration error: REDCONF_API_POSIX_READDIR must be either 0 or 1."
|
||||||
#if (REDCONF_API_FSE_TRUNCATE != 0) && (REDCONF_API_FSE_TRUNCATE != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRUNCATE must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_NAME_MAX < 1U) || (REDCONF_NAME_MAX > (REDCONF_BLOCK_SIZE - 4U))
|
||||||
|
#error "Configuration error: invalid value of REDCONF_NAME_MAX"
|
||||||
#if (REDCONF_API_FSE_TRANSMASKSET != 0) && (REDCONF_API_FSE_TRANSMASKSET != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRANSMASKSET must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_PATH_SEPARATOR < 1) || (REDCONF_PATH_SEPARATOR > 127)
|
||||||
|
#error "Configuration error: invalid value of REDCONF_PATH_SEPARATOR"
|
||||||
#if (REDCONF_API_FSE_TRANSMASKGET != 0) && (REDCONF_API_FSE_TRANSMASKGET != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_API_FSE_TRANSMASKGET must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_RENAME_ATOMIC != 0) && (REDCONF_RENAME_ATOMIC != 1)
|
||||||
#endif
|
#error "Configuration error: REDCONF_RENAME_ATOMIC must be either 0 or 1."
|
||||||
|
#endif
|
||||||
#if REDCONF_TASK_COUNT < 1U
|
|
||||||
#error "Configuration error: invalid value of REDCONF_TASK_COUNT"
|
#if (REDCONF_HANDLE_COUNT < 1U) || (REDCONF_HANDLE_COUNT > 4096U)
|
||||||
#endif
|
#error "Configuration error: invalid value of REDCONF_HANDLE_COUNT"
|
||||||
|
#endif
|
||||||
#if (REDCONF_ENDIAN_BIG != 0) && (REDCONF_ENDIAN_BIG != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_ENDIAN_BIG must be either 0 or 1."
|
#if REDCONF_API_FSE == 1
|
||||||
#endif
|
#if (REDCONF_API_FSE_FORMAT != 0) && (REDCONF_API_FSE_FORMAT != 1)
|
||||||
|
#error "Configuration error: REDCONF_API_FSE_FORMAT must be either 0 or 1."
|
||||||
#if (REDCONF_ALIGNMENT_SIZE != 1U) && (REDCONF_ALIGNMENT_SIZE != 2U) && (REDCONF_ALIGNMENT_SIZE != 4U) && (REDCONF_ALIGNMENT_SIZE != 8U)
|
#endif
|
||||||
#error "Configuration error: invalid value REDCONF_ALIGNMENT_SIZE"
|
|
||||||
#endif
|
#if (REDCONF_API_FSE_TRUNCATE != 0) && (REDCONF_API_FSE_TRUNCATE != 1)
|
||||||
|
#error "Configuration error: REDCONF_API_FSE_TRUNCATE must be either 0 or 1."
|
||||||
/* REDCONF_CRC_ALGORITHM checked in crc.c
|
#endif
|
||||||
*/
|
|
||||||
|
#if (REDCONF_API_FSE_TRANSMASKSET != 0) && (REDCONF_API_FSE_TRANSMASKSET != 1)
|
||||||
#if (REDCONF_INODE_TIMESTAMPS != 0) && (REDCONF_INODE_TIMESTAMPS != 1)
|
#error "Configuration error: REDCONF_API_FSE_TRANSMASKSET must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_INODE_TIMESTAMPS must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_API_FSE_TRANSMASKGET != 0) && (REDCONF_API_FSE_TRANSMASKGET != 1)
|
||||||
#if (REDCONF_ATIME != 0) && (REDCONF_ATIME != 1)
|
#error "Configuration error: REDCONF_API_FSE_TRANSMASKGET must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_ATIME must be either 0 or 1."
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (REDCONF_INODE_TIMESTAMPS == 0) && (REDCONF_ATIME == 1)
|
#if REDCONF_TASK_COUNT < 1U
|
||||||
#error "Configuration error: REDCONF_ATIME must be 0 when REDCONF_INODE_TIMESTAMPS is 0."
|
#error "Configuration error: invalid value of REDCONF_TASK_COUNT"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* REDCONF_DIRECT_POINTERS and REDCONF_INDIRECT_POINTERS checked in rednodes.h
|
#if (REDCONF_ENDIAN_BIG != 0) && (REDCONF_ENDIAN_BIG != 1)
|
||||||
*/
|
#error "Configuration error: REDCONF_ENDIAN_BIG must be either 0 or 1."
|
||||||
|
#endif
|
||||||
#if (REDCONF_INODE_BLOCKS != 0) && (REDCONF_INODE_BLOCKS != 1)
|
|
||||||
#error "Configuration error: REDCONF_INODE_BLOCKS must be either 0 or 1."
|
#if (REDCONF_ALIGNMENT_SIZE != 1U) && (REDCONF_ALIGNMENT_SIZE != 2U) && (REDCONF_ALIGNMENT_SIZE != 4U) && (REDCONF_ALIGNMENT_SIZE != 8U)
|
||||||
#endif
|
#error "Configuration error: invalid value REDCONF_ALIGNMENT_SIZE"
|
||||||
|
#endif
|
||||||
/* Further validity checking of imap specs done in RelCoreInit()
|
|
||||||
*/
|
/* REDCONF_CRC_ALGORITHM checked in crc.c
|
||||||
#if (REDCONF_IMAP_EXTERNAL != 0) && (REDCONF_IMAP_EXTERNAL != 1)
|
*/
|
||||||
#error "Configuration error: REDCONF_IMAP_EXTERNAL must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_INODE_TIMESTAMPS != 0) && (REDCONF_INODE_TIMESTAMPS != 1)
|
||||||
#if (REDCONF_IMAP_INLINE != 0) && (REDCONF_IMAP_INLINE != 1)
|
#error "Configuration error: REDCONF_INODE_TIMESTAMPS must be either 0 or 1."
|
||||||
#error "Configuration error: REDCONF_IMAP_INLINE must be either 0 or 1."
|
#endif
|
||||||
#endif
|
|
||||||
#if (REDCONF_IMAP_INLINE == 0) && (REDCONF_IMAP_EXTERNAL == 0)
|
#if (REDCONF_ATIME != 0) && (REDCONF_ATIME != 1)
|
||||||
#error "Configuration error: At least one of REDCONF_IMAP_INLINE and REDCONF_IMAP_EXTERNAL must be set"
|
#error "Configuration error: REDCONF_ATIME must be either 0 or 1."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (REDCONF_OUTPUT != 0) && (REDCONF_OUTPUT != 1)
|
#if (REDCONF_INODE_TIMESTAMPS == 0) && (REDCONF_ATIME == 1)
|
||||||
#error "Configuration error: REDCONF_OUTPUT must be either 0 or 1."
|
#error "Configuration error: REDCONF_ATIME must be 0 when REDCONF_INODE_TIMESTAMPS is 0."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (REDCONF_ASSERTS != 0) && (REDCONF_ASSERTS != 1)
|
/* REDCONF_DIRECT_POINTERS and REDCONF_INDIRECT_POINTERS checked in rednodes.h
|
||||||
#error "Configuration error: REDCONF_ASSERTS must be either 0 or 1."
|
*/
|
||||||
#endif
|
|
||||||
|
#if (REDCONF_INODE_BLOCKS != 0) && (REDCONF_INODE_BLOCKS != 1)
|
||||||
/* REDCONF_BLOCK_SIZE checked in redmacs.h
|
#error "Configuration error: REDCONF_INODE_BLOCKS must be either 0 or 1."
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
#if (REDCONF_VOLUME_COUNT < 1U) || (REDCONF_VOLUME_COUNT > 255U)
|
/* Further validity checking of imap specs done in RelCoreInit()
|
||||||
#error "REDCONF_VOLUME_COUNT must be an integer between 1 and 255"
|
*/
|
||||||
#endif
|
#if (REDCONF_IMAP_EXTERNAL != 0) && (REDCONF_IMAP_EXTERNAL != 1)
|
||||||
|
#error "Configuration error: REDCONF_IMAP_EXTERNAL must be either 0 or 1."
|
||||||
/* REDCONF_BUFFER_COUNT lower limit checked in buffer.c
|
#endif
|
||||||
*/
|
#if (REDCONF_IMAP_INLINE != 0) && (REDCONF_IMAP_INLINE != 1)
|
||||||
#if REDCONF_BUFFER_COUNT > 255U
|
#error "Configuration error: REDCONF_IMAP_INLINE must be either 0 or 1."
|
||||||
#error "REDCONF_BUFFER_COUNT cannot be greater than 255"
|
#endif
|
||||||
#endif
|
#if (REDCONF_IMAP_INLINE == 0) && (REDCONF_IMAP_EXTERNAL == 0)
|
||||||
|
#error "Configuration error: At least one of REDCONF_IMAP_INLINE and REDCONF_IMAP_EXTERNAL must be set"
|
||||||
#if (REDCONF_IMAGE_BUILDER != 0) && (REDCONF_IMAGE_BUILDER != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_IMAGE_BUILDER must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_OUTPUT != 0) && (REDCONF_OUTPUT != 1)
|
||||||
|
#error "Configuration error: REDCONF_OUTPUT must be either 0 or 1."
|
||||||
#if (REDCONF_CHECKER != 0) && (REDCONF_CHECKER != 1)
|
#endif
|
||||||
#error "Configuration error: REDCONF_CHECKER must be either 0 or 1."
|
|
||||||
#endif
|
#if (REDCONF_ASSERTS != 0) && (REDCONF_ASSERTS != 1)
|
||||||
|
#error "Configuration error: REDCONF_ASSERTS must be either 0 or 1."
|
||||||
|
#endif
|
||||||
#endif
|
|
||||||
|
/* REDCONF_BLOCK_SIZE checked in redmacs.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if (REDCONF_VOLUME_COUNT < 1U) || (REDCONF_VOLUME_COUNT > 255U)
|
||||||
|
#error "REDCONF_VOLUME_COUNT must be an integer between 1 and 255"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (REDCONF_DISCARDS != 0) && (REDCONF_DISCARDS != 1)
|
||||||
|
#error "Configuration error: REDCONF_DISCARDS must be either 0 or 1."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* REDCONF_BUFFER_COUNT lower limit checked in buffer.c
|
||||||
|
*/
|
||||||
|
#if REDCONF_BUFFER_COUNT > 255U
|
||||||
|
#error "REDCONF_BUFFER_COUNT cannot be greater than 255"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (REDCONF_IMAGE_BUILDER != 0) && (REDCONF_IMAGE_BUILDER != 1)
|
||||||
|
#error "Configuration error: REDCONF_IMAGE_BUILDER must be either 0 or 1."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (REDCONF_CHECKER != 0) && (REDCONF_CHECKER != 1)
|
||||||
|
#error "Configuration error: REDCONF_CHECKER must be either 0 or 1."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if (REDCONF_DISCARDS == 1) && (RED_KIT == RED_KIT_GPL)
|
||||||
|
#error "REDCONF_DISCARDS not supported in Reliance Edge under GPL. Contact sales@datalight.com to upgrade."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,5 @@
|
||||||
|| ((REDCONF_API_FSE == 1) && (REDCONF_API_FSE_FORMAT == 1)) \
|
|| ((REDCONF_API_FSE == 1) && (REDCONF_API_FSE_FORMAT == 1)) \
|
||||||
|| (REDCONF_IMAGE_BUILDER == 1)))
|
|| (REDCONF_IMAGE_BUILDER == 1)))
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <redconf.h>
|
#include <redconf.h>
|
||||||
|
#include "redver.h"
|
||||||
#include "redconfigchk.h"
|
#include "redconfigchk.h"
|
||||||
#include <redtypes.h>
|
#include <redtypes.h>
|
||||||
#include "rederrno.h"
|
#include "rederrno.h"
|
||||||
|
@ -38,7 +39,6 @@
|
||||||
#include "redutils.h"
|
#include "redutils.h"
|
||||||
#include "redosserv.h"
|
#include "redosserv.h"
|
||||||
#include "redmisc.h"
|
#include "redmisc.h"
|
||||||
#include "redver.h"
|
|
||||||
#include "redexclude.h"
|
#include "redexclude.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
#define STOCH_POSIX_TEST_SUPPORTED \
|
#define STOCH_POSIX_TEST_SUPPORTED \
|
||||||
( ((RED_KIT == RED_KIT_COMMERCIAL) || (RED_KIT == RED_KIT_SANDBOX)) \
|
( ((RED_KIT == RED_KIT_COMMERCIAL) || (RED_KIT == RED_KIT_SANDBOX)) \
|
||||||
&& (REDCONF_OUTPUT == 1) && (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX == 1) \
|
&& (REDCONF_OUTPUT == 1) && (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX == 1) \
|
||||||
&& (REDCONF_READ_ONLY == 0) && (REDCONF_API_POSIX_FORMAT == 1) && (REDCONF_API_POSIX_READDIR == 1) \
|
&& (REDCONF_API_POSIX_FORMAT == 1) && (REDCONF_API_POSIX_READDIR == 1) \
|
||||||
&& (REDCONF_API_POSIX_MKDIR == 1) && (REDCONF_API_POSIX_RMDIR == 1) && (REDCONF_API_POSIX_UNLINK == 1) \
|
&& (REDCONF_API_POSIX_MKDIR == 1) && (REDCONF_API_POSIX_RMDIR == 1) && (REDCONF_API_POSIX_UNLINK == 1) \
|
||||||
&& (REDCONF_API_POSIX_RENAME == 1))
|
&& (REDCONF_API_POSIX_RENAME == 1))
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
|
|
||||||
uint8_t RedFindVolumeNumber(const char *pszVolume);
|
uint8_t RedFindVolumeNumber(const char *pszVolume);
|
||||||
|
bool RedConfirmOperation(const char *pszMessage);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
183
FreeRTOS-Plus/Source/Reliance-Edge/include/redtools.h
Normal file
183
FreeRTOS-Plus/Source/Reliance-Edge/include/redtools.h
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
||||||
|
|
||||||
|
Copyright (c) 2014-2015 Datalight, Inc.
|
||||||
|
All Rights Reserved Worldwide.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; use version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
/* Businesses and individuals that for commercial or other reasons cannot
|
||||||
|
comply with the terms of the GPLv2 license may obtain a commercial license
|
||||||
|
before incorporating Reliance Edge into proprietary software for
|
||||||
|
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
||||||
|
more information.
|
||||||
|
*/
|
||||||
|
#ifndef REDTOOLS_H
|
||||||
|
#define REDTOOLS_H
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <Windows.h>
|
||||||
|
#define HOST_PATH_MAX MAX_PATH
|
||||||
|
#else
|
||||||
|
#include <linux/limits.h>
|
||||||
|
#define HOST_PATH_MAX PATH_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if REDCONF_IMAGE_BUILDER == 1
|
||||||
|
|
||||||
|
#define MACRO_NAME_MAX_LEN 32
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t bVolNumber;
|
||||||
|
const char *pszInputDir;
|
||||||
|
const char *pszOutputFile;
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
const char *pszVolName;
|
||||||
|
#else
|
||||||
|
const char *pszMapFile;
|
||||||
|
const char *pszDefineFile;
|
||||||
|
bool fNowarn;
|
||||||
|
#endif
|
||||||
|
} IMGBLDPARAM;
|
||||||
|
|
||||||
|
|
||||||
|
void ImgbldParseParams(int argc, char *argv [], IMGBLDPARAM *pParam);
|
||||||
|
int ImgbldStart(IMGBLDPARAM *pParam);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
char asOutFilePath[HOST_PATH_MAX];
|
||||||
|
#else
|
||||||
|
uint32_t ulOutFileIndex;
|
||||||
|
#endif
|
||||||
|
char asInFilePath[HOST_PATH_MAX];
|
||||||
|
} FILEMAPPING;
|
||||||
|
|
||||||
|
|
||||||
|
extern void *gpCopyBuffer;
|
||||||
|
extern uint32_t gulCopyBufferSize;
|
||||||
|
|
||||||
|
|
||||||
|
/* Implemented in ibposix.c
|
||||||
|
*/
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
REDSTATUS IbPosixCopyDir(const char *pszVolName, const char *pszInDir);
|
||||||
|
int IbPosixCreateDir(const char *pszVolName, const char *pszFullPath, const char *pszBasePath);
|
||||||
|
int IbConvertPath(const char *pszVolName, const char *pszFullPath, const char *pszBasePath, char *szOutPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Implemented in ibfse.c
|
||||||
|
*/
|
||||||
|
#if REDCONF_API_FSE == 1
|
||||||
|
typedef struct sFILELISTENTRY FILELISTENTRY;
|
||||||
|
struct sFILELISTENTRY
|
||||||
|
{
|
||||||
|
FILEMAPPING fileMapping;
|
||||||
|
FILELISTENTRY *pNext;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void FreeFileList(FILELISTENTRY **ppsFileList);
|
||||||
|
|
||||||
|
int IbFseGetFileList(const char *pszPath, const char *pszIndirPath, FILELISTENTRY **ppFileListHead);
|
||||||
|
int IbFseOutputDefines(FILELISTENTRY *pFileList, const IMGBLDPARAM *pOptions);
|
||||||
|
int IbFseCopyFiles(int volNum, const FILELISTENTRY *pFileList);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Implemented in os-specific space (ibwin.c and iblinux.c)
|
||||||
|
*/
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
int IbPosixCopyDirRecursive(const char *pszVolName, const char *pszInDir);
|
||||||
|
#endif
|
||||||
|
#if REDCONF_API_FSE == 1
|
||||||
|
int IbFseBuildFileList(const char *pszDirPath, FILELISTENTRY **ppFileListHead);
|
||||||
|
#endif
|
||||||
|
#if REDCONF_API_FSE == 1
|
||||||
|
int IbSetRelativePath(char *pszPath, const char *pszParentPath);
|
||||||
|
#endif
|
||||||
|
bool IsRegularFile(const char *pszPath);
|
||||||
|
|
||||||
|
|
||||||
|
/* Implemented in ibcommon.c
|
||||||
|
*/
|
||||||
|
int IbCopyFile(int volNum, const FILEMAPPING *pFileMapping);
|
||||||
|
int IbCheckFileExists(const char *pszPath, bool *pfExists);
|
||||||
|
|
||||||
|
|
||||||
|
/* Implemented separately in ibfse.c and ibposix.c
|
||||||
|
*/
|
||||||
|
int IbApiInit(void);
|
||||||
|
int IbApiUninit(void);
|
||||||
|
int IbWriteFile(int volNum, const FILEMAPPING *pFileMapping, uint64_t ullOffset, void *pData, uint32_t ulDataLen);
|
||||||
|
|
||||||
|
#endif /* IMAGE_BUILDER */
|
||||||
|
|
||||||
|
/* For image copier tool
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define HOST_PSEP '\\'
|
||||||
|
#if !__STDC__
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#define stat _stat
|
||||||
|
#define S_IFDIR _S_IFDIR
|
||||||
|
#define rmdir _rmdir
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define HOST_PSEP '/'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t bVolNumber;
|
||||||
|
const char *pszOutputDir;
|
||||||
|
const char *pszBDevSpec;
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
const char *pszVolName;
|
||||||
|
#endif
|
||||||
|
bool fNoWarn;
|
||||||
|
} IMGCOPYPARAM;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
#if REDCONF_API_POSIX == 1
|
||||||
|
const char *pszVolume; /* Volume path prefix. */
|
||||||
|
uint32_t ulVolPrefixLen; /* strlen(COPIER::pszVolume) */
|
||||||
|
#else
|
||||||
|
uint8_t bVolNum; /* Volume number. */
|
||||||
|
#endif
|
||||||
|
const char *pszOutputDir; /* Output directory path. */
|
||||||
|
bool fNoWarn; /* If true, no warning to overwrite. */
|
||||||
|
uint8_t *pbCopyBuffer; /* Buffer for copying file data. */
|
||||||
|
} COPIER;
|
||||||
|
|
||||||
|
|
||||||
|
void ImgcopyParseParams(int argc, char *argv [], IMGCOPYPARAM *pParam);
|
||||||
|
int ImgcopyStart(IMGCOPYPARAM *pParam);
|
||||||
|
|
||||||
|
/* Implemented separately in imgcopywin.c and imgcopylinux.c. These functions
|
||||||
|
print an error message and abort on failure.
|
||||||
|
*/
|
||||||
|
void ImgcopyMkdir(const char *pszDir);
|
||||||
|
void ImgcopyRecursiveRmdir(const char *pszDir);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* REDTOOLS_H */
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
<!-- This macro is updated automatically: do not edit! -->
|
<!-- This macro is updated automatically: do not edit! -->
|
||||||
*/
|
*/
|
||||||
#define RED_BUILD_NUMBER "677"
|
#define RED_BUILD_NUMBER "700"
|
||||||
|
|
||||||
#define RED_KIT_GPL 0U /* Open source GPL kit. */
|
#define RED_KIT_GPL 0U /* Open source GPL kit. */
|
||||||
#define RED_KIT_COMMERCIAL 1U /* Commercially-licensed kit. */
|
#define RED_KIT_COMMERCIAL 1U /* Commercially-licensed kit. */
|
||||||
|
@ -48,8 +48,13 @@
|
||||||
|
|
||||||
/** @brief Version number to display in output.
|
/** @brief Version number to display in output.
|
||||||
*/
|
*/
|
||||||
#define RED_VERSION "v1.0.4"
|
#define RED_VERSION "v2.0"
|
||||||
|
|
||||||
|
/** @brief Version number in hex.
|
||||||
|
|
||||||
|
The most significant byte is the major version number, etc.
|
||||||
|
*/
|
||||||
|
#define RED_VERSION_VAL 0x02000000U
|
||||||
|
|
||||||
/** @brief On-disk version number.
|
/** @brief On-disk version number.
|
||||||
|
|
||||||
|
@ -67,7 +72,7 @@
|
||||||
/* Specifies whether the product is in alpha stage, beta stage, or neither.
|
/* Specifies whether the product is in alpha stage, beta stage, or neither.
|
||||||
*/
|
*/
|
||||||
#if 0
|
#if 0
|
||||||
#if 1
|
#if 0
|
||||||
#define ALPHABETA " (Alpha)"
|
#define ALPHABETA " (Alpha)"
|
||||||
#else
|
#else
|
||||||
#define ALPHABETA " (Beta)"
|
#define ALPHABETA " (Beta)"
|
||||||
|
@ -83,7 +88,7 @@
|
||||||
|
|
||||||
/** @brief Product copyright.
|
/** @brief Product copyright.
|
||||||
*/
|
*/
|
||||||
#define RED_PRODUCT_LEGAL "Copyright (c) 2014-2016 Datalight, Inc. All Rights Reserved Worldwide."
|
#define RED_PRODUCT_LEGAL "Copyright (c) 2014-2017 Datalight, Inc. All Rights Reserved Worldwide."
|
||||||
|
|
||||||
|
|
||||||
/** @brief Product patents.
|
/** @brief Product patents.
|
||||||
|
|
|
@ -1061,6 +1061,7 @@ static REDSTATUS DiskFlush(
|
||||||
#error "The STM32 StdPeriph driver is not supported. Please use the HAL driver or modify the Reliance Edge block device interface."
|
#error "The STM32 StdPeriph driver is not supported. Please use the HAL driver or modify the Reliance Edge block device interface."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/** @brief Number of times to call BSP_SD_GetStatus() before timing out and
|
/** @brief Number of times to call BSP_SD_GetStatus() before timing out and
|
||||||
returning an error.
|
returning an error.
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include <redcoreapi.h>
|
#include <redcoreapi.h>
|
||||||
#include <redvolume.h>
|
#include <redvolume.h>
|
||||||
#include <redposix.h>
|
#include <redposix.h>
|
||||||
#include "redpath.h"
|
#include <redpath.h>
|
||||||
|
|
||||||
|
|
||||||
static bool IsRootDir(const char *pszLocalPath);
|
static bool IsRootDir(const char *pszLocalPath);
|
||||||
|
@ -405,11 +405,11 @@ static bool IsRootDir(
|
||||||
Example | Result
|
Example | Result
|
||||||
------- | ------
|
------- | ------
|
||||||
"" false
|
"" false
|
||||||
"\" false
|
"/" false
|
||||||
"\\" false
|
"//" false
|
||||||
"a" true
|
"a" true
|
||||||
"\a" true
|
"/a" true
|
||||||
"\\a" true
|
"//a" true
|
||||||
|
|
||||||
@param pszPathIdx The path to examine, incremented to the point of
|
@param pszPathIdx The path to examine, incremented to the point of
|
||||||
interest.
|
interest.
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <redvolume.h>
|
#include <redvolume.h>
|
||||||
#include <redcoreapi.h>
|
#include <redcoreapi.h>
|
||||||
#include <redposix.h>
|
#include <redposix.h>
|
||||||
#include "redpath.h"
|
#include <redpath.h>
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------
|
/*-------------------------------------------------------------------
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,478 +1,478 @@
|
||||||
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
||||||
|
|
||||||
Copyright (c) 2014-2015 Datalight, Inc.
|
Copyright (c) 2014-2015 Datalight, Inc.
|
||||||
All Rights Reserved Worldwide.
|
All Rights Reserved Worldwide.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; use version 2 of the License.
|
the Free Software Foundation; use version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
/* Businesses and individuals that for commercial or other reasons cannot
|
/* Businesses and individuals that for commercial or other reasons cannot
|
||||||
comply with the terms of the GPLv2 license may obtain a commercial license
|
comply with the terms of the GPLv2 license may obtain a commercial license
|
||||||
before incorporating Reliance Edge into proprietary software for
|
before incorporating Reliance Edge into proprietary software for
|
||||||
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
||||||
more information.
|
more information.
|
||||||
*/
|
*/
|
||||||
/** @file
|
/** @file
|
||||||
@brief Implements utilities that convert strings to numbers.
|
@brief Implements utilities that convert strings to numbers.
|
||||||
*/
|
*/
|
||||||
#include <redfs.h>
|
#include <redfs.h>
|
||||||
#include <redtestutils.h>
|
#include <redtestutils.h>
|
||||||
|
|
||||||
|
|
||||||
#define ISHEXDIGITU(c) (((c) >= 'A') && ((c) <= 'F'))
|
#define ISHEXDIGITU(c) (((c) >= 'A') && ((c) <= 'F'))
|
||||||
#define ISHEXDIGITL(c) (((c) >= 'a') && ((c) <= 'f'))
|
#define ISHEXDIGITL(c) (((c) >= 'a') && ((c) <= 'f'))
|
||||||
#define ISHEXDIGIT(c) (ISHEXDIGITL(c) || ISHEXDIGITU(c))
|
#define ISHEXDIGIT(c) (ISHEXDIGITL(c) || ISHEXDIGITU(c))
|
||||||
|
|
||||||
|
|
||||||
/** @brief Converts an ASCII number into an int32_t.
|
/** @brief Converts an ASCII number into an int32_t.
|
||||||
|
|
||||||
Converts all decimal digit numbers up to the end of the string or to the
|
Converts all decimal digit numbers up to the end of the string or to the
|
||||||
first non-numerical character.
|
first non-numerical character.
|
||||||
|
|
||||||
@note This function does *not* ignore leading white space.
|
@note This function does *not* ignore leading white space.
|
||||||
|
|
||||||
@param pszNum Pointer to a constant array of characters.
|
@param pszNum Pointer to a constant array of characters.
|
||||||
|
|
||||||
@return The integer represented in the string.
|
@return The integer represented in the string.
|
||||||
*/
|
*/
|
||||||
int32_t RedAtoI(
|
int32_t RedAtoI(
|
||||||
const char *pszNum)
|
const char *pszNum)
|
||||||
{
|
{
|
||||||
int32_t lValue = 0;
|
int32_t lValue = 0;
|
||||||
int32_t lNegative = 1;
|
int32_t lNegative = 1;
|
||||||
uint32_t ulIdx = 0U;
|
uint32_t ulIdx = 0U;
|
||||||
|
|
||||||
if(pszNum[ulIdx] == '+')
|
if(pszNum[ulIdx] == '+')
|
||||||
{
|
{
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
else if(pszNum[ulIdx] == '-')
|
else if(pszNum[ulIdx] == '-')
|
||||||
{
|
{
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
lNegative = -1;
|
lNegative = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No sign, implicitly positive.
|
/* No sign, implicitly positive.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
while(ISDIGIT(pszNum[ulIdx]))
|
while(ISDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
lValue *= 10;
|
lValue *= 10;
|
||||||
lValue += pszNum[ulIdx] - '0';
|
lValue += pszNum[ulIdx] - '0';
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
lValue *= lNegative;
|
lValue *= lNegative;
|
||||||
|
|
||||||
return lValue;
|
return lValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Convert a hexadecimal ASCII number into a uint32_t value.
|
/** @brief Convert a hexadecimal ASCII number into a uint32_t value.
|
||||||
|
|
||||||
The function processes all hex digits up to a NUL-terminator, or to the
|
The function processes all hex digits up to a NUL-terminator, or to the
|
||||||
first non-hex character. Only hexadecimal digits are processed, so leading
|
first non-hex character. Only hexadecimal digits are processed, so leading
|
||||||
white space, or a leading "0x" prefix are not allowed.
|
white space, or a leading "0x" prefix are not allowed.
|
||||||
|
|
||||||
If pachNum points to an empty string (points to a NUL), this function will
|
If pachNum points to an empty string (points to a NUL), this function will
|
||||||
return NULL, and the value at *pulNum will not be modified.
|
return NULL, and the value at *pulNum will not be modified.
|
||||||
|
|
||||||
@note This function does not check for overflow. If there are more
|
@note This function does not check for overflow. If there are more
|
||||||
significant digits than can be represented in a uint32_t variable, the
|
significant digits than can be represented in a uint32_t variable, the
|
||||||
output is unspecified.
|
output is unspecified.
|
||||||
|
|
||||||
@param pachNum A pointer to a constant array of hex characters.
|
@param pszNum A pointer to a constant array of hex characters.
|
||||||
@param pulNum A pointer to the location in which to store the uint32_t
|
@param pulNum A pointer to the location in which to store the uint32_t
|
||||||
result. Upon return, this value will be modified ONLY if
|
result. Upon return, this value will be modified ONLY if
|
||||||
the function succeeds and the returned pointer is valid (not
|
the function succeeds and the returned pointer is valid (not
|
||||||
NULL).
|
NULL).
|
||||||
|
|
||||||
@return A pointer to the byte following the converted number or NULL to
|
@return A pointer to the byte following the converted number or NULL to
|
||||||
indicate failure.
|
indicate failure.
|
||||||
*/
|
*/
|
||||||
const char *RedHtoUL(
|
const char *RedHtoUL(
|
||||||
const char *pszNum,
|
const char *pszNum,
|
||||||
uint32_t *pulNum)
|
uint32_t *pulNum)
|
||||||
{
|
{
|
||||||
uint64_t ullValue;
|
uint64_t ullValue;
|
||||||
const char *pszReturn;
|
const char *pszReturn;
|
||||||
|
|
||||||
pszReturn = RedHtoULL(pszNum, &ullValue);
|
pszReturn = RedHtoULL(pszNum, &ullValue);
|
||||||
if(pszReturn != NULL)
|
if(pszReturn != NULL)
|
||||||
{
|
{
|
||||||
if(ullValue < UINT32_MAX)
|
if(ullValue < UINT32_MAX)
|
||||||
{
|
{
|
||||||
*pulNum = (uint32_t)ullValue;
|
*pulNum = (uint32_t)ullValue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pszReturn;
|
return pszReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Convert a hexadecimal ASCII number into a D_UINT64 value.
|
/** @brief Convert a hexadecimal ASCII number into a D_UINT64 value.
|
||||||
|
|
||||||
The function processes all hex digits up to a NUL-terminator, or to the
|
The function processes all hex digits up to a NUL-terminator, or to the
|
||||||
first non-hex character. Only hexadecimal digits are processed, so leading
|
first non-hex character. Only hexadecimal digits are processed, so leading
|
||||||
white space, or a leading "0x" prefix are not allowed.
|
white space, or a leading "0x" prefix are not allowed.
|
||||||
|
|
||||||
If pachNum points to an empty string (points to a NUL), this function will
|
If pachNum points to an empty string (points to a NUL), this function will
|
||||||
return NULL, and the value at *pulNum will not be modified.
|
return NULL, and the value at *pulNum will not be modified.
|
||||||
|
|
||||||
@note This function does not check for overflow. If there are more
|
@note This function does not check for overflow. If there are more
|
||||||
significant digits than can be represented in a uint64_t variable, the
|
significant digits than can be represented in a uint64_t variable, the
|
||||||
output is unspecified.
|
output is unspecified.
|
||||||
|
|
||||||
@param pszNum A pointer to a constant array of hex characters.
|
@param pszNum A pointer to a constant array of hex characters.
|
||||||
@param pullNum A pointer to the location in which to store the uint64_t
|
@param pullNum A pointer to the location in which to store the uint64_t
|
||||||
result. Upon return, this value will be modified ONLY if
|
result. Upon return, this value will be modified ONLY if
|
||||||
the function succeeds and the returned pointer is valid (not
|
the function succeeds and the returned pointer is valid (not
|
||||||
NULL).
|
NULL).
|
||||||
|
|
||||||
@return A pointer to the byte following the converted number, or NULL to
|
@return A pointer to the byte following the converted number, or NULL to
|
||||||
indicate failure.
|
indicate failure.
|
||||||
*/
|
*/
|
||||||
const char *RedHtoULL(
|
const char *RedHtoULL(
|
||||||
const char *pszNum,
|
const char *pszNum,
|
||||||
uint64_t *pullNum)
|
uint64_t *pullNum)
|
||||||
{
|
{
|
||||||
uint64_t ullValue = 0U;
|
uint64_t ullValue = 0U;
|
||||||
const char *pszReturn = NULL;
|
const char *pszReturn = NULL;
|
||||||
uint32_t ulIdx = 0U;
|
uint32_t ulIdx = 0U;
|
||||||
|
|
||||||
REDASSERT(pszNum != NULL);
|
REDASSERT(pszNum != NULL);
|
||||||
REDASSERT(pullNum != NULL);
|
REDASSERT(pullNum != NULL);
|
||||||
|
|
||||||
while(pszNum[ulIdx] != '\0')
|
while(pszNum[ulIdx] != '\0')
|
||||||
{
|
{
|
||||||
char cDigit = pszNum[ulIdx];
|
char cDigit = pszNum[ulIdx];
|
||||||
|
|
||||||
if(ISDIGIT(cDigit))
|
if(ISDIGIT(cDigit))
|
||||||
{
|
{
|
||||||
cDigit -= '0';
|
cDigit -= '0';
|
||||||
}
|
}
|
||||||
else if(ISHEXDIGITU(cDigit))
|
else if(ISHEXDIGITU(cDigit))
|
||||||
{
|
{
|
||||||
cDigit -= ('A' - 10);
|
cDigit -= ('A' - 10);
|
||||||
}
|
}
|
||||||
else if(ISHEXDIGITL(cDigit))
|
else if(ISHEXDIGITL(cDigit))
|
||||||
{
|
{
|
||||||
cDigit -= ('a' - 10);
|
cDigit -= ('a' - 10);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
REDASSERT((ullValue & UINT64_SUFFIX(0xF000000000000000)) == 0U);
|
REDASSERT((ullValue & UINT64_SUFFIX(0xF000000000000000)) == 0U);
|
||||||
|
|
||||||
ullValue <<= 4U;
|
ullValue <<= 4U;
|
||||||
ullValue += cDigit;
|
ullValue += cDigit;
|
||||||
|
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
pszReturn = &pszNum[ulIdx];
|
pszReturn = &pszNum[ulIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Modify the number returned only if we found one or more valid hex
|
/* Modify the number returned only if we found one or more valid hex
|
||||||
digits.
|
digits.
|
||||||
*/
|
*/
|
||||||
if(pszReturn != NULL)
|
if(pszReturn != NULL)
|
||||||
{
|
{
|
||||||
*pullNum = ullValue;
|
*pullNum = ullValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pszReturn;
|
return pszReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Convert the ASCII number to a uint32_t value.
|
/** @brief Convert the ASCII number to a uint32_t value.
|
||||||
|
|
||||||
The number may be hex or decimal. Hex numbers must be prefixed by '0x', and
|
The number may be hex or decimal. Hex numbers must be prefixed by '0x', and
|
||||||
they may be upper or lower case. The conversion process will stop with the
|
they may be upper or lower case. The conversion process will stop with the
|
||||||
first non hex or decimal digit.
|
first non hex or decimal digit.
|
||||||
|
|
||||||
If the number is negative (the first character is a '-' sign), the value
|
If the number is negative (the first character is a '-' sign), the value
|
||||||
will be range checked and returned as the equivalent unsigned value.
|
will be range checked and returned as the equivalent unsigned value.
|
||||||
|
|
||||||
@note This function will NOT fail for numbers which exceed the size of a
|
@note This function will NOT fail for numbers which exceed the size of a
|
||||||
uint32_t value.
|
uint32_t value.
|
||||||
|
|
||||||
@param pszNum A pointer to the ASCII number to convert
|
@param pszNum A pointer to the ASCII number to convert
|
||||||
@param pulNum A pointer to the uint32_t location to store the result.
|
@param pulNum A pointer to the uint32_t location to store the result.
|
||||||
This value will be modified on return only if the function
|
This value will be modified on return only if the function
|
||||||
succeeds and the returned pointer is valid (not NULL).
|
succeeds and the returned pointer is valid (not NULL).
|
||||||
|
|
||||||
@return A pointer to the byte following the converted number, or NULL to
|
@return A pointer to the byte following the converted number, or NULL to
|
||||||
indicate failure.
|
indicate failure.
|
||||||
*/
|
*/
|
||||||
const char *RedNtoUL(
|
const char *RedNtoUL(
|
||||||
const char *pszNum,
|
const char *pszNum,
|
||||||
uint32_t *pulNum)
|
uint32_t *pulNum)
|
||||||
{
|
{
|
||||||
bool fNegative = false;
|
bool fNegative = false;
|
||||||
uint32_t ulIdx = 0U;
|
uint32_t ulIdx = 0U;
|
||||||
const char *pszReturn;
|
const char *pszReturn;
|
||||||
|
|
||||||
REDASSERT(pszNum != NULL);
|
REDASSERT(pszNum != NULL);
|
||||||
REDASSERT(pulNum != NULL);
|
REDASSERT(pulNum != NULL);
|
||||||
|
|
||||||
if(pszNum[ulIdx] == '-')
|
if(pszNum[ulIdx] == '-')
|
||||||
{
|
{
|
||||||
fNegative = true;
|
fNegative = true;
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hex numbers must be prefixed with '0x'.
|
/* Hex numbers must be prefixed with '0x'.
|
||||||
*/
|
*/
|
||||||
if((pszNum[ulIdx] == '0') && ((pszNum[ulIdx + 1U] == 'x') || (pszNum[ulIdx + 1U] == 'X')))
|
if((pszNum[ulIdx] == '0') && ((pszNum[ulIdx + 1U] == 'x') || (pszNum[ulIdx + 1U] == 'X')))
|
||||||
{
|
{
|
||||||
ulIdx += 2U;
|
ulIdx += 2U;
|
||||||
|
|
||||||
if(ISDIGIT(pszNum[ulIdx]) || ISHEXDIGIT(pszNum[ulIdx]))
|
if(ISDIGIT(pszNum[ulIdx]) || ISHEXDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
pszReturn = RedHtoUL(&pszNum[ulIdx], pulNum);
|
pszReturn = RedHtoUL(&pszNum[ulIdx], pulNum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ISDIGIT(pszNum[ulIdx]))
|
else if(ISDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
uint32_t ulTemp;
|
uint32_t ulTemp;
|
||||||
|
|
||||||
ulTemp = RedAtoI(&pszNum[ulIdx]);
|
ulTemp = RedAtoI(&pszNum[ulIdx]);
|
||||||
|
|
||||||
while(ISDIGIT(pszNum[ulIdx]))
|
while(ISDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fNegative)
|
if(fNegative)
|
||||||
{
|
{
|
||||||
/* Fail if the number is out of range.
|
/* Fail if the number is out of range.
|
||||||
*/
|
*/
|
||||||
if(ulTemp > INT32_MAX)
|
if(ulTemp > INT32_MAX)
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pulNum = -((int32_t)ulTemp);
|
*pulNum = -((int32_t)ulTemp);
|
||||||
pszReturn = &pszNum[ulIdx];
|
pszReturn = &pszNum[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pulNum = ulTemp;
|
*pulNum = ulTemp;
|
||||||
pszReturn = &pszNum[ulIdx];
|
pszReturn = &pszNum[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Return an error if there is not at least one hex or decimal digit.
|
/* Return an error if there is not at least one hex or decimal digit.
|
||||||
*/
|
*/
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pszReturn;
|
return pszReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Convert the ASCII number pointed to by pachNum to a uint64_t value.
|
/** @brief Convert the ASCII number pointed to by pachNum to a uint64_t value.
|
||||||
|
|
||||||
The number may be hex or decimal. Hex numbers must be prefixed by '0x', and
|
The number may be hex or decimal. Hex numbers must be prefixed by '0x', and
|
||||||
they may be upper or lower case. The conversion process will stop with the
|
they may be upper or lower case. The conversion process will stop with the
|
||||||
first non hex or decimal digit.
|
first non hex or decimal digit.
|
||||||
|
|
||||||
If the number is negative (the first character is a '-' sign), the value
|
If the number is negative (the first character is a '-' sign), the value
|
||||||
will be range checked and returned as the equivalent unsigned value.
|
will be range checked and returned as the equivalent unsigned value.
|
||||||
|
|
||||||
@param pszNum A pointer to the ASCII number to convert.
|
@param pszNum A pointer to the ASCII number to convert.
|
||||||
@param pullNum A pointer to the uint64_t location to store the result.
|
@param pullNum A pointer to the uint64_t location to store the result.
|
||||||
This value will be modified on return only if the function
|
This value will be modified on return only if the function
|
||||||
succeeds and the returned pointer is valid (not NULL).
|
succeeds and the returned pointer is valid (not NULL).
|
||||||
|
|
||||||
@return A pointer to the byte following the converted number, or NULL to
|
@return A pointer to the byte following the converted number, or NULL to
|
||||||
indicate failure.
|
indicate failure.
|
||||||
*/
|
*/
|
||||||
const char *RedNtoULL(
|
const char *RedNtoULL(
|
||||||
const char *pszNum,
|
const char *pszNum,
|
||||||
uint64_t *pullNum)
|
uint64_t *pullNum)
|
||||||
{
|
{
|
||||||
bool fNegative = false;
|
bool fNegative = false;
|
||||||
uint32_t ulIdx = 0U;
|
uint32_t ulIdx = 0U;
|
||||||
const char *pszReturn;
|
const char *pszReturn;
|
||||||
|
|
||||||
REDASSERT(pszNum != NULL);
|
REDASSERT(pszNum != NULL);
|
||||||
REDASSERT(pullNum != NULL);
|
REDASSERT(pullNum != NULL);
|
||||||
|
|
||||||
if(pszNum[ulIdx] == '-')
|
if(pszNum[ulIdx] == '-')
|
||||||
{
|
{
|
||||||
fNegative = true;
|
fNegative = true;
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hex numbers must be prefixed with '0x'.
|
/* Hex numbers must be prefixed with '0x'.
|
||||||
*/
|
*/
|
||||||
if((pszNum[ulIdx] == '0') && ((pszNum[ulIdx + 1U] == 'x') || (pszNum[ulIdx + 1U] == 'X')))
|
if((pszNum[ulIdx] == '0') && ((pszNum[ulIdx + 1U] == 'x') || (pszNum[ulIdx + 1U] == 'X')))
|
||||||
{
|
{
|
||||||
ulIdx += 2U;
|
ulIdx += 2U;
|
||||||
|
|
||||||
if(ISDIGIT(pszNum[ulIdx]) || ISHEXDIGIT(pszNum[ulIdx]))
|
if(ISDIGIT(pszNum[ulIdx]) || ISHEXDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
pszReturn = RedHtoULL(&pszNum[ulIdx], pullNum);
|
pszReturn = RedHtoULL(&pszNum[ulIdx], pullNum);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ISDIGIT(pszNum[ulIdx]))
|
else if(ISDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
uint64_t ullTemp = 0U;
|
uint64_t ullTemp = 0U;
|
||||||
|
|
||||||
while(ISDIGIT(pszNum[ulIdx]))
|
while(ISDIGIT(pszNum[ulIdx]))
|
||||||
{
|
{
|
||||||
ullTemp *= 10U;
|
ullTemp *= 10U;
|
||||||
ullTemp += pszNum[ulIdx] - '0';
|
ullTemp += pszNum[ulIdx] - '0';
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fNegative)
|
if(fNegative)
|
||||||
{
|
{
|
||||||
/* Fail if the number is out of range.
|
/* Fail if the number is out of range.
|
||||||
*/
|
*/
|
||||||
if(ullTemp > INT64_MAX)
|
if(ullTemp > INT64_MAX)
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pullNum = (uint64_t)(-((int64_t)ullTemp));
|
*pullNum = (uint64_t)(-((int64_t)ullTemp));
|
||||||
pszReturn = &pszNum[ulIdx];
|
pszReturn = &pszNum[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pullNum = ullTemp;
|
*pullNum = ullTemp;
|
||||||
pszReturn = &pszNum[ulIdx];
|
pszReturn = &pszNum[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Return an error if there is not at least one hex or decimal digit.
|
/* Return an error if there is not at least one hex or decimal digit.
|
||||||
*/
|
*/
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pszReturn;
|
return pszReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Convert an ASCII hex or decimal number, which may may have a "B",
|
/** @brief Convert an ASCII hex or decimal number, which may may have a "B",
|
||||||
"KB", or "MB" suffix (case insensitive), to a binary value.
|
"KB", or "MB" suffix (case insensitive), to a binary value.
|
||||||
|
|
||||||
Hex numbers must be prefixed with "0x".
|
Hex numbers must be prefixed with "0x".
|
||||||
|
|
||||||
@note If there is no postfix, KB is assumed!
|
@note If there is no postfix, KB is assumed!
|
||||||
|
|
||||||
May fail due to bad formatting or overflow.
|
May fail due to bad formatting or overflow.
|
||||||
|
|
||||||
@param pszNum A pointer to the ASCII number to convert.
|
@param pszNum A pointer to the ASCII number to convert.
|
||||||
@param pulResult A pointer to a uint32_t in which to place the result.
|
@param pulResult A pointer to a uint32_t in which to place the result.
|
||||||
|
|
||||||
@return A pointer to the byte following the string, or NULL to indicate an
|
@return A pointer to the byte following the string, or NULL to indicate an
|
||||||
error. In the event of an error, *pulResult will not be modified.
|
error. In the event of an error, *pulResult will not be modified.
|
||||||
*/
|
*/
|
||||||
const char *RedSizeToUL(
|
const char *RedSizeToUL(
|
||||||
const char *pszNum,
|
const char *pszNum,
|
||||||
uint32_t *pulResult)
|
uint32_t *pulResult)
|
||||||
{
|
{
|
||||||
uint32_t ulResult;
|
uint32_t ulResult;
|
||||||
const char *pszSuffix;
|
const char *pszSuffix;
|
||||||
const char *pszReturn;
|
const char *pszReturn;
|
||||||
uint32_t ulIdx = 0U;
|
uint32_t ulIdx = 0U;
|
||||||
|
|
||||||
REDASSERT(pszNum != NULL);
|
REDASSERT(pszNum != NULL);
|
||||||
REDASSERT(pulResult != NULL);
|
REDASSERT(pulResult != NULL);
|
||||||
|
|
||||||
/* Do the basic hex/decimal conversion
|
/* Do the basic hex/decimal conversion
|
||||||
*/
|
*/
|
||||||
pszSuffix = RedNtoUL(pszNum, &ulResult);
|
pszSuffix = RedNtoUL(pszNum, &ulResult);
|
||||||
if(pszSuffix != NULL)
|
if(pszSuffix != NULL)
|
||||||
{
|
{
|
||||||
if((pszSuffix[ulIdx] == 'B') || (pszSuffix[ulIdx] == 'b'))
|
if((pszSuffix[ulIdx] == 'B') || (pszSuffix[ulIdx] == 'b'))
|
||||||
{
|
{
|
||||||
ulIdx++;
|
ulIdx++;
|
||||||
pszReturn = &pszSuffix[ulIdx];
|
pszReturn = &pszSuffix[ulIdx];
|
||||||
}
|
}
|
||||||
else if( ((pszSuffix[ulIdx] == 'M') || (pszSuffix[ulIdx] == 'm'))
|
else if( ((pszSuffix[ulIdx] == 'M') || (pszSuffix[ulIdx] == 'm'))
|
||||||
&& ((pszSuffix[ulIdx + 1U] == 'B') || (pszSuffix[ulIdx + 1U] == 'b')))
|
&& ((pszSuffix[ulIdx + 1U] == 'B') || (pszSuffix[ulIdx + 1U] == 'b')))
|
||||||
{
|
{
|
||||||
ulIdx += 2U;
|
ulIdx += 2U;
|
||||||
|
|
||||||
if(ulResult > (UINT32_MAX / (1024U * 1024U)))
|
if(ulResult > (UINT32_MAX / (1024U * 1024U)))
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ulResult *= 1024U * 1024U;
|
ulResult *= 1024U * 1024U;
|
||||||
pszReturn = &pszSuffix[ulIdx];
|
pszReturn = &pszSuffix[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The number is either postfixed with "KB" or something
|
/* The number is either postfixed with "KB" or something
|
||||||
else (we don't care), but we must increment the pointer
|
else (we don't care), but we must increment the pointer
|
||||||
if it is something recognize.
|
if it is something recognize.
|
||||||
*/
|
*/
|
||||||
if( ((pszSuffix[ulIdx] == 'K') || (pszSuffix[ulIdx] == 'k'))
|
if( ((pszSuffix[ulIdx] == 'K') || (pszSuffix[ulIdx] == 'k'))
|
||||||
&& ((pszSuffix[ulIdx + 1U] == 'B') || (pszSuffix[ulIdx + 1U] == 'b')))
|
&& ((pszSuffix[ulIdx + 1U] == 'B') || (pszSuffix[ulIdx + 1U] == 'b')))
|
||||||
{
|
{
|
||||||
ulIdx += 2U;
|
ulIdx += 2U;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "B" or "MB" were not specified, so it must be "KB"
|
/* "B" or "MB" were not specified, so it must be "KB"
|
||||||
*/
|
*/
|
||||||
if(ulResult > (UINT32_MAX / 1024U))
|
if(ulResult > (UINT32_MAX / 1024U))
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ulResult *= 1024UL;
|
ulResult *= 1024UL;
|
||||||
pszReturn = &pszSuffix[ulIdx];
|
pszReturn = &pszSuffix[ulIdx];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pszReturn != NULL)
|
if(pszReturn != NULL)
|
||||||
{
|
{
|
||||||
*pulResult = ulResult;
|
*pulResult = ulResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pszReturn = NULL;
|
pszReturn = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pszReturn;
|
return pszReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,159 +1,159 @@
|
||||||
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
|
||||||
|
|
||||||
Copyright (c) 2014-2015 Datalight, Inc.
|
Copyright (c) 2014-2015 Datalight, Inc.
|
||||||
All Rights Reserved Worldwide.
|
All Rights Reserved Worldwide.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; use version 2 of the License.
|
the Free Software Foundation; use version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
|
||||||
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
/* Businesses and individuals that for commercial or other reasons cannot
|
/* Businesses and individuals that for commercial or other reasons cannot
|
||||||
comply with the terms of the GPLv2 license may obtain a commercial license
|
comply with the terms of the GPLv2 license may obtain a commercial license
|
||||||
before incorporating Reliance Edge into proprietary software for
|
before incorporating Reliance Edge into proprietary software for
|
||||||
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
distribution in any form. Visit http://www.datalight.com/reliance-edge for
|
||||||
more information.
|
more information.
|
||||||
*/
|
*/
|
||||||
/** @file
|
/** @file
|
||||||
@brief Implements a random number generator.
|
@brief Implements a random number generator.
|
||||||
*/
|
*/
|
||||||
#include <redfs.h>
|
#include <redfs.h>
|
||||||
#include <redtestutils.h>
|
#include <redtestutils.h>
|
||||||
|
|
||||||
|
|
||||||
/* This is the global seed used by the random number generator when the caller
|
/* This is the global seed used by the random number generator when the caller
|
||||||
has not provided a seed to either the RedRand32() or RedRand64() functions.
|
has not provided a seed to either the RedRand32() or RedRand64() functions.
|
||||||
*/
|
*/
|
||||||
static uint64_t ullGlobalRandomNumberSeed;
|
static uint64_t ullGlobalRandomNumberSeed;
|
||||||
|
|
||||||
/* Whether the above seed has been initialized.
|
/* Whether the above seed has been initialized.
|
||||||
*/
|
*/
|
||||||
static bool fGlobalSeedInited;
|
static bool fGlobalSeedInited;
|
||||||
|
|
||||||
|
|
||||||
/** @brief Set the global seed used by the random number generator.
|
/** @brief Set the global seed used by the random number generator.
|
||||||
|
|
||||||
The global seed gets used when RedRand64() or RedRand32() are called with
|
The global seed gets used when RedRand64() or RedRand32() are called with
|
||||||
a NULL seed argument.
|
a NULL seed argument.
|
||||||
|
|
||||||
@param ullSeed The value to use as the global RNG seed.
|
@param ullSeed The value to use as the global RNG seed.
|
||||||
*/
|
*/
|
||||||
void RedRandSeed(
|
void RedRandSeed(
|
||||||
uint64_t ullSeed)
|
uint64_t ullSeed)
|
||||||
{
|
{
|
||||||
ullGlobalRandomNumberSeed = ullSeed;
|
ullGlobalRandomNumberSeed = ullSeed;
|
||||||
fGlobalSeedInited = true;
|
fGlobalSeedInited = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Generate a 64-bit pseudo-random number.
|
/** @brief Generate a 64-bit pseudo-random number.
|
||||||
|
|
||||||
The period of this random number generator is 2^64 (1.8 x 1019). These
|
The period of this random number generator is 2^64 (1.8 x 1019). These
|
||||||
parameters are the same as the default one-stream SPRNG lcg64 generator and
|
parameters are the same as the default one-stream SPRNG lcg64 generator and
|
||||||
it satisfies the requirements for a maximal period.
|
it satisfies the requirements for a maximal period.
|
||||||
|
|
||||||
The tempering value is used and an AND mask and is specifically selected to
|
The tempering value is used and an AND mask and is specifically selected to
|
||||||
favor the distribution of lower bits.
|
favor the distribution of lower bits.
|
||||||
|
|
||||||
@param pullSeed A pointer to the seed to use. Set this value to NULL to
|
@param pullSeed A pointer to the seed to use. Set this value to NULL to
|
||||||
use the internal global seed value.
|
use the internal global seed value.
|
||||||
|
|
||||||
@return A pseudo-random number in the range [0, UINT64_MAX].
|
@return A pseudo-random number in the range [0, UINT64_MAX].
|
||||||
*/
|
*/
|
||||||
uint64_t RedRand64(
|
uint64_t RedRand64(
|
||||||
uint64_t *pullSeed)
|
uint64_t *pullSeed)
|
||||||
{
|
{
|
||||||
const uint64_t ullA = UINT64_SUFFIX(2862933555777941757);
|
const uint64_t ullA = UINT64_SUFFIX(2862933555777941757);
|
||||||
const uint64_t ullC = UINT64_SUFFIX(3037000493);
|
const uint64_t ullC = UINT64_SUFFIX(3037000493);
|
||||||
const uint64_t ullT = UINT64_SUFFIX(4921441182957829599);
|
const uint64_t ullT = UINT64_SUFFIX(4921441182957829599);
|
||||||
uint64_t ullN;
|
uint64_t ullN;
|
||||||
uint64_t *pullSeedPtr;
|
uint64_t *pullSeedPtr;
|
||||||
uint64_t ullLocalSeed;
|
uint64_t ullLocalSeed;
|
||||||
|
|
||||||
if(pullSeed != NULL)
|
if(pullSeed != NULL)
|
||||||
{
|
{
|
||||||
ullLocalSeed = *pullSeed;
|
ullLocalSeed = *pullSeed;
|
||||||
pullSeedPtr = pullSeed;
|
pullSeedPtr = pullSeed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!fGlobalSeedInited)
|
if(!fGlobalSeedInited)
|
||||||
{
|
{
|
||||||
/* Unfortunately, the Reliance Edge OS services don't give us much
|
/* Unfortunately, the Reliance Edge OS services don't give us much
|
||||||
to work with to initialize the global seed. There is no entropy
|
to work with to initialize the global seed. There is no entropy
|
||||||
abstraction, no tick count abstraction, and the timestamp
|
abstraction, no tick count abstraction, and the timestamp
|
||||||
abstraction uses an opaque type which is not guaranteed to be an
|
abstraction uses an opaque type which is not guaranteed to be an
|
||||||
integer. The best we can do is use the RTC.
|
integer. The best we can do is use the RTC.
|
||||||
|
|
||||||
Tests using the RNG should be supplying a seed anyway, for
|
Tests using the RNG should be supplying a seed anyway, for
|
||||||
reproducibility.
|
reproducibility.
|
||||||
*/
|
*/
|
||||||
RedRandSeed((uint64_t)RedOsClockGetTime());
|
RedRandSeed((uint64_t)RedOsClockGetTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
ullLocalSeed = ullGlobalRandomNumberSeed;
|
ullLocalSeed = ullGlobalRandomNumberSeed;
|
||||||
pullSeedPtr = &ullGlobalRandomNumberSeed;
|
pullSeedPtr = &ullGlobalRandomNumberSeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ullN = (ullLocalSeed * ullA) + ullC;
|
ullN = (ullLocalSeed * ullA) + ullC;
|
||||||
|
|
||||||
*pullSeedPtr = ullN;
|
*pullSeedPtr = ullN;
|
||||||
|
|
||||||
/* The linear congruential generator used above produces good psuedo-random
|
/* The linear congruential generator used above produces good psuedo-random
|
||||||
64-bit number sequences, however, as with any LCG, the period of the
|
64-bit number sequences, however, as with any LCG, the period of the
|
||||||
lower order bits is much shorter resulting in alternately odd/even pairs
|
lower order bits is much shorter resulting in alternately odd/even pairs
|
||||||
in bit zero.
|
in bit zero.
|
||||||
|
|
||||||
The result of the LGC above is tempered below with a series of XOR and
|
The result of the LGC above is tempered below with a series of XOR and
|
||||||
shift operations to produce a more acceptable equidistribution of bits
|
shift operations to produce a more acceptable equidistribution of bits
|
||||||
throughout the 64-bit range.
|
throughout the 64-bit range.
|
||||||
*/
|
*/
|
||||||
ullN ^= (ullN >> 21U) & ullT;
|
ullN ^= (ullN >> 21U) & ullT;
|
||||||
ullN ^= (ullN >> 43U) & ullT;
|
ullN ^= (ullN >> 43U) & ullT;
|
||||||
ullN ^= (ullN << 23U) & ~ullT;
|
ullN ^= (ullN << 23U) & ~ullT;
|
||||||
ullN ^= (ullN << 31U) & ~ullT;
|
ullN ^= (ullN << 31U) & ~ullT;
|
||||||
|
|
||||||
return ullN;
|
return ullN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @brief Generate a 32-bit pseudo-random number.
|
/** @brief Generate a 32-bit pseudo-random number.
|
||||||
|
|
||||||
@note The 32-bit random number generator internally uses the 64-bit random
|
@note The 32-bit random number generator internally uses the 64-bit random
|
||||||
number generator, returning the low 32-bits of the pseudo-random
|
number generator, returning the low 32-bits of the pseudo-random
|
||||||
64-bit value.
|
64-bit value.
|
||||||
|
|
||||||
@param pulSeed A pointer to the seed to use. Set this value to NULL to use
|
@param pulSeed A pointer to the seed to use. Set this value to NULL to use
|
||||||
the internal global seed value.
|
the internal global seed value.
|
||||||
|
|
||||||
@return A pseudo-random number in the range [0, UINT32_MAX].
|
@return A pseudo-random number in the range [0, UINT32_MAX].
|
||||||
*/
|
*/
|
||||||
uint32_t RedRand32(
|
uint32_t RedRand32(
|
||||||
uint32_t *pulSeed)
|
uint32_t *pulSeed)
|
||||||
{
|
{
|
||||||
uint64_t ullN;
|
uint64_t ullN;
|
||||||
|
|
||||||
if(pulSeed != NULL)
|
if(pulSeed != NULL)
|
||||||
{
|
{
|
||||||
uint64_t ullLocalSeed;
|
uint64_t ullLocalSeed;
|
||||||
|
|
||||||
ullLocalSeed = *pulSeed;
|
ullLocalSeed = *pulSeed;
|
||||||
ullN = RedRand64(&ullLocalSeed);
|
ullN = RedRand64(&ullLocalSeed);
|
||||||
*pulSeed = (uint32_t)ullLocalSeed;
|
*pulSeed = (uint32_t)ullLocalSeed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ullN = RedRand64(NULL);
|
ullN = RedRand64(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (uint32_t)ullN;
|
return (uint32_t)ullN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue